xref: /aosp_15_r20/external/angle/src/image_util/loadimage.inc (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker//
2*8975f5c5SAndroid Build Coastguard Worker// Copyright 2014 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker//
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker#include "common/mathutil.h"
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker#include <string.h>
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Workernamespace angle
12*8975f5c5SAndroid Build Coastguard Worker{
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Workernamespace priv
15*8975f5c5SAndroid Build Coastguard Worker{
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Workertemplate <typename T>
18*8975f5c5SAndroid Build Coastguard Workerinline T *OffsetDataPointer(uint8_t *data, size_t y, size_t z, size_t rowPitch, size_t depthPitch)
19*8975f5c5SAndroid Build Coastguard Worker{
20*8975f5c5SAndroid Build Coastguard Worker    return reinterpret_cast<T*>(data + (y * rowPitch) + (z * depthPitch));
21*8975f5c5SAndroid Build Coastguard Worker}
22*8975f5c5SAndroid Build Coastguard Worker
23*8975f5c5SAndroid Build Coastguard Workertemplate <typename T>
24*8975f5c5SAndroid Build Coastguard Workerinline const T *OffsetDataPointer(const uint8_t *data, size_t y, size_t z, size_t rowPitch, size_t depthPitch)
25*8975f5c5SAndroid Build Coastguard Worker{
26*8975f5c5SAndroid Build Coastguard Worker    return reinterpret_cast<const T*>(data + (y * rowPitch) + (z * depthPitch));
27*8975f5c5SAndroid Build Coastguard Worker}
28*8975f5c5SAndroid Build Coastguard Worker
29*8975f5c5SAndroid Build Coastguard Worker}  // namespace priv
30*8975f5c5SAndroid Build Coastguard Worker
31*8975f5c5SAndroid Build Coastguard Workertemplate <typename type, size_t componentCount>
32*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative(const ImageLoadContext &context, size_t width, size_t height, size_t depth,
33*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
34*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
35*8975f5c5SAndroid Build Coastguard Worker{
36*8975f5c5SAndroid Build Coastguard Worker    const size_t rowSize = width * sizeof(type) * componentCount;
37*8975f5c5SAndroid Build Coastguard Worker    const size_t layerSize = rowSize * height;
38*8975f5c5SAndroid Build Coastguard Worker    const size_t imageSize = layerSize * depth;
39*8975f5c5SAndroid Build Coastguard Worker
40*8975f5c5SAndroid Build Coastguard Worker    if (layerSize == inputDepthPitch && layerSize == outputDepthPitch)
41*8975f5c5SAndroid Build Coastguard Worker    {
42*8975f5c5SAndroid Build Coastguard Worker        ASSERT(rowSize == inputRowPitch && rowSize == outputRowPitch);
43*8975f5c5SAndroid Build Coastguard Worker        memcpy(output, input, imageSize);
44*8975f5c5SAndroid Build Coastguard Worker    }
45*8975f5c5SAndroid Build Coastguard Worker    else if (rowSize == inputRowPitch && rowSize == outputRowPitch)
46*8975f5c5SAndroid Build Coastguard Worker    {
47*8975f5c5SAndroid Build Coastguard Worker        for (size_t z = 0; z < depth; z++)
48*8975f5c5SAndroid Build Coastguard Worker        {
49*8975f5c5SAndroid Build Coastguard Worker            const type *source = priv::OffsetDataPointer<type>(input, 0, z, inputRowPitch, inputDepthPitch);
50*8975f5c5SAndroid Build Coastguard Worker            type *dest = priv::OffsetDataPointer<type>(output, 0, z, outputRowPitch, outputDepthPitch);
51*8975f5c5SAndroid Build Coastguard Worker
52*8975f5c5SAndroid Build Coastguard Worker            memcpy(dest, source, layerSize);
53*8975f5c5SAndroid Build Coastguard Worker        }
54*8975f5c5SAndroid Build Coastguard Worker    }
55*8975f5c5SAndroid Build Coastguard Worker    else
56*8975f5c5SAndroid Build Coastguard Worker    {
57*8975f5c5SAndroid Build Coastguard Worker        for (size_t z = 0; z < depth; z++)
58*8975f5c5SAndroid Build Coastguard Worker        {
59*8975f5c5SAndroid Build Coastguard Worker            for (size_t y = 0; y < height; y++)
60*8975f5c5SAndroid Build Coastguard Worker            {
61*8975f5c5SAndroid Build Coastguard Worker                const type *source = priv::OffsetDataPointer<type>(input, y, z, inputRowPitch, inputDepthPitch);
62*8975f5c5SAndroid Build Coastguard Worker                type *dest = priv::OffsetDataPointer<type>(output, y, z, outputRowPitch, outputDepthPitch);
63*8975f5c5SAndroid Build Coastguard Worker                memcpy(dest, source, width * sizeof(type) * componentCount);
64*8975f5c5SAndroid Build Coastguard Worker            }
65*8975f5c5SAndroid Build Coastguard Worker        }
66*8975f5c5SAndroid Build Coastguard Worker    }
67*8975f5c5SAndroid Build Coastguard Worker}
68*8975f5c5SAndroid Build Coastguard Worker
69*8975f5c5SAndroid Build Coastguard Workertemplate <typename type>
70*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4Impl(const ImageLoadContext &context,
71*8975f5c5SAndroid Build Coastguard Worker                                 const uint32_t fourthComponentBits,
72*8975f5c5SAndroid Build Coastguard Worker                                 size_t width,
73*8975f5c5SAndroid Build Coastguard Worker                                 size_t height,
74*8975f5c5SAndroid Build Coastguard Worker                                 size_t depth,
75*8975f5c5SAndroid Build Coastguard Worker                                 const uint8_t *input,
76*8975f5c5SAndroid Build Coastguard Worker                                 size_t inputRowPitch,
77*8975f5c5SAndroid Build Coastguard Worker                                 size_t inputDepthPitch,
78*8975f5c5SAndroid Build Coastguard Worker                                 uint8_t *output,
79*8975f5c5SAndroid Build Coastguard Worker                                 size_t outputRowPitch,
80*8975f5c5SAndroid Build Coastguard Worker                                 size_t outputDepthPitch)
81*8975f5c5SAndroid Build Coastguard Worker{
82*8975f5c5SAndroid Build Coastguard Worker    const type fourthValue = gl::bitCast<type>(fourthComponentBits);
83*8975f5c5SAndroid Build Coastguard Worker
84*8975f5c5SAndroid Build Coastguard Worker    for (size_t z = 0; z < depth; z++)
85*8975f5c5SAndroid Build Coastguard Worker    {
86*8975f5c5SAndroid Build Coastguard Worker        for (size_t y = 0; y < height; y++)
87*8975f5c5SAndroid Build Coastguard Worker        {
88*8975f5c5SAndroid Build Coastguard Worker            const type *source =
89*8975f5c5SAndroid Build Coastguard Worker                priv::OffsetDataPointer<type>(input, y, z, inputRowPitch, inputDepthPitch);
90*8975f5c5SAndroid Build Coastguard Worker            type *dest =
91*8975f5c5SAndroid Build Coastguard Worker                priv::OffsetDataPointer<type>(output, y, z, outputRowPitch, outputDepthPitch);
92*8975f5c5SAndroid Build Coastguard Worker            for (size_t x = 0; x < width; x++)
93*8975f5c5SAndroid Build Coastguard Worker            {
94*8975f5c5SAndroid Build Coastguard Worker                memcpy(&dest[x * 4], &source[x * 3], sizeof(type) * 3);
95*8975f5c5SAndroid Build Coastguard Worker                dest[x * 4 + 3] = fourthValue;
96*8975f5c5SAndroid Build Coastguard Worker            }
97*8975f5c5SAndroid Build Coastguard Worker        }
98*8975f5c5SAndroid Build Coastguard Worker    }
99*8975f5c5SAndroid Build Coastguard Worker}
100*8975f5c5SAndroid Build Coastguard Worker
101*8975f5c5SAndroid Build Coastguard Workertemplate <typename type, uint32_t fourthComponentBits>
102*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4(const ImageLoadContext &context,
103*8975f5c5SAndroid Build Coastguard Worker                             size_t width,
104*8975f5c5SAndroid Build Coastguard Worker                             size_t height,
105*8975f5c5SAndroid Build Coastguard Worker                             size_t depth,
106*8975f5c5SAndroid Build Coastguard Worker                             const uint8_t *input,
107*8975f5c5SAndroid Build Coastguard Worker                             size_t inputRowPitch,
108*8975f5c5SAndroid Build Coastguard Worker                             size_t inputDepthPitch,
109*8975f5c5SAndroid Build Coastguard Worker                             uint8_t *output,
110*8975f5c5SAndroid Build Coastguard Worker                             size_t outputRowPitch,
111*8975f5c5SAndroid Build Coastguard Worker                             size_t outputDepthPitch)
112*8975f5c5SAndroid Build Coastguard Worker{
113*8975f5c5SAndroid Build Coastguard Worker    LoadToNative3To4Impl<type>(context, fourthComponentBits, width, height, depth, input,
114*8975f5c5SAndroid Build Coastguard Worker                               inputRowPitch, inputDepthPitch, output, outputRowPitch,
115*8975f5c5SAndroid Build Coastguard Worker                               outputDepthPitch);
116*8975f5c5SAndroid Build Coastguard Worker}
117*8975f5c5SAndroid Build Coastguard Worker
118*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNativeByte3To4Impl(const ImageLoadContext &context,
119*8975f5c5SAndroid Build Coastguard Worker                                      const uint8_t fourthValue,
120*8975f5c5SAndroid Build Coastguard Worker                                      size_t width,
121*8975f5c5SAndroid Build Coastguard Worker                                      size_t height,
122*8975f5c5SAndroid Build Coastguard Worker                                      size_t depth,
123*8975f5c5SAndroid Build Coastguard Worker                                      const uint8_t *input,
124*8975f5c5SAndroid Build Coastguard Worker                                      size_t inputRowPitch,
125*8975f5c5SAndroid Build Coastguard Worker                                      size_t inputDepthPitch,
126*8975f5c5SAndroid Build Coastguard Worker                                      uint8_t *output,
127*8975f5c5SAndroid Build Coastguard Worker                                      size_t outputRowPitch,
128*8975f5c5SAndroid Build Coastguard Worker                                      size_t outputDepthPitch)
129*8975f5c5SAndroid Build Coastguard Worker{
130*8975f5c5SAndroid Build Coastguard Worker    // This function is used for both signed and unsigned byte copies.
131*8975f5c5SAndroid Build Coastguard Worker    ASSERT(IsLittleEndian());
132*8975f5c5SAndroid Build Coastguard Worker    uint32_t fourthValue32 = static_cast<uint32_t>(fourthValue) << 24;
133*8975f5c5SAndroid Build Coastguard Worker
134*8975f5c5SAndroid Build Coastguard Worker    // To prevent undefined behavior, if the output address is not aligned by 4, the copy would be
135*8975f5c5SAndroid Build Coastguard Worker    // done using the default function instead.
136*8975f5c5SAndroid Build Coastguard Worker    if (reinterpret_cast<uintptr_t>(output) % 4 != 0)
137*8975f5c5SAndroid Build Coastguard Worker    {
138*8975f5c5SAndroid Build Coastguard Worker        LoadToNative3To4Impl<uint8_t>(context, fourthValue, width, height, depth, input,
139*8975f5c5SAndroid Build Coastguard Worker                                      inputRowPitch, inputDepthPitch, output, outputRowPitch,
140*8975f5c5SAndroid Build Coastguard Worker                                      outputDepthPitch);
141*8975f5c5SAndroid Build Coastguard Worker        return;
142*8975f5c5SAndroid Build Coastguard Worker    }
143*8975f5c5SAndroid Build Coastguard Worker
144*8975f5c5SAndroid Build Coastguard Worker    for (size_t z = 0; z < depth; z++)
145*8975f5c5SAndroid Build Coastguard Worker    {
146*8975f5c5SAndroid Build Coastguard Worker        for (size_t y = 0; y < height; y++)
147*8975f5c5SAndroid Build Coastguard Worker        {
148*8975f5c5SAndroid Build Coastguard Worker            const uint8_t *source8 =
149*8975f5c5SAndroid Build Coastguard Worker                priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
150*8975f5c5SAndroid Build Coastguard Worker            uint8_t *dest8 =
151*8975f5c5SAndroid Build Coastguard Worker                priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
152*8975f5c5SAndroid Build Coastguard Worker
153*8975f5c5SAndroid Build Coastguard Worker            // If the uint8_t addresses are not aligned to 4 bytes, there may be undefined behavior
154*8975f5c5SAndroid Build Coastguard Worker            // if they are used to copy 32-bit data. In that case, pixels are copied to the output
155*8975f5c5SAndroid Build Coastguard Worker            // one at a time until 4-byte alignment has been achieved for the source.
156*8975f5c5SAndroid Build Coastguard Worker            size_t pixelIndex = 0;
157*8975f5c5SAndroid Build Coastguard Worker
158*8975f5c5SAndroid Build Coastguard Worker            uint32_t source4Mod = reinterpret_cast<uintptr_t>(source8) % 4;
159*8975f5c5SAndroid Build Coastguard Worker            while (source4Mod != 0 && pixelIndex < width)
160*8975f5c5SAndroid Build Coastguard Worker            {
161*8975f5c5SAndroid Build Coastguard Worker                dest8[0] = source8[0];
162*8975f5c5SAndroid Build Coastguard Worker                dest8[1] = source8[1];
163*8975f5c5SAndroid Build Coastguard Worker                dest8[2] = source8[2];
164*8975f5c5SAndroid Build Coastguard Worker                dest8[3] = fourthValue;
165*8975f5c5SAndroid Build Coastguard Worker
166*8975f5c5SAndroid Build Coastguard Worker                source8 += 3;
167*8975f5c5SAndroid Build Coastguard Worker                source4Mod = (source4Mod + 3) % 4;
168*8975f5c5SAndroid Build Coastguard Worker                dest8 += 4;
169*8975f5c5SAndroid Build Coastguard Worker                pixelIndex++;
170*8975f5c5SAndroid Build Coastguard Worker            }
171*8975f5c5SAndroid Build Coastguard Worker
172*8975f5c5SAndroid Build Coastguard Worker            if (pixelIndex == width)
173*8975f5c5SAndroid Build Coastguard Worker            {
174*8975f5c5SAndroid Build Coastguard Worker                continue;
175*8975f5c5SAndroid Build Coastguard Worker            }
176*8975f5c5SAndroid Build Coastguard Worker
177*8975f5c5SAndroid Build Coastguard Worker            // In the following loop, 4 RGB pixels will be read in each iteration. If the remaining
178*8975f5c5SAndroid Build Coastguard Worker            // pixels are not a multiple of 4, the rest at the end of the row will be copied one at
179*8975f5c5SAndroid Build Coastguard Worker            // a time.
180*8975f5c5SAndroid Build Coastguard Worker            const uint32_t *source32 = reinterpret_cast<const uint32_t *>(source8);
181*8975f5c5SAndroid Build Coastguard Worker            uint32_t *dest32         = reinterpret_cast<uint32_t *>(dest8);
182*8975f5c5SAndroid Build Coastguard Worker
183*8975f5c5SAndroid Build Coastguard Worker            size_t remainingWidth = width - pixelIndex;
184*8975f5c5SAndroid Build Coastguard Worker            if (remainingWidth >= 4)
185*8975f5c5SAndroid Build Coastguard Worker            {
186*8975f5c5SAndroid Build Coastguard Worker                size_t fourByteCopyThreshold = remainingWidth - 4;
187*8975f5c5SAndroid Build Coastguard Worker                for (; pixelIndex <= fourByteCopyThreshold; pixelIndex += 4)
188*8975f5c5SAndroid Build Coastguard Worker                {
189*8975f5c5SAndroid Build Coastguard Worker                    // Three 32-bit values from the input contain 4 RGB pixels in total. This
190*8975f5c5SAndroid Build Coastguard Worker                    // translates to four 32-bits on the output.
191*8975f5c5SAndroid Build Coastguard Worker                    // (RGBR GBRG BRGB -> RGBA RGBA RGBA RGBA)
192*8975f5c5SAndroid Build Coastguard Worker                    uint32_t newPixelData[3];
193*8975f5c5SAndroid Build Coastguard Worker                    uint32_t rgbaPixelData[4];
194*8975f5c5SAndroid Build Coastguard Worker                    memcpy(&newPixelData[0], &source32[0], sizeof(uint32_t) * 3);
195*8975f5c5SAndroid Build Coastguard Worker
196*8975f5c5SAndroid Build Coastguard Worker                    rgbaPixelData[0] = (newPixelData[0] & 0x00FFFFFF) | fourthValue32;
197*8975f5c5SAndroid Build Coastguard Worker                    rgbaPixelData[1] = (newPixelData[0] >> 24) |
198*8975f5c5SAndroid Build Coastguard Worker                                       ((newPixelData[1] & 0x0000FFFF) << 8) | fourthValue32;
199*8975f5c5SAndroid Build Coastguard Worker                    rgbaPixelData[2] = (newPixelData[1] >> 16) |
200*8975f5c5SAndroid Build Coastguard Worker                                       ((newPixelData[2] & 0x000000FF) << 16) | fourthValue32;
201*8975f5c5SAndroid Build Coastguard Worker                    rgbaPixelData[3] = (newPixelData[2] >> 8) | fourthValue32;
202*8975f5c5SAndroid Build Coastguard Worker
203*8975f5c5SAndroid Build Coastguard Worker                    memcpy(&dest32[0], &rgbaPixelData[0], sizeof(uint32_t) * 4);
204*8975f5c5SAndroid Build Coastguard Worker
205*8975f5c5SAndroid Build Coastguard Worker                    source32 += 3;
206*8975f5c5SAndroid Build Coastguard Worker                    dest32 += 4;
207*8975f5c5SAndroid Build Coastguard Worker                }
208*8975f5c5SAndroid Build Coastguard Worker            }
209*8975f5c5SAndroid Build Coastguard Worker
210*8975f5c5SAndroid Build Coastguard Worker            // We should copy the remaining pixels at the end one by one.
211*8975f5c5SAndroid Build Coastguard Worker            source8 = reinterpret_cast<const uint8_t *>(source32);
212*8975f5c5SAndroid Build Coastguard Worker            dest8   = reinterpret_cast<uint8_t *>(dest32);
213*8975f5c5SAndroid Build Coastguard Worker            for (; pixelIndex < width; pixelIndex++)
214*8975f5c5SAndroid Build Coastguard Worker            {
215*8975f5c5SAndroid Build Coastguard Worker                dest8[0] = source8[0];
216*8975f5c5SAndroid Build Coastguard Worker                dest8[1] = source8[1];
217*8975f5c5SAndroid Build Coastguard Worker                dest8[2] = source8[2];
218*8975f5c5SAndroid Build Coastguard Worker                dest8[3] = fourthValue;
219*8975f5c5SAndroid Build Coastguard Worker
220*8975f5c5SAndroid Build Coastguard Worker                source8 += 3;
221*8975f5c5SAndroid Build Coastguard Worker                dest8 += 4;
222*8975f5c5SAndroid Build Coastguard Worker            }
223*8975f5c5SAndroid Build Coastguard Worker        }
224*8975f5c5SAndroid Build Coastguard Worker    }
225*8975f5c5SAndroid Build Coastguard Worker}
226*8975f5c5SAndroid Build Coastguard Worker
227*8975f5c5SAndroid Build Coastguard Workertemplate <>
228*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4<uint8_t, 0xFF>(const ImageLoadContext &context,
229*8975f5c5SAndroid Build Coastguard Worker                                            size_t width,
230*8975f5c5SAndroid Build Coastguard Worker                                            size_t height,
231*8975f5c5SAndroid Build Coastguard Worker                                            size_t depth,
232*8975f5c5SAndroid Build Coastguard Worker                                            const uint8_t *input,
233*8975f5c5SAndroid Build Coastguard Worker                                            size_t inputRowPitch,
234*8975f5c5SAndroid Build Coastguard Worker                                            size_t inputDepthPitch,
235*8975f5c5SAndroid Build Coastguard Worker                                            uint8_t *output,
236*8975f5c5SAndroid Build Coastguard Worker                                            size_t outputRowPitch,
237*8975f5c5SAndroid Build Coastguard Worker                                            size_t outputDepthPitch)
238*8975f5c5SAndroid Build Coastguard Worker{
239*8975f5c5SAndroid Build Coastguard Worker    LoadToNativeByte3To4Impl(context, 0xFF, width, height, depth, input, inputRowPitch,
240*8975f5c5SAndroid Build Coastguard Worker                              inputDepthPitch, output, outputRowPitch, outputDepthPitch);
241*8975f5c5SAndroid Build Coastguard Worker}
242*8975f5c5SAndroid Build Coastguard Worker
243*8975f5c5SAndroid Build Coastguard Workertemplate <>
244*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4<uint8_t, 0x01>(const ImageLoadContext &context,
245*8975f5c5SAndroid Build Coastguard Worker                                            size_t width,
246*8975f5c5SAndroid Build Coastguard Worker                                            size_t height,
247*8975f5c5SAndroid Build Coastguard Worker                                            size_t depth,
248*8975f5c5SAndroid Build Coastguard Worker                                            const uint8_t *input,
249*8975f5c5SAndroid Build Coastguard Worker                                            size_t inputRowPitch,
250*8975f5c5SAndroid Build Coastguard Worker                                            size_t inputDepthPitch,
251*8975f5c5SAndroid Build Coastguard Worker                                            uint8_t *output,
252*8975f5c5SAndroid Build Coastguard Worker                                            size_t outputRowPitch,
253*8975f5c5SAndroid Build Coastguard Worker                                            size_t outputDepthPitch)
254*8975f5c5SAndroid Build Coastguard Worker{
255*8975f5c5SAndroid Build Coastguard Worker    LoadToNativeByte3To4Impl(context, 0x01, width, height, depth, input, inputRowPitch,
256*8975f5c5SAndroid Build Coastguard Worker                              inputDepthPitch, output, outputRowPitch, outputDepthPitch);
257*8975f5c5SAndroid Build Coastguard Worker}
258*8975f5c5SAndroid Build Coastguard Worker
259*8975f5c5SAndroid Build Coastguard Workertemplate <>
260*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4<int8_t, 0x01>(const ImageLoadContext &context,
261*8975f5c5SAndroid Build Coastguard Worker                                            size_t width,
262*8975f5c5SAndroid Build Coastguard Worker                                            size_t height,
263*8975f5c5SAndroid Build Coastguard Worker                                            size_t depth,
264*8975f5c5SAndroid Build Coastguard Worker                                            const uint8_t *input,
265*8975f5c5SAndroid Build Coastguard Worker                                            size_t inputRowPitch,
266*8975f5c5SAndroid Build Coastguard Worker                                            size_t inputDepthPitch,
267*8975f5c5SAndroid Build Coastguard Worker                                            uint8_t *output,
268*8975f5c5SAndroid Build Coastguard Worker                                            size_t outputRowPitch,
269*8975f5c5SAndroid Build Coastguard Worker                                            size_t outputDepthPitch)
270*8975f5c5SAndroid Build Coastguard Worker{
271*8975f5c5SAndroid Build Coastguard Worker    LoadToNativeByte3To4Impl(context, 0x01, width, height, depth, input, inputRowPitch,
272*8975f5c5SAndroid Build Coastguard Worker                              inputDepthPitch, output, outputRowPitch, outputDepthPitch);
273*8975f5c5SAndroid Build Coastguard Worker}
274*8975f5c5SAndroid Build Coastguard Worker
275*8975f5c5SAndroid Build Coastguard Workertemplate <>
276*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4<int8_t, 0x7F>(const ImageLoadContext &context,
277*8975f5c5SAndroid Build Coastguard Worker                                            size_t width,
278*8975f5c5SAndroid Build Coastguard Worker                                            size_t height,
279*8975f5c5SAndroid Build Coastguard Worker                                            size_t depth,
280*8975f5c5SAndroid Build Coastguard Worker                                            const uint8_t *input,
281*8975f5c5SAndroid Build Coastguard Worker                                            size_t inputRowPitch,
282*8975f5c5SAndroid Build Coastguard Worker                                            size_t inputDepthPitch,
283*8975f5c5SAndroid Build Coastguard Worker                                            uint8_t *output,
284*8975f5c5SAndroid Build Coastguard Worker                                            size_t outputRowPitch,
285*8975f5c5SAndroid Build Coastguard Worker                                            size_t outputDepthPitch)
286*8975f5c5SAndroid Build Coastguard Worker{
287*8975f5c5SAndroid Build Coastguard Worker    LoadToNativeByte3To4Impl(context, 0x7F, width, height, depth, input, inputRowPitch,
288*8975f5c5SAndroid Build Coastguard Worker                              inputDepthPitch, output, outputRowPitch, outputDepthPitch);
289*8975f5c5SAndroid Build Coastguard Worker}
290*8975f5c5SAndroid Build Coastguard Worker
291*8975f5c5SAndroid Build Coastguard Workertemplate <size_t componentCount>
292*8975f5c5SAndroid Build Coastguard Workerinline void Load32FTo16F(const ImageLoadContext &context, size_t width, size_t height, size_t depth,
293*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
294*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
295*8975f5c5SAndroid Build Coastguard Worker{
296*8975f5c5SAndroid Build Coastguard Worker    const size_t elementWidth = componentCount * width;
297*8975f5c5SAndroid Build Coastguard Worker
298*8975f5c5SAndroid Build Coastguard Worker    for (size_t z = 0; z < depth; z++)
299*8975f5c5SAndroid Build Coastguard Worker    {
300*8975f5c5SAndroid Build Coastguard Worker        for (size_t y = 0; y < height; y++)
301*8975f5c5SAndroid Build Coastguard Worker        {
302*8975f5c5SAndroid Build Coastguard Worker            const float *source = priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
303*8975f5c5SAndroid Build Coastguard Worker            uint16_t *dest = priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
304*8975f5c5SAndroid Build Coastguard Worker
305*8975f5c5SAndroid Build Coastguard Worker            for (size_t x = 0; x < elementWidth; x++)
306*8975f5c5SAndroid Build Coastguard Worker            {
307*8975f5c5SAndroid Build Coastguard Worker                dest[x] = gl::float32ToFloat16(source[x]);
308*8975f5c5SAndroid Build Coastguard Worker            }
309*8975f5c5SAndroid Build Coastguard Worker        }
310*8975f5c5SAndroid Build Coastguard Worker    }
311*8975f5c5SAndroid Build Coastguard Worker}
312*8975f5c5SAndroid Build Coastguard Worker
313*8975f5c5SAndroid Build Coastguard Workertemplate <typename type,
314*8975f5c5SAndroid Build Coastguard Worker          size_t inputComponentCount,
315*8975f5c5SAndroid Build Coastguard Worker          size_t outputComponentCount,
316*8975f5c5SAndroid Build Coastguard Worker          bool normalized>
317*8975f5c5SAndroid Build Coastguard Workerinline void LoadToFloat(const ImageLoadContext &context, size_t width, size_t height, size_t depth,
318*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
319*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch) {
320*8975f5c5SAndroid Build Coastguard Worker    typedef std::numeric_limits<type> NL;
321*8975f5c5SAndroid Build Coastguard Worker
322*8975f5c5SAndroid Build Coastguard Worker    for (size_t z = 0; z < depth; z++)
323*8975f5c5SAndroid Build Coastguard Worker    {
324*8975f5c5SAndroid Build Coastguard Worker        for (size_t y = 0; y < height; y++)
325*8975f5c5SAndroid Build Coastguard Worker        {
326*8975f5c5SAndroid Build Coastguard Worker            const type *source_line = priv::OffsetDataPointer<type>(input, y, z, inputRowPitch, inputDepthPitch);
327*8975f5c5SAndroid Build Coastguard Worker            float *dest_line = priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
328*8975f5c5SAndroid Build Coastguard Worker
329*8975f5c5SAndroid Build Coastguard Worker            for (size_t x = 0; x < width; x++)
330*8975f5c5SAndroid Build Coastguard Worker            {
331*8975f5c5SAndroid Build Coastguard Worker                const type *source_pixel = source_line + x * inputComponentCount;
332*8975f5c5SAndroid Build Coastguard Worker                float *dest_pixel = dest_line + x * outputComponentCount;
333*8975f5c5SAndroid Build Coastguard Worker
334*8975f5c5SAndroid Build Coastguard Worker                for (size_t i = 0; i < inputComponentCount; i++)
335*8975f5c5SAndroid Build Coastguard Worker                {
336*8975f5c5SAndroid Build Coastguard Worker                    float result = 0;
337*8975f5c5SAndroid Build Coastguard Worker                    if (normalized)
338*8975f5c5SAndroid Build Coastguard Worker                    {
339*8975f5c5SAndroid Build Coastguard Worker                        if (NL::is_signed)
340*8975f5c5SAndroid Build Coastguard Worker                        {
341*8975f5c5SAndroid Build Coastguard Worker                            result = static_cast<float>(source_pixel[i]) / static_cast<float>(NL::max());
342*8975f5c5SAndroid Build Coastguard Worker                            result = result >= -1.0f ? result : -1.0f;
343*8975f5c5SAndroid Build Coastguard Worker                        }
344*8975f5c5SAndroid Build Coastguard Worker                        else
345*8975f5c5SAndroid Build Coastguard Worker                        {
346*8975f5c5SAndroid Build Coastguard Worker                            result = static_cast<float>(source_pixel[i]) / static_cast<float>(NL::max());
347*8975f5c5SAndroid Build Coastguard Worker                        }
348*8975f5c5SAndroid Build Coastguard Worker                    }
349*8975f5c5SAndroid Build Coastguard Worker                    else
350*8975f5c5SAndroid Build Coastguard Worker                    {
351*8975f5c5SAndroid Build Coastguard Worker                        result = static_cast<float>(source_pixel[i]);
352*8975f5c5SAndroid Build Coastguard Worker                    }
353*8975f5c5SAndroid Build Coastguard Worker                    dest_pixel[i] = result;
354*8975f5c5SAndroid Build Coastguard Worker                }
355*8975f5c5SAndroid Build Coastguard Worker
356*8975f5c5SAndroid Build Coastguard Worker                for (size_t j = inputComponentCount; j < outputComponentCount; j++)
357*8975f5c5SAndroid Build Coastguard Worker                {
358*8975f5c5SAndroid Build Coastguard Worker                    dest_pixel[j] = j == 3 ? 1.0f : 0.0f;
359*8975f5c5SAndroid Build Coastguard Worker                }
360*8975f5c5SAndroid Build Coastguard Worker            }
361*8975f5c5SAndroid Build Coastguard Worker        }
362*8975f5c5SAndroid Build Coastguard Worker    }
363*8975f5c5SAndroid Build Coastguard Worker}
364*8975f5c5SAndroid Build Coastguard Worker
365*8975f5c5SAndroid Build Coastguard Workertemplate <size_t blockWidth, size_t blockHeight, size_t blockDepth, size_t blockSize>
366*8975f5c5SAndroid Build Coastguard Workerinline void LoadCompressedToNative(const ImageLoadContext &context, size_t width, size_t height,
367*8975f5c5SAndroid Build Coastguard Worker                                   size_t depth, const uint8_t *input, size_t inputRowPitch,
368*8975f5c5SAndroid Build Coastguard Worker                                   size_t inputDepthPitch, uint8_t *output, size_t outputRowPitch,
369*8975f5c5SAndroid Build Coastguard Worker                                   size_t outputDepthPitch)
370*8975f5c5SAndroid Build Coastguard Worker{
371*8975f5c5SAndroid Build Coastguard Worker    const size_t columns = (width + (blockWidth - 1)) / blockWidth;
372*8975f5c5SAndroid Build Coastguard Worker    const size_t rows = (height + (blockHeight - 1)) / blockHeight;
373*8975f5c5SAndroid Build Coastguard Worker    const size_t layers = (depth + (blockDepth - 1)) / blockDepth;
374*8975f5c5SAndroid Build Coastguard Worker
375*8975f5c5SAndroid Build Coastguard Worker    const size_t inputLayerSize = inputRowPitch * rows;
376*8975f5c5SAndroid Build Coastguard Worker    const size_t inputImageSize = inputDepthPitch * layers;
377*8975f5c5SAndroid Build Coastguard Worker
378*8975f5c5SAndroid Build Coastguard Worker    const size_t outputLayerSize = outputRowPitch * rows;
379*8975f5c5SAndroid Build Coastguard Worker    const size_t outputImageSize = outputDepthPitch * layers;
380*8975f5c5SAndroid Build Coastguard Worker
381*8975f5c5SAndroid Build Coastguard Worker    if (inputImageSize == outputImageSize)
382*8975f5c5SAndroid Build Coastguard Worker    {
383*8975f5c5SAndroid Build Coastguard Worker        ASSERT(inputRowPitch == outputRowPitch);
384*8975f5c5SAndroid Build Coastguard Worker        ASSERT(inputLayerSize == outputLayerSize && inputLayerSize == inputDepthPitch && outputLayerSize == outputDepthPitch);
385*8975f5c5SAndroid Build Coastguard Worker        memcpy(output, input, inputImageSize);
386*8975f5c5SAndroid Build Coastguard Worker    }
387*8975f5c5SAndroid Build Coastguard Worker    else
388*8975f5c5SAndroid Build Coastguard Worker    {
389*8975f5c5SAndroid Build Coastguard Worker        // Note: this path should technically never be hit, but it is with the d3d backend.  Once
390*8975f5c5SAndroid Build Coastguard Worker        // the issue is fixed, this path should be removed.
391*8975f5c5SAndroid Build Coastguard Worker        // http://anglebug.com/42266773
392*8975f5c5SAndroid Build Coastguard Worker        for (size_t z = 0; z < layers; ++z)
393*8975f5c5SAndroid Build Coastguard Worker        {
394*8975f5c5SAndroid Build Coastguard Worker            for (size_t y = 0; y < rows; ++y)
395*8975f5c5SAndroid Build Coastguard Worker            {
396*8975f5c5SAndroid Build Coastguard Worker                const uint8_t *source = priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
397*8975f5c5SAndroid Build Coastguard Worker                uint8_t *dest = priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
398*8975f5c5SAndroid Build Coastguard Worker                memcpy(dest, source, columns * blockSize);
399*8975f5c5SAndroid Build Coastguard Worker            }
400*8975f5c5SAndroid Build Coastguard Worker        }
401*8975f5c5SAndroid Build Coastguard Worker    }
402*8975f5c5SAndroid Build Coastguard Worker}
403*8975f5c5SAndroid Build Coastguard Worker
404*8975f5c5SAndroid Build Coastguard Workertemplate <typename type, uint32_t firstBits, uint32_t secondBits, uint32_t thirdBits, uint32_t fourthBits>
405*8975f5c5SAndroid Build Coastguard Workerinline void Initialize4ComponentData(size_t width, size_t height, size_t depth,
406*8975f5c5SAndroid Build Coastguard Worker                                     uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
407*8975f5c5SAndroid Build Coastguard Worker{
408*8975f5c5SAndroid Build Coastguard Worker    type writeValues[4] =
409*8975f5c5SAndroid Build Coastguard Worker    {
410*8975f5c5SAndroid Build Coastguard Worker        gl::bitCast<type>(firstBits),
411*8975f5c5SAndroid Build Coastguard Worker        gl::bitCast<type>(secondBits),
412*8975f5c5SAndroid Build Coastguard Worker        gl::bitCast<type>(thirdBits),
413*8975f5c5SAndroid Build Coastguard Worker        gl::bitCast<type>(fourthBits),
414*8975f5c5SAndroid Build Coastguard Worker    };
415*8975f5c5SAndroid Build Coastguard Worker
416*8975f5c5SAndroid Build Coastguard Worker    for (size_t z = 0; z < depth; z++)
417*8975f5c5SAndroid Build Coastguard Worker    {
418*8975f5c5SAndroid Build Coastguard Worker        for (size_t y = 0; y < height; y++)
419*8975f5c5SAndroid Build Coastguard Worker        {
420*8975f5c5SAndroid Build Coastguard Worker            type *destRow = priv::OffsetDataPointer<type>(output, y, z, outputRowPitch, outputDepthPitch);
421*8975f5c5SAndroid Build Coastguard Worker            for (size_t x = 0; x < width; x++)
422*8975f5c5SAndroid Build Coastguard Worker            {
423*8975f5c5SAndroid Build Coastguard Worker                type* destPixel = destRow + x * 4;
424*8975f5c5SAndroid Build Coastguard Worker
425*8975f5c5SAndroid Build Coastguard Worker                // This could potentially be optimized by generating an entire row of initialization
426*8975f5c5SAndroid Build Coastguard Worker                // data and copying row by row instead of pixel by pixel.
427*8975f5c5SAndroid Build Coastguard Worker                memcpy(destPixel, writeValues, sizeof(type) * 4);
428*8975f5c5SAndroid Build Coastguard Worker            }
429*8975f5c5SAndroid Build Coastguard Worker        }
430*8975f5c5SAndroid Build Coastguard Worker    }
431*8975f5c5SAndroid Build Coastguard Worker}
432*8975f5c5SAndroid Build Coastguard Worker
433*8975f5c5SAndroid Build Coastguard Workertemplate <size_t blockWidth, size_t blockHeight>
434*8975f5c5SAndroid Build Coastguard Workerinline void LoadASTCToRGBA8(const ImageLoadContext &context,
435*8975f5c5SAndroid Build Coastguard Worker                            size_t width,
436*8975f5c5SAndroid Build Coastguard Worker                            size_t height,
437*8975f5c5SAndroid Build Coastguard Worker                            size_t depth,
438*8975f5c5SAndroid Build Coastguard Worker                            const uint8_t *input,
439*8975f5c5SAndroid Build Coastguard Worker                            size_t inputRowPitch,
440*8975f5c5SAndroid Build Coastguard Worker                            size_t inputDepthPitch,
441*8975f5c5SAndroid Build Coastguard Worker                            uint8_t *output,
442*8975f5c5SAndroid Build Coastguard Worker                            size_t outputRowPitch,
443*8975f5c5SAndroid Build Coastguard Worker                            size_t outputDepthPitch)
444*8975f5c5SAndroid Build Coastguard Worker{
445*8975f5c5SAndroid Build Coastguard Worker    LoadASTCToRGBA8Inner(context, width, height, depth, blockWidth, blockHeight, input, inputRowPitch,
446*8975f5c5SAndroid Build Coastguard Worker                         inputDepthPitch, output, outputRowPitch, outputDepthPitch);
447*8975f5c5SAndroid Build Coastguard Worker}
448*8975f5c5SAndroid Build Coastguard Worker
449*8975f5c5SAndroid Build Coastguard Workertemplate <uint32_t indexBits, uint32_t redBlueBits, uint32_t greenBits, uint32_t alphaBits>
450*8975f5c5SAndroid Build Coastguard Workerinline void LoadPalettedToRGBA8(const ImageLoadContext &context,
451*8975f5c5SAndroid Build Coastguard Worker                                size_t width,
452*8975f5c5SAndroid Build Coastguard Worker                                size_t height,
453*8975f5c5SAndroid Build Coastguard Worker                                size_t depth,
454*8975f5c5SAndroid Build Coastguard Worker                                const uint8_t *input,
455*8975f5c5SAndroid Build Coastguard Worker                                size_t inputRowPitch,
456*8975f5c5SAndroid Build Coastguard Worker                                size_t inputDepthPitch,
457*8975f5c5SAndroid Build Coastguard Worker                                uint8_t *output,
458*8975f5c5SAndroid Build Coastguard Worker                                size_t outputRowPitch,
459*8975f5c5SAndroid Build Coastguard Worker                                size_t outputDepthPitch)
460*8975f5c5SAndroid Build Coastguard Worker{
461*8975f5c5SAndroid Build Coastguard Worker    static_assert(indexBits == 4 || indexBits == 8);
462*8975f5c5SAndroid Build Coastguard Worker    static_assert(redBlueBits == 4 || redBlueBits == 5 || redBlueBits == 8);
463*8975f5c5SAndroid Build Coastguard Worker    static_assert(greenBits == 4 || greenBits == 5 || greenBits == 6 || greenBits == 8);
464*8975f5c5SAndroid Build Coastguard Worker    static_assert(alphaBits == 0 || alphaBits == 1 || alphaBits == 4 || alphaBits == 8);
465*8975f5c5SAndroid Build Coastguard Worker    constexpr uint32_t colorBits = 2 * redBlueBits + greenBits + alphaBits;
466*8975f5c5SAndroid Build Coastguard Worker    static_assert(colorBits == 16 || colorBits == 24 || colorBits == 32);
467*8975f5c5SAndroid Build Coastguard Worker
468*8975f5c5SAndroid Build Coastguard Worker    LoadPalettedToRGBA8Impl(context, width, height, depth,
469*8975f5c5SAndroid Build Coastguard Worker                            indexBits, redBlueBits, greenBits, alphaBits,
470*8975f5c5SAndroid Build Coastguard Worker                            input, inputRowPitch, inputDepthPitch,
471*8975f5c5SAndroid Build Coastguard Worker                            output, outputRowPitch, outputDepthPitch);
472*8975f5c5SAndroid Build Coastguard Worker}
473*8975f5c5SAndroid Build Coastguard Worker
474*8975f5c5SAndroid Build Coastguard Worker// Temporary overload functions; need to have no-context overloads of the following functions used
475*8975f5c5SAndroid Build Coastguard Worker// by Chromium.  A Chromium change will switch to the with-context overloads, and then these can be
476*8975f5c5SAndroid Build Coastguard Worker// removed.
477*8975f5c5SAndroid Build Coastguard Workerinline void LoadEACR11ToR8(size_t width,
478*8975f5c5SAndroid Build Coastguard Worker                           size_t height,
479*8975f5c5SAndroid Build Coastguard Worker                           size_t depth,
480*8975f5c5SAndroid Build Coastguard Worker                           const uint8_t *input,
481*8975f5c5SAndroid Build Coastguard Worker                           size_t inputRowPitch,
482*8975f5c5SAndroid Build Coastguard Worker                           size_t inputDepthPitch,
483*8975f5c5SAndroid Build Coastguard Worker                           uint8_t *output,
484*8975f5c5SAndroid Build Coastguard Worker                           size_t outputRowPitch,
485*8975f5c5SAndroid Build Coastguard Worker                           size_t outputDepthPitch)
486*8975f5c5SAndroid Build Coastguard Worker{
487*8975f5c5SAndroid Build Coastguard Worker    LoadEACR11ToR8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
488*8975f5c5SAndroid Build Coastguard Worker                   outputRowPitch, outputDepthPitch);
489*8975f5c5SAndroid Build Coastguard Worker}
490*8975f5c5SAndroid Build Coastguard Worker
491*8975f5c5SAndroid Build Coastguard Workerinline void LoadEACR11SToR8(size_t width,
492*8975f5c5SAndroid Build Coastguard Worker                            size_t height,
493*8975f5c5SAndroid Build Coastguard Worker                            size_t depth,
494*8975f5c5SAndroid Build Coastguard Worker                            const uint8_t *input,
495*8975f5c5SAndroid Build Coastguard Worker                            size_t inputRowPitch,
496*8975f5c5SAndroid Build Coastguard Worker                            size_t inputDepthPitch,
497*8975f5c5SAndroid Build Coastguard Worker                            uint8_t *output,
498*8975f5c5SAndroid Build Coastguard Worker                            size_t outputRowPitch,
499*8975f5c5SAndroid Build Coastguard Worker                            size_t outputDepthPitch)
500*8975f5c5SAndroid Build Coastguard Worker{
501*8975f5c5SAndroid Build Coastguard Worker    LoadEACR11SToR8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
502*8975f5c5SAndroid Build Coastguard Worker                    outputRowPitch, outputDepthPitch);
503*8975f5c5SAndroid Build Coastguard Worker}
504*8975f5c5SAndroid Build Coastguard Worker
505*8975f5c5SAndroid Build Coastguard Workerinline void LoadEACRG11ToRG8(size_t width,
506*8975f5c5SAndroid Build Coastguard Worker                             size_t height,
507*8975f5c5SAndroid Build Coastguard Worker                             size_t depth,
508*8975f5c5SAndroid Build Coastguard Worker                             const uint8_t *input,
509*8975f5c5SAndroid Build Coastguard Worker                             size_t inputRowPitch,
510*8975f5c5SAndroid Build Coastguard Worker                             size_t inputDepthPitch,
511*8975f5c5SAndroid Build Coastguard Worker                             uint8_t *output,
512*8975f5c5SAndroid Build Coastguard Worker                             size_t outputRowPitch,
513*8975f5c5SAndroid Build Coastguard Worker                             size_t outputDepthPitch)
514*8975f5c5SAndroid Build Coastguard Worker{
515*8975f5c5SAndroid Build Coastguard Worker    LoadEACRG11ToRG8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
516*8975f5c5SAndroid Build Coastguard Worker                     outputRowPitch, outputDepthPitch);
517*8975f5c5SAndroid Build Coastguard Worker}
518*8975f5c5SAndroid Build Coastguard Worker
519*8975f5c5SAndroid Build Coastguard Workerinline void LoadEACRG11SToRG8(size_t width,
520*8975f5c5SAndroid Build Coastguard Worker                              size_t height,
521*8975f5c5SAndroid Build Coastguard Worker                              size_t depth,
522*8975f5c5SAndroid Build Coastguard Worker                              const uint8_t *input,
523*8975f5c5SAndroid Build Coastguard Worker                              size_t inputRowPitch,
524*8975f5c5SAndroid Build Coastguard Worker                              size_t inputDepthPitch,
525*8975f5c5SAndroid Build Coastguard Worker                              uint8_t *output,
526*8975f5c5SAndroid Build Coastguard Worker                              size_t outputRowPitch,
527*8975f5c5SAndroid Build Coastguard Worker                              size_t outputDepthPitch)
528*8975f5c5SAndroid Build Coastguard Worker{
529*8975f5c5SAndroid Build Coastguard Worker    LoadEACRG11SToRG8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
530*8975f5c5SAndroid Build Coastguard Worker                      outputRowPitch, outputDepthPitch);
531*8975f5c5SAndroid Build Coastguard Worker}
532*8975f5c5SAndroid Build Coastguard Worker
533*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2RGB8ToRGBA8(size_t width,
534*8975f5c5SAndroid Build Coastguard Worker                                size_t height,
535*8975f5c5SAndroid Build Coastguard Worker                                size_t depth,
536*8975f5c5SAndroid Build Coastguard Worker                                const uint8_t *input,
537*8975f5c5SAndroid Build Coastguard Worker                                size_t inputRowPitch,
538*8975f5c5SAndroid Build Coastguard Worker                                size_t inputDepthPitch,
539*8975f5c5SAndroid Build Coastguard Worker                                uint8_t *output,
540*8975f5c5SAndroid Build Coastguard Worker                                size_t outputRowPitch,
541*8975f5c5SAndroid Build Coastguard Worker                                size_t outputDepthPitch)
542*8975f5c5SAndroid Build Coastguard Worker{
543*8975f5c5SAndroid Build Coastguard Worker    LoadETC2RGB8ToRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
544*8975f5c5SAndroid Build Coastguard Worker                        outputRowPitch, outputDepthPitch);
545*8975f5c5SAndroid Build Coastguard Worker}
546*8975f5c5SAndroid Build Coastguard Worker
547*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2SRGB8ToRGBA8(size_t width,
548*8975f5c5SAndroid Build Coastguard Worker                                 size_t height,
549*8975f5c5SAndroid Build Coastguard Worker                                 size_t depth,
550*8975f5c5SAndroid Build Coastguard Worker                                 const uint8_t *input,
551*8975f5c5SAndroid Build Coastguard Worker                                 size_t inputRowPitch,
552*8975f5c5SAndroid Build Coastguard Worker                                 size_t inputDepthPitch,
553*8975f5c5SAndroid Build Coastguard Worker                                 uint8_t *output,
554*8975f5c5SAndroid Build Coastguard Worker                                 size_t outputRowPitch,
555*8975f5c5SAndroid Build Coastguard Worker                                 size_t outputDepthPitch)
556*8975f5c5SAndroid Build Coastguard Worker{
557*8975f5c5SAndroid Build Coastguard Worker    LoadETC2SRGB8ToRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
558*8975f5c5SAndroid Build Coastguard Worker                         outputRowPitch, outputDepthPitch);
559*8975f5c5SAndroid Build Coastguard Worker}
560*8975f5c5SAndroid Build Coastguard Worker
561*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2RGBA8ToRGBA8(size_t width,
562*8975f5c5SAndroid Build Coastguard Worker                                 size_t height,
563*8975f5c5SAndroid Build Coastguard Worker                                 size_t depth,
564*8975f5c5SAndroid Build Coastguard Worker                                 const uint8_t *input,
565*8975f5c5SAndroid Build Coastguard Worker                                 size_t inputRowPitch,
566*8975f5c5SAndroid Build Coastguard Worker                                 size_t inputDepthPitch,
567*8975f5c5SAndroid Build Coastguard Worker                                 uint8_t *output,
568*8975f5c5SAndroid Build Coastguard Worker                                 size_t outputRowPitch,
569*8975f5c5SAndroid Build Coastguard Worker                                 size_t outputDepthPitch)
570*8975f5c5SAndroid Build Coastguard Worker{
571*8975f5c5SAndroid Build Coastguard Worker    LoadETC2RGBA8ToRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
572*8975f5c5SAndroid Build Coastguard Worker                         outputRowPitch, outputDepthPitch);
573*8975f5c5SAndroid Build Coastguard Worker}
574*8975f5c5SAndroid Build Coastguard Worker
575*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2RGB8A1ToRGBA8(size_t width,
576*8975f5c5SAndroid Build Coastguard Worker                                  size_t height,
577*8975f5c5SAndroid Build Coastguard Worker                                  size_t depth,
578*8975f5c5SAndroid Build Coastguard Worker                                  const uint8_t *input,
579*8975f5c5SAndroid Build Coastguard Worker                                  size_t inputRowPitch,
580*8975f5c5SAndroid Build Coastguard Worker                                  size_t inputDepthPitch,
581*8975f5c5SAndroid Build Coastguard Worker                                  uint8_t *output,
582*8975f5c5SAndroid Build Coastguard Worker                                  size_t outputRowPitch,
583*8975f5c5SAndroid Build Coastguard Worker                                  size_t outputDepthPitch)
584*8975f5c5SAndroid Build Coastguard Worker{
585*8975f5c5SAndroid Build Coastguard Worker    LoadETC2RGB8A1ToRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
586*8975f5c5SAndroid Build Coastguard Worker                          outputRowPitch, outputDepthPitch);
587*8975f5c5SAndroid Build Coastguard Worker}
588*8975f5c5SAndroid Build Coastguard Worker
589*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2SRGBA8ToSRGBA8(size_t width,
590*8975f5c5SAndroid Build Coastguard Worker                                   size_t height,
591*8975f5c5SAndroid Build Coastguard Worker                                   size_t depth,
592*8975f5c5SAndroid Build Coastguard Worker                                   const uint8_t *input,
593*8975f5c5SAndroid Build Coastguard Worker                                   size_t inputRowPitch,
594*8975f5c5SAndroid Build Coastguard Worker                                   size_t inputDepthPitch,
595*8975f5c5SAndroid Build Coastguard Worker                                   uint8_t *output,
596*8975f5c5SAndroid Build Coastguard Worker                                   size_t outputRowPitch,
597*8975f5c5SAndroid Build Coastguard Worker                                   size_t outputDepthPitch)
598*8975f5c5SAndroid Build Coastguard Worker{
599*8975f5c5SAndroid Build Coastguard Worker    LoadETC2SRGBA8ToSRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
600*8975f5c5SAndroid Build Coastguard Worker                           outputRowPitch, outputDepthPitch);
601*8975f5c5SAndroid Build Coastguard Worker}
602*8975f5c5SAndroid Build Coastguard Worker
603*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2SRGB8A1ToRGBA8(size_t width,
604*8975f5c5SAndroid Build Coastguard Worker                                   size_t height,
605*8975f5c5SAndroid Build Coastguard Worker                                   size_t depth,
606*8975f5c5SAndroid Build Coastguard Worker                                   const uint8_t *input,
607*8975f5c5SAndroid Build Coastguard Worker                                   size_t inputRowPitch,
608*8975f5c5SAndroid Build Coastguard Worker                                   size_t inputDepthPitch,
609*8975f5c5SAndroid Build Coastguard Worker                                   uint8_t *output,
610*8975f5c5SAndroid Build Coastguard Worker                                   size_t outputRowPitch,
611*8975f5c5SAndroid Build Coastguard Worker                                   size_t outputDepthPitch)
612*8975f5c5SAndroid Build Coastguard Worker{
613*8975f5c5SAndroid Build Coastguard Worker    LoadETC2SRGB8A1ToRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
614*8975f5c5SAndroid Build Coastguard Worker                           outputRowPitch, outputDepthPitch);
615*8975f5c5SAndroid Build Coastguard Worker}
616*8975f5c5SAndroid Build Coastguard Worker
617*8975f5c5SAndroid Build Coastguard Worker} // namespace angle
618