xref: /aosp_15_r20/external/angle/src/image_util/loadimage.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2013 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 // angle_loadimage.cpp: Defines image loading functions.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "image_util/loadimage.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "common/platform.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "image_util/imageformats.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_WINDOWS) && !defined(_M_ARM) && !defined(_M_ARM64)
16*8975f5c5SAndroid Build Coastguard Worker #    if defined(_MSC_VER)
17*8975f5c5SAndroid Build Coastguard Worker #        include <intrin.h>
18*8975f5c5SAndroid Build Coastguard Worker #        define ANGLE_LOADIMAGE_USE_SSE
19*8975f5c5SAndroid Build Coastguard Worker #    elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
20*8975f5c5SAndroid Build Coastguard Worker #        include <x86intrin.h>
21*8975f5c5SAndroid Build Coastguard Worker #        if __SSE__
22*8975f5c5SAndroid Build Coastguard Worker #            define ANGLE_LOADIMAGE_USE_SSE
23*8975f5c5SAndroid Build Coastguard Worker #        endif
24*8975f5c5SAndroid Build Coastguard Worker #    endif
25*8975f5c5SAndroid Build Coastguard Worker #endif
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_LOADIMAGE_USE_SSE)
supportsSSE2()28*8975f5c5SAndroid Build Coastguard Worker inline bool supportsSSE2()
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker     static bool checked  = false;
31*8975f5c5SAndroid Build Coastguard Worker     static bool supports = false;
32*8975f5c5SAndroid Build Coastguard Worker 
33*8975f5c5SAndroid Build Coastguard Worker     if (checked)
34*8975f5c5SAndroid Build Coastguard Worker     {
35*8975f5c5SAndroid Build Coastguard Worker         return supports;
36*8975f5c5SAndroid Build Coastguard Worker     }
37*8975f5c5SAndroid Build Coastguard Worker 
38*8975f5c5SAndroid Build Coastguard Worker     int info[4];
39*8975f5c5SAndroid Build Coastguard Worker     __cpuid(info, 0);
40*8975f5c5SAndroid Build Coastguard Worker 
41*8975f5c5SAndroid Build Coastguard Worker     if (info[0] >= 1)
42*8975f5c5SAndroid Build Coastguard Worker     {
43*8975f5c5SAndroid Build Coastguard Worker         __cpuid(info, 1);
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker         supports = (info[3] >> 26) & 1;
46*8975f5c5SAndroid Build Coastguard Worker     }
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker     checked = true;
49*8975f5c5SAndroid Build Coastguard Worker     return supports;
50*8975f5c5SAndroid Build Coastguard Worker }
51*8975f5c5SAndroid Build Coastguard Worker #endif
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker namespace angle
54*8975f5c5SAndroid Build Coastguard Worker {
55*8975f5c5SAndroid Build Coastguard Worker ImageLoadContext::ImageLoadContext()                              = default;
56*8975f5c5SAndroid Build Coastguard Worker ImageLoadContext::~ImageLoadContext()                             = default;
57*8975f5c5SAndroid Build Coastguard Worker ImageLoadContext::ImageLoadContext(const ImageLoadContext &other) = default;
58*8975f5c5SAndroid Build Coastguard Worker 
LoadA8ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)59*8975f5c5SAndroid Build Coastguard Worker void LoadA8ToRGBA8(const ImageLoadContext &context,
60*8975f5c5SAndroid Build Coastguard Worker                    size_t width,
61*8975f5c5SAndroid Build Coastguard Worker                    size_t height,
62*8975f5c5SAndroid Build Coastguard Worker                    size_t depth,
63*8975f5c5SAndroid Build Coastguard Worker                    const uint8_t *input,
64*8975f5c5SAndroid Build Coastguard Worker                    size_t inputRowPitch,
65*8975f5c5SAndroid Build Coastguard Worker                    size_t inputDepthPitch,
66*8975f5c5SAndroid Build Coastguard Worker                    uint8_t *output,
67*8975f5c5SAndroid Build Coastguard Worker                    size_t outputRowPitch,
68*8975f5c5SAndroid Build Coastguard Worker                    size_t outputDepthPitch)
69*8975f5c5SAndroid Build Coastguard Worker {
70*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_LOADIMAGE_USE_SSE)
71*8975f5c5SAndroid Build Coastguard Worker     if (supportsSSE2())
72*8975f5c5SAndroid Build Coastguard Worker     {
73*8975f5c5SAndroid Build Coastguard Worker         __m128i zeroWide = _mm_setzero_si128();
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker         for (size_t z = 0; z < depth; z++)
76*8975f5c5SAndroid Build Coastguard Worker         {
77*8975f5c5SAndroid Build Coastguard Worker             for (size_t y = 0; y < height; y++)
78*8975f5c5SAndroid Build Coastguard Worker             {
79*8975f5c5SAndroid Build Coastguard Worker                 const uint8_t *source =
80*8975f5c5SAndroid Build Coastguard Worker                     priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
81*8975f5c5SAndroid Build Coastguard Worker                 uint32_t *dest = priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch,
82*8975f5c5SAndroid Build Coastguard Worker                                                                    outputDepthPitch);
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker                 size_t x = 0;
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker                 // Make output writes aligned
87*8975f5c5SAndroid Build Coastguard Worker                 for (; ((reinterpret_cast<intptr_t>(&dest[x]) & 0xF) != 0 && x < width); x++)
88*8975f5c5SAndroid Build Coastguard Worker                 {
89*8975f5c5SAndroid Build Coastguard Worker                     dest[x] = static_cast<uint32_t>(source[x]) << 24;
90*8975f5c5SAndroid Build Coastguard Worker                 }
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker                 for (; x + 7 < width; x += 8)
93*8975f5c5SAndroid Build Coastguard Worker                 {
94*8975f5c5SAndroid Build Coastguard Worker                     __m128i sourceData =
95*8975f5c5SAndroid Build Coastguard Worker                         _mm_loadl_epi64(reinterpret_cast<const __m128i *>(&source[x]));
96*8975f5c5SAndroid Build Coastguard Worker                     // Interleave each byte to 16bit, make the lower byte to zero
97*8975f5c5SAndroid Build Coastguard Worker                     sourceData = _mm_unpacklo_epi8(zeroWide, sourceData);
98*8975f5c5SAndroid Build Coastguard Worker                     // Interleave each 16bit to 32bit, make the lower 16bit to zero
99*8975f5c5SAndroid Build Coastguard Worker                     __m128i lo = _mm_unpacklo_epi16(zeroWide, sourceData);
100*8975f5c5SAndroid Build Coastguard Worker                     __m128i hi = _mm_unpackhi_epi16(zeroWide, sourceData);
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker                     _mm_store_si128(reinterpret_cast<__m128i *>(&dest[x]), lo);
103*8975f5c5SAndroid Build Coastguard Worker                     _mm_store_si128(reinterpret_cast<__m128i *>(&dest[x + 4]), hi);
104*8975f5c5SAndroid Build Coastguard Worker                 }
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker                 // Handle the remainder
107*8975f5c5SAndroid Build Coastguard Worker                 for (; x < width; x++)
108*8975f5c5SAndroid Build Coastguard Worker                 {
109*8975f5c5SAndroid Build Coastguard Worker                     dest[x] = static_cast<uint32_t>(source[x]) << 24;
110*8975f5c5SAndroid Build Coastguard Worker                 }
111*8975f5c5SAndroid Build Coastguard Worker             }
112*8975f5c5SAndroid Build Coastguard Worker         }
113*8975f5c5SAndroid Build Coastguard Worker 
114*8975f5c5SAndroid Build Coastguard Worker         return;
115*8975f5c5SAndroid Build Coastguard Worker     }
116*8975f5c5SAndroid Build Coastguard Worker #endif
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
119*8975f5c5SAndroid Build Coastguard Worker     {
120*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
121*8975f5c5SAndroid Build Coastguard Worker         {
122*8975f5c5SAndroid Build Coastguard Worker             const uint8_t *source =
123*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
124*8975f5c5SAndroid Build Coastguard Worker             uint32_t *dest =
125*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
126*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
127*8975f5c5SAndroid Build Coastguard Worker             {
128*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = static_cast<uint32_t>(source[x]) << 24;
129*8975f5c5SAndroid Build Coastguard Worker             }
130*8975f5c5SAndroid Build Coastguard Worker         }
131*8975f5c5SAndroid Build Coastguard Worker     }
132*8975f5c5SAndroid Build Coastguard Worker }
133*8975f5c5SAndroid Build Coastguard Worker 
LoadA8ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)134*8975f5c5SAndroid Build Coastguard Worker void LoadA8ToBGRA8(const ImageLoadContext &context,
135*8975f5c5SAndroid Build Coastguard Worker                    size_t width,
136*8975f5c5SAndroid Build Coastguard Worker                    size_t height,
137*8975f5c5SAndroid Build Coastguard Worker                    size_t depth,
138*8975f5c5SAndroid Build Coastguard Worker                    const uint8_t *input,
139*8975f5c5SAndroid Build Coastguard Worker                    size_t inputRowPitch,
140*8975f5c5SAndroid Build Coastguard Worker                    size_t inputDepthPitch,
141*8975f5c5SAndroid Build Coastguard Worker                    uint8_t *output,
142*8975f5c5SAndroid Build Coastguard Worker                    size_t outputRowPitch,
143*8975f5c5SAndroid Build Coastguard Worker                    size_t outputDepthPitch)
144*8975f5c5SAndroid Build Coastguard Worker {
145*8975f5c5SAndroid Build Coastguard Worker     // Same as loading to RGBA
146*8975f5c5SAndroid Build Coastguard Worker     LoadA8ToRGBA8(context, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
147*8975f5c5SAndroid Build Coastguard Worker                   outputRowPitch, outputDepthPitch);
148*8975f5c5SAndroid Build Coastguard Worker }
149*8975f5c5SAndroid Build Coastguard Worker 
LoadA32FToRGBA32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)150*8975f5c5SAndroid Build Coastguard Worker void LoadA32FToRGBA32F(const ImageLoadContext &context,
151*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
152*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
153*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
154*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
155*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
156*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
157*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
158*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
159*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
160*8975f5c5SAndroid Build Coastguard Worker {
161*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
162*8975f5c5SAndroid Build Coastguard Worker     {
163*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
164*8975f5c5SAndroid Build Coastguard Worker         {
165*8975f5c5SAndroid Build Coastguard Worker             const float *source =
166*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
167*8975f5c5SAndroid Build Coastguard Worker             float *dest =
168*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
169*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
170*8975f5c5SAndroid Build Coastguard Worker             {
171*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = 0.0f;
172*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = 0.0f;
173*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] = 0.0f;
174*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = source[x];
175*8975f5c5SAndroid Build Coastguard Worker             }
176*8975f5c5SAndroid Build Coastguard Worker         }
177*8975f5c5SAndroid Build Coastguard Worker     }
178*8975f5c5SAndroid Build Coastguard Worker }
179*8975f5c5SAndroid Build Coastguard Worker 
LoadA16FToRGBA16F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)180*8975f5c5SAndroid Build Coastguard Worker void LoadA16FToRGBA16F(const ImageLoadContext &context,
181*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
182*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
183*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
184*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
185*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
186*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
187*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
188*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
189*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
190*8975f5c5SAndroid Build Coastguard Worker {
191*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
192*8975f5c5SAndroid Build Coastguard Worker     {
193*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
194*8975f5c5SAndroid Build Coastguard Worker         {
195*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
196*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
197*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
198*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
199*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
200*8975f5c5SAndroid Build Coastguard Worker             {
201*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = 0;
202*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = 0;
203*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] = 0;
204*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = source[x];
205*8975f5c5SAndroid Build Coastguard Worker             }
206*8975f5c5SAndroid Build Coastguard Worker         }
207*8975f5c5SAndroid Build Coastguard Worker     }
208*8975f5c5SAndroid Build Coastguard Worker }
209*8975f5c5SAndroid Build Coastguard Worker 
LoadL8ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)210*8975f5c5SAndroid Build Coastguard Worker void LoadL8ToRGBA8(const ImageLoadContext &context,
211*8975f5c5SAndroid Build Coastguard Worker                    size_t width,
212*8975f5c5SAndroid Build Coastguard Worker                    size_t height,
213*8975f5c5SAndroid Build Coastguard Worker                    size_t depth,
214*8975f5c5SAndroid Build Coastguard Worker                    const uint8_t *input,
215*8975f5c5SAndroid Build Coastguard Worker                    size_t inputRowPitch,
216*8975f5c5SAndroid Build Coastguard Worker                    size_t inputDepthPitch,
217*8975f5c5SAndroid Build Coastguard Worker                    uint8_t *output,
218*8975f5c5SAndroid Build Coastguard Worker                    size_t outputRowPitch,
219*8975f5c5SAndroid Build Coastguard Worker                    size_t outputDepthPitch)
220*8975f5c5SAndroid Build Coastguard Worker {
221*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
222*8975f5c5SAndroid Build Coastguard Worker     {
223*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
224*8975f5c5SAndroid Build Coastguard Worker         {
225*8975f5c5SAndroid Build Coastguard Worker             const uint8_t *source =
226*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
227*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
228*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
229*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
230*8975f5c5SAndroid Build Coastguard Worker             {
231*8975f5c5SAndroid Build Coastguard Worker                 uint8_t sourceVal = source[x];
232*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0]   = sourceVal;
233*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1]   = sourceVal;
234*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2]   = sourceVal;
235*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3]   = 0xFF;
236*8975f5c5SAndroid Build Coastguard Worker             }
237*8975f5c5SAndroid Build Coastguard Worker         }
238*8975f5c5SAndroid Build Coastguard Worker     }
239*8975f5c5SAndroid Build Coastguard Worker }
240*8975f5c5SAndroid Build Coastguard Worker 
LoadL8ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)241*8975f5c5SAndroid Build Coastguard Worker void LoadL8ToBGRA8(const ImageLoadContext &context,
242*8975f5c5SAndroid Build Coastguard Worker                    size_t width,
243*8975f5c5SAndroid Build Coastguard Worker                    size_t height,
244*8975f5c5SAndroid Build Coastguard Worker                    size_t depth,
245*8975f5c5SAndroid Build Coastguard Worker                    const uint8_t *input,
246*8975f5c5SAndroid Build Coastguard Worker                    size_t inputRowPitch,
247*8975f5c5SAndroid Build Coastguard Worker                    size_t inputDepthPitch,
248*8975f5c5SAndroid Build Coastguard Worker                    uint8_t *output,
249*8975f5c5SAndroid Build Coastguard Worker                    size_t outputRowPitch,
250*8975f5c5SAndroid Build Coastguard Worker                    size_t outputDepthPitch)
251*8975f5c5SAndroid Build Coastguard Worker {
252*8975f5c5SAndroid Build Coastguard Worker     // Same as loading to RGBA
253*8975f5c5SAndroid Build Coastguard Worker     LoadL8ToRGBA8(context, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
254*8975f5c5SAndroid Build Coastguard Worker                   outputRowPitch, outputDepthPitch);
255*8975f5c5SAndroid Build Coastguard Worker }
256*8975f5c5SAndroid Build Coastguard Worker 
LoadL32FToRGBA32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)257*8975f5c5SAndroid Build Coastguard Worker void LoadL32FToRGBA32F(const ImageLoadContext &context,
258*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
259*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
260*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
261*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
262*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
263*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
264*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
265*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
266*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
267*8975f5c5SAndroid Build Coastguard Worker {
268*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
269*8975f5c5SAndroid Build Coastguard Worker     {
270*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
271*8975f5c5SAndroid Build Coastguard Worker         {
272*8975f5c5SAndroid Build Coastguard Worker             const float *source =
273*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
274*8975f5c5SAndroid Build Coastguard Worker             float *dest =
275*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
276*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
277*8975f5c5SAndroid Build Coastguard Worker             {
278*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = source[x];
279*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = source[x];
280*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] = source[x];
281*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = 1.0f;
282*8975f5c5SAndroid Build Coastguard Worker             }
283*8975f5c5SAndroid Build Coastguard Worker         }
284*8975f5c5SAndroid Build Coastguard Worker     }
285*8975f5c5SAndroid Build Coastguard Worker }
286*8975f5c5SAndroid Build Coastguard Worker 
LoadL16FToRGBA16F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)287*8975f5c5SAndroid Build Coastguard Worker void LoadL16FToRGBA16F(const ImageLoadContext &context,
288*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
289*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
290*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
291*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
292*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
293*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
294*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
295*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
296*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
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 uint16_t *source =
303*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
304*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
305*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
306*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
307*8975f5c5SAndroid Build Coastguard Worker             {
308*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = source[x];
309*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = source[x];
310*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] = source[x];
311*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = gl::Float16One;
312*8975f5c5SAndroid Build Coastguard Worker             }
313*8975f5c5SAndroid Build Coastguard Worker         }
314*8975f5c5SAndroid Build Coastguard Worker     }
315*8975f5c5SAndroid Build Coastguard Worker }
316*8975f5c5SAndroid Build Coastguard Worker 
LoadLA8ToRGBA4(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)317*8975f5c5SAndroid Build Coastguard Worker void LoadLA8ToRGBA4(const ImageLoadContext &context,
318*8975f5c5SAndroid Build Coastguard Worker                     size_t width,
319*8975f5c5SAndroid Build Coastguard Worker                     size_t height,
320*8975f5c5SAndroid Build Coastguard Worker                     size_t depth,
321*8975f5c5SAndroid Build Coastguard Worker                     const uint8_t *input,
322*8975f5c5SAndroid Build Coastguard Worker                     size_t inputRowPitch,
323*8975f5c5SAndroid Build Coastguard Worker                     size_t inputDepthPitch,
324*8975f5c5SAndroid Build Coastguard Worker                     uint8_t *output,
325*8975f5c5SAndroid Build Coastguard Worker                     size_t outputRowPitch,
326*8975f5c5SAndroid Build Coastguard Worker                     size_t outputDepthPitch)
327*8975f5c5SAndroid Build Coastguard Worker {
328*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
329*8975f5c5SAndroid Build Coastguard Worker     {
330*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
331*8975f5c5SAndroid Build Coastguard Worker         {
332*8975f5c5SAndroid Build Coastguard Worker             const uint8_t *source =
333*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
334*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
335*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
336*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
337*8975f5c5SAndroid Build Coastguard Worker             {
338*8975f5c5SAndroid Build Coastguard Worker                 uint8_t l       = source[2 * x + 0] >> 4;
339*8975f5c5SAndroid Build Coastguard Worker                 uint8_t a       = source[2 * x + 1] >> 4;
340*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = l | l << 4;
341*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = l | a << 4;
342*8975f5c5SAndroid Build Coastguard Worker             }
343*8975f5c5SAndroid Build Coastguard Worker         }
344*8975f5c5SAndroid Build Coastguard Worker     }
345*8975f5c5SAndroid Build Coastguard Worker }
346*8975f5c5SAndroid Build Coastguard Worker 
LoadLA8ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)347*8975f5c5SAndroid Build Coastguard Worker void LoadLA8ToRGBA8(const ImageLoadContext &context,
348*8975f5c5SAndroid Build Coastguard Worker                     size_t width,
349*8975f5c5SAndroid Build Coastguard Worker                     size_t height,
350*8975f5c5SAndroid Build Coastguard Worker                     size_t depth,
351*8975f5c5SAndroid Build Coastguard Worker                     const uint8_t *input,
352*8975f5c5SAndroid Build Coastguard Worker                     size_t inputRowPitch,
353*8975f5c5SAndroid Build Coastguard Worker                     size_t inputDepthPitch,
354*8975f5c5SAndroid Build Coastguard Worker                     uint8_t *output,
355*8975f5c5SAndroid Build Coastguard Worker                     size_t outputRowPitch,
356*8975f5c5SAndroid Build Coastguard Worker                     size_t outputDepthPitch)
357*8975f5c5SAndroid Build Coastguard Worker {
358*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
359*8975f5c5SAndroid Build Coastguard Worker     {
360*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
361*8975f5c5SAndroid Build Coastguard Worker         {
362*8975f5c5SAndroid Build Coastguard Worker             const uint8_t *source =
363*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
364*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
365*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
366*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
367*8975f5c5SAndroid Build Coastguard Worker             {
368*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = source[2 * x + 0];
369*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = source[2 * x + 0];
370*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] = source[2 * x + 0];
371*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = source[2 * x + 1];
372*8975f5c5SAndroid Build Coastguard Worker             }
373*8975f5c5SAndroid Build Coastguard Worker         }
374*8975f5c5SAndroid Build Coastguard Worker     }
375*8975f5c5SAndroid Build Coastguard Worker }
376*8975f5c5SAndroid Build Coastguard Worker 
LoadLA8ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)377*8975f5c5SAndroid Build Coastguard Worker void LoadLA8ToBGRA8(const ImageLoadContext &context,
378*8975f5c5SAndroid Build Coastguard Worker                     size_t width,
379*8975f5c5SAndroid Build Coastguard Worker                     size_t height,
380*8975f5c5SAndroid Build Coastguard Worker                     size_t depth,
381*8975f5c5SAndroid Build Coastguard Worker                     const uint8_t *input,
382*8975f5c5SAndroid Build Coastguard Worker                     size_t inputRowPitch,
383*8975f5c5SAndroid Build Coastguard Worker                     size_t inputDepthPitch,
384*8975f5c5SAndroid Build Coastguard Worker                     uint8_t *output,
385*8975f5c5SAndroid Build Coastguard Worker                     size_t outputRowPitch,
386*8975f5c5SAndroid Build Coastguard Worker                     size_t outputDepthPitch)
387*8975f5c5SAndroid Build Coastguard Worker {
388*8975f5c5SAndroid Build Coastguard Worker     // Same as loading to RGBA
389*8975f5c5SAndroid Build Coastguard Worker     LoadLA8ToRGBA8(context, width, height, depth, input, inputRowPitch, inputDepthPitch, output,
390*8975f5c5SAndroid Build Coastguard Worker                    outputRowPitch, outputDepthPitch);
391*8975f5c5SAndroid Build Coastguard Worker }
392*8975f5c5SAndroid Build Coastguard Worker 
LoadLA32FToRGBA32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)393*8975f5c5SAndroid Build Coastguard Worker void LoadLA32FToRGBA32F(const ImageLoadContext &context,
394*8975f5c5SAndroid Build Coastguard Worker                         size_t width,
395*8975f5c5SAndroid Build Coastguard Worker                         size_t height,
396*8975f5c5SAndroid Build Coastguard Worker                         size_t depth,
397*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input,
398*8975f5c5SAndroid Build Coastguard Worker                         size_t inputRowPitch,
399*8975f5c5SAndroid Build Coastguard Worker                         size_t inputDepthPitch,
400*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output,
401*8975f5c5SAndroid Build Coastguard Worker                         size_t outputRowPitch,
402*8975f5c5SAndroid Build Coastguard Worker                         size_t outputDepthPitch)
403*8975f5c5SAndroid Build Coastguard Worker {
404*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
405*8975f5c5SAndroid Build Coastguard Worker     {
406*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
407*8975f5c5SAndroid Build Coastguard Worker         {
408*8975f5c5SAndroid Build Coastguard Worker             const float *source =
409*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
410*8975f5c5SAndroid Build Coastguard Worker             float *dest =
411*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
412*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
413*8975f5c5SAndroid Build Coastguard Worker             {
414*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = source[2 * x + 0];
415*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = source[2 * x + 0];
416*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] = source[2 * x + 0];
417*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = source[2 * x + 1];
418*8975f5c5SAndroid Build Coastguard Worker             }
419*8975f5c5SAndroid Build Coastguard Worker         }
420*8975f5c5SAndroid Build Coastguard Worker     }
421*8975f5c5SAndroid Build Coastguard Worker }
422*8975f5c5SAndroid Build Coastguard Worker 
LoadLA16FToRGBA16F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)423*8975f5c5SAndroid Build Coastguard Worker void LoadLA16FToRGBA16F(const ImageLoadContext &context,
424*8975f5c5SAndroid Build Coastguard Worker                         size_t width,
425*8975f5c5SAndroid Build Coastguard Worker                         size_t height,
426*8975f5c5SAndroid Build Coastguard Worker                         size_t depth,
427*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input,
428*8975f5c5SAndroid Build Coastguard Worker                         size_t inputRowPitch,
429*8975f5c5SAndroid Build Coastguard Worker                         size_t inputDepthPitch,
430*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output,
431*8975f5c5SAndroid Build Coastguard Worker                         size_t outputRowPitch,
432*8975f5c5SAndroid Build Coastguard Worker                         size_t outputDepthPitch)
433*8975f5c5SAndroid Build Coastguard Worker {
434*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
435*8975f5c5SAndroid Build Coastguard Worker     {
436*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
437*8975f5c5SAndroid Build Coastguard Worker         {
438*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
439*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
440*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
441*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
442*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
443*8975f5c5SAndroid Build Coastguard Worker             {
444*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = source[2 * x + 0];
445*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = source[2 * x + 0];
446*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] = source[2 * x + 0];
447*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = source[2 * x + 1];
448*8975f5c5SAndroid Build Coastguard Worker             }
449*8975f5c5SAndroid Build Coastguard Worker         }
450*8975f5c5SAndroid Build Coastguard Worker     }
451*8975f5c5SAndroid Build Coastguard Worker }
452*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB8ToBGR565(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)453*8975f5c5SAndroid Build Coastguard Worker void LoadRGB8ToBGR565(const ImageLoadContext &context,
454*8975f5c5SAndroid Build Coastguard Worker                       size_t width,
455*8975f5c5SAndroid Build Coastguard Worker                       size_t height,
456*8975f5c5SAndroid Build Coastguard Worker                       size_t depth,
457*8975f5c5SAndroid Build Coastguard Worker                       const uint8_t *input,
458*8975f5c5SAndroid Build Coastguard Worker                       size_t inputRowPitch,
459*8975f5c5SAndroid Build Coastguard Worker                       size_t inputDepthPitch,
460*8975f5c5SAndroid Build Coastguard Worker                       uint8_t *output,
461*8975f5c5SAndroid Build Coastguard Worker                       size_t outputRowPitch,
462*8975f5c5SAndroid Build Coastguard Worker                       size_t outputDepthPitch)
463*8975f5c5SAndroid Build Coastguard Worker {
464*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
465*8975f5c5SAndroid Build Coastguard Worker     {
466*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
467*8975f5c5SAndroid Build Coastguard Worker         {
468*8975f5c5SAndroid Build Coastguard Worker             const uint8_t *source =
469*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
470*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
471*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
472*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
473*8975f5c5SAndroid Build Coastguard Worker             {
474*8975f5c5SAndroid Build Coastguard Worker                 uint8_t r8 = source[x * 3 + 0];
475*8975f5c5SAndroid Build Coastguard Worker                 uint8_t g8 = source[x * 3 + 1];
476*8975f5c5SAndroid Build Coastguard Worker                 uint8_t b8 = source[x * 3 + 2];
477*8975f5c5SAndroid Build Coastguard Worker                 auto r5    = static_cast<uint16_t>(r8 >> 3);
478*8975f5c5SAndroid Build Coastguard Worker                 auto g6    = static_cast<uint16_t>(g8 >> 2);
479*8975f5c5SAndroid Build Coastguard Worker                 auto b5    = static_cast<uint16_t>(b8 >> 3);
480*8975f5c5SAndroid Build Coastguard Worker                 dest[x]    = (r5 << 11) | (g6 << 5) | b5;
481*8975f5c5SAndroid Build Coastguard Worker             }
482*8975f5c5SAndroid Build Coastguard Worker         }
483*8975f5c5SAndroid Build Coastguard Worker     }
484*8975f5c5SAndroid Build Coastguard Worker }
485*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB565ToBGR565(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)486*8975f5c5SAndroid Build Coastguard Worker void LoadRGB565ToBGR565(const ImageLoadContext &context,
487*8975f5c5SAndroid Build Coastguard Worker                         size_t width,
488*8975f5c5SAndroid Build Coastguard Worker                         size_t height,
489*8975f5c5SAndroid Build Coastguard Worker                         size_t depth,
490*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input,
491*8975f5c5SAndroid Build Coastguard Worker                         size_t inputRowPitch,
492*8975f5c5SAndroid Build Coastguard Worker                         size_t inputDepthPitch,
493*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output,
494*8975f5c5SAndroid Build Coastguard Worker                         size_t outputRowPitch,
495*8975f5c5SAndroid Build Coastguard Worker                         size_t outputDepthPitch)
496*8975f5c5SAndroid Build Coastguard Worker {
497*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
498*8975f5c5SAndroid Build Coastguard Worker     {
499*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
500*8975f5c5SAndroid Build Coastguard Worker         {
501*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
502*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
503*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
504*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
505*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
506*8975f5c5SAndroid Build Coastguard Worker             {
507*8975f5c5SAndroid Build Coastguard Worker                 // The GL type RGB is packed with with red in the MSB, while the D3D11 type BGR
508*8975f5c5SAndroid Build Coastguard Worker                 // is packed with red in the LSB
509*8975f5c5SAndroid Build Coastguard Worker                 auto rgb    = source[x];
510*8975f5c5SAndroid Build Coastguard Worker                 uint16_t r5 = gl::getShiftedData<5, 11>(rgb);
511*8975f5c5SAndroid Build Coastguard Worker                 uint16_t g6 = gl::getShiftedData<6, 5>(rgb);
512*8975f5c5SAndroid Build Coastguard Worker                 uint16_t b5 = gl::getShiftedData<5, 0>(rgb);
513*8975f5c5SAndroid Build Coastguard Worker                 dest[x]     = (r5 << 11) | (g6 << 5) | b5;
514*8975f5c5SAndroid Build Coastguard Worker             }
515*8975f5c5SAndroid Build Coastguard Worker         }
516*8975f5c5SAndroid Build Coastguard Worker     }
517*8975f5c5SAndroid Build Coastguard Worker }
518*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB8ToBGRX8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)519*8975f5c5SAndroid Build Coastguard Worker void LoadRGB8ToBGRX8(const ImageLoadContext &context,
520*8975f5c5SAndroid Build Coastguard Worker                      size_t width,
521*8975f5c5SAndroid Build Coastguard Worker                      size_t height,
522*8975f5c5SAndroid Build Coastguard Worker                      size_t depth,
523*8975f5c5SAndroid Build Coastguard Worker                      const uint8_t *input,
524*8975f5c5SAndroid Build Coastguard Worker                      size_t inputRowPitch,
525*8975f5c5SAndroid Build Coastguard Worker                      size_t inputDepthPitch,
526*8975f5c5SAndroid Build Coastguard Worker                      uint8_t *output,
527*8975f5c5SAndroid Build Coastguard Worker                      size_t outputRowPitch,
528*8975f5c5SAndroid Build Coastguard Worker                      size_t outputDepthPitch)
529*8975f5c5SAndroid Build Coastguard Worker {
530*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
531*8975f5c5SAndroid Build Coastguard Worker     {
532*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
533*8975f5c5SAndroid Build Coastguard Worker         {
534*8975f5c5SAndroid Build Coastguard Worker             const uint8_t *source =
535*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
536*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
537*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
538*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
539*8975f5c5SAndroid Build Coastguard Worker             {
540*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = source[x * 3 + 2];
541*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = source[x * 3 + 1];
542*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] = source[x * 3 + 0];
543*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = 0xFF;
544*8975f5c5SAndroid Build Coastguard Worker             }
545*8975f5c5SAndroid Build Coastguard Worker         }
546*8975f5c5SAndroid Build Coastguard Worker     }
547*8975f5c5SAndroid Build Coastguard Worker }
548*8975f5c5SAndroid Build Coastguard Worker 
LoadRG8ToBGRX8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)549*8975f5c5SAndroid Build Coastguard Worker void LoadRG8ToBGRX8(const ImageLoadContext &context,
550*8975f5c5SAndroid Build Coastguard Worker                     size_t width,
551*8975f5c5SAndroid Build Coastguard Worker                     size_t height,
552*8975f5c5SAndroid Build Coastguard Worker                     size_t depth,
553*8975f5c5SAndroid Build Coastguard Worker                     const uint8_t *input,
554*8975f5c5SAndroid Build Coastguard Worker                     size_t inputRowPitch,
555*8975f5c5SAndroid Build Coastguard Worker                     size_t inputDepthPitch,
556*8975f5c5SAndroid Build Coastguard Worker                     uint8_t *output,
557*8975f5c5SAndroid Build Coastguard Worker                     size_t outputRowPitch,
558*8975f5c5SAndroid Build Coastguard Worker                     size_t outputDepthPitch)
559*8975f5c5SAndroid Build Coastguard Worker {
560*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
561*8975f5c5SAndroid Build Coastguard Worker     {
562*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
563*8975f5c5SAndroid Build Coastguard Worker         {
564*8975f5c5SAndroid Build Coastguard Worker             const uint8_t *source =
565*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
566*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
567*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
568*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
569*8975f5c5SAndroid Build Coastguard Worker             {
570*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = 0x00;
571*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = source[x * 2 + 1];
572*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] = source[x * 2 + 0];
573*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = 0xFF;
574*8975f5c5SAndroid Build Coastguard Worker             }
575*8975f5c5SAndroid Build Coastguard Worker         }
576*8975f5c5SAndroid Build Coastguard Worker     }
577*8975f5c5SAndroid Build Coastguard Worker }
578*8975f5c5SAndroid Build Coastguard Worker 
LoadR8ToBGRX8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)579*8975f5c5SAndroid Build Coastguard Worker void LoadR8ToBGRX8(const ImageLoadContext &context,
580*8975f5c5SAndroid Build Coastguard Worker                    size_t width,
581*8975f5c5SAndroid Build Coastguard Worker                    size_t height,
582*8975f5c5SAndroid Build Coastguard Worker                    size_t depth,
583*8975f5c5SAndroid Build Coastguard Worker                    const uint8_t *input,
584*8975f5c5SAndroid Build Coastguard Worker                    size_t inputRowPitch,
585*8975f5c5SAndroid Build Coastguard Worker                    size_t inputDepthPitch,
586*8975f5c5SAndroid Build Coastguard Worker                    uint8_t *output,
587*8975f5c5SAndroid Build Coastguard Worker                    size_t outputRowPitch,
588*8975f5c5SAndroid Build Coastguard Worker                    size_t outputDepthPitch)
589*8975f5c5SAndroid Build Coastguard Worker {
590*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
591*8975f5c5SAndroid Build Coastguard Worker     {
592*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
593*8975f5c5SAndroid Build Coastguard Worker         {
594*8975f5c5SAndroid Build Coastguard Worker             const uint8_t *source =
595*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
596*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
597*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
598*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
599*8975f5c5SAndroid Build Coastguard Worker             {
600*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = 0x00;
601*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = 0x00;
602*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] = source[x];
603*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = 0xFF;
604*8975f5c5SAndroid Build Coastguard Worker             }
605*8975f5c5SAndroid Build Coastguard Worker         }
606*8975f5c5SAndroid Build Coastguard Worker     }
607*8975f5c5SAndroid Build Coastguard Worker }
608*8975f5c5SAndroid Build Coastguard Worker 
LoadR5G6B5ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)609*8975f5c5SAndroid Build Coastguard Worker void LoadR5G6B5ToBGRA8(const ImageLoadContext &context,
610*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
611*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
612*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
613*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
614*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
615*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
616*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
617*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
618*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
619*8975f5c5SAndroid Build Coastguard Worker {
620*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
621*8975f5c5SAndroid Build Coastguard Worker     {
622*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
623*8975f5c5SAndroid Build Coastguard Worker         {
624*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
625*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
626*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
627*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
628*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
629*8975f5c5SAndroid Build Coastguard Worker             {
630*8975f5c5SAndroid Build Coastguard Worker                 uint16_t rgb = source[x];
631*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] =
632*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgb & 0x001F) << 3) | ((rgb & 0x001F) >> 2));
633*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] =
634*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgb & 0x07E0) >> 3) | ((rgb & 0x07E0) >> 9));
635*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] =
636*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgb & 0xF800) >> 8) | ((rgb & 0xF800) >> 13));
637*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = 0xFF;
638*8975f5c5SAndroid Build Coastguard Worker             }
639*8975f5c5SAndroid Build Coastguard Worker         }
640*8975f5c5SAndroid Build Coastguard Worker     }
641*8975f5c5SAndroid Build Coastguard Worker }
642*8975f5c5SAndroid Build Coastguard Worker 
LoadR5G6B5ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)643*8975f5c5SAndroid Build Coastguard Worker void LoadR5G6B5ToRGBA8(const ImageLoadContext &context,
644*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
645*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
646*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
647*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
648*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
649*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
650*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
651*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
652*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
653*8975f5c5SAndroid Build Coastguard Worker {
654*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
655*8975f5c5SAndroid Build Coastguard Worker     {
656*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
657*8975f5c5SAndroid Build Coastguard Worker         {
658*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
659*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
660*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
661*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
662*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
663*8975f5c5SAndroid Build Coastguard Worker             {
664*8975f5c5SAndroid Build Coastguard Worker                 uint16_t rgb = source[x];
665*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] =
666*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgb & 0xF800) >> 8) | ((rgb & 0xF800) >> 13));
667*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] =
668*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgb & 0x07E0) >> 3) | ((rgb & 0x07E0) >> 9));
669*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] =
670*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgb & 0x001F) << 3) | ((rgb & 0x001F) >> 2));
671*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = 0xFF;
672*8975f5c5SAndroid Build Coastguard Worker             }
673*8975f5c5SAndroid Build Coastguard Worker         }
674*8975f5c5SAndroid Build Coastguard Worker     }
675*8975f5c5SAndroid Build Coastguard Worker }
676*8975f5c5SAndroid Build Coastguard Worker 
LoadRGBA8ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)677*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA8ToBGRA8(const ImageLoadContext &context,
678*8975f5c5SAndroid Build Coastguard Worker                       size_t width,
679*8975f5c5SAndroid Build Coastguard Worker                       size_t height,
680*8975f5c5SAndroid Build Coastguard Worker                       size_t depth,
681*8975f5c5SAndroid Build Coastguard Worker                       const uint8_t *input,
682*8975f5c5SAndroid Build Coastguard Worker                       size_t inputRowPitch,
683*8975f5c5SAndroid Build Coastguard Worker                       size_t inputDepthPitch,
684*8975f5c5SAndroid Build Coastguard Worker                       uint8_t *output,
685*8975f5c5SAndroid Build Coastguard Worker                       size_t outputRowPitch,
686*8975f5c5SAndroid Build Coastguard Worker                       size_t outputDepthPitch)
687*8975f5c5SAndroid Build Coastguard Worker {
688*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_LOADIMAGE_USE_SSE)
689*8975f5c5SAndroid Build Coastguard Worker     if (supportsSSE2())
690*8975f5c5SAndroid Build Coastguard Worker     {
691*8975f5c5SAndroid Build Coastguard Worker         __m128i brMask = _mm_set1_epi32(0x00ff00ff);
692*8975f5c5SAndroid Build Coastguard Worker 
693*8975f5c5SAndroid Build Coastguard Worker         for (size_t z = 0; z < depth; z++)
694*8975f5c5SAndroid Build Coastguard Worker         {
695*8975f5c5SAndroid Build Coastguard Worker             for (size_t y = 0; y < height; y++)
696*8975f5c5SAndroid Build Coastguard Worker             {
697*8975f5c5SAndroid Build Coastguard Worker                 const uint32_t *source =
698*8975f5c5SAndroid Build Coastguard Worker                     priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
699*8975f5c5SAndroid Build Coastguard Worker                 uint32_t *dest = priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch,
700*8975f5c5SAndroid Build Coastguard Worker                                                                    outputDepthPitch);
701*8975f5c5SAndroid Build Coastguard Worker 
702*8975f5c5SAndroid Build Coastguard Worker                 size_t x = 0;
703*8975f5c5SAndroid Build Coastguard Worker 
704*8975f5c5SAndroid Build Coastguard Worker                 // Make output writes aligned
705*8975f5c5SAndroid Build Coastguard Worker                 for (; ((reinterpret_cast<intptr_t>(&dest[x]) & 15) != 0) && x < width; x++)
706*8975f5c5SAndroid Build Coastguard Worker                 {
707*8975f5c5SAndroid Build Coastguard Worker                     uint32_t rgba = source[x];
708*8975f5c5SAndroid Build Coastguard Worker                     dest[x]       = (ANGLE_ROTL(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00);
709*8975f5c5SAndroid Build Coastguard Worker                 }
710*8975f5c5SAndroid Build Coastguard Worker 
711*8975f5c5SAndroid Build Coastguard Worker                 for (; x + 3 < width; x += 4)
712*8975f5c5SAndroid Build Coastguard Worker                 {
713*8975f5c5SAndroid Build Coastguard Worker                     __m128i sourceData =
714*8975f5c5SAndroid Build Coastguard Worker                         _mm_loadu_si128(reinterpret_cast<const __m128i *>(&source[x]));
715*8975f5c5SAndroid Build Coastguard Worker                     // Mask out g and a, which don't change
716*8975f5c5SAndroid Build Coastguard Worker                     __m128i gaComponents = _mm_andnot_si128(brMask, sourceData);
717*8975f5c5SAndroid Build Coastguard Worker                     // Mask out b and r
718*8975f5c5SAndroid Build Coastguard Worker                     __m128i brComponents = _mm_and_si128(sourceData, brMask);
719*8975f5c5SAndroid Build Coastguard Worker                     // Swap b and r
720*8975f5c5SAndroid Build Coastguard Worker                     __m128i brSwapped = _mm_shufflehi_epi16(
721*8975f5c5SAndroid Build Coastguard Worker                         _mm_shufflelo_epi16(brComponents, _MM_SHUFFLE(2, 3, 0, 1)),
722*8975f5c5SAndroid Build Coastguard Worker                         _MM_SHUFFLE(2, 3, 0, 1));
723*8975f5c5SAndroid Build Coastguard Worker                     __m128i result = _mm_or_si128(gaComponents, brSwapped);
724*8975f5c5SAndroid Build Coastguard Worker                     _mm_store_si128(reinterpret_cast<__m128i *>(&dest[x]), result);
725*8975f5c5SAndroid Build Coastguard Worker                 }
726*8975f5c5SAndroid Build Coastguard Worker 
727*8975f5c5SAndroid Build Coastguard Worker                 // Perform leftover writes
728*8975f5c5SAndroid Build Coastguard Worker                 for (; x < width; x++)
729*8975f5c5SAndroid Build Coastguard Worker                 {
730*8975f5c5SAndroid Build Coastguard Worker                     uint32_t rgba = source[x];
731*8975f5c5SAndroid Build Coastguard Worker                     dest[x]       = (ANGLE_ROTL(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00);
732*8975f5c5SAndroid Build Coastguard Worker                 }
733*8975f5c5SAndroid Build Coastguard Worker             }
734*8975f5c5SAndroid Build Coastguard Worker         }
735*8975f5c5SAndroid Build Coastguard Worker 
736*8975f5c5SAndroid Build Coastguard Worker         return;
737*8975f5c5SAndroid Build Coastguard Worker     }
738*8975f5c5SAndroid Build Coastguard Worker #endif
739*8975f5c5SAndroid Build Coastguard Worker 
740*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
741*8975f5c5SAndroid Build Coastguard Worker     {
742*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
743*8975f5c5SAndroid Build Coastguard Worker         {
744*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
745*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
746*8975f5c5SAndroid Build Coastguard Worker             uint32_t *dest =
747*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
748*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
749*8975f5c5SAndroid Build Coastguard Worker             {
750*8975f5c5SAndroid Build Coastguard Worker                 uint32_t rgba = source[x];
751*8975f5c5SAndroid Build Coastguard Worker                 dest[x]       = (ANGLE_ROTL(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00);
752*8975f5c5SAndroid Build Coastguard Worker             }
753*8975f5c5SAndroid Build Coastguard Worker         }
754*8975f5c5SAndroid Build Coastguard Worker     }
755*8975f5c5SAndroid Build Coastguard Worker }
756*8975f5c5SAndroid Build Coastguard Worker 
LoadRGBA8ToBGRA4(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)757*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA8ToBGRA4(const ImageLoadContext &context,
758*8975f5c5SAndroid Build Coastguard Worker                       size_t width,
759*8975f5c5SAndroid Build Coastguard Worker                       size_t height,
760*8975f5c5SAndroid Build Coastguard Worker                       size_t depth,
761*8975f5c5SAndroid Build Coastguard Worker                       const uint8_t *input,
762*8975f5c5SAndroid Build Coastguard Worker                       size_t inputRowPitch,
763*8975f5c5SAndroid Build Coastguard Worker                       size_t inputDepthPitch,
764*8975f5c5SAndroid Build Coastguard Worker                       uint8_t *output,
765*8975f5c5SAndroid Build Coastguard Worker                       size_t outputRowPitch,
766*8975f5c5SAndroid Build Coastguard Worker                       size_t outputDepthPitch)
767*8975f5c5SAndroid Build Coastguard Worker {
768*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
769*8975f5c5SAndroid Build Coastguard Worker     {
770*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
771*8975f5c5SAndroid Build Coastguard Worker         {
772*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
773*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
774*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
775*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
776*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
777*8975f5c5SAndroid Build Coastguard Worker             {
778*8975f5c5SAndroid Build Coastguard Worker                 uint32_t rgba8 = source[x];
779*8975f5c5SAndroid Build Coastguard Worker                 auto r4        = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 4);
780*8975f5c5SAndroid Build Coastguard Worker                 auto g4        = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 12);
781*8975f5c5SAndroid Build Coastguard Worker                 auto b4        = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 20);
782*8975f5c5SAndroid Build Coastguard Worker                 auto a4        = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 28);
783*8975f5c5SAndroid Build Coastguard Worker                 dest[x]        = (a4 << 12) | (r4 << 8) | (g4 << 4) | b4;
784*8975f5c5SAndroid Build Coastguard Worker             }
785*8975f5c5SAndroid Build Coastguard Worker         }
786*8975f5c5SAndroid Build Coastguard Worker     }
787*8975f5c5SAndroid Build Coastguard Worker }
788*8975f5c5SAndroid Build Coastguard Worker 
LoadRGBA8ToRGBA4(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)789*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA8ToRGBA4(const ImageLoadContext &context,
790*8975f5c5SAndroid Build Coastguard Worker                       size_t width,
791*8975f5c5SAndroid Build Coastguard Worker                       size_t height,
792*8975f5c5SAndroid Build Coastguard Worker                       size_t depth,
793*8975f5c5SAndroid Build Coastguard Worker                       const uint8_t *input,
794*8975f5c5SAndroid Build Coastguard Worker                       size_t inputRowPitch,
795*8975f5c5SAndroid Build Coastguard Worker                       size_t inputDepthPitch,
796*8975f5c5SAndroid Build Coastguard Worker                       uint8_t *output,
797*8975f5c5SAndroid Build Coastguard Worker                       size_t outputRowPitch,
798*8975f5c5SAndroid Build Coastguard Worker                       size_t outputDepthPitch)
799*8975f5c5SAndroid Build Coastguard Worker {
800*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
801*8975f5c5SAndroid Build Coastguard Worker     {
802*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
803*8975f5c5SAndroid Build Coastguard Worker         {
804*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
805*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
806*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
807*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
808*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
809*8975f5c5SAndroid Build Coastguard Worker             {
810*8975f5c5SAndroid Build Coastguard Worker                 uint32_t rgba8 = source[x];
811*8975f5c5SAndroid Build Coastguard Worker                 auto r4        = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 4);
812*8975f5c5SAndroid Build Coastguard Worker                 auto g4        = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 12);
813*8975f5c5SAndroid Build Coastguard Worker                 auto b4        = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 20);
814*8975f5c5SAndroid Build Coastguard Worker                 auto a4        = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 28);
815*8975f5c5SAndroid Build Coastguard Worker                 dest[x]        = (r4 << 12) | (g4 << 8) | (b4 << 4) | a4;
816*8975f5c5SAndroid Build Coastguard Worker             }
817*8975f5c5SAndroid Build Coastguard Worker         }
818*8975f5c5SAndroid Build Coastguard Worker     }
819*8975f5c5SAndroid Build Coastguard Worker }
820*8975f5c5SAndroid Build Coastguard Worker 
LoadRGBA4ToARGB4(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)821*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA4ToARGB4(const ImageLoadContext &context,
822*8975f5c5SAndroid Build Coastguard Worker                       size_t width,
823*8975f5c5SAndroid Build Coastguard Worker                       size_t height,
824*8975f5c5SAndroid Build Coastguard Worker                       size_t depth,
825*8975f5c5SAndroid Build Coastguard Worker                       const uint8_t *input,
826*8975f5c5SAndroid Build Coastguard Worker                       size_t inputRowPitch,
827*8975f5c5SAndroid Build Coastguard Worker                       size_t inputDepthPitch,
828*8975f5c5SAndroid Build Coastguard Worker                       uint8_t *output,
829*8975f5c5SAndroid Build Coastguard Worker                       size_t outputRowPitch,
830*8975f5c5SAndroid Build Coastguard Worker                       size_t outputDepthPitch)
831*8975f5c5SAndroid Build Coastguard Worker {
832*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
833*8975f5c5SAndroid Build Coastguard Worker     {
834*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
835*8975f5c5SAndroid Build Coastguard Worker         {
836*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
837*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
838*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
839*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
840*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
841*8975f5c5SAndroid Build Coastguard Worker             {
842*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = ANGLE_ROTR16(source[x], 4);
843*8975f5c5SAndroid Build Coastguard Worker             }
844*8975f5c5SAndroid Build Coastguard Worker         }
845*8975f5c5SAndroid Build Coastguard Worker     }
846*8975f5c5SAndroid Build Coastguard Worker }
847*8975f5c5SAndroid Build Coastguard Worker 
LoadRGBA4ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)848*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA4ToBGRA8(const ImageLoadContext &context,
849*8975f5c5SAndroid Build Coastguard Worker                       size_t width,
850*8975f5c5SAndroid Build Coastguard Worker                       size_t height,
851*8975f5c5SAndroid Build Coastguard Worker                       size_t depth,
852*8975f5c5SAndroid Build Coastguard Worker                       const uint8_t *input,
853*8975f5c5SAndroid Build Coastguard Worker                       size_t inputRowPitch,
854*8975f5c5SAndroid Build Coastguard Worker                       size_t inputDepthPitch,
855*8975f5c5SAndroid Build Coastguard Worker                       uint8_t *output,
856*8975f5c5SAndroid Build Coastguard Worker                       size_t outputRowPitch,
857*8975f5c5SAndroid Build Coastguard Worker                       size_t outputDepthPitch)
858*8975f5c5SAndroid Build Coastguard Worker {
859*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
860*8975f5c5SAndroid Build Coastguard Worker     {
861*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
862*8975f5c5SAndroid Build Coastguard Worker         {
863*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
864*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
865*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
866*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
867*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
868*8975f5c5SAndroid Build Coastguard Worker             {
869*8975f5c5SAndroid Build Coastguard Worker                 uint16_t rgba = source[x];
870*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] =
871*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4));
872*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] =
873*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8));
874*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] =
875*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12));
876*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] =
877*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0));
878*8975f5c5SAndroid Build Coastguard Worker             }
879*8975f5c5SAndroid Build Coastguard Worker         }
880*8975f5c5SAndroid Build Coastguard Worker     }
881*8975f5c5SAndroid Build Coastguard Worker }
882*8975f5c5SAndroid Build Coastguard Worker 
LoadRGBA4ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)883*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA4ToRGBA8(const ImageLoadContext &context,
884*8975f5c5SAndroid Build Coastguard Worker                       size_t width,
885*8975f5c5SAndroid Build Coastguard Worker                       size_t height,
886*8975f5c5SAndroid Build Coastguard Worker                       size_t depth,
887*8975f5c5SAndroid Build Coastguard Worker                       const uint8_t *input,
888*8975f5c5SAndroid Build Coastguard Worker                       size_t inputRowPitch,
889*8975f5c5SAndroid Build Coastguard Worker                       size_t inputDepthPitch,
890*8975f5c5SAndroid Build Coastguard Worker                       uint8_t *output,
891*8975f5c5SAndroid Build Coastguard Worker                       size_t outputRowPitch,
892*8975f5c5SAndroid Build Coastguard Worker                       size_t outputDepthPitch)
893*8975f5c5SAndroid Build Coastguard Worker {
894*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
895*8975f5c5SAndroid Build Coastguard Worker     {
896*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
897*8975f5c5SAndroid Build Coastguard Worker         {
898*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
899*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
900*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
901*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
902*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
903*8975f5c5SAndroid Build Coastguard Worker             {
904*8975f5c5SAndroid Build Coastguard Worker                 uint16_t rgba = source[x];
905*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] =
906*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12));
907*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] =
908*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8));
909*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] =
910*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4));
911*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] =
912*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0));
913*8975f5c5SAndroid Build Coastguard Worker             }
914*8975f5c5SAndroid Build Coastguard Worker         }
915*8975f5c5SAndroid Build Coastguard Worker     }
916*8975f5c5SAndroid Build Coastguard Worker }
917*8975f5c5SAndroid Build Coastguard Worker 
LoadBGRA4ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)918*8975f5c5SAndroid Build Coastguard Worker void LoadBGRA4ToBGRA8(const ImageLoadContext &context,
919*8975f5c5SAndroid Build Coastguard Worker                       size_t width,
920*8975f5c5SAndroid Build Coastguard Worker                       size_t height,
921*8975f5c5SAndroid Build Coastguard Worker                       size_t depth,
922*8975f5c5SAndroid Build Coastguard Worker                       const uint8_t *input,
923*8975f5c5SAndroid Build Coastguard Worker                       size_t inputRowPitch,
924*8975f5c5SAndroid Build Coastguard Worker                       size_t inputDepthPitch,
925*8975f5c5SAndroid Build Coastguard Worker                       uint8_t *output,
926*8975f5c5SAndroid Build Coastguard Worker                       size_t outputRowPitch,
927*8975f5c5SAndroid Build Coastguard Worker                       size_t outputDepthPitch)
928*8975f5c5SAndroid Build Coastguard Worker {
929*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
930*8975f5c5SAndroid Build Coastguard Worker     {
931*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
932*8975f5c5SAndroid Build Coastguard Worker         {
933*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
934*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
935*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
936*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
937*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
938*8975f5c5SAndroid Build Coastguard Worker             {
939*8975f5c5SAndroid Build Coastguard Worker                 uint16_t bgra = source[x];
940*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] =
941*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((bgra & 0xF000) >> 8) | ((bgra & 0xF000) >> 12));
942*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] =
943*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((bgra & 0x0F00) >> 4) | ((bgra & 0x0F00) >> 8));
944*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] =
945*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((bgra & 0x00F0) << 0) | ((bgra & 0x00F0) >> 4));
946*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] =
947*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((bgra & 0x000F) << 4) | ((bgra & 0x000F) >> 0));
948*8975f5c5SAndroid Build Coastguard Worker             }
949*8975f5c5SAndroid Build Coastguard Worker         }
950*8975f5c5SAndroid Build Coastguard Worker     }
951*8975f5c5SAndroid Build Coastguard Worker }
952*8975f5c5SAndroid Build Coastguard Worker 
LoadRGBA8ToBGR5A1(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)953*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA8ToBGR5A1(const ImageLoadContext &context,
954*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
955*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
956*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
957*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
958*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
959*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
960*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
961*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
962*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
963*8975f5c5SAndroid Build Coastguard Worker {
964*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
965*8975f5c5SAndroid Build Coastguard Worker     {
966*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
967*8975f5c5SAndroid Build Coastguard Worker         {
968*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
969*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
970*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
971*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
972*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
973*8975f5c5SAndroid Build Coastguard Worker             {
974*8975f5c5SAndroid Build Coastguard Worker                 uint32_t rgba8 = source[x];
975*8975f5c5SAndroid Build Coastguard Worker                 auto r5        = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 3);
976*8975f5c5SAndroid Build Coastguard Worker                 auto g5        = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 11);
977*8975f5c5SAndroid Build Coastguard Worker                 auto b5        = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 19);
978*8975f5c5SAndroid Build Coastguard Worker                 auto a1        = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 31);
979*8975f5c5SAndroid Build Coastguard Worker                 dest[x]        = (a1 << 15) | (r5 << 10) | (g5 << 5) | b5;
980*8975f5c5SAndroid Build Coastguard Worker             }
981*8975f5c5SAndroid Build Coastguard Worker         }
982*8975f5c5SAndroid Build Coastguard Worker     }
983*8975f5c5SAndroid Build Coastguard Worker }
984*8975f5c5SAndroid Build Coastguard Worker 
LoadRGBA8ToRGB5A1(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)985*8975f5c5SAndroid Build Coastguard Worker void LoadRGBA8ToRGB5A1(const ImageLoadContext &context,
986*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
987*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
988*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
989*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
990*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
991*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
992*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
993*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
994*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
995*8975f5c5SAndroid Build Coastguard Worker {
996*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
997*8975f5c5SAndroid Build Coastguard Worker     {
998*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
999*8975f5c5SAndroid Build Coastguard Worker         {
1000*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1001*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1002*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
1003*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1004*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1005*8975f5c5SAndroid Build Coastguard Worker             {
1006*8975f5c5SAndroid Build Coastguard Worker                 uint32_t rgba8 = source[x];
1007*8975f5c5SAndroid Build Coastguard Worker                 auto r5        = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 3);
1008*8975f5c5SAndroid Build Coastguard Worker                 auto g5        = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 11);
1009*8975f5c5SAndroid Build Coastguard Worker                 auto b5        = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 19);
1010*8975f5c5SAndroid Build Coastguard Worker                 auto a1        = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 31);
1011*8975f5c5SAndroid Build Coastguard Worker                 dest[x]        = (r5 << 11) | (g5 << 6) | (b5 << 1) | a1;
1012*8975f5c5SAndroid Build Coastguard Worker             }
1013*8975f5c5SAndroid Build Coastguard Worker         }
1014*8975f5c5SAndroid Build Coastguard Worker     }
1015*8975f5c5SAndroid Build Coastguard Worker }
1016*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB10A2ToBGR5A1(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1017*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToBGR5A1(const ImageLoadContext &context,
1018*8975f5c5SAndroid Build Coastguard Worker                          size_t width,
1019*8975f5c5SAndroid Build Coastguard Worker                          size_t height,
1020*8975f5c5SAndroid Build Coastguard Worker                          size_t depth,
1021*8975f5c5SAndroid Build Coastguard Worker                          const uint8_t *input,
1022*8975f5c5SAndroid Build Coastguard Worker                          size_t inputRowPitch,
1023*8975f5c5SAndroid Build Coastguard Worker                          size_t inputDepthPitch,
1024*8975f5c5SAndroid Build Coastguard Worker                          uint8_t *output,
1025*8975f5c5SAndroid Build Coastguard Worker                          size_t outputRowPitch,
1026*8975f5c5SAndroid Build Coastguard Worker                          size_t outputDepthPitch)
1027*8975f5c5SAndroid Build Coastguard Worker {
1028*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1029*8975f5c5SAndroid Build Coastguard Worker     {
1030*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1031*8975f5c5SAndroid Build Coastguard Worker         {
1032*8975f5c5SAndroid Build Coastguard Worker             const R10G10B10A2 *source =
1033*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<R10G10B10A2>(input, y, z, inputRowPitch, inputDepthPitch);
1034*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
1035*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1036*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1037*8975f5c5SAndroid Build Coastguard Worker             {
1038*8975f5c5SAndroid Build Coastguard Worker                 R10G10B10A2 rgb10a2 = source[x];
1039*8975f5c5SAndroid Build Coastguard Worker 
1040*8975f5c5SAndroid Build Coastguard Worker                 uint16_t r5 = static_cast<uint16_t>(rgb10a2.R >> 5u);
1041*8975f5c5SAndroid Build Coastguard Worker                 uint16_t g5 = static_cast<uint16_t>(rgb10a2.G >> 5u);
1042*8975f5c5SAndroid Build Coastguard Worker                 uint16_t b5 = static_cast<uint16_t>(rgb10a2.B >> 5u);
1043*8975f5c5SAndroid Build Coastguard Worker                 uint16_t a1 = static_cast<uint16_t>(rgb10a2.A >> 1u);
1044*8975f5c5SAndroid Build Coastguard Worker 
1045*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = (a1 << 15) | (r5 << 10) | (g5 << 5) | b5;
1046*8975f5c5SAndroid Build Coastguard Worker             }
1047*8975f5c5SAndroid Build Coastguard Worker         }
1048*8975f5c5SAndroid Build Coastguard Worker     }
1049*8975f5c5SAndroid Build Coastguard Worker }
1050*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB10A2ToRGB5A1(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1051*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToRGB5A1(const ImageLoadContext &context,
1052*8975f5c5SAndroid Build Coastguard Worker                          size_t width,
1053*8975f5c5SAndroid Build Coastguard Worker                          size_t height,
1054*8975f5c5SAndroid Build Coastguard Worker                          size_t depth,
1055*8975f5c5SAndroid Build Coastguard Worker                          const uint8_t *input,
1056*8975f5c5SAndroid Build Coastguard Worker                          size_t inputRowPitch,
1057*8975f5c5SAndroid Build Coastguard Worker                          size_t inputDepthPitch,
1058*8975f5c5SAndroid Build Coastguard Worker                          uint8_t *output,
1059*8975f5c5SAndroid Build Coastguard Worker                          size_t outputRowPitch,
1060*8975f5c5SAndroid Build Coastguard Worker                          size_t outputDepthPitch)
1061*8975f5c5SAndroid Build Coastguard Worker {
1062*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1063*8975f5c5SAndroid Build Coastguard Worker     {
1064*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1065*8975f5c5SAndroid Build Coastguard Worker         {
1066*8975f5c5SAndroid Build Coastguard Worker             const R10G10B10A2 *source =
1067*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<R10G10B10A2>(input, y, z, inputRowPitch, inputDepthPitch);
1068*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
1069*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1070*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1071*8975f5c5SAndroid Build Coastguard Worker             {
1072*8975f5c5SAndroid Build Coastguard Worker                 R10G10B10A2 rgb10a2 = source[x];
1073*8975f5c5SAndroid Build Coastguard Worker 
1074*8975f5c5SAndroid Build Coastguard Worker                 uint16_t r5 = static_cast<uint16_t>(rgb10a2.R >> 5u);
1075*8975f5c5SAndroid Build Coastguard Worker                 uint16_t g5 = static_cast<uint16_t>(rgb10a2.G >> 5u);
1076*8975f5c5SAndroid Build Coastguard Worker                 uint16_t b5 = static_cast<uint16_t>(rgb10a2.B >> 5u);
1077*8975f5c5SAndroid Build Coastguard Worker                 uint16_t a1 = static_cast<uint16_t>(rgb10a2.A >> 1u);
1078*8975f5c5SAndroid Build Coastguard Worker 
1079*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = (r5 << 11) | (g5 << 6) | (b5 << 1) | a1;
1080*8975f5c5SAndroid Build Coastguard Worker             }
1081*8975f5c5SAndroid Build Coastguard Worker         }
1082*8975f5c5SAndroid Build Coastguard Worker     }
1083*8975f5c5SAndroid Build Coastguard Worker }
1084*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB10A2ToRGB565(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1085*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToRGB565(const ImageLoadContext &context,
1086*8975f5c5SAndroid Build Coastguard Worker                          size_t width,
1087*8975f5c5SAndroid Build Coastguard Worker                          size_t height,
1088*8975f5c5SAndroid Build Coastguard Worker                          size_t depth,
1089*8975f5c5SAndroid Build Coastguard Worker                          const uint8_t *input,
1090*8975f5c5SAndroid Build Coastguard Worker                          size_t inputRowPitch,
1091*8975f5c5SAndroid Build Coastguard Worker                          size_t inputDepthPitch,
1092*8975f5c5SAndroid Build Coastguard Worker                          uint8_t *output,
1093*8975f5c5SAndroid Build Coastguard Worker                          size_t outputRowPitch,
1094*8975f5c5SAndroid Build Coastguard Worker                          size_t outputDepthPitch)
1095*8975f5c5SAndroid Build Coastguard Worker {
1096*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1097*8975f5c5SAndroid Build Coastguard Worker     {
1098*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1099*8975f5c5SAndroid Build Coastguard Worker         {
1100*8975f5c5SAndroid Build Coastguard Worker             const R10G10B10A2 *source =
1101*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<R10G10B10A2>(input, y, z, inputRowPitch, inputDepthPitch);
1102*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
1103*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1104*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1105*8975f5c5SAndroid Build Coastguard Worker             {
1106*8975f5c5SAndroid Build Coastguard Worker                 R10G10B10A2 rgb10a2 = source[x];
1107*8975f5c5SAndroid Build Coastguard Worker 
1108*8975f5c5SAndroid Build Coastguard Worker                 uint16_t r5 = static_cast<uint16_t>(rgb10a2.R >> 5u);
1109*8975f5c5SAndroid Build Coastguard Worker                 uint16_t g6 = static_cast<uint16_t>(rgb10a2.G >> 4u);
1110*8975f5c5SAndroid Build Coastguard Worker                 uint16_t b5 = static_cast<uint16_t>(rgb10a2.B >> 5u);
1111*8975f5c5SAndroid Build Coastguard Worker 
1112*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = (r5 << 11) | (g6 << 5) | b5;
1113*8975f5c5SAndroid Build Coastguard Worker             }
1114*8975f5c5SAndroid Build Coastguard Worker         }
1115*8975f5c5SAndroid Build Coastguard Worker     }
1116*8975f5c5SAndroid Build Coastguard Worker }
1117*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB5A1ToA1RGB5(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1118*8975f5c5SAndroid Build Coastguard Worker void LoadRGB5A1ToA1RGB5(const ImageLoadContext &context,
1119*8975f5c5SAndroid Build Coastguard Worker                         size_t width,
1120*8975f5c5SAndroid Build Coastguard Worker                         size_t height,
1121*8975f5c5SAndroid Build Coastguard Worker                         size_t depth,
1122*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input,
1123*8975f5c5SAndroid Build Coastguard Worker                         size_t inputRowPitch,
1124*8975f5c5SAndroid Build Coastguard Worker                         size_t inputDepthPitch,
1125*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output,
1126*8975f5c5SAndroid Build Coastguard Worker                         size_t outputRowPitch,
1127*8975f5c5SAndroid Build Coastguard Worker                         size_t outputDepthPitch)
1128*8975f5c5SAndroid Build Coastguard Worker {
1129*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1130*8975f5c5SAndroid Build Coastguard Worker     {
1131*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1132*8975f5c5SAndroid Build Coastguard Worker         {
1133*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
1134*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1135*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
1136*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1137*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1138*8975f5c5SAndroid Build Coastguard Worker             {
1139*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = ANGLE_ROTR16(source[x], 1);
1140*8975f5c5SAndroid Build Coastguard Worker             }
1141*8975f5c5SAndroid Build Coastguard Worker         }
1142*8975f5c5SAndroid Build Coastguard Worker     }
1143*8975f5c5SAndroid Build Coastguard Worker }
1144*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB5A1ToBGR5A1(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1145*8975f5c5SAndroid Build Coastguard Worker void LoadRGB5A1ToBGR5A1(const ImageLoadContext &context,
1146*8975f5c5SAndroid Build Coastguard Worker                         size_t width,
1147*8975f5c5SAndroid Build Coastguard Worker                         size_t height,
1148*8975f5c5SAndroid Build Coastguard Worker                         size_t depth,
1149*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input,
1150*8975f5c5SAndroid Build Coastguard Worker                         size_t inputRowPitch,
1151*8975f5c5SAndroid Build Coastguard Worker                         size_t inputDepthPitch,
1152*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output,
1153*8975f5c5SAndroid Build Coastguard Worker                         size_t outputRowPitch,
1154*8975f5c5SAndroid Build Coastguard Worker                         size_t outputDepthPitch)
1155*8975f5c5SAndroid Build Coastguard Worker {
1156*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1157*8975f5c5SAndroid Build Coastguard Worker     {
1158*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1159*8975f5c5SAndroid Build Coastguard Worker         {
1160*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
1161*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1162*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
1163*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1164*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1165*8975f5c5SAndroid Build Coastguard Worker             {
1166*8975f5c5SAndroid Build Coastguard Worker                 uint16_t rgba = source[x];
1167*8975f5c5SAndroid Build Coastguard Worker                 auto r5       = static_cast<uint16_t>((rgba & 0xF800) >> 11);
1168*8975f5c5SAndroid Build Coastguard Worker                 auto g5       = static_cast<uint16_t>((rgba & 0x07c0) >> 6);
1169*8975f5c5SAndroid Build Coastguard Worker                 auto b5       = static_cast<uint16_t>((rgba & 0x003e) >> 1);
1170*8975f5c5SAndroid Build Coastguard Worker                 auto a1       = static_cast<uint16_t>((rgba & 0x0001));
1171*8975f5c5SAndroid Build Coastguard Worker                 dest[x]       = (b5 << 11) | (g5 << 6) | (r5 << 1) | a1;
1172*8975f5c5SAndroid Build Coastguard Worker             }
1173*8975f5c5SAndroid Build Coastguard Worker         }
1174*8975f5c5SAndroid Build Coastguard Worker     }
1175*8975f5c5SAndroid Build Coastguard Worker }
1176*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB5A1ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1177*8975f5c5SAndroid Build Coastguard Worker void LoadRGB5A1ToBGRA8(const ImageLoadContext &context,
1178*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
1179*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
1180*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
1181*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
1182*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
1183*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
1184*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
1185*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
1186*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
1187*8975f5c5SAndroid Build Coastguard Worker {
1188*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1189*8975f5c5SAndroid Build Coastguard Worker     {
1190*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1191*8975f5c5SAndroid Build Coastguard Worker         {
1192*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
1193*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1194*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
1195*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
1196*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1197*8975f5c5SAndroid Build Coastguard Worker             {
1198*8975f5c5SAndroid Build Coastguard Worker                 uint16_t rgba = source[x];
1199*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] =
1200*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3));
1201*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] =
1202*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8));
1203*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] =
1204*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13));
1205*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = static_cast<uint8_t>((rgba & 0x0001) ? 0xFF : 0);
1206*8975f5c5SAndroid Build Coastguard Worker             }
1207*8975f5c5SAndroid Build Coastguard Worker         }
1208*8975f5c5SAndroid Build Coastguard Worker     }
1209*8975f5c5SAndroid Build Coastguard Worker }
1210*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB5A1ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1211*8975f5c5SAndroid Build Coastguard Worker void LoadRGB5A1ToRGBA8(const ImageLoadContext &context,
1212*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
1213*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
1214*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
1215*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
1216*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
1217*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
1218*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
1219*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
1220*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
1221*8975f5c5SAndroid Build Coastguard Worker {
1222*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1223*8975f5c5SAndroid Build Coastguard Worker     {
1224*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1225*8975f5c5SAndroid Build Coastguard Worker         {
1226*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
1227*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1228*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
1229*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
1230*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1231*8975f5c5SAndroid Build Coastguard Worker             {
1232*8975f5c5SAndroid Build Coastguard Worker                 uint16_t rgba = source[x];
1233*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] =
1234*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13));
1235*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] =
1236*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8));
1237*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] =
1238*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3));
1239*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = static_cast<uint8_t>((rgba & 0x0001) ? 0xFF : 0);
1240*8975f5c5SAndroid Build Coastguard Worker             }
1241*8975f5c5SAndroid Build Coastguard Worker         }
1242*8975f5c5SAndroid Build Coastguard Worker     }
1243*8975f5c5SAndroid Build Coastguard Worker }
1244*8975f5c5SAndroid Build Coastguard Worker 
LoadBGR5A1ToBGRA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1245*8975f5c5SAndroid Build Coastguard Worker void LoadBGR5A1ToBGRA8(const ImageLoadContext &context,
1246*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
1247*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
1248*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
1249*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
1250*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
1251*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
1252*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
1253*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
1254*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
1255*8975f5c5SAndroid Build Coastguard Worker {
1256*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1257*8975f5c5SAndroid Build Coastguard Worker     {
1258*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1259*8975f5c5SAndroid Build Coastguard Worker         {
1260*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
1261*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1262*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
1263*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
1264*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1265*8975f5c5SAndroid Build Coastguard Worker             {
1266*8975f5c5SAndroid Build Coastguard Worker                 uint16_t bgra = source[x];
1267*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] =
1268*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((bgra & 0xF800) >> 8) | ((bgra & 0xF800) >> 13));
1269*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] =
1270*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((bgra & 0x07C0) >> 3) | ((bgra & 0x07C0) >> 8));
1271*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] =
1272*8975f5c5SAndroid Build Coastguard Worker                     static_cast<uint8_t>(((bgra & 0x003E) << 2) | ((bgra & 0x003E) >> 3));
1273*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = static_cast<uint8_t>((bgra & 0x0001) ? 0xFF : 0);
1274*8975f5c5SAndroid Build Coastguard Worker             }
1275*8975f5c5SAndroid Build Coastguard Worker         }
1276*8975f5c5SAndroid Build Coastguard Worker     }
1277*8975f5c5SAndroid Build Coastguard Worker }
1278*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB10A2ToRGBA8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1279*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToRGBA8(const ImageLoadContext &context,
1280*8975f5c5SAndroid Build Coastguard Worker                         size_t width,
1281*8975f5c5SAndroid Build Coastguard Worker                         size_t height,
1282*8975f5c5SAndroid Build Coastguard Worker                         size_t depth,
1283*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input,
1284*8975f5c5SAndroid Build Coastguard Worker                         size_t inputRowPitch,
1285*8975f5c5SAndroid Build Coastguard Worker                         size_t inputDepthPitch,
1286*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output,
1287*8975f5c5SAndroid Build Coastguard Worker                         size_t outputRowPitch,
1288*8975f5c5SAndroid Build Coastguard Worker                         size_t outputDepthPitch)
1289*8975f5c5SAndroid Build Coastguard Worker {
1290*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1291*8975f5c5SAndroid Build Coastguard Worker     {
1292*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1293*8975f5c5SAndroid Build Coastguard Worker         {
1294*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1295*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1296*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
1297*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
1298*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1299*8975f5c5SAndroid Build Coastguard Worker             {
1300*8975f5c5SAndroid Build Coastguard Worker                 uint32_t rgba   = source[x];
1301*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 0] = static_cast<uint8_t>((rgba & 0x000003FF) >> 2);
1302*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 1] = static_cast<uint8_t>((rgba & 0x000FFC00) >> 12);
1303*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 2] = static_cast<uint8_t>((rgba & 0x3FF00000) >> 22);
1304*8975f5c5SAndroid Build Coastguard Worker                 dest[4 * x + 3] = static_cast<uint8_t>(((rgba & 0xC0000000) >> 30) * 0x55);
1305*8975f5c5SAndroid Build Coastguard Worker             }
1306*8975f5c5SAndroid Build Coastguard Worker         }
1307*8975f5c5SAndroid Build Coastguard Worker     }
1308*8975f5c5SAndroid Build Coastguard Worker }
1309*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB10A2ToRGB8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1310*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToRGB8(const ImageLoadContext &context,
1311*8975f5c5SAndroid Build Coastguard Worker                        size_t width,
1312*8975f5c5SAndroid Build Coastguard Worker                        size_t height,
1313*8975f5c5SAndroid Build Coastguard Worker                        size_t depth,
1314*8975f5c5SAndroid Build Coastguard Worker                        const uint8_t *input,
1315*8975f5c5SAndroid Build Coastguard Worker                        size_t inputRowPitch,
1316*8975f5c5SAndroid Build Coastguard Worker                        size_t inputDepthPitch,
1317*8975f5c5SAndroid Build Coastguard Worker                        uint8_t *output,
1318*8975f5c5SAndroid Build Coastguard Worker                        size_t outputRowPitch,
1319*8975f5c5SAndroid Build Coastguard Worker                        size_t outputDepthPitch)
1320*8975f5c5SAndroid Build Coastguard Worker {
1321*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1322*8975f5c5SAndroid Build Coastguard Worker     {
1323*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1324*8975f5c5SAndroid Build Coastguard Worker         {
1325*8975f5c5SAndroid Build Coastguard Worker 
1326*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1327*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1328*8975f5c5SAndroid Build Coastguard Worker             uint8_t *dest =
1329*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);
1330*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1331*8975f5c5SAndroid Build Coastguard Worker             {
1332*8975f5c5SAndroid Build Coastguard Worker                 uint32_t rgba   = source[x];
1333*8975f5c5SAndroid Build Coastguard Worker                 dest[3 * x + 0] = static_cast<uint8_t>((rgba & 0x000003FF) >> 2);
1334*8975f5c5SAndroid Build Coastguard Worker                 dest[3 * x + 1] = static_cast<uint8_t>((rgba & 0x000FFC00) >> 12);
1335*8975f5c5SAndroid Build Coastguard Worker                 dest[3 * x + 2] = static_cast<uint8_t>((rgba & 0x3FF00000) >> 22);
1336*8975f5c5SAndroid Build Coastguard Worker             }
1337*8975f5c5SAndroid Build Coastguard Worker         }
1338*8975f5c5SAndroid Build Coastguard Worker     }
1339*8975f5c5SAndroid Build Coastguard Worker }
1340*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB10A2ToRGB10X2(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1341*8975f5c5SAndroid Build Coastguard Worker void LoadRGB10A2ToRGB10X2(const ImageLoadContext &context,
1342*8975f5c5SAndroid Build Coastguard Worker                           size_t width,
1343*8975f5c5SAndroid Build Coastguard Worker                           size_t height,
1344*8975f5c5SAndroid Build Coastguard Worker                           size_t depth,
1345*8975f5c5SAndroid Build Coastguard Worker                           const uint8_t *input,
1346*8975f5c5SAndroid Build Coastguard Worker                           size_t inputRowPitch,
1347*8975f5c5SAndroid Build Coastguard Worker                           size_t inputDepthPitch,
1348*8975f5c5SAndroid Build Coastguard Worker                           uint8_t *output,
1349*8975f5c5SAndroid Build Coastguard Worker                           size_t outputRowPitch,
1350*8975f5c5SAndroid Build Coastguard Worker                           size_t outputDepthPitch)
1351*8975f5c5SAndroid Build Coastguard Worker {
1352*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1353*8975f5c5SAndroid Build Coastguard Worker     {
1354*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1355*8975f5c5SAndroid Build Coastguard Worker         {
1356*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1357*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1358*8975f5c5SAndroid Build Coastguard Worker             uint32_t *dest =
1359*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1360*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1361*8975f5c5SAndroid Build Coastguard Worker             {
1362*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = source[x] | 0xC0000000;
1363*8975f5c5SAndroid Build Coastguard Worker             }
1364*8975f5c5SAndroid Build Coastguard Worker         }
1365*8975f5c5SAndroid Build Coastguard Worker     }
1366*8975f5c5SAndroid Build Coastguard Worker }
1367*8975f5c5SAndroid Build Coastguard Worker 
LoadBGR10A2ToRGB10A2(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1368*8975f5c5SAndroid Build Coastguard Worker void LoadBGR10A2ToRGB10A2(const ImageLoadContext &context,
1369*8975f5c5SAndroid Build Coastguard Worker                           size_t width,
1370*8975f5c5SAndroid Build Coastguard Worker                           size_t height,
1371*8975f5c5SAndroid Build Coastguard Worker                           size_t depth,
1372*8975f5c5SAndroid Build Coastguard Worker                           const uint8_t *input,
1373*8975f5c5SAndroid Build Coastguard Worker                           size_t inputRowPitch,
1374*8975f5c5SAndroid Build Coastguard Worker                           size_t inputDepthPitch,
1375*8975f5c5SAndroid Build Coastguard Worker                           uint8_t *output,
1376*8975f5c5SAndroid Build Coastguard Worker                           size_t outputRowPitch,
1377*8975f5c5SAndroid Build Coastguard Worker                           size_t outputDepthPitch)
1378*8975f5c5SAndroid Build Coastguard Worker {
1379*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1380*8975f5c5SAndroid Build Coastguard Worker     {
1381*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1382*8975f5c5SAndroid Build Coastguard Worker         {
1383*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1384*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1385*8975f5c5SAndroid Build Coastguard Worker             uint32_t *dest =
1386*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1387*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1388*8975f5c5SAndroid Build Coastguard Worker             {
1389*8975f5c5SAndroid Build Coastguard Worker                 const uint32_t src  = source[x];
1390*8975f5c5SAndroid Build Coastguard Worker                 const uint32_t srcB = src & 0x3FF;
1391*8975f5c5SAndroid Build Coastguard Worker                 const uint32_t srcG = src >> 10 & 0x3FF;
1392*8975f5c5SAndroid Build Coastguard Worker                 const uint32_t srcR = src >> 20 & 0x3FF;
1393*8975f5c5SAndroid Build Coastguard Worker                 const uint32_t srcA = src >> 30 & 0x3;
1394*8975f5c5SAndroid Build Coastguard Worker                 dest[x]             = srcR | srcG << 10 | srcB << 20 | srcA << 30;
1395*8975f5c5SAndroid Build Coastguard Worker             }
1396*8975f5c5SAndroid Build Coastguard Worker         }
1397*8975f5c5SAndroid Build Coastguard Worker     }
1398*8975f5c5SAndroid Build Coastguard Worker }
1399*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB16FToRGB9E5(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1400*8975f5c5SAndroid Build Coastguard Worker void LoadRGB16FToRGB9E5(const ImageLoadContext &context,
1401*8975f5c5SAndroid Build Coastguard Worker                         size_t width,
1402*8975f5c5SAndroid Build Coastguard Worker                         size_t height,
1403*8975f5c5SAndroid Build Coastguard Worker                         size_t depth,
1404*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input,
1405*8975f5c5SAndroid Build Coastguard Worker                         size_t inputRowPitch,
1406*8975f5c5SAndroid Build Coastguard Worker                         size_t inputDepthPitch,
1407*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output,
1408*8975f5c5SAndroid Build Coastguard Worker                         size_t outputRowPitch,
1409*8975f5c5SAndroid Build Coastguard Worker                         size_t outputDepthPitch)
1410*8975f5c5SAndroid Build Coastguard Worker {
1411*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1412*8975f5c5SAndroid Build Coastguard Worker     {
1413*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1414*8975f5c5SAndroid Build Coastguard Worker         {
1415*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
1416*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1417*8975f5c5SAndroid Build Coastguard Worker             uint32_t *dest =
1418*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1419*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1420*8975f5c5SAndroid Build Coastguard Worker             {
1421*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = gl::convertRGBFloatsTo999E5(gl::float16ToFloat32(source[x * 3 + 0]),
1422*8975f5c5SAndroid Build Coastguard Worker                                                       gl::float16ToFloat32(source[x * 3 + 1]),
1423*8975f5c5SAndroid Build Coastguard Worker                                                       gl::float16ToFloat32(source[x * 3 + 2]));
1424*8975f5c5SAndroid Build Coastguard Worker             }
1425*8975f5c5SAndroid Build Coastguard Worker         }
1426*8975f5c5SAndroid Build Coastguard Worker     }
1427*8975f5c5SAndroid Build Coastguard Worker }
1428*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB32FToRGB9E5(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1429*8975f5c5SAndroid Build Coastguard Worker void LoadRGB32FToRGB9E5(const ImageLoadContext &context,
1430*8975f5c5SAndroid Build Coastguard Worker                         size_t width,
1431*8975f5c5SAndroid Build Coastguard Worker                         size_t height,
1432*8975f5c5SAndroid Build Coastguard Worker                         size_t depth,
1433*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input,
1434*8975f5c5SAndroid Build Coastguard Worker                         size_t inputRowPitch,
1435*8975f5c5SAndroid Build Coastguard Worker                         size_t inputDepthPitch,
1436*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output,
1437*8975f5c5SAndroid Build Coastguard Worker                         size_t outputRowPitch,
1438*8975f5c5SAndroid Build Coastguard Worker                         size_t outputDepthPitch)
1439*8975f5c5SAndroid Build Coastguard Worker {
1440*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1441*8975f5c5SAndroid Build Coastguard Worker     {
1442*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1443*8975f5c5SAndroid Build Coastguard Worker         {
1444*8975f5c5SAndroid Build Coastguard Worker             const float *source =
1445*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1446*8975f5c5SAndroid Build Coastguard Worker             uint32_t *dest =
1447*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1448*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1449*8975f5c5SAndroid Build Coastguard Worker             {
1450*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = gl::convertRGBFloatsTo999E5(source[x * 3 + 0], source[x * 3 + 1],
1451*8975f5c5SAndroid Build Coastguard Worker                                                       source[x * 3 + 2]);
1452*8975f5c5SAndroid Build Coastguard Worker             }
1453*8975f5c5SAndroid Build Coastguard Worker         }
1454*8975f5c5SAndroid Build Coastguard Worker     }
1455*8975f5c5SAndroid Build Coastguard Worker }
1456*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB16FToRG11B10F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1457*8975f5c5SAndroid Build Coastguard Worker void LoadRGB16FToRG11B10F(const ImageLoadContext &context,
1458*8975f5c5SAndroid Build Coastguard Worker                           size_t width,
1459*8975f5c5SAndroid Build Coastguard Worker                           size_t height,
1460*8975f5c5SAndroid Build Coastguard Worker                           size_t depth,
1461*8975f5c5SAndroid Build Coastguard Worker                           const uint8_t *input,
1462*8975f5c5SAndroid Build Coastguard Worker                           size_t inputRowPitch,
1463*8975f5c5SAndroid Build Coastguard Worker                           size_t inputDepthPitch,
1464*8975f5c5SAndroid Build Coastguard Worker                           uint8_t *output,
1465*8975f5c5SAndroid Build Coastguard Worker                           size_t outputRowPitch,
1466*8975f5c5SAndroid Build Coastguard Worker                           size_t outputDepthPitch)
1467*8975f5c5SAndroid Build Coastguard Worker {
1468*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1469*8975f5c5SAndroid Build Coastguard Worker     {
1470*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1471*8975f5c5SAndroid Build Coastguard Worker         {
1472*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
1473*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1474*8975f5c5SAndroid Build Coastguard Worker             uint32_t *dest =
1475*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1476*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1477*8975f5c5SAndroid Build Coastguard Worker             {
1478*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = (gl::float32ToFloat11(gl::float16ToFloat32(source[x * 3 + 0])) << 0) |
1479*8975f5c5SAndroid Build Coastguard Worker                           (gl::float32ToFloat11(gl::float16ToFloat32(source[x * 3 + 1])) << 11) |
1480*8975f5c5SAndroid Build Coastguard Worker                           (gl::float32ToFloat10(gl::float16ToFloat32(source[x * 3 + 2])) << 22);
1481*8975f5c5SAndroid Build Coastguard Worker             }
1482*8975f5c5SAndroid Build Coastguard Worker         }
1483*8975f5c5SAndroid Build Coastguard Worker     }
1484*8975f5c5SAndroid Build Coastguard Worker }
1485*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB32FToRG11B10F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1486*8975f5c5SAndroid Build Coastguard Worker void LoadRGB32FToRG11B10F(const ImageLoadContext &context,
1487*8975f5c5SAndroid Build Coastguard Worker                           size_t width,
1488*8975f5c5SAndroid Build Coastguard Worker                           size_t height,
1489*8975f5c5SAndroid Build Coastguard Worker                           size_t depth,
1490*8975f5c5SAndroid Build Coastguard Worker                           const uint8_t *input,
1491*8975f5c5SAndroid Build Coastguard Worker                           size_t inputRowPitch,
1492*8975f5c5SAndroid Build Coastguard Worker                           size_t inputDepthPitch,
1493*8975f5c5SAndroid Build Coastguard Worker                           uint8_t *output,
1494*8975f5c5SAndroid Build Coastguard Worker                           size_t outputRowPitch,
1495*8975f5c5SAndroid Build Coastguard Worker                           size_t outputDepthPitch)
1496*8975f5c5SAndroid Build Coastguard Worker {
1497*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1498*8975f5c5SAndroid Build Coastguard Worker     {
1499*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1500*8975f5c5SAndroid Build Coastguard Worker         {
1501*8975f5c5SAndroid Build Coastguard Worker             const float *source =
1502*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1503*8975f5c5SAndroid Build Coastguard Worker             uint32_t *dest =
1504*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1505*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1506*8975f5c5SAndroid Build Coastguard Worker             {
1507*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = (gl::float32ToFloat11(source[x * 3 + 0]) << 0) |
1508*8975f5c5SAndroid Build Coastguard Worker                           (gl::float32ToFloat11(source[x * 3 + 1]) << 11) |
1509*8975f5c5SAndroid Build Coastguard Worker                           (gl::float32ToFloat10(source[x * 3 + 2]) << 22);
1510*8975f5c5SAndroid Build Coastguard Worker             }
1511*8975f5c5SAndroid Build Coastguard Worker         }
1512*8975f5c5SAndroid Build Coastguard Worker     }
1513*8975f5c5SAndroid Build Coastguard Worker }
1514*8975f5c5SAndroid Build Coastguard Worker 
LoadD24S8ToS8D24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1515*8975f5c5SAndroid Build Coastguard Worker void LoadD24S8ToS8D24(const ImageLoadContext &context,
1516*8975f5c5SAndroid Build Coastguard Worker                       size_t width,
1517*8975f5c5SAndroid Build Coastguard Worker                       size_t height,
1518*8975f5c5SAndroid Build Coastguard Worker                       size_t depth,
1519*8975f5c5SAndroid Build Coastguard Worker                       const uint8_t *input,
1520*8975f5c5SAndroid Build Coastguard Worker                       size_t inputRowPitch,
1521*8975f5c5SAndroid Build Coastguard Worker                       size_t inputDepthPitch,
1522*8975f5c5SAndroid Build Coastguard Worker                       uint8_t *output,
1523*8975f5c5SAndroid Build Coastguard Worker                       size_t outputRowPitch,
1524*8975f5c5SAndroid Build Coastguard Worker                       size_t outputDepthPitch)
1525*8975f5c5SAndroid Build Coastguard Worker {
1526*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1527*8975f5c5SAndroid Build Coastguard Worker     {
1528*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1529*8975f5c5SAndroid Build Coastguard Worker         {
1530*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1531*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1532*8975f5c5SAndroid Build Coastguard Worker             uint32_t *dest =
1533*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1534*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1535*8975f5c5SAndroid Build Coastguard Worker             {
1536*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = ANGLE_ROTL(source[x], 24);
1537*8975f5c5SAndroid Build Coastguard Worker             }
1538*8975f5c5SAndroid Build Coastguard Worker         }
1539*8975f5c5SAndroid Build Coastguard Worker     }
1540*8975f5c5SAndroid Build Coastguard Worker }
1541*8975f5c5SAndroid Build Coastguard Worker 
LoadD24S8ToD32FS8X24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1542*8975f5c5SAndroid Build Coastguard Worker void LoadD24S8ToD32FS8X24(const ImageLoadContext &context,
1543*8975f5c5SAndroid Build Coastguard Worker                           size_t width,
1544*8975f5c5SAndroid Build Coastguard Worker                           size_t height,
1545*8975f5c5SAndroid Build Coastguard Worker                           size_t depth,
1546*8975f5c5SAndroid Build Coastguard Worker                           const uint8_t *input,
1547*8975f5c5SAndroid Build Coastguard Worker                           size_t inputRowPitch,
1548*8975f5c5SAndroid Build Coastguard Worker                           size_t inputDepthPitch,
1549*8975f5c5SAndroid Build Coastguard Worker                           uint8_t *output,
1550*8975f5c5SAndroid Build Coastguard Worker                           size_t outputRowPitch,
1551*8975f5c5SAndroid Build Coastguard Worker                           size_t outputDepthPitch)
1552*8975f5c5SAndroid Build Coastguard Worker {
1553*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1554*8975f5c5SAndroid Build Coastguard Worker     {
1555*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1556*8975f5c5SAndroid Build Coastguard Worker         {
1557*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1558*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1559*8975f5c5SAndroid Build Coastguard Worker             float *destDepth =
1560*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1561*8975f5c5SAndroid Build Coastguard Worker             uint32_t *destStencil =
1562*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch) +
1563*8975f5c5SAndroid Build Coastguard Worker                 1;
1564*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1565*8975f5c5SAndroid Build Coastguard Worker             {
1566*8975f5c5SAndroid Build Coastguard Worker                 destDepth[x * 2]   = (source[x] >> 8) / static_cast<float>(0xFFFFFF);
1567*8975f5c5SAndroid Build Coastguard Worker                 destStencil[x * 2] = source[x] & 0xFF;
1568*8975f5c5SAndroid Build Coastguard Worker             }
1569*8975f5c5SAndroid Build Coastguard Worker         }
1570*8975f5c5SAndroid Build Coastguard Worker     }
1571*8975f5c5SAndroid Build Coastguard Worker }
1572*8975f5c5SAndroid Build Coastguard Worker 
LoadD24S8ToD32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1573*8975f5c5SAndroid Build Coastguard Worker void LoadD24S8ToD32F(const ImageLoadContext &context,
1574*8975f5c5SAndroid Build Coastguard Worker                      size_t width,
1575*8975f5c5SAndroid Build Coastguard Worker                      size_t height,
1576*8975f5c5SAndroid Build Coastguard Worker                      size_t depth,
1577*8975f5c5SAndroid Build Coastguard Worker                      const uint8_t *input,
1578*8975f5c5SAndroid Build Coastguard Worker                      size_t inputRowPitch,
1579*8975f5c5SAndroid Build Coastguard Worker                      size_t inputDepthPitch,
1580*8975f5c5SAndroid Build Coastguard Worker                      uint8_t *output,
1581*8975f5c5SAndroid Build Coastguard Worker                      size_t outputRowPitch,
1582*8975f5c5SAndroid Build Coastguard Worker                      size_t outputDepthPitch)
1583*8975f5c5SAndroid Build Coastguard Worker {
1584*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1585*8975f5c5SAndroid Build Coastguard Worker     {
1586*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1587*8975f5c5SAndroid Build Coastguard Worker         {
1588*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1589*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1590*8975f5c5SAndroid Build Coastguard Worker             float *destDepth =
1591*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1592*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1593*8975f5c5SAndroid Build Coastguard Worker             {
1594*8975f5c5SAndroid Build Coastguard Worker                 destDepth[x] = (source[x] >> 8) / static_cast<float>(0xFFFFFF);
1595*8975f5c5SAndroid Build Coastguard Worker             }
1596*8975f5c5SAndroid Build Coastguard Worker         }
1597*8975f5c5SAndroid Build Coastguard Worker     }
1598*8975f5c5SAndroid Build Coastguard Worker }
1599*8975f5c5SAndroid Build Coastguard Worker 
LoadD32ToD32FX32(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1600*8975f5c5SAndroid Build Coastguard Worker void LoadD32ToD32FX32(const ImageLoadContext &context,
1601*8975f5c5SAndroid Build Coastguard Worker                       size_t width,
1602*8975f5c5SAndroid Build Coastguard Worker                       size_t height,
1603*8975f5c5SAndroid Build Coastguard Worker                       size_t depth,
1604*8975f5c5SAndroid Build Coastguard Worker                       const uint8_t *input,
1605*8975f5c5SAndroid Build Coastguard Worker                       size_t inputRowPitch,
1606*8975f5c5SAndroid Build Coastguard Worker                       size_t inputDepthPitch,
1607*8975f5c5SAndroid Build Coastguard Worker                       uint8_t *output,
1608*8975f5c5SAndroid Build Coastguard Worker                       size_t outputRowPitch,
1609*8975f5c5SAndroid Build Coastguard Worker                       size_t outputDepthPitch)
1610*8975f5c5SAndroid Build Coastguard Worker {
1611*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1612*8975f5c5SAndroid Build Coastguard Worker     {
1613*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1614*8975f5c5SAndroid Build Coastguard Worker         {
1615*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1616*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1617*8975f5c5SAndroid Build Coastguard Worker             float *destDepth =
1618*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1619*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1620*8975f5c5SAndroid Build Coastguard Worker             {
1621*8975f5c5SAndroid Build Coastguard Worker                 destDepth[x * 2] = source[x] / static_cast<float>(0xFFFFFFFF);
1622*8975f5c5SAndroid Build Coastguard Worker             }
1623*8975f5c5SAndroid Build Coastguard Worker         }
1624*8975f5c5SAndroid Build Coastguard Worker     }
1625*8975f5c5SAndroid Build Coastguard Worker }
1626*8975f5c5SAndroid Build Coastguard Worker 
LoadD32ToD32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1627*8975f5c5SAndroid Build Coastguard Worker void LoadD32ToD32F(const ImageLoadContext &context,
1628*8975f5c5SAndroid Build Coastguard Worker                    size_t width,
1629*8975f5c5SAndroid Build Coastguard Worker                    size_t height,
1630*8975f5c5SAndroid Build Coastguard Worker                    size_t depth,
1631*8975f5c5SAndroid Build Coastguard Worker                    const uint8_t *input,
1632*8975f5c5SAndroid Build Coastguard Worker                    size_t inputRowPitch,
1633*8975f5c5SAndroid Build Coastguard Worker                    size_t inputDepthPitch,
1634*8975f5c5SAndroid Build Coastguard Worker                    uint8_t *output,
1635*8975f5c5SAndroid Build Coastguard Worker                    size_t outputRowPitch,
1636*8975f5c5SAndroid Build Coastguard Worker                    size_t outputDepthPitch)
1637*8975f5c5SAndroid Build Coastguard Worker {
1638*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1639*8975f5c5SAndroid Build Coastguard Worker     {
1640*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1641*8975f5c5SAndroid Build Coastguard Worker         {
1642*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1643*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1644*8975f5c5SAndroid Build Coastguard Worker             float *destDepth =
1645*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1646*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1647*8975f5c5SAndroid Build Coastguard Worker             {
1648*8975f5c5SAndroid Build Coastguard Worker                 uint32_t sourcePixel = source[x];
1649*8975f5c5SAndroid Build Coastguard Worker                 destDepth[x]         = sourcePixel / static_cast<float>(0xFFFFFFFF);
1650*8975f5c5SAndroid Build Coastguard Worker             }
1651*8975f5c5SAndroid Build Coastguard Worker         }
1652*8975f5c5SAndroid Build Coastguard Worker     }
1653*8975f5c5SAndroid Build Coastguard Worker }
1654*8975f5c5SAndroid Build Coastguard Worker 
LoadD32FToD32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1655*8975f5c5SAndroid Build Coastguard Worker void LoadD32FToD32F(const ImageLoadContext &context,
1656*8975f5c5SAndroid Build Coastguard Worker                     size_t width,
1657*8975f5c5SAndroid Build Coastguard Worker                     size_t height,
1658*8975f5c5SAndroid Build Coastguard Worker                     size_t depth,
1659*8975f5c5SAndroid Build Coastguard Worker                     const uint8_t *input,
1660*8975f5c5SAndroid Build Coastguard Worker                     size_t inputRowPitch,
1661*8975f5c5SAndroid Build Coastguard Worker                     size_t inputDepthPitch,
1662*8975f5c5SAndroid Build Coastguard Worker                     uint8_t *output,
1663*8975f5c5SAndroid Build Coastguard Worker                     size_t outputRowPitch,
1664*8975f5c5SAndroid Build Coastguard Worker                     size_t outputDepthPitch)
1665*8975f5c5SAndroid Build Coastguard Worker {
1666*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1667*8975f5c5SAndroid Build Coastguard Worker     {
1668*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1669*8975f5c5SAndroid Build Coastguard Worker         {
1670*8975f5c5SAndroid Build Coastguard Worker             const float *source =
1671*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1672*8975f5c5SAndroid Build Coastguard Worker             float *dest =
1673*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1674*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1675*8975f5c5SAndroid Build Coastguard Worker             {
1676*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = gl::clamp01(source[x]);
1677*8975f5c5SAndroid Build Coastguard Worker             }
1678*8975f5c5SAndroid Build Coastguard Worker         }
1679*8975f5c5SAndroid Build Coastguard Worker     }
1680*8975f5c5SAndroid Build Coastguard Worker }
1681*8975f5c5SAndroid Build Coastguard Worker 
LoadD32FS8X24ToS8D24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1682*8975f5c5SAndroid Build Coastguard Worker void LoadD32FS8X24ToS8D24(const ImageLoadContext &context,
1683*8975f5c5SAndroid Build Coastguard Worker                           size_t width,
1684*8975f5c5SAndroid Build Coastguard Worker                           size_t height,
1685*8975f5c5SAndroid Build Coastguard Worker                           size_t depth,
1686*8975f5c5SAndroid Build Coastguard Worker                           const uint8_t *input,
1687*8975f5c5SAndroid Build Coastguard Worker                           size_t inputRowPitch,
1688*8975f5c5SAndroid Build Coastguard Worker                           size_t inputDepthPitch,
1689*8975f5c5SAndroid Build Coastguard Worker                           uint8_t *output,
1690*8975f5c5SAndroid Build Coastguard Worker                           size_t outputRowPitch,
1691*8975f5c5SAndroid Build Coastguard Worker                           size_t outputDepthPitch)
1692*8975f5c5SAndroid Build Coastguard Worker {
1693*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1694*8975f5c5SAndroid Build Coastguard Worker     {
1695*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1696*8975f5c5SAndroid Build Coastguard Worker         {
1697*8975f5c5SAndroid Build Coastguard Worker             const float *sourceDepth =
1698*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1699*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *sourceStencil =
1700*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch) + 1;
1701*8975f5c5SAndroid Build Coastguard Worker             uint32_t *dest =
1702*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1703*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1704*8975f5c5SAndroid Build Coastguard Worker             {
1705*8975f5c5SAndroid Build Coastguard Worker                 uint32_t d = static_cast<uint32_t>(gl::clamp01(sourceDepth[x * 2]) * 0xFFFFFF);
1706*8975f5c5SAndroid Build Coastguard Worker                 uint32_t s = sourceStencil[x * 2] << 24;
1707*8975f5c5SAndroid Build Coastguard Worker                 dest[x]    = d | s;
1708*8975f5c5SAndroid Build Coastguard Worker             }
1709*8975f5c5SAndroid Build Coastguard Worker         }
1710*8975f5c5SAndroid Build Coastguard Worker     }
1711*8975f5c5SAndroid Build Coastguard Worker }
1712*8975f5c5SAndroid Build Coastguard Worker 
LoadX24S8ToS8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1713*8975f5c5SAndroid Build Coastguard Worker void LoadX24S8ToS8(const ImageLoadContext &context,
1714*8975f5c5SAndroid Build Coastguard Worker                    size_t width,
1715*8975f5c5SAndroid Build Coastguard Worker                    size_t height,
1716*8975f5c5SAndroid Build Coastguard Worker                    size_t depth,
1717*8975f5c5SAndroid Build Coastguard Worker                    const uint8_t *input,
1718*8975f5c5SAndroid Build Coastguard Worker                    size_t inputRowPitch,
1719*8975f5c5SAndroid Build Coastguard Worker                    size_t inputDepthPitch,
1720*8975f5c5SAndroid Build Coastguard Worker                    uint8_t *output,
1721*8975f5c5SAndroid Build Coastguard Worker                    size_t outputRowPitch,
1722*8975f5c5SAndroid Build Coastguard Worker                    size_t outputDepthPitch)
1723*8975f5c5SAndroid Build Coastguard Worker {
1724*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1725*8975f5c5SAndroid Build Coastguard Worker     {
1726*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1727*8975f5c5SAndroid Build Coastguard Worker         {
1728*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source = reinterpret_cast<const uint32_t *>(
1729*8975f5c5SAndroid Build Coastguard Worker                 input + (y * inputRowPitch) + (z * inputDepthPitch));
1730*8975f5c5SAndroid Build Coastguard Worker             uint8_t *destStencil =
1731*8975f5c5SAndroid Build Coastguard Worker                 reinterpret_cast<uint8_t *>(output + (y * outputRowPitch) + (z * outputDepthPitch));
1732*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1733*8975f5c5SAndroid Build Coastguard Worker             {
1734*8975f5c5SAndroid Build Coastguard Worker                 destStencil[x] = (source[x] & 0xFF);
1735*8975f5c5SAndroid Build Coastguard Worker             }
1736*8975f5c5SAndroid Build Coastguard Worker         }
1737*8975f5c5SAndroid Build Coastguard Worker     }
1738*8975f5c5SAndroid Build Coastguard Worker }
1739*8975f5c5SAndroid Build Coastguard Worker 
LoadX32S8ToS8(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1740*8975f5c5SAndroid Build Coastguard Worker void LoadX32S8ToS8(const ImageLoadContext &context,
1741*8975f5c5SAndroid Build Coastguard Worker                    size_t width,
1742*8975f5c5SAndroid Build Coastguard Worker                    size_t height,
1743*8975f5c5SAndroid Build Coastguard Worker                    size_t depth,
1744*8975f5c5SAndroid Build Coastguard Worker                    const uint8_t *input,
1745*8975f5c5SAndroid Build Coastguard Worker                    size_t inputRowPitch,
1746*8975f5c5SAndroid Build Coastguard Worker                    size_t inputDepthPitch,
1747*8975f5c5SAndroid Build Coastguard Worker                    uint8_t *output,
1748*8975f5c5SAndroid Build Coastguard Worker                    size_t outputRowPitch,
1749*8975f5c5SAndroid Build Coastguard Worker                    size_t outputDepthPitch)
1750*8975f5c5SAndroid Build Coastguard Worker {
1751*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1752*8975f5c5SAndroid Build Coastguard Worker     {
1753*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1754*8975f5c5SAndroid Build Coastguard Worker         {
1755*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source = reinterpret_cast<const uint32_t *>(
1756*8975f5c5SAndroid Build Coastguard Worker                 input + (y * inputRowPitch) + (z * inputDepthPitch));
1757*8975f5c5SAndroid Build Coastguard Worker             uint8_t *destStencil =
1758*8975f5c5SAndroid Build Coastguard Worker                 reinterpret_cast<uint8_t *>(output + (y * outputRowPitch) + (z * outputDepthPitch));
1759*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1760*8975f5c5SAndroid Build Coastguard Worker             {
1761*8975f5c5SAndroid Build Coastguard Worker                 destStencil[x] = (source[(x * 2) + 1] & 0xFF);
1762*8975f5c5SAndroid Build Coastguard Worker             }
1763*8975f5c5SAndroid Build Coastguard Worker         }
1764*8975f5c5SAndroid Build Coastguard Worker     }
1765*8975f5c5SAndroid Build Coastguard Worker }
1766*8975f5c5SAndroid Build Coastguard Worker 
LoadD32FS8X24ToD32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1767*8975f5c5SAndroid Build Coastguard Worker void LoadD32FS8X24ToD32F(const ImageLoadContext &context,
1768*8975f5c5SAndroid Build Coastguard Worker                          size_t width,
1769*8975f5c5SAndroid Build Coastguard Worker                          size_t height,
1770*8975f5c5SAndroid Build Coastguard Worker                          size_t depth,
1771*8975f5c5SAndroid Build Coastguard Worker                          const uint8_t *input,
1772*8975f5c5SAndroid Build Coastguard Worker                          size_t inputRowPitch,
1773*8975f5c5SAndroid Build Coastguard Worker                          size_t inputDepthPitch,
1774*8975f5c5SAndroid Build Coastguard Worker                          uint8_t *output,
1775*8975f5c5SAndroid Build Coastguard Worker                          size_t outputRowPitch,
1776*8975f5c5SAndroid Build Coastguard Worker                          size_t outputDepthPitch)
1777*8975f5c5SAndroid Build Coastguard Worker {
1778*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1779*8975f5c5SAndroid Build Coastguard Worker     {
1780*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1781*8975f5c5SAndroid Build Coastguard Worker         {
1782*8975f5c5SAndroid Build Coastguard Worker             const float *sourceDepth =
1783*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1784*8975f5c5SAndroid Build Coastguard Worker             float *destDepth =
1785*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1786*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1787*8975f5c5SAndroid Build Coastguard Worker             {
1788*8975f5c5SAndroid Build Coastguard Worker                 destDepth[x] = gl::clamp01(sourceDepth[x * 2]);
1789*8975f5c5SAndroid Build Coastguard Worker             }
1790*8975f5c5SAndroid Build Coastguard Worker         }
1791*8975f5c5SAndroid Build Coastguard Worker     }
1792*8975f5c5SAndroid Build Coastguard Worker }
1793*8975f5c5SAndroid Build Coastguard Worker 
LoadD32FS8X24ToD32FS8X24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1794*8975f5c5SAndroid Build Coastguard Worker void LoadD32FS8X24ToD32FS8X24(const ImageLoadContext &context,
1795*8975f5c5SAndroid Build Coastguard Worker                               size_t width,
1796*8975f5c5SAndroid Build Coastguard Worker                               size_t height,
1797*8975f5c5SAndroid Build Coastguard Worker                               size_t depth,
1798*8975f5c5SAndroid Build Coastguard Worker                               const uint8_t *input,
1799*8975f5c5SAndroid Build Coastguard Worker                               size_t inputRowPitch,
1800*8975f5c5SAndroid Build Coastguard Worker                               size_t inputDepthPitch,
1801*8975f5c5SAndroid Build Coastguard Worker                               uint8_t *output,
1802*8975f5c5SAndroid Build Coastguard Worker                               size_t outputRowPitch,
1803*8975f5c5SAndroid Build Coastguard Worker                               size_t outputDepthPitch)
1804*8975f5c5SAndroid Build Coastguard Worker {
1805*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1806*8975f5c5SAndroid Build Coastguard Worker     {
1807*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1808*8975f5c5SAndroid Build Coastguard Worker         {
1809*8975f5c5SAndroid Build Coastguard Worker             const float *sourceDepth =
1810*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1811*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *sourceStencil =
1812*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch) + 1;
1813*8975f5c5SAndroid Build Coastguard Worker             float *destDepth =
1814*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1815*8975f5c5SAndroid Build Coastguard Worker             uint32_t *destStencil =
1816*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch) +
1817*8975f5c5SAndroid Build Coastguard Worker                 1;
1818*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1819*8975f5c5SAndroid Build Coastguard Worker             {
1820*8975f5c5SAndroid Build Coastguard Worker                 destDepth[x * 2]   = gl::clamp01(sourceDepth[x * 2]);
1821*8975f5c5SAndroid Build Coastguard Worker                 destStencil[x * 2] = sourceStencil[x * 2] & 0xFF;
1822*8975f5c5SAndroid Build Coastguard Worker             }
1823*8975f5c5SAndroid Build Coastguard Worker         }
1824*8975f5c5SAndroid Build Coastguard Worker     }
1825*8975f5c5SAndroid Build Coastguard Worker }
1826*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB32FToRGBA16F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1827*8975f5c5SAndroid Build Coastguard Worker void LoadRGB32FToRGBA16F(const ImageLoadContext &context,
1828*8975f5c5SAndroid Build Coastguard Worker                          size_t width,
1829*8975f5c5SAndroid Build Coastguard Worker                          size_t height,
1830*8975f5c5SAndroid Build Coastguard Worker                          size_t depth,
1831*8975f5c5SAndroid Build Coastguard Worker                          const uint8_t *input,
1832*8975f5c5SAndroid Build Coastguard Worker                          size_t inputRowPitch,
1833*8975f5c5SAndroid Build Coastguard Worker                          size_t inputDepthPitch,
1834*8975f5c5SAndroid Build Coastguard Worker                          uint8_t *output,
1835*8975f5c5SAndroid Build Coastguard Worker                          size_t outputRowPitch,
1836*8975f5c5SAndroid Build Coastguard Worker                          size_t outputDepthPitch)
1837*8975f5c5SAndroid Build Coastguard Worker {
1838*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1839*8975f5c5SAndroid Build Coastguard Worker     {
1840*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1841*8975f5c5SAndroid Build Coastguard Worker         {
1842*8975f5c5SAndroid Build Coastguard Worker             const float *source =
1843*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1844*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
1845*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1846*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1847*8975f5c5SAndroid Build Coastguard Worker             {
1848*8975f5c5SAndroid Build Coastguard Worker                 dest[x * 4 + 0] = gl::float32ToFloat16(source[x * 3 + 0]);
1849*8975f5c5SAndroid Build Coastguard Worker                 dest[x * 4 + 1] = gl::float32ToFloat16(source[x * 3 + 1]);
1850*8975f5c5SAndroid Build Coastguard Worker                 dest[x * 4 + 2] = gl::float32ToFloat16(source[x * 3 + 2]);
1851*8975f5c5SAndroid Build Coastguard Worker                 dest[x * 4 + 3] = gl::Float16One;
1852*8975f5c5SAndroid Build Coastguard Worker             }
1853*8975f5c5SAndroid Build Coastguard Worker         }
1854*8975f5c5SAndroid Build Coastguard Worker     }
1855*8975f5c5SAndroid Build Coastguard Worker }
1856*8975f5c5SAndroid Build Coastguard Worker 
LoadRGB32FToRGB16F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1857*8975f5c5SAndroid Build Coastguard Worker void LoadRGB32FToRGB16F(const ImageLoadContext &context,
1858*8975f5c5SAndroid Build Coastguard Worker                         size_t width,
1859*8975f5c5SAndroid Build Coastguard Worker                         size_t height,
1860*8975f5c5SAndroid Build Coastguard Worker                         size_t depth,
1861*8975f5c5SAndroid Build Coastguard Worker                         const uint8_t *input,
1862*8975f5c5SAndroid Build Coastguard Worker                         size_t inputRowPitch,
1863*8975f5c5SAndroid Build Coastguard Worker                         size_t inputDepthPitch,
1864*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *output,
1865*8975f5c5SAndroid Build Coastguard Worker                         size_t outputRowPitch,
1866*8975f5c5SAndroid Build Coastguard Worker                         size_t outputDepthPitch)
1867*8975f5c5SAndroid Build Coastguard Worker {
1868*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1869*8975f5c5SAndroid Build Coastguard Worker     {
1870*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1871*8975f5c5SAndroid Build Coastguard Worker         {
1872*8975f5c5SAndroid Build Coastguard Worker             const float *source =
1873*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
1874*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
1875*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1876*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1877*8975f5c5SAndroid Build Coastguard Worker             {
1878*8975f5c5SAndroid Build Coastguard Worker                 dest[x * 3 + 0] = gl::float32ToFloat16(source[x * 3 + 0]);
1879*8975f5c5SAndroid Build Coastguard Worker                 dest[x * 3 + 1] = gl::float32ToFloat16(source[x * 3 + 1]);
1880*8975f5c5SAndroid Build Coastguard Worker                 dest[x * 3 + 2] = gl::float32ToFloat16(source[x * 3 + 2]);
1881*8975f5c5SAndroid Build Coastguard Worker             }
1882*8975f5c5SAndroid Build Coastguard Worker         }
1883*8975f5c5SAndroid Build Coastguard Worker     }
1884*8975f5c5SAndroid Build Coastguard Worker }
1885*8975f5c5SAndroid Build Coastguard Worker 
LoadR32ToR16(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1886*8975f5c5SAndroid Build Coastguard Worker void LoadR32ToR16(const ImageLoadContext &context,
1887*8975f5c5SAndroid Build Coastguard Worker                   size_t width,
1888*8975f5c5SAndroid Build Coastguard Worker                   size_t height,
1889*8975f5c5SAndroid Build Coastguard Worker                   size_t depth,
1890*8975f5c5SAndroid Build Coastguard Worker                   const uint8_t *input,
1891*8975f5c5SAndroid Build Coastguard Worker                   size_t inputRowPitch,
1892*8975f5c5SAndroid Build Coastguard Worker                   size_t inputDepthPitch,
1893*8975f5c5SAndroid Build Coastguard Worker                   uint8_t *output,
1894*8975f5c5SAndroid Build Coastguard Worker                   size_t outputRowPitch,
1895*8975f5c5SAndroid Build Coastguard Worker                   size_t outputDepthPitch)
1896*8975f5c5SAndroid Build Coastguard Worker {
1897*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1898*8975f5c5SAndroid Build Coastguard Worker     {
1899*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1900*8975f5c5SAndroid Build Coastguard Worker         {
1901*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1902*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1903*8975f5c5SAndroid Build Coastguard Worker             uint16_t *dest =
1904*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
1905*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1906*8975f5c5SAndroid Build Coastguard Worker             {
1907*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = source[x] >> 16;
1908*8975f5c5SAndroid Build Coastguard Worker             }
1909*8975f5c5SAndroid Build Coastguard Worker         }
1910*8975f5c5SAndroid Build Coastguard Worker     }
1911*8975f5c5SAndroid Build Coastguard Worker }
1912*8975f5c5SAndroid Build Coastguard Worker 
LoadD32ToX8D24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1913*8975f5c5SAndroid Build Coastguard Worker void LoadD32ToX8D24(const ImageLoadContext &context,
1914*8975f5c5SAndroid Build Coastguard Worker                     size_t width,
1915*8975f5c5SAndroid Build Coastguard Worker                     size_t height,
1916*8975f5c5SAndroid Build Coastguard Worker                     size_t depth,
1917*8975f5c5SAndroid Build Coastguard Worker                     const uint8_t *input,
1918*8975f5c5SAndroid Build Coastguard Worker                     size_t inputRowPitch,
1919*8975f5c5SAndroid Build Coastguard Worker                     size_t inputDepthPitch,
1920*8975f5c5SAndroid Build Coastguard Worker                     uint8_t *output,
1921*8975f5c5SAndroid Build Coastguard Worker                     size_t outputRowPitch,
1922*8975f5c5SAndroid Build Coastguard Worker                     size_t outputDepthPitch)
1923*8975f5c5SAndroid Build Coastguard Worker {
1924*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1925*8975f5c5SAndroid Build Coastguard Worker     {
1926*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1927*8975f5c5SAndroid Build Coastguard Worker         {
1928*8975f5c5SAndroid Build Coastguard Worker             const uint32_t *source =
1929*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
1930*8975f5c5SAndroid Build Coastguard Worker             uint32_t *dest =
1931*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1932*8975f5c5SAndroid Build Coastguard Worker 
1933*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1934*8975f5c5SAndroid Build Coastguard Worker             {
1935*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = source[x] >> 8;
1936*8975f5c5SAndroid Build Coastguard Worker             }
1937*8975f5c5SAndroid Build Coastguard Worker         }
1938*8975f5c5SAndroid Build Coastguard Worker     }
1939*8975f5c5SAndroid Build Coastguard Worker }
1940*8975f5c5SAndroid Build Coastguard Worker 
1941*8975f5c5SAndroid Build Coastguard Worker // This conversion was added to support using a 32F depth buffer
1942*8975f5c5SAndroid Build Coastguard Worker // as emulation for 16unorm depth buffer in Metal.
1943*8975f5c5SAndroid Build Coastguard Worker // See https://anglebug.com/42265093
LoadD16ToD32F(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1944*8975f5c5SAndroid Build Coastguard Worker void LoadD16ToD32F(const ImageLoadContext &context,
1945*8975f5c5SAndroid Build Coastguard Worker                    size_t width,
1946*8975f5c5SAndroid Build Coastguard Worker                    size_t height,
1947*8975f5c5SAndroid Build Coastguard Worker                    size_t depth,
1948*8975f5c5SAndroid Build Coastguard Worker                    const uint8_t *input,
1949*8975f5c5SAndroid Build Coastguard Worker                    size_t inputRowPitch,
1950*8975f5c5SAndroid Build Coastguard Worker                    size_t inputDepthPitch,
1951*8975f5c5SAndroid Build Coastguard Worker                    uint8_t *output,
1952*8975f5c5SAndroid Build Coastguard Worker                    size_t outputRowPitch,
1953*8975f5c5SAndroid Build Coastguard Worker                    size_t outputDepthPitch)
1954*8975f5c5SAndroid Build Coastguard Worker {
1955*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1956*8975f5c5SAndroid Build Coastguard Worker     {
1957*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1958*8975f5c5SAndroid Build Coastguard Worker         {
1959*8975f5c5SAndroid Build Coastguard Worker             const uint16_t *source =
1960*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);
1961*8975f5c5SAndroid Build Coastguard Worker             float *dest =
1962*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
1963*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1964*8975f5c5SAndroid Build Coastguard Worker             {
1965*8975f5c5SAndroid Build Coastguard Worker                 dest[x] = static_cast<float>(source[x]) / 0xFFFF;
1966*8975f5c5SAndroid Build Coastguard Worker             }
1967*8975f5c5SAndroid Build Coastguard Worker         }
1968*8975f5c5SAndroid Build Coastguard Worker     }
1969*8975f5c5SAndroid Build Coastguard Worker }
1970*8975f5c5SAndroid Build Coastguard Worker 
LoadS8ToS8X24(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1971*8975f5c5SAndroid Build Coastguard Worker void LoadS8ToS8X24(const ImageLoadContext &context,
1972*8975f5c5SAndroid Build Coastguard Worker                    size_t width,
1973*8975f5c5SAndroid Build Coastguard Worker                    size_t height,
1974*8975f5c5SAndroid Build Coastguard Worker                    size_t depth,
1975*8975f5c5SAndroid Build Coastguard Worker                    const uint8_t *input,
1976*8975f5c5SAndroid Build Coastguard Worker                    size_t inputRowPitch,
1977*8975f5c5SAndroid Build Coastguard Worker                    size_t inputDepthPitch,
1978*8975f5c5SAndroid Build Coastguard Worker                    uint8_t *output,
1979*8975f5c5SAndroid Build Coastguard Worker                    size_t outputRowPitch,
1980*8975f5c5SAndroid Build Coastguard Worker                    size_t outputDepthPitch)
1981*8975f5c5SAndroid Build Coastguard Worker {
1982*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
1983*8975f5c5SAndroid Build Coastguard Worker     {
1984*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
1985*8975f5c5SAndroid Build Coastguard Worker         {
1986*8975f5c5SAndroid Build Coastguard Worker             const uint8_t *source =
1987*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);
1988*8975f5c5SAndroid Build Coastguard Worker             uint32_t *destStencil =
1989*8975f5c5SAndroid Build Coastguard Worker                 priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
1990*8975f5c5SAndroid Build Coastguard Worker 
1991*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
1992*8975f5c5SAndroid Build Coastguard Worker             {
1993*8975f5c5SAndroid Build Coastguard Worker                 destStencil[x] = source[x] << 24;
1994*8975f5c5SAndroid Build Coastguard Worker             }
1995*8975f5c5SAndroid Build Coastguard Worker         }
1996*8975f5c5SAndroid Build Coastguard Worker     }
1997*8975f5c5SAndroid Build Coastguard Worker }
1998*8975f5c5SAndroid Build Coastguard Worker 
LoadYuvToNative(const ImageLoadContext & context,size_t width,size_t height,size_t depth,const uint8_t * input,size_t inputRowPitch,size_t inputDepthPitch,uint8_t * output,size_t outputRowPitch,size_t outputDepthPitch)1999*8975f5c5SAndroid Build Coastguard Worker void LoadYuvToNative(const ImageLoadContext &context,
2000*8975f5c5SAndroid Build Coastguard Worker                      size_t width,
2001*8975f5c5SAndroid Build Coastguard Worker                      size_t height,
2002*8975f5c5SAndroid Build Coastguard Worker                      size_t depth,
2003*8975f5c5SAndroid Build Coastguard Worker                      const uint8_t *input,
2004*8975f5c5SAndroid Build Coastguard Worker                      size_t inputRowPitch,
2005*8975f5c5SAndroid Build Coastguard Worker                      size_t inputDepthPitch,
2006*8975f5c5SAndroid Build Coastguard Worker                      uint8_t *output,
2007*8975f5c5SAndroid Build Coastguard Worker                      size_t outputRowPitch,
2008*8975f5c5SAndroid Build Coastguard Worker                      size_t outputDepthPitch)
2009*8975f5c5SAndroid Build Coastguard Worker {
2010*8975f5c5SAndroid Build Coastguard Worker     // For YUV formats it is assumed that source has tightly packed data.
2011*8975f5c5SAndroid Build Coastguard Worker     memcpy(output, input, inputDepthPitch);
2012*8975f5c5SAndroid Build Coastguard Worker }
2013*8975f5c5SAndroid Build Coastguard Worker 
2014*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
2015