1 /*
2  * Mesa 3-D graphics library
3  *
4  * Copyright (c) 2011 VMware, Inc.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 
24 
25 #include "colormac.h"
26 #include "format_unpack.h"
27 #include "macros.h"
28 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
29 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
30 
31 
32 /** Helper struct for MESA_FORMAT_Z32_FLOAT_X24S8 */
33 struct z32f_x24s8
34 {
35    float z;
36    uint32_t x24s8;
37 };
38 
39 
40 /* Expand 1, 2, 3, 4, 5, 6-bit values to fill 8 bits */
41 
42 #define EXPAND_1_8(X)  ( (X) ? 0xff : 0x0 )
43 
44 #define EXPAND_2_8(X)  ( ((X) << 6) | ((X) << 4) | ((X) << 2) | (X) )
45 
46 #define EXPAND_3_8(X)  ( ((X) << 5) | ((X) << 2) | ((X) >> 1) )
47 
48 #define EXPAND_4_8(X)  ( ((X) << 4) | (X) )
49 
50 #define EXPAND_5_8(X)  ( ((X) << 3) | ((X) >> 2) )
51 
52 #define EXPAND_6_8(X)  ( ((X) << 2) | ((X) >> 4) )
53 
54 
55 /**
56  * Convert an 8-bit sRGB value from non-linear space to a
57  * linear RGB value in [0, 1].
58  * Implemented with a 256-entry lookup table.
59  */
60 static inline GLfloat
nonlinear_to_linear(GLubyte cs8)61 nonlinear_to_linear(GLubyte cs8)
62 {
63    static GLfloat table[256];
64    static GLboolean tableReady = GL_FALSE;
65    if (!tableReady) {
66       /* compute lookup table now */
67       GLuint i;
68       for (i = 0; i < 256; i++) {
69          const GLfloat cs = UBYTE_TO_FLOAT(i);
70          if (cs <= 0.04045) {
71             table[i] = cs / 12.92f;
72          }
73          else {
74             table[i] = (GLfloat) pow((cs + 0.055) / 1.055, 2.4);
75          }
76       }
77       tableReady = GL_TRUE;
78    }
79    return table[cs8];
80 }
81 
82 
83 /**********************************************************************/
84 /*  Unpack, returning GLfloat colors                                  */
85 /**********************************************************************/
86 
87 typedef void (*unpack_rgba_func)(const void *src, GLfloat dst[][4], GLuint n);
88 
89 
90 static void
unpack_RGBA8888(const void * src,GLfloat dst[][4],GLuint n)91 unpack_RGBA8888(const void *src, GLfloat dst[][4], GLuint n)
92 {
93    const GLuint *s = ((const GLuint *) src);
94    GLuint i;
95    for (i = 0; i < n; i++) {
96       dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24)        );
97       dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
98       dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >>  8) & 0xff );
99       dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i]      ) & 0xff );
100    }
101 }
102 
103 static void
unpack_RGBA8888_REV(const void * src,GLfloat dst[][4],GLuint n)104 unpack_RGBA8888_REV(const void *src, GLfloat dst[][4], GLuint n)
105 {
106    const GLuint *s = ((const GLuint *) src);
107    GLuint i;
108    for (i = 0; i < n; i++) {
109       dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i]      ) & 0xff );
110       dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >>  8) & 0xff );
111       dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
112       dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] >> 24)        );
113    }
114 }
115 
116 static void
unpack_ARGB8888(const void * src,GLfloat dst[][4],GLuint n)117 unpack_ARGB8888(const void *src, GLfloat dst[][4], GLuint n)
118 {
119    const GLuint *s = ((const GLuint *) src);
120    GLuint i;
121    for (i = 0; i < n; i++) {
122       dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
123       dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >>  8) & 0xff );
124       dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i]      ) & 0xff );
125       dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] >> 24)        );
126    }
127 }
128 
129 static void
unpack_ARGB8888_REV(const void * src,GLfloat dst[][4],GLuint n)130 unpack_ARGB8888_REV(const void *src, GLfloat dst[][4], GLuint n)
131 {
132    const GLuint *s = ((const GLuint *) src);
133    GLuint i;
134    for (i = 0; i < n; i++) {
135       dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >>  8) & 0xff );
136       dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
137       dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24)        );
138       dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i]      ) & 0xff );
139    }
140 }
141 
142 static void
unpack_RGBX8888(const void * src,GLfloat dst[][4],GLuint n)143 unpack_RGBX8888(const void *src, GLfloat dst[][4], GLuint n)
144 {
145    const GLuint *s = ((const GLuint *) src);
146    GLuint i;
147    for (i = 0; i < n; i++) {
148       dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24)        );
149       dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
150       dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >>  8) & 0xff );
151       dst[i][ACOMP] = 1.0f;
152    }
153 }
154 
155 static void
unpack_RGBX8888_REV(const void * src,GLfloat dst[][4],GLuint n)156 unpack_RGBX8888_REV(const void *src, GLfloat dst[][4], GLuint n)
157 {
158    const GLuint *s = ((const GLuint *) src);
159    GLuint i;
160    for (i = 0; i < n; i++) {
161       dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i]      ) & 0xff );
162       dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >>  8) & 0xff );
163       dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
164       dst[i][ACOMP] = 1.0f;
165    }
166 }
167 
168 static void
unpack_XRGB8888(const void * src,GLfloat dst[][4],GLuint n)169 unpack_XRGB8888(const void *src, GLfloat dst[][4], GLuint n)
170 {
171    const GLuint *s = ((const GLuint *) src);
172    GLuint i;
173    for (i = 0; i < n; i++) {
174       dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
175       dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >>  8) & 0xff );
176       dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i]      ) & 0xff );
177       dst[i][ACOMP] = 1.0f;
178    }
179 }
180 
181 static void
unpack_XRGB8888_REV(const void * src,GLfloat dst[][4],GLuint n)182 unpack_XRGB8888_REV(const void *src, GLfloat dst[][4], GLuint n)
183 {
184    const GLuint *s = ((const GLuint *) src);
185    GLuint i;
186    for (i = 0; i < n; i++) {
187       dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >>  8) & 0xff );
188       dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
189       dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24)        );
190       dst[i][ACOMP] = 1.0f;
191    }
192 }
193 
194 static void
unpack_RGB888(const void * src,GLfloat dst[][4],GLuint n)195 unpack_RGB888(const void *src, GLfloat dst[][4], GLuint n)
196 {
197    const GLubyte *s = (const GLubyte *) src;
198    GLuint i;
199    for (i = 0; i < n; i++) {
200       dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i*3+2] );
201       dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i*3+1] );
202       dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i*3+0] );
203       dst[i][ACOMP] = 1.0F;
204    }
205 }
206 
207 static void
unpack_BGR888(const void * src,GLfloat dst[][4],GLuint n)208 unpack_BGR888(const void *src, GLfloat dst[][4], GLuint n)
209 {
210    const GLubyte *s = (const GLubyte *) src;
211    GLuint i;
212    for (i = 0; i < n; i++) {
213       dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i*3+0] );
214       dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i*3+1] );
215       dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i*3+2] );
216       dst[i][ACOMP] = 1.0F;
217    }
218 }
219 
220 static void
unpack_RGB565(const void * src,GLfloat dst[][4],GLuint n)221 unpack_RGB565(const void *src, GLfloat dst[][4], GLuint n)
222 {
223    const GLushort *s = ((const GLushort *) src);
224    GLuint i;
225    for (i = 0; i < n; i++) {
226       dst[i][RCOMP] = ((s[i] >> 11) & 0x1f) * (1.0F / 31.0F);
227       dst[i][GCOMP] = ((s[i] >> 5 ) & 0x3f) * (1.0F / 63.0F);
228       dst[i][BCOMP] = ((s[i]      ) & 0x1f) * (1.0F / 31.0F);
229       dst[i][ACOMP] = 1.0F;
230    }
231 }
232 
233 static void
unpack_RGB565_REV(const void * src,GLfloat dst[][4],GLuint n)234 unpack_RGB565_REV(const void *src, GLfloat dst[][4], GLuint n)
235 {
236    const GLushort *s = ((const GLushort *) src);
237    GLuint i;
238    for (i = 0; i < n; i++) {
239       GLuint t = (s[i] >> 8) | (s[i] << 8); /* byte swap */
240       dst[i][RCOMP] = UBYTE_TO_FLOAT( ((t >> 8) & 0xf8) | ((t >> 13) & 0x7) );
241       dst[i][GCOMP] = UBYTE_TO_FLOAT( ((t >> 3) & 0xfc) | ((t >>  9) & 0x3) );
242       dst[i][BCOMP] = UBYTE_TO_FLOAT( ((t << 3) & 0xf8) | ((t >>  2) & 0x7) );
243       dst[i][ACOMP] = 1.0F;
244    }
245 }
246 
247 static void
unpack_ARGB4444(const void * src,GLfloat dst[][4],GLuint n)248 unpack_ARGB4444(const void *src, GLfloat dst[][4], GLuint n)
249 {
250    const GLushort *s = ((const GLushort *) src);
251    GLuint i;
252    for (i = 0; i < n; i++) {
253       dst[i][RCOMP] = ((s[i] >>  8) & 0xf) * (1.0F / 15.0F);
254       dst[i][GCOMP] = ((s[i] >>  4) & 0xf) * (1.0F / 15.0F);
255       dst[i][BCOMP] = ((s[i]      ) & 0xf) * (1.0F / 15.0F);
256       dst[i][ACOMP] = ((s[i] >> 12) & 0xf) * (1.0F / 15.0F);
257    }
258 }
259 
260 static void
unpack_ARGB4444_REV(const void * src,GLfloat dst[][4],GLuint n)261 unpack_ARGB4444_REV(const void *src, GLfloat dst[][4], GLuint n)
262 {
263    const GLushort *s = ((const GLushort *) src);
264    GLuint i;
265    for (i = 0; i < n; i++) {
266       dst[i][RCOMP] = ((s[i]      ) & 0xf) * (1.0F / 15.0F);
267       dst[i][GCOMP] = ((s[i] >> 12) & 0xf) * (1.0F / 15.0F);
268       dst[i][BCOMP] = ((s[i] >>  8) & 0xf) * (1.0F / 15.0F);
269       dst[i][ACOMP] = ((s[i] >>  4) & 0xf) * (1.0F / 15.0F);
270    }
271 }
272 
273 static void
unpack_RGBA5551(const void * src,GLfloat dst[][4],GLuint n)274 unpack_RGBA5551(const void *src, GLfloat dst[][4], GLuint n)
275 {
276    const GLushort *s = ((const GLushort *) src);
277    GLuint i;
278    for (i = 0; i < n; i++) {
279       dst[i][RCOMP] = ((s[i] >> 11) & 0x1f) * (1.0F / 31.0F);
280       dst[i][GCOMP] = ((s[i] >>  6) & 0x1f) * (1.0F / 31.0F);
281       dst[i][BCOMP] = ((s[i] >>  1) & 0x1f) * (1.0F / 31.0F);
282       dst[i][ACOMP] = ((s[i]      ) & 0x01) * 1.0F;
283    }
284 }
285 
286 static void
unpack_ARGB1555(const void * src,GLfloat dst[][4],GLuint n)287 unpack_ARGB1555(const void *src, GLfloat dst[][4], GLuint n)
288 {
289    const GLushort *s = ((const GLushort *) src);
290    GLuint i;
291    for (i = 0; i < n; i++) {
292       dst[i][RCOMP] = ((s[i] >> 10) & 0x1f) * (1.0F / 31.0F);
293       dst[i][GCOMP] = ((s[i] >>  5) & 0x1f) * (1.0F / 31.0F);
294       dst[i][BCOMP] = ((s[i] >>  0) & 0x1f) * (1.0F / 31.0F);
295       dst[i][ACOMP] = ((s[i] >> 15) & 0x01) * 1.0F;
296    }
297 }
298 
299 static void
unpack_ARGB1555_REV(const void * src,GLfloat dst[][4],GLuint n)300 unpack_ARGB1555_REV(const void *src, GLfloat dst[][4], GLuint n)
301 {
302    const GLushort *s = ((const GLushort *) src);
303    GLuint i;
304    for (i = 0; i < n; i++) {
305       GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */
306       dst[i][RCOMP] = ((tmp >> 10) & 0x1f) * (1.0F / 31.0F);
307       dst[i][GCOMP] = ((tmp >>  5) & 0x1f) * (1.0F / 31.0F);
308       dst[i][BCOMP] = ((tmp >>  0) & 0x1f) * (1.0F / 31.0F);
309       dst[i][ACOMP] = ((tmp >> 15) & 0x01) * 1.0F;
310    }
311 }
312 
313 static void
unpack_AL44(const void * src,GLfloat dst[][4],GLuint n)314 unpack_AL44(const void *src, GLfloat dst[][4], GLuint n)
315 {
316    const GLubyte *s = ((const GLubyte *) src);
317    GLuint i;
318    for (i = 0; i < n; i++) {
319       dst[i][RCOMP] =
320       dst[i][GCOMP] =
321       dst[i][BCOMP] = (s[i] & 0xf) * (1.0F / 15.0F);
322       dst[i][ACOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
323    }
324 }
325 
326 static void
unpack_AL88(const void * src,GLfloat dst[][4],GLuint n)327 unpack_AL88(const void *src, GLfloat dst[][4], GLuint n)
328 {
329    const GLushort *s = ((const GLushort *) src);
330    GLuint i;
331    for (i = 0; i < n; i++) {
332       dst[i][RCOMP] =
333       dst[i][GCOMP] =
334       dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
335       dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
336    }
337 }
338 
339 static void
unpack_AL88_REV(const void * src,GLfloat dst[][4],GLuint n)340 unpack_AL88_REV(const void *src, GLfloat dst[][4], GLuint n)
341 {
342    const GLushort *s = ((const GLushort *) src);
343    GLuint i;
344    for (i = 0; i < n; i++) {
345       dst[i][RCOMP] =
346       dst[i][GCOMP] =
347       dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
348       dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
349    }
350 }
351 
352 static void
unpack_AL1616(const void * src,GLfloat dst[][4],GLuint n)353 unpack_AL1616(const void *src, GLfloat dst[][4], GLuint n)
354 {
355    const GLuint *s = ((const GLuint *) src);
356    GLuint i;
357    for (i = 0; i < n; i++) {
358       dst[i][RCOMP] =
359       dst[i][GCOMP] =
360       dst[i][BCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
361       dst[i][ACOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
362    }
363 }
364 
365 static void
unpack_AL1616_REV(const void * src,GLfloat dst[][4],GLuint n)366 unpack_AL1616_REV(const void *src, GLfloat dst[][4], GLuint n)
367 {
368    const GLuint *s = ((const GLuint *) src);
369    GLuint i;
370    for (i = 0; i < n; i++) {
371       dst[i][RCOMP] =
372       dst[i][GCOMP] =
373       dst[i][BCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
374       dst[i][ACOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
375    }
376 }
377 
378 static void
unpack_RGB332(const void * src,GLfloat dst[][4],GLuint n)379 unpack_RGB332(const void *src, GLfloat dst[][4], GLuint n)
380 {
381    const GLubyte *s = ((const GLubyte *) src);
382    GLuint i;
383    for (i = 0; i < n; i++) {
384       dst[i][RCOMP] = ((s[i] >> 5) & 0x7) * (1.0F / 7.0F);
385       dst[i][GCOMP] = ((s[i] >> 2) & 0x7) * (1.0F / 7.0F);
386       dst[i][BCOMP] = ((s[i]     ) & 0x3) * (1.0F / 3.0F);
387       dst[i][ACOMP] = 1.0F;
388    }
389 }
390 
391 
392 static void
unpack_A8(const void * src,GLfloat dst[][4],GLuint n)393 unpack_A8(const void *src, GLfloat dst[][4], GLuint n)
394 {
395    const GLubyte *s = ((const GLubyte *) src);
396    GLuint i;
397    for (i = 0; i < n; i++) {
398       dst[i][RCOMP] =
399       dst[i][GCOMP] =
400       dst[i][BCOMP] = 0.0F;
401       dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i]);
402    }
403 }
404 
405 static void
unpack_A16(const void * src,GLfloat dst[][4],GLuint n)406 unpack_A16(const void *src, GLfloat dst[][4], GLuint n)
407 {
408    const GLushort *s = ((const GLushort *) src);
409    GLuint i;
410    for (i = 0; i < n; i++) {
411       dst[i][RCOMP] =
412       dst[i][GCOMP] =
413       dst[i][BCOMP] = 0.0F;
414       dst[i][ACOMP] = USHORT_TO_FLOAT(s[i]);
415    }
416 }
417 
418 static void
unpack_L8(const void * src,GLfloat dst[][4],GLuint n)419 unpack_L8(const void *src, GLfloat dst[][4], GLuint n)
420 {
421    const GLubyte *s = ((const GLubyte *) src);
422    GLuint i;
423    for (i = 0; i < n; i++) {
424       dst[i][RCOMP] =
425       dst[i][GCOMP] =
426       dst[i][BCOMP] = UBYTE_TO_FLOAT(s[i]);
427       dst[i][ACOMP] = 1.0F;
428    }
429 }
430 
431 static void
unpack_L16(const void * src,GLfloat dst[][4],GLuint n)432 unpack_L16(const void *src, GLfloat dst[][4], GLuint n)
433 {
434    const GLushort *s = ((const GLushort *) src);
435    GLuint i;
436    for (i = 0; i < n; i++) {
437       dst[i][RCOMP] =
438       dst[i][GCOMP] =
439       dst[i][BCOMP] = USHORT_TO_FLOAT(s[i]);
440       dst[i][ACOMP] = 1.0F;
441    }
442 }
443 
444 static void
unpack_I8(const void * src,GLfloat dst[][4],GLuint n)445 unpack_I8(const void *src, GLfloat dst[][4], GLuint n)
446 {
447    const GLubyte *s = ((const GLubyte *) src);
448    GLuint i;
449    for (i = 0; i < n; i++) {
450       dst[i][RCOMP] =
451       dst[i][GCOMP] =
452       dst[i][BCOMP] =
453       dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i]);
454    }
455 }
456 
457 static void
unpack_I16(const void * src,GLfloat dst[][4],GLuint n)458 unpack_I16(const void *src, GLfloat dst[][4], GLuint n)
459 {
460    const GLushort *s = ((const GLushort *) src);
461    GLuint i;
462    for (i = 0; i < n; i++) {
463       dst[i][RCOMP] =
464       dst[i][GCOMP] =
465       dst[i][BCOMP] =
466       dst[i][ACOMP] = USHORT_TO_FLOAT(s[i]);
467    }
468 }
469 
470 static void
unpack_YCBCR(const void * src,GLfloat dst[][4],GLuint n)471 unpack_YCBCR(const void *src, GLfloat dst[][4], GLuint n)
472 {
473    GLuint i;
474    for (i = 0; i < n; i++) {
475       const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
476       const GLushort *src1 = src0 + 1;         /* odd */
477       const GLubyte y0 = (*src0 >> 8) & 0xff;  /* luminance */
478       const GLubyte cb = *src0 & 0xff;         /* chroma U */
479       const GLubyte y1 = (*src1 >> 8) & 0xff;  /* luminance */
480       const GLubyte cr = *src1 & 0xff;         /* chroma V */
481       const GLubyte y = (i & 1) ? y1 : y0;     /* choose even/odd luminance */
482       GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
483       GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
484       GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
485       r *= (1.0F / 255.0F);
486       g *= (1.0F / 255.0F);
487       b *= (1.0F / 255.0F);
488       dst[i][RCOMP] = CLAMP(r, 0.0F, 1.0F);
489       dst[i][GCOMP] = CLAMP(g, 0.0F, 1.0F);
490       dst[i][BCOMP] = CLAMP(b, 0.0F, 1.0F);
491       dst[i][ACOMP] = 1.0F;
492    }
493 }
494 
495 static void
unpack_YCBCR_REV(const void * src,GLfloat dst[][4],GLuint n)496 unpack_YCBCR_REV(const void *src, GLfloat dst[][4], GLuint n)
497 {
498    GLuint i;
499    for (i = 0; i < n; i++) {
500       const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
501       const GLushort *src1 = src0 + 1;         /* odd */
502       const GLubyte y0 = *src0 & 0xff;         /* luminance */
503       const GLubyte cr = (*src0 >> 8) & 0xff;  /* chroma V */
504       const GLubyte y1 = *src1 & 0xff;         /* luminance */
505       const GLubyte cb = (*src1 >> 8) & 0xff;  /* chroma U */
506       const GLubyte y = (i & 1) ? y1 : y0;     /* choose even/odd luminance */
507       GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
508       GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
509       GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
510       r *= (1.0F / 255.0F);
511       g *= (1.0F / 255.0F);
512       b *= (1.0F / 255.0F);
513       dst[i][RCOMP] = CLAMP(r, 0.0F, 1.0F);
514       dst[i][GCOMP] = CLAMP(g, 0.0F, 1.0F);
515       dst[i][BCOMP] = CLAMP(b, 0.0F, 1.0F);
516       dst[i][ACOMP] = 1.0F;
517    }
518 }
519 
520 static void
unpack_R8(const void * src,GLfloat dst[][4],GLuint n)521 unpack_R8(const void *src, GLfloat dst[][4], GLuint n)
522 {
523    const GLubyte *s = ((const GLubyte *) src);
524    GLuint i;
525    for (i = 0; i < n; i++) {
526       dst[i][0] = UBYTE_TO_FLOAT(s[i]);
527       dst[i][1] =
528       dst[i][2] = 0.0F;
529       dst[i][3] = 1.0F;
530    }
531 }
532 
533 static void
unpack_GR88(const void * src,GLfloat dst[][4],GLuint n)534 unpack_GR88(const void *src, GLfloat dst[][4], GLuint n)
535 {
536    const GLushort *s = ((const GLushort *) src);
537    GLuint i;
538    for (i = 0; i < n; i++) {
539       dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
540       dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
541       dst[i][BCOMP] = 0.0;
542       dst[i][ACOMP] = 1.0;
543    }
544 }
545 
546 static void
unpack_RG88(const void * src,GLfloat dst[][4],GLuint n)547 unpack_RG88(const void *src, GLfloat dst[][4], GLuint n)
548 {
549    const GLushort *s = ((const GLushort *) src);
550    GLuint i;
551    for (i = 0; i < n; i++) {
552       dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
553       dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
554       dst[i][BCOMP] = 0.0;
555       dst[i][ACOMP] = 1.0;
556    }
557 }
558 
559 static void
unpack_R16(const void * src,GLfloat dst[][4],GLuint n)560 unpack_R16(const void *src, GLfloat dst[][4], GLuint n)
561 {
562    const GLushort *s = ((const GLushort *) src);
563    GLuint i;
564    for (i = 0; i < n; i++) {
565       dst[i][RCOMP] = USHORT_TO_FLOAT(s[i]);
566       dst[i][GCOMP] = 0.0;
567       dst[i][BCOMP] = 0.0;
568       dst[i][ACOMP] = 1.0;
569    }
570 }
571 
572 static void
unpack_RG1616(const void * src,GLfloat dst[][4],GLuint n)573 unpack_RG1616(const void *src, GLfloat dst[][4], GLuint n)
574 {
575    const GLuint *s = ((const GLuint *) src);
576    GLuint i;
577    for (i = 0; i < n; i++) {
578       dst[i][RCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
579       dst[i][GCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
580       dst[i][BCOMP] = 0.0;
581       dst[i][ACOMP] = 1.0;
582    }
583 }
584 
585 static void
unpack_RG1616_REV(const void * src,GLfloat dst[][4],GLuint n)586 unpack_RG1616_REV(const void *src, GLfloat dst[][4], GLuint n)
587 {
588    const GLuint *s = ((const GLuint *) src);
589    GLuint i;
590    for (i = 0; i < n; i++) {
591       dst[i][RCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
592       dst[i][GCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
593       dst[i][BCOMP] = 0.0;
594       dst[i][ACOMP] = 1.0;
595    }
596 }
597 
598 static void
unpack_ARGB2101010(const void * src,GLfloat dst[][4],GLuint n)599 unpack_ARGB2101010(const void *src, GLfloat dst[][4], GLuint n)
600 {
601    const GLuint *s = ((const GLuint *) src);
602    GLuint i;
603    for (i = 0; i < n; i++) {
604       dst[i][RCOMP] = ((s[i] >> 20) & 0x3ff) * (1.0F / 1023.0F);
605       dst[i][GCOMP] = ((s[i] >> 10) & 0x3ff) * (1.0F / 1023.0F);
606       dst[i][BCOMP] = ((s[i] >>  0) & 0x3ff) * (1.0F / 1023.0F);
607       dst[i][ACOMP] = ((s[i] >> 30) &  0x03) * (1.0F / 3.0F);
608    }
609 }
610 
611 
612 static void
unpack_ABGR2101010_UINT(const void * src,GLfloat dst[][4],GLuint n)613 unpack_ABGR2101010_UINT(const void *src, GLfloat dst[][4], GLuint n)
614 {
615    const GLuint *s = ((const GLuint *) src);
616    GLuint i;
617    for (i = 0; i < n; i++) {
618       dst[i][RCOMP] = (GLfloat)((s[i] >>  0) & 0x3ff);
619       dst[i][GCOMP] = (GLfloat)((s[i] >> 10) & 0x3ff);
620       dst[i][BCOMP] = (GLfloat)((s[i] >> 20) & 0x3ff);
621       dst[i][ACOMP] = (GLfloat)((s[i] >> 30) &  0x03);
622    }
623 }
624 
625 
626 static void
unpack_Z24_S8(const void * src,GLfloat dst[][4],GLuint n)627 unpack_Z24_S8(const void *src, GLfloat dst[][4], GLuint n)
628 {
629    /* only return Z, not stencil data */
630    const GLuint *s = ((const GLuint *) src);
631    const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
632    GLuint i;
633    for (i = 0; i < n; i++) {
634       dst[i][0] =
635       dst[i][1] =
636       dst[i][2] = (s[i] >> 8) * scale;
637       dst[i][3] = 1.0F;
638       ASSERT(dst[i][0] >= 0.0F);
639       ASSERT(dst[i][0] <= 1.0F);
640    }
641 }
642 
643 static void
unpack_S8_Z24(const void * src,GLfloat dst[][4],GLuint n)644 unpack_S8_Z24(const void *src, GLfloat dst[][4], GLuint n)
645 {
646    /* only return Z, not stencil data */
647    const GLuint *s = ((const GLuint *) src);
648    const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
649    GLuint i;
650    for (i = 0; i < n; i++) {
651       dst[i][0] =
652       dst[i][1] =
653       dst[i][2] = (s[i] & 0x00ffffff) * scale;
654       dst[i][3] = 1.0F;
655       ASSERT(dst[i][0] >= 0.0F);
656       ASSERT(dst[i][0] <= 1.0F);
657    }
658 }
659 
660 static void
unpack_Z16(const void * src,GLfloat dst[][4],GLuint n)661 unpack_Z16(const void *src, GLfloat dst[][4], GLuint n)
662 {
663    const GLushort *s = ((const GLushort *) src);
664    GLuint i;
665    for (i = 0; i < n; i++) {
666       dst[i][0] =
667       dst[i][1] =
668       dst[i][2] = s[i] * (1.0F / 65535.0F);
669       dst[i][3] = 1.0F;
670    }
671 }
672 
673 static void
unpack_X8_Z24(const void * src,GLfloat dst[][4],GLuint n)674 unpack_X8_Z24(const void *src, GLfloat dst[][4], GLuint n)
675 {
676    unpack_S8_Z24(src, dst, n);
677 }
678 
679 static void
unpack_Z24_X8(const void * src,GLfloat dst[][4],GLuint n)680 unpack_Z24_X8(const void *src, GLfloat dst[][4], GLuint n)
681 {
682    unpack_Z24_S8(src, dst, n);
683 }
684 
685 static void
unpack_Z32(const void * src,GLfloat dst[][4],GLuint n)686 unpack_Z32(const void *src, GLfloat dst[][4], GLuint n)
687 {
688    const GLuint *s = ((const GLuint *) src);
689    GLuint i;
690    for (i = 0; i < n; i++) {
691       dst[i][0] =
692       dst[i][1] =
693       dst[i][2] = s[i] * (1.0F / 0xffffffff);
694       dst[i][3] = 1.0F;
695    }
696 }
697 
698 static void
unpack_Z32_FLOAT(const void * src,GLfloat dst[][4],GLuint n)699 unpack_Z32_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
700 {
701    const GLfloat *s = ((const GLfloat *) src);
702    GLuint i;
703    for (i = 0; i < n; i++) {
704       dst[i][0] =
705       dst[i][1] =
706       dst[i][2] = s[i * 2];
707       dst[i][3] = 1.0F;
708    }
709 }
710 
711 static void
unpack_Z32_FLOAT_X24S8(const void * src,GLfloat dst[][4],GLuint n)712 unpack_Z32_FLOAT_X24S8(const void *src, GLfloat dst[][4], GLuint n)
713 {
714    const GLfloat *s = ((const GLfloat *) src);
715    GLuint i;
716    for (i = 0; i < n; i++) {
717       dst[i][0] =
718       dst[i][1] =
719       dst[i][2] = s[i];
720       dst[i][3] = 1.0F;
721    }
722 }
723 
724 
725 static void
unpack_S8(const void * src,GLfloat dst[][4],GLuint n)726 unpack_S8(const void *src, GLfloat dst[][4], GLuint n)
727 {
728    /* should never be used */
729    GLuint i;
730    for (i = 0; i < n; i++) {
731       dst[i][0] =
732       dst[i][1] =
733       dst[i][2] = 0.0F;
734       dst[i][3] = 1.0F;
735    }
736 }
737 
738 
739 static void
unpack_SRGB8(const void * src,GLfloat dst[][4],GLuint n)740 unpack_SRGB8(const void *src, GLfloat dst[][4], GLuint n)
741 {
742    const GLubyte *s = (const GLubyte *) src;
743    GLuint i;
744    for (i = 0; i < n; i++) {
745       dst[i][RCOMP] = nonlinear_to_linear(s[i*3+2]);
746       dst[i][GCOMP] = nonlinear_to_linear(s[i*3+1]);
747       dst[i][BCOMP] = nonlinear_to_linear(s[i*3+0]);
748       dst[i][ACOMP] = 1.0F;
749    }
750 }
751 
752 static void
unpack_SRGBA8(const void * src,GLfloat dst[][4],GLuint n)753 unpack_SRGBA8(const void *src, GLfloat dst[][4], GLuint n)
754 {
755    const GLuint *s = ((const GLuint *) src);
756    GLuint i;
757    for (i = 0; i < n; i++) {
758       dst[i][RCOMP] = nonlinear_to_linear( (s[i] >> 24) );
759       dst[i][GCOMP] = nonlinear_to_linear( (s[i] >> 16) & 0xff );
760       dst[i][BCOMP] = nonlinear_to_linear( (s[i] >>  8) & 0xff );
761       dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] & 0xff ); /* linear! */
762    }
763 }
764 
765 static void
unpack_SARGB8(const void * src,GLfloat dst[][4],GLuint n)766 unpack_SARGB8(const void *src, GLfloat dst[][4], GLuint n)
767 {
768    const GLuint *s = ((const GLuint *) src);
769    GLuint i;
770    for (i = 0; i < n; i++) {
771       dst[i][RCOMP] = nonlinear_to_linear( (s[i] >> 16) & 0xff );
772       dst[i][GCOMP] = nonlinear_to_linear( (s[i] >>  8) & 0xff );
773       dst[i][BCOMP] = nonlinear_to_linear( (s[i]      ) & 0xff );
774       dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 24 ); /* linear! */
775    }
776 }
777 
778 static void
unpack_SL8(const void * src,GLfloat dst[][4],GLuint n)779 unpack_SL8(const void *src, GLfloat dst[][4], GLuint n)
780 {
781    const GLubyte *s = ((const GLubyte *) src);
782    GLuint i;
783    for (i = 0; i < n; i++) {
784       dst[i][RCOMP] =
785       dst[i][GCOMP] =
786       dst[i][BCOMP] = nonlinear_to_linear(s[i]);
787       dst[i][ACOMP] = 1.0F;
788    }
789 }
790 
791 static void
unpack_SLA8(const void * src,GLfloat dst[][4],GLuint n)792 unpack_SLA8(const void *src, GLfloat dst[][4], GLuint n)
793 {
794    const GLushort *s = (const GLushort *) src;
795    GLuint i;
796    for (i = 0; i < n; i++) {
797       dst[i][RCOMP] =
798       dst[i][GCOMP] =
799       dst[i][BCOMP] = nonlinear_to_linear(s[i] & 0xff);
800       dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i] >> 8); /* linear! */
801    }
802 }
803 
804 static void
unpack_SRGB_DXT1(const void * src,GLfloat dst[][4],GLuint n)805 unpack_SRGB_DXT1(const void *src, GLfloat dst[][4], GLuint n)
806 {
807 }
808 
809 static void
unpack_SRGBA_DXT1(const void * src,GLfloat dst[][4],GLuint n)810 unpack_SRGBA_DXT1(const void *src, GLfloat dst[][4], GLuint n)
811 {
812 }
813 
814 static void
unpack_SRGBA_DXT3(const void * src,GLfloat dst[][4],GLuint n)815 unpack_SRGBA_DXT3(const void *src, GLfloat dst[][4], GLuint n)
816 {
817 }
818 
819 static void
unpack_SRGBA_DXT5(const void * src,GLfloat dst[][4],GLuint n)820 unpack_SRGBA_DXT5(const void *src, GLfloat dst[][4], GLuint n)
821 {
822 }
823 
824 static void
unpack_RGB_FXT1(const void * src,GLfloat dst[][4],GLuint n)825 unpack_RGB_FXT1(const void *src, GLfloat dst[][4], GLuint n)
826 {
827 }
828 
829 static void
unpack_RGBA_FXT1(const void * src,GLfloat dst[][4],GLuint n)830 unpack_RGBA_FXT1(const void *src, GLfloat dst[][4], GLuint n)
831 {
832 }
833 
834 static void
unpack_RGB_DXT1(const void * src,GLfloat dst[][4],GLuint n)835 unpack_RGB_DXT1(const void *src, GLfloat dst[][4], GLuint n)
836 {
837 }
838 
839 static void
unpack_RGBA_DXT1(const void * src,GLfloat dst[][4],GLuint n)840 unpack_RGBA_DXT1(const void *src, GLfloat dst[][4], GLuint n)
841 {
842 }
843 
844 static void
unpack_RGBA_DXT3(const void * src,GLfloat dst[][4],GLuint n)845 unpack_RGBA_DXT3(const void *src, GLfloat dst[][4], GLuint n)
846 {
847 }
848 
849 static void
unpack_RGBA_DXT5(const void * src,GLfloat dst[][4],GLuint n)850 unpack_RGBA_DXT5(const void *src, GLfloat dst[][4], GLuint n)
851 {
852 }
853 
854 
855 static void
unpack_RGBA_FLOAT32(const void * src,GLfloat dst[][4],GLuint n)856 unpack_RGBA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
857 {
858    const GLfloat *s = (const GLfloat *) src;
859    GLuint i;
860    for (i = 0; i < n; i++) {
861       dst[i][RCOMP] = s[i*4+0];
862       dst[i][GCOMP] = s[i*4+1];
863       dst[i][BCOMP] = s[i*4+2];
864       dst[i][ACOMP] = s[i*4+3];
865    }
866 }
867 
868 static void
unpack_RGBA_FLOAT16(const void * src,GLfloat dst[][4],GLuint n)869 unpack_RGBA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
870 {
871    const GLhalfARB *s = (const GLhalfARB *) src;
872    GLuint i;
873    for (i = 0; i < n; i++) {
874       dst[i][RCOMP] = _mesa_half_to_float(s[i*4+0]);
875       dst[i][GCOMP] = _mesa_half_to_float(s[i*4+1]);
876       dst[i][BCOMP] = _mesa_half_to_float(s[i*4+2]);
877       dst[i][ACOMP] = _mesa_half_to_float(s[i*4+3]);
878    }
879 }
880 
881 static void
unpack_RGB_FLOAT32(const void * src,GLfloat dst[][4],GLuint n)882 unpack_RGB_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
883 {
884    const GLfloat *s = (const GLfloat *) src;
885    GLuint i;
886    for (i = 0; i < n; i++) {
887       dst[i][RCOMP] = s[i*3+0];
888       dst[i][GCOMP] = s[i*3+1];
889       dst[i][BCOMP] = s[i*3+2];
890       dst[i][ACOMP] = 1.0F;
891    }
892 }
893 
894 static void
unpack_RGB_FLOAT16(const void * src,GLfloat dst[][4],GLuint n)895 unpack_RGB_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
896 {
897    const GLhalfARB *s = (const GLhalfARB *) src;
898    GLuint i;
899    for (i = 0; i < n; i++) {
900       dst[i][RCOMP] = _mesa_half_to_float(s[i*3+0]);
901       dst[i][GCOMP] = _mesa_half_to_float(s[i*3+1]);
902       dst[i][BCOMP] = _mesa_half_to_float(s[i*3+2]);
903       dst[i][ACOMP] = 1.0F;
904    }
905 }
906 
907 static void
unpack_ALPHA_FLOAT32(const void * src,GLfloat dst[][4],GLuint n)908 unpack_ALPHA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
909 {
910    const GLfloat *s = (const GLfloat *) src;
911    GLuint i;
912    for (i = 0; i < n; i++) {
913       dst[i][RCOMP] =
914       dst[i][GCOMP] =
915       dst[i][BCOMP] = 0.0F;
916       dst[i][ACOMP] = s[i];
917    }
918 }
919 
920 static void
unpack_ALPHA_FLOAT16(const void * src,GLfloat dst[][4],GLuint n)921 unpack_ALPHA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
922 {
923    const GLhalfARB *s = (const GLhalfARB *) src;
924    GLuint i;
925    for (i = 0; i < n; i++) {
926       dst[i][RCOMP] =
927       dst[i][GCOMP] =
928       dst[i][BCOMP] = 0.0F;
929       dst[i][ACOMP] = _mesa_half_to_float(s[i]);
930    }
931 }
932 
933 static void
unpack_LUMINANCE_FLOAT32(const void * src,GLfloat dst[][4],GLuint n)934 unpack_LUMINANCE_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
935 {
936    const GLfloat *s = (const GLfloat *) src;
937    GLuint i;
938    for (i = 0; i < n; i++) {
939       dst[i][RCOMP] =
940       dst[i][GCOMP] =
941       dst[i][BCOMP] = s[i];
942       dst[i][ACOMP] = 1.0F;
943    }
944 }
945 
946 static void
unpack_LUMINANCE_FLOAT16(const void * src,GLfloat dst[][4],GLuint n)947 unpack_LUMINANCE_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
948 {
949    const GLhalfARB *s = (const GLhalfARB *) src;
950    GLuint i;
951    for (i = 0; i < n; i++) {
952       dst[i][RCOMP] =
953       dst[i][GCOMP] =
954       dst[i][BCOMP] = _mesa_half_to_float(s[i]);
955       dst[i][ACOMP] = 1.0F;
956    }
957 }
958 
959 static void
unpack_LUMINANCE_ALPHA_FLOAT32(const void * src,GLfloat dst[][4],GLuint n)960 unpack_LUMINANCE_ALPHA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
961 {
962    const GLfloat *s = (const GLfloat *) src;
963    GLuint i;
964    for (i = 0; i < n; i++) {
965       dst[i][RCOMP] =
966       dst[i][GCOMP] =
967       dst[i][BCOMP] = s[i*2+0];
968       dst[i][ACOMP] = s[i*2+1];
969    }
970 }
971 
972 static void
unpack_LUMINANCE_ALPHA_FLOAT16(const void * src,GLfloat dst[][4],GLuint n)973 unpack_LUMINANCE_ALPHA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
974 {
975    const GLhalfARB *s = (const GLhalfARB *) src;
976    GLuint i;
977    for (i = 0; i < n; i++) {
978       dst[i][RCOMP] =
979       dst[i][GCOMP] =
980       dst[i][BCOMP] = _mesa_half_to_float(s[i*2+0]);
981       dst[i][ACOMP] = _mesa_half_to_float(s[i*2+1]);
982    }
983 }
984 
985 static void
unpack_INTENSITY_FLOAT32(const void * src,GLfloat dst[][4],GLuint n)986 unpack_INTENSITY_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
987 {
988    const GLfloat *s = (const GLfloat *) src;
989    GLuint i;
990    for (i = 0; i < n; i++) {
991       dst[i][RCOMP] =
992       dst[i][GCOMP] =
993       dst[i][BCOMP] =
994       dst[i][ACOMP] = s[i];
995    }
996 }
997 
998 static void
unpack_INTENSITY_FLOAT16(const void * src,GLfloat dst[][4],GLuint n)999 unpack_INTENSITY_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
1000 {
1001    const GLhalfARB *s = (const GLhalfARB *) src;
1002    GLuint i;
1003    for (i = 0; i < n; i++) {
1004       dst[i][RCOMP] =
1005       dst[i][GCOMP] =
1006       dst[i][BCOMP] =
1007       dst[i][ACOMP] = _mesa_half_to_float(s[i]);
1008    }
1009 }
1010 
1011 static void
unpack_R_FLOAT32(const void * src,GLfloat dst[][4],GLuint n)1012 unpack_R_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
1013 {
1014    const GLfloat *s = (const GLfloat *) src;
1015    GLuint i;
1016    for (i = 0; i < n; i++) {
1017       dst[i][RCOMP] = s[i];
1018       dst[i][GCOMP] = 0.0F;
1019       dst[i][BCOMP] = 0.0F;
1020       dst[i][ACOMP] = 1.0F;
1021    }
1022 }
1023 
1024 static void
unpack_R_FLOAT16(const void * src,GLfloat dst[][4],GLuint n)1025 unpack_R_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
1026 {
1027    const GLhalfARB *s = (const GLhalfARB *) src;
1028    GLuint i;
1029    for (i = 0; i < n; i++) {
1030       dst[i][RCOMP] = _mesa_half_to_float(s[i]);
1031       dst[i][GCOMP] = 0.0F;
1032       dst[i][BCOMP] = 0.0F;
1033       dst[i][ACOMP] = 1.0F;
1034    }
1035 }
1036 
1037 static void
unpack_RG_FLOAT32(const void * src,GLfloat dst[][4],GLuint n)1038 unpack_RG_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
1039 {
1040    const GLfloat *s = (const GLfloat *) src;
1041    GLuint i;
1042    for (i = 0; i < n; i++) {
1043       dst[i][RCOMP] = s[i*2+0];
1044       dst[i][GCOMP] = s[i*2+1];
1045       dst[i][BCOMP] = 0.0F;
1046       dst[i][ACOMP] = 1.0F;
1047    }
1048 }
1049 
1050 static void
unpack_RG_FLOAT16(const void * src,GLfloat dst[][4],GLuint n)1051 unpack_RG_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
1052 {
1053    const GLhalfARB *s = (const GLhalfARB *) src;
1054    GLuint i;
1055    for (i = 0; i < n; i++) {
1056       dst[i][RCOMP] = _mesa_half_to_float(s[i*2+0]);
1057       dst[i][GCOMP] = _mesa_half_to_float(s[i*2+1]);
1058       dst[i][BCOMP] = 0.0F;
1059       dst[i][ACOMP] = 1.0F;
1060    }
1061 }
1062 
1063 
1064 static void
unpack_RGBA_INT8(const void * src,GLfloat dst[][4],GLuint n)1065 unpack_RGBA_INT8(const void *src, GLfloat dst[][4], GLuint n)
1066 {
1067    const GLbyte *s = (const GLbyte *) src;
1068    GLuint i;
1069    for (i = 0; i < n; i++) {
1070       dst[i][RCOMP] = (GLfloat) s[i*4+0];
1071       dst[i][GCOMP] = (GLfloat) s[i*4+1];
1072       dst[i][BCOMP] = (GLfloat) s[i*4+2];
1073       dst[i][ACOMP] = (GLfloat) s[i*4+3];
1074    }
1075 }
1076 
1077 static void
unpack_RGBA_INT16(const void * src,GLfloat dst[][4],GLuint n)1078 unpack_RGBA_INT16(const void *src, GLfloat dst[][4], GLuint n)
1079 {
1080    const GLshort *s = (const GLshort *) src;
1081    GLuint i;
1082    for (i = 0; i < n; i++) {
1083       dst[i][RCOMP] = (GLfloat) s[i*4+0];
1084       dst[i][GCOMP] = (GLfloat) s[i*4+1];
1085       dst[i][BCOMP] = (GLfloat) s[i*4+2];
1086       dst[i][ACOMP] = (GLfloat) s[i*4+3];
1087    }
1088 }
1089 
1090 static void
unpack_RGBA_INT32(const void * src,GLfloat dst[][4],GLuint n)1091 unpack_RGBA_INT32(const void *src, GLfloat dst[][4], GLuint n)
1092 {
1093    const GLint *s = (const GLint *) src;
1094    GLuint i;
1095    for (i = 0; i < n; i++) {
1096       dst[i][RCOMP] = (GLfloat) s[i*4+0];
1097       dst[i][GCOMP] = (GLfloat) s[i*4+1];
1098       dst[i][BCOMP] = (GLfloat) s[i*4+2];
1099       dst[i][ACOMP] = (GLfloat) s[i*4+3];
1100    }
1101 }
1102 
1103 static void
unpack_RGBA_UINT8(const void * src,GLfloat dst[][4],GLuint n)1104 unpack_RGBA_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1105 {
1106    const GLubyte *s = (const GLubyte *) src;
1107    GLuint i;
1108    for (i = 0; i < n; i++) {
1109       dst[i][RCOMP] = (GLfloat) s[i*4+0];
1110       dst[i][GCOMP] = (GLfloat) s[i*4+1];
1111       dst[i][BCOMP] = (GLfloat) s[i*4+2];
1112       dst[i][ACOMP] = (GLfloat) s[i*4+3];
1113    }
1114 }
1115 
1116 static void
unpack_RGBA_UINT16(const void * src,GLfloat dst[][4],GLuint n)1117 unpack_RGBA_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1118 {
1119    const GLushort *s = (const GLushort *) src;
1120    GLuint i;
1121    for (i = 0; i < n; i++) {
1122       dst[i][RCOMP] = (GLfloat) s[i*4+0];
1123       dst[i][GCOMP] = (GLfloat) s[i*4+1];
1124       dst[i][BCOMP] = (GLfloat) s[i*4+2];
1125       dst[i][ACOMP] = (GLfloat) s[i*4+3];
1126    }
1127 }
1128 
1129 static void
unpack_RGBA_UINT32(const void * src,GLfloat dst[][4],GLuint n)1130 unpack_RGBA_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1131 {
1132    const GLuint *s = (const GLuint *) src;
1133    GLuint i;
1134    for (i = 0; i < n; i++) {
1135       dst[i][RCOMP] = (GLfloat) s[i*4+0];
1136       dst[i][GCOMP] = (GLfloat) s[i*4+1];
1137       dst[i][BCOMP] = (GLfloat) s[i*4+2];
1138       dst[i][ACOMP] = (GLfloat) s[i*4+3];
1139    }
1140 }
1141 
1142 static void
unpack_DUDV8(const void * src,GLfloat dst[][4],GLuint n)1143 unpack_DUDV8(const void *src, GLfloat dst[][4], GLuint n)
1144 {
1145    const GLbyte *s = (const GLbyte *) src;
1146    GLuint i;
1147    for (i = 0; i < n; i++) {
1148       dst[i][RCOMP] = BYTE_TO_FLOAT(s[i*2+0]);
1149       dst[i][GCOMP] = BYTE_TO_FLOAT(s[i*2+1]);
1150       dst[i][BCOMP] = 0;
1151       dst[i][ACOMP] = 0;
1152    }
1153 }
1154 
1155 static void
unpack_SIGNED_R8(const void * src,GLfloat dst[][4],GLuint n)1156 unpack_SIGNED_R8(const void *src, GLfloat dst[][4], GLuint n)
1157 {
1158    const GLbyte *s = ((const GLbyte *) src);
1159    GLuint i;
1160    for (i = 0; i < n; i++) {
1161       dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1162       dst[i][GCOMP] = 0.0F;
1163       dst[i][BCOMP] = 0.0F;
1164       dst[i][ACOMP] = 1.0F;
1165    }
1166 }
1167 
1168 static void
unpack_SIGNED_RG88_REV(const void * src,GLfloat dst[][4],GLuint n)1169 unpack_SIGNED_RG88_REV(const void *src, GLfloat dst[][4], GLuint n)
1170 {
1171    const GLushort *s = ((const GLushort *) src);
1172    GLuint i;
1173    for (i = 0; i < n; i++) {
1174       dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) );
1175       dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1176       dst[i][BCOMP] = 0.0F;
1177       dst[i][ACOMP] = 1.0F;
1178    }
1179 }
1180 
1181 static void
unpack_SIGNED_RGBX8888(const void * src,GLfloat dst[][4],GLuint n)1182 unpack_SIGNED_RGBX8888(const void *src, GLfloat dst[][4], GLuint n)
1183 {
1184    const GLuint *s = ((const GLuint *) src);
1185    GLuint i;
1186    for (i = 0; i < n; i++) {
1187       dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1188       dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1189       dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >>  8) );
1190       dst[i][ACOMP] = 1.0f;
1191    }
1192 }
1193 
1194 static void
unpack_SIGNED_RGBA8888(const void * src,GLfloat dst[][4],GLuint n)1195 unpack_SIGNED_RGBA8888(const void *src, GLfloat dst[][4], GLuint n)
1196 {
1197    const GLuint *s = ((const GLuint *) src);
1198    GLuint i;
1199    for (i = 0; i < n; i++) {
1200       dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1201       dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1202       dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >>  8) );
1203       dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i]      ) );
1204    }
1205 }
1206 
1207 static void
unpack_SIGNED_RGBA8888_REV(const void * src,GLfloat dst[][4],GLuint n)1208 unpack_SIGNED_RGBA8888_REV(const void *src, GLfloat dst[][4], GLuint n)
1209 {
1210    const GLuint *s = ((const GLuint *) src);
1211    GLuint i;
1212    for (i = 0; i < n; i++) {
1213       dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i]      ) );
1214       dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >>  8) );
1215       dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1216       dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1217    }
1218 }
1219 
1220 static void
unpack_SIGNED_R16(const void * src,GLfloat dst[][4],GLuint n)1221 unpack_SIGNED_R16(const void *src, GLfloat dst[][4], GLuint n)
1222 {
1223    const GLshort *s = ((const GLshort *) src);
1224    GLuint i;
1225    for (i = 0; i < n; i++) {
1226       dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i] );
1227       dst[i][GCOMP] = 0.0F;
1228       dst[i][BCOMP] = 0.0F;
1229       dst[i][ACOMP] = 1.0F;
1230    }
1231 }
1232 
1233 static void
unpack_SIGNED_GR1616(const void * src,GLfloat dst[][4],GLuint n)1234 unpack_SIGNED_GR1616(const void *src, GLfloat dst[][4], GLuint n)
1235 {
1236    const GLuint *s = ((const GLuint *) src);
1237    GLuint i;
1238    for (i = 0; i < n; i++) {
1239       dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] & 0xffff) );
1240       dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] >> 16) );
1241       dst[i][BCOMP] = 0.0F;
1242       dst[i][ACOMP] = 1.0F;
1243    }
1244 }
1245 
1246 static void
unpack_SIGNED_RGB_16(const void * src,GLfloat dst[][4],GLuint n)1247 unpack_SIGNED_RGB_16(const void *src, GLfloat dst[][4], GLuint n)
1248 {
1249    const GLshort *s = (const GLshort *) src;
1250    GLuint i;
1251    for (i = 0; i < n; i++) {
1252       dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+0] );
1253       dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+1] );
1254       dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+2] );
1255       dst[i][ACOMP] = 1.0F;
1256    }
1257 }
1258 
1259 static void
unpack_SIGNED_RGBA_16(const void * src,GLfloat dst[][4],GLuint n)1260 unpack_SIGNED_RGBA_16(const void *src, GLfloat dst[][4], GLuint n)
1261 {
1262    const GLshort *s = (const GLshort *) src;
1263    GLuint i;
1264    for (i = 0; i < n; i++) {
1265       dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+0] );
1266       dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+1] );
1267       dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+2] );
1268       dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i*4+3] );
1269    }
1270 }
1271 
1272 static void
unpack_RGBA_16(const void * src,GLfloat dst[][4],GLuint n)1273 unpack_RGBA_16(const void *src, GLfloat dst[][4], GLuint n)
1274 {
1275    const GLushort *s = (const GLushort *) src;
1276    GLuint i;
1277    for (i = 0; i < n; i++) {
1278       dst[i][RCOMP] = USHORT_TO_FLOAT( s[i*4+0] );
1279       dst[i][GCOMP] = USHORT_TO_FLOAT( s[i*4+1] );
1280       dst[i][BCOMP] = USHORT_TO_FLOAT( s[i*4+2] );
1281       dst[i][ACOMP] = USHORT_TO_FLOAT( s[i*4+3] );
1282    }
1283 }
1284 
1285 static void
unpack_RED_RGTC1(const void * src,GLfloat dst[][4],GLuint n)1286 unpack_RED_RGTC1(const void *src, GLfloat dst[][4], GLuint n)
1287 {
1288    /* XXX to do */
1289 }
1290 
1291 static void
unpack_SIGNED_RED_RGTC1(const void * src,GLfloat dst[][4],GLuint n)1292 unpack_SIGNED_RED_RGTC1(const void *src, GLfloat dst[][4], GLuint n)
1293 {
1294    /* XXX to do */
1295 }
1296 
1297 static void
unpack_RG_RGTC2(const void * src,GLfloat dst[][4],GLuint n)1298 unpack_RG_RGTC2(const void *src, GLfloat dst[][4], GLuint n)
1299 {
1300    /* XXX to do */
1301 }
1302 
1303 static void
unpack_SIGNED_RG_RGTC2(const void * src,GLfloat dst[][4],GLuint n)1304 unpack_SIGNED_RG_RGTC2(const void *src, GLfloat dst[][4], GLuint n)
1305 {
1306    /* XXX to do */
1307 }
1308 
1309 static void
unpack_L_LATC1(const void * src,GLfloat dst[][4],GLuint n)1310 unpack_L_LATC1(const void *src, GLfloat dst[][4], GLuint n)
1311 {
1312    /* XXX to do */
1313 }
1314 
1315 static void
unpack_SIGNED_L_LATC1(const void * src,GLfloat dst[][4],GLuint n)1316 unpack_SIGNED_L_LATC1(const void *src, GLfloat dst[][4], GLuint n)
1317 {
1318    /* XXX to do */
1319 }
1320 
1321 static void
unpack_LA_LATC2(const void * src,GLfloat dst[][4],GLuint n)1322 unpack_LA_LATC2(const void *src, GLfloat dst[][4], GLuint n)
1323 {
1324    /* XXX to do */
1325 }
1326 
1327 static void
unpack_SIGNED_LA_LATC2(const void * src,GLfloat dst[][4],GLuint n)1328 unpack_SIGNED_LA_LATC2(const void *src, GLfloat dst[][4], GLuint n)
1329 {
1330    /* XXX to do */
1331 }
1332 
1333 static void
unpack_ETC1_RGB8(const void * src,GLfloat dst[][4],GLuint n)1334 unpack_ETC1_RGB8(const void *src, GLfloat dst[][4], GLuint n)
1335 {
1336    /* XXX to do */
1337 }
1338 
1339 static void
unpack_SIGNED_A8(const void * src,GLfloat dst[][4],GLuint n)1340 unpack_SIGNED_A8(const void *src, GLfloat dst[][4], GLuint n)
1341 {
1342    const GLbyte *s = ((const GLbyte *) src);
1343    GLuint i;
1344    for (i = 0; i < n; i++) {
1345       dst[i][RCOMP] = 0.0F;
1346       dst[i][GCOMP] = 0.0F;
1347       dst[i][BCOMP] = 0.0F;
1348       dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1349    }
1350 }
1351 
1352 static void
unpack_SIGNED_L8(const void * src,GLfloat dst[][4],GLuint n)1353 unpack_SIGNED_L8(const void *src, GLfloat dst[][4], GLuint n)
1354 {
1355    const GLbyte *s = ((const GLbyte *) src);
1356    GLuint i;
1357    for (i = 0; i < n; i++) {
1358       dst[i][RCOMP] =
1359       dst[i][GCOMP] =
1360       dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1361       dst[i][ACOMP] = 1.0F;
1362    }
1363 }
1364 
1365 static void
unpack_SIGNED_AL88(const void * src,GLfloat dst[][4],GLuint n)1366 unpack_SIGNED_AL88(const void *src, GLfloat dst[][4], GLuint n)
1367 {
1368    const GLshort *s = ((const GLshort *) src);
1369    GLuint i;
1370    for (i = 0; i < n; i++) {
1371       dst[i][RCOMP] =
1372       dst[i][GCOMP] =
1373       dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) );
1374       dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1375    }
1376 }
1377 
1378 static void
unpack_SIGNED_I8(const void * src,GLfloat dst[][4],GLuint n)1379 unpack_SIGNED_I8(const void *src, GLfloat dst[][4], GLuint n)
1380 {
1381    const GLbyte *s = ((const GLbyte *) src);
1382    GLuint i;
1383    for (i = 0; i < n; i++) {
1384       dst[i][RCOMP] =
1385       dst[i][GCOMP] =
1386       dst[i][BCOMP] =
1387       dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1388    }
1389 }
1390 
1391 static void
unpack_SIGNED_A16(const void * src,GLfloat dst[][4],GLuint n)1392 unpack_SIGNED_A16(const void *src, GLfloat dst[][4], GLuint n)
1393 {
1394    const GLshort *s = ((const GLshort *) src);
1395    GLuint i;
1396    for (i = 0; i < n; i++) {
1397       dst[i][RCOMP] = 0.0F;
1398       dst[i][GCOMP] = 0.0F;
1399       dst[i][BCOMP] = 0.0F;
1400       dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i] );
1401    }
1402 }
1403 
1404 static void
unpack_SIGNED_L16(const void * src,GLfloat dst[][4],GLuint n)1405 unpack_SIGNED_L16(const void *src, GLfloat dst[][4], GLuint n)
1406 {
1407    const GLshort *s = ((const GLshort *) src);
1408    GLuint i;
1409    for (i = 0; i < n; i++) {
1410       dst[i][RCOMP] =
1411       dst[i][GCOMP] =
1412       dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i] );
1413       dst[i][ACOMP] = 1.0F;
1414    }
1415 }
1416 
1417 static void
unpack_SIGNED_AL1616(const void * src,GLfloat dst[][4],GLuint n)1418 unpack_SIGNED_AL1616(const void *src, GLfloat dst[][4], GLuint n)
1419 {
1420    const GLshort *s = (const GLshort *) src;
1421    GLuint i;
1422    for (i = 0; i < n; i++) {
1423       dst[i][RCOMP] =
1424       dst[i][GCOMP] =
1425       dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*2+0] );
1426       dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i*2+1] );
1427    }
1428 }
1429 
1430 static void
unpack_SIGNED_I16(const void * src,GLfloat dst[][4],GLuint n)1431 unpack_SIGNED_I16(const void *src, GLfloat dst[][4], GLuint n)
1432 {
1433    const GLshort *s = ((const GLshort *) src);
1434    GLuint i;
1435    for (i = 0; i < n; i++) {
1436       dst[i][RCOMP] =
1437       dst[i][GCOMP] =
1438       dst[i][BCOMP] =
1439       dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i] );
1440    }
1441 }
1442 
1443 static void
unpack_RGB9_E5_FLOAT(const void * src,GLfloat dst[][4],GLuint n)1444 unpack_RGB9_E5_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
1445 {
1446    const GLuint *s = (const GLuint *) src;
1447    GLuint i;
1448    for (i = 0; i < n; i++) {
1449       rgb9e5_to_float3(s[i], dst[i]);
1450       dst[i][ACOMP] = 1.0F;
1451    }
1452 }
1453 
1454 static void
unpack_R11_G11_B10_FLOAT(const void * src,GLfloat dst[][4],GLuint n)1455 unpack_R11_G11_B10_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
1456 {
1457    const GLuint *s = (const GLuint *) src;
1458    GLuint i;
1459    for (i = 0; i < n; i++) {
1460       r11g11b10f_to_float3(s[i], dst[i]);
1461       dst[i][ACOMP] = 1.0F;
1462    }
1463 }
1464 
1465 
1466 /**
1467  * Return the unpacker function for the given format.
1468  */
1469 static unpack_rgba_func
get_unpack_rgba_function(gl_format format)1470 get_unpack_rgba_function(gl_format format)
1471 {
1472    static unpack_rgba_func table[MESA_FORMAT_COUNT];
1473    static GLboolean initialized = GL_FALSE;
1474 
1475    if (!initialized) {
1476       table[MESA_FORMAT_NONE] = NULL;
1477 
1478       table[MESA_FORMAT_RGBA8888] = unpack_RGBA8888;
1479       table[MESA_FORMAT_RGBA8888_REV] = unpack_RGBA8888_REV;
1480       table[MESA_FORMAT_ARGB8888] = unpack_ARGB8888;
1481       table[MESA_FORMAT_ARGB8888_REV] = unpack_ARGB8888_REV;
1482       table[MESA_FORMAT_RGBX8888] = unpack_RGBX8888;
1483       table[MESA_FORMAT_RGBX8888_REV] = unpack_RGBX8888_REV;
1484       table[MESA_FORMAT_XRGB8888] = unpack_XRGB8888;
1485       table[MESA_FORMAT_XRGB8888_REV] = unpack_XRGB8888_REV;
1486       table[MESA_FORMAT_RGB888] = unpack_RGB888;
1487       table[MESA_FORMAT_BGR888] = unpack_BGR888;
1488       table[MESA_FORMAT_RGB565] = unpack_RGB565;
1489       table[MESA_FORMAT_RGB565_REV] = unpack_RGB565_REV;
1490       table[MESA_FORMAT_ARGB4444] = unpack_ARGB4444;
1491       table[MESA_FORMAT_ARGB4444_REV] = unpack_ARGB4444_REV;
1492       table[MESA_FORMAT_RGBA5551] = unpack_RGBA5551;
1493       table[MESA_FORMAT_ARGB1555] = unpack_ARGB1555;
1494       table[MESA_FORMAT_ARGB1555_REV] = unpack_ARGB1555_REV;
1495       table[MESA_FORMAT_AL44] = unpack_AL44;
1496       table[MESA_FORMAT_AL88] = unpack_AL88;
1497       table[MESA_FORMAT_AL88_REV] = unpack_AL88_REV;
1498       table[MESA_FORMAT_AL1616] = unpack_AL1616;
1499       table[MESA_FORMAT_AL1616_REV] = unpack_AL1616_REV;
1500       table[MESA_FORMAT_RGB332] = unpack_RGB332;
1501       table[MESA_FORMAT_A8] = unpack_A8;
1502       table[MESA_FORMAT_A16] = unpack_A16;
1503       table[MESA_FORMAT_L8] = unpack_L8;
1504       table[MESA_FORMAT_L16] = unpack_L16;
1505       table[MESA_FORMAT_I8] = unpack_I8;
1506       table[MESA_FORMAT_I16] = unpack_I16;
1507       table[MESA_FORMAT_YCBCR] = unpack_YCBCR;
1508       table[MESA_FORMAT_YCBCR_REV] = unpack_YCBCR_REV;
1509       table[MESA_FORMAT_R8] = unpack_R8;
1510       table[MESA_FORMAT_GR88] = unpack_GR88;
1511       table[MESA_FORMAT_RG88] = unpack_RG88;
1512       table[MESA_FORMAT_R16] = unpack_R16;
1513       table[MESA_FORMAT_RG1616] = unpack_RG1616;
1514       table[MESA_FORMAT_RG1616_REV] = unpack_RG1616_REV;
1515       table[MESA_FORMAT_ARGB2101010] = unpack_ARGB2101010;
1516       table[MESA_FORMAT_ABGR2101010_UINT] = unpack_ABGR2101010_UINT;
1517       table[MESA_FORMAT_Z24_S8] = unpack_Z24_S8;
1518       table[MESA_FORMAT_S8_Z24] = unpack_S8_Z24;
1519       table[MESA_FORMAT_Z16] = unpack_Z16;
1520       table[MESA_FORMAT_X8_Z24] = unpack_X8_Z24;
1521       table[MESA_FORMAT_Z24_X8] = unpack_Z24_X8;
1522       table[MESA_FORMAT_Z32] = unpack_Z32;
1523       table[MESA_FORMAT_S8] = unpack_S8;
1524       table[MESA_FORMAT_SRGB8] = unpack_SRGB8;
1525       table[MESA_FORMAT_SRGBA8] = unpack_SRGBA8;
1526       table[MESA_FORMAT_SARGB8] = unpack_SARGB8;
1527       table[MESA_FORMAT_SL8] = unpack_SL8;
1528       table[MESA_FORMAT_SLA8] = unpack_SLA8;
1529       table[MESA_FORMAT_SRGB_DXT1] = unpack_SRGB_DXT1;
1530       table[MESA_FORMAT_SRGBA_DXT1] = unpack_SRGBA_DXT1;
1531       table[MESA_FORMAT_SRGBA_DXT3] = unpack_SRGBA_DXT3;
1532       table[MESA_FORMAT_SRGBA_DXT5] = unpack_SRGBA_DXT5;
1533 
1534       table[MESA_FORMAT_RGB_FXT1] = unpack_RGB_FXT1;
1535       table[MESA_FORMAT_RGBA_FXT1] = unpack_RGBA_FXT1;
1536       table[MESA_FORMAT_RGB_DXT1] = unpack_RGB_DXT1;
1537       table[MESA_FORMAT_RGBA_DXT1] = unpack_RGBA_DXT1;
1538       table[MESA_FORMAT_RGBA_DXT3] = unpack_RGBA_DXT3;
1539       table[MESA_FORMAT_RGBA_DXT5] = unpack_RGBA_DXT5;
1540 
1541       table[MESA_FORMAT_RGBA_FLOAT32] = unpack_RGBA_FLOAT32;
1542       table[MESA_FORMAT_RGBA_FLOAT16] = unpack_RGBA_FLOAT16;
1543       table[MESA_FORMAT_RGB_FLOAT32] = unpack_RGB_FLOAT32;
1544       table[MESA_FORMAT_RGB_FLOAT16] = unpack_RGB_FLOAT16;
1545       table[MESA_FORMAT_ALPHA_FLOAT32] = unpack_ALPHA_FLOAT32;
1546       table[MESA_FORMAT_ALPHA_FLOAT16] = unpack_ALPHA_FLOAT16;
1547       table[MESA_FORMAT_LUMINANCE_FLOAT32] = unpack_LUMINANCE_FLOAT32;
1548       table[MESA_FORMAT_LUMINANCE_FLOAT16] = unpack_LUMINANCE_FLOAT16;
1549       table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = unpack_LUMINANCE_ALPHA_FLOAT32;
1550       table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = unpack_LUMINANCE_ALPHA_FLOAT16;
1551       table[MESA_FORMAT_INTENSITY_FLOAT32] = unpack_INTENSITY_FLOAT32;
1552       table[MESA_FORMAT_INTENSITY_FLOAT16] = unpack_INTENSITY_FLOAT16;
1553       table[MESA_FORMAT_R_FLOAT32] = unpack_R_FLOAT32;
1554       table[MESA_FORMAT_R_FLOAT16] = unpack_R_FLOAT16;
1555       table[MESA_FORMAT_RG_FLOAT32] = unpack_RG_FLOAT32;
1556       table[MESA_FORMAT_RG_FLOAT16] = unpack_RG_FLOAT16;
1557 
1558       table[MESA_FORMAT_RGBA_INT8] = unpack_RGBA_INT8;
1559       table[MESA_FORMAT_RGBA_INT16] = unpack_RGBA_INT16;
1560       table[MESA_FORMAT_RGBA_INT32] = unpack_RGBA_INT32;
1561       table[MESA_FORMAT_RGBA_UINT8] = unpack_RGBA_UINT8;
1562       table[MESA_FORMAT_RGBA_UINT16] = unpack_RGBA_UINT16;
1563       table[MESA_FORMAT_RGBA_UINT32] = unpack_RGBA_UINT32;
1564 
1565       table[MESA_FORMAT_DUDV8] = unpack_DUDV8;
1566       table[MESA_FORMAT_SIGNED_R8] = unpack_SIGNED_R8;
1567       table[MESA_FORMAT_SIGNED_RG88_REV] = unpack_SIGNED_RG88_REV;
1568       table[MESA_FORMAT_SIGNED_RGBX8888] = unpack_SIGNED_RGBX8888;
1569       table[MESA_FORMAT_SIGNED_RGBA8888] = unpack_SIGNED_RGBA8888;
1570       table[MESA_FORMAT_SIGNED_RGBA8888_REV] = unpack_SIGNED_RGBA8888_REV;
1571       table[MESA_FORMAT_SIGNED_R16] = unpack_SIGNED_R16;
1572       table[MESA_FORMAT_SIGNED_GR1616] = unpack_SIGNED_GR1616;
1573       table[MESA_FORMAT_SIGNED_RGB_16] = unpack_SIGNED_RGB_16;
1574       table[MESA_FORMAT_SIGNED_RGBA_16] = unpack_SIGNED_RGBA_16;
1575       table[MESA_FORMAT_RGBA_16] = unpack_RGBA_16;
1576 
1577       table[MESA_FORMAT_RED_RGTC1] = unpack_RED_RGTC1;
1578       table[MESA_FORMAT_SIGNED_RED_RGTC1] = unpack_SIGNED_RED_RGTC1;
1579       table[MESA_FORMAT_RG_RGTC2] = unpack_RG_RGTC2;
1580       table[MESA_FORMAT_SIGNED_RG_RGTC2] = unpack_SIGNED_RG_RGTC2;
1581 
1582       table[MESA_FORMAT_L_LATC1] = unpack_L_LATC1;
1583       table[MESA_FORMAT_SIGNED_L_LATC1] = unpack_SIGNED_L_LATC1;
1584       table[MESA_FORMAT_LA_LATC2] = unpack_LA_LATC2;
1585       table[MESA_FORMAT_SIGNED_LA_LATC2] = unpack_SIGNED_LA_LATC2;
1586 
1587       table[MESA_FORMAT_ETC1_RGB8] = unpack_ETC1_RGB8;
1588 
1589       table[MESA_FORMAT_SIGNED_A8] = unpack_SIGNED_A8;
1590       table[MESA_FORMAT_SIGNED_L8] = unpack_SIGNED_L8;
1591       table[MESA_FORMAT_SIGNED_AL88] = unpack_SIGNED_AL88;
1592       table[MESA_FORMAT_SIGNED_I8] = unpack_SIGNED_I8;
1593       table[MESA_FORMAT_SIGNED_A16] = unpack_SIGNED_A16;
1594       table[MESA_FORMAT_SIGNED_L16] = unpack_SIGNED_L16;
1595       table[MESA_FORMAT_SIGNED_AL1616] = unpack_SIGNED_AL1616;
1596       table[MESA_FORMAT_SIGNED_I16] = unpack_SIGNED_I16;
1597 
1598       table[MESA_FORMAT_RGB9_E5_FLOAT] = unpack_RGB9_E5_FLOAT;
1599       table[MESA_FORMAT_R11_G11_B10_FLOAT] = unpack_R11_G11_B10_FLOAT;
1600 
1601       table[MESA_FORMAT_Z32_FLOAT] = unpack_Z32_FLOAT;
1602       table[MESA_FORMAT_Z32_FLOAT_X24S8] = unpack_Z32_FLOAT_X24S8;
1603 
1604       initialized = GL_TRUE;
1605    }
1606 
1607    if (table[format] == NULL) {
1608       _mesa_problem(NULL, "unsupported unpack for format %s",
1609                     _mesa_get_format_name(format));
1610    }
1611 
1612    return table[format];
1613 }
1614 
1615 
1616 /**
1617  * Unpack rgba colors, returning as GLfloat values.
1618  */
1619 void
_mesa_unpack_rgba_row(gl_format format,GLuint n,const void * src,GLfloat dst[][4])1620 _mesa_unpack_rgba_row(gl_format format, GLuint n,
1621                       const void *src, GLfloat dst[][4])
1622 {
1623    unpack_rgba_func unpack = get_unpack_rgba_function(format);
1624    unpack(src, dst, n);
1625 }
1626 
1627 
1628 /**********************************************************************/
1629 /*  Unpack, returning GLubyte colors                                  */
1630 /**********************************************************************/
1631 
1632 
1633 static void
unpack_ubyte_RGBA8888(const void * src,GLubyte dst[][4],GLuint n)1634 unpack_ubyte_RGBA8888(const void *src, GLubyte dst[][4], GLuint n)
1635 {
1636    const GLuint *s = ((const GLuint *) src);
1637    GLuint i;
1638    for (i = 0; i < n; i++) {
1639       dst[i][RCOMP] = (s[i] >> 24);
1640       dst[i][GCOMP] = (s[i] >> 16) & 0xff;
1641       dst[i][BCOMP] = (s[i] >>  8) & 0xff;
1642       dst[i][ACOMP] = (s[i]      ) & 0xff;
1643    }
1644 }
1645 
1646 static void
unpack_ubyte_RGBA8888_REV(const void * src,GLubyte dst[][4],GLuint n)1647 unpack_ubyte_RGBA8888_REV(const void *src, GLubyte dst[][4], GLuint n)
1648 {
1649    const GLuint *s = ((const GLuint *) src);
1650    GLuint i;
1651    for (i = 0; i < n; i++) {
1652       dst[i][RCOMP] = (s[i]      ) & 0xff;
1653       dst[i][GCOMP] = (s[i] >>  8) & 0xff;
1654       dst[i][BCOMP] = (s[i] >> 16) & 0xff;
1655       dst[i][ACOMP] = (s[i] >> 24);
1656    }
1657 }
1658 
1659 static void
unpack_ubyte_ARGB8888(const void * src,GLubyte dst[][4],GLuint n)1660 unpack_ubyte_ARGB8888(const void *src, GLubyte dst[][4], GLuint n)
1661 {
1662    const GLuint *s = ((const GLuint *) src);
1663    GLuint i;
1664    for (i = 0; i < n; i++) {
1665       dst[i][RCOMP] = (s[i] >> 16) & 0xff;
1666       dst[i][GCOMP] = (s[i] >>  8) & 0xff;
1667       dst[i][BCOMP] = (s[i]      ) & 0xff;
1668       dst[i][ACOMP] = (s[i] >> 24);
1669    }
1670 }
1671 
1672 static void
unpack_ubyte_ARGB8888_REV(const void * src,GLubyte dst[][4],GLuint n)1673 unpack_ubyte_ARGB8888_REV(const void *src, GLubyte dst[][4], GLuint n)
1674 {
1675    const GLuint *s = ((const GLuint *) src);
1676    GLuint i;
1677    for (i = 0; i < n; i++) {
1678       dst[i][RCOMP] = (s[i] >>  8) & 0xff;
1679       dst[i][GCOMP] = (s[i] >> 16) & 0xff;
1680       dst[i][BCOMP] = (s[i] >> 24);
1681       dst[i][ACOMP] = (s[i]      ) & 0xff;
1682    }
1683 }
1684 
1685 static void
unpack_ubyte_RGBX8888(const void * src,GLubyte dst[][4],GLuint n)1686 unpack_ubyte_RGBX8888(const void *src, GLubyte dst[][4], GLuint n)
1687 {
1688    const GLuint *s = ((const GLuint *) src);
1689    GLuint i;
1690    for (i = 0; i < n; i++) {
1691       dst[i][RCOMP] = (s[i] >> 24);
1692       dst[i][GCOMP] = (s[i] >> 16) & 0xff;
1693       dst[i][BCOMP] = (s[i] >>  8) & 0xff;
1694       dst[i][ACOMP] = 0xff;
1695    }
1696 }
1697 
1698 static void
unpack_ubyte_RGBX8888_REV(const void * src,GLubyte dst[][4],GLuint n)1699 unpack_ubyte_RGBX8888_REV(const void *src, GLubyte dst[][4], GLuint n)
1700 {
1701    const GLuint *s = ((const GLuint *) src);
1702    GLuint i;
1703    for (i = 0; i < n; i++) {
1704       dst[i][RCOMP] = (s[i]      ) & 0xff;
1705       dst[i][GCOMP] = (s[i] >>  8) & 0xff;
1706       dst[i][BCOMP] = (s[i] >> 16) & 0xff;
1707       dst[i][ACOMP] = 0xff;
1708    }
1709 }
1710 
1711 static void
unpack_ubyte_XRGB8888(const void * src,GLubyte dst[][4],GLuint n)1712 unpack_ubyte_XRGB8888(const void *src, GLubyte dst[][4], GLuint n)
1713 {
1714    const GLuint *s = ((const GLuint *) src);
1715    GLuint i;
1716    for (i = 0; i < n; i++) {
1717       dst[i][RCOMP] = (s[i] >> 16) & 0xff;
1718       dst[i][GCOMP] = (s[i] >>  8) & 0xff;
1719       dst[i][BCOMP] = (s[i]      ) & 0xff;
1720       dst[i][ACOMP] = 0xff;
1721    }
1722 }
1723 
1724 static void
unpack_ubyte_XRGB8888_REV(const void * src,GLubyte dst[][4],GLuint n)1725 unpack_ubyte_XRGB8888_REV(const void *src, GLubyte dst[][4], GLuint n)
1726 {
1727    const GLuint *s = ((const GLuint *) src);
1728    GLuint i;
1729    for (i = 0; i < n; i++) {
1730       dst[i][RCOMP] = (s[i] >>  8) & 0xff;
1731       dst[i][GCOMP] = (s[i] >> 16) & 0xff;
1732       dst[i][BCOMP] = (s[i] >> 24);
1733       dst[i][ACOMP] = 0xff;
1734    }
1735 }
1736 
1737 static void
unpack_ubyte_RGB888(const void * src,GLubyte dst[][4],GLuint n)1738 unpack_ubyte_RGB888(const void *src, GLubyte dst[][4], GLuint n)
1739 {
1740    const GLubyte *s = (const GLubyte *) src;
1741    GLuint i;
1742    for (i = 0; i < n; i++) {
1743       dst[i][RCOMP] = s[i*3+2];
1744       dst[i][GCOMP] = s[i*3+1];
1745       dst[i][BCOMP] = s[i*3+0];
1746       dst[i][ACOMP] = 0xff;
1747    }
1748 }
1749 
1750 static void
unpack_ubyte_BGR888(const void * src,GLubyte dst[][4],GLuint n)1751 unpack_ubyte_BGR888(const void *src, GLubyte dst[][4], GLuint n)
1752 {
1753    const GLubyte *s = (const GLubyte *) src;
1754    GLuint i;
1755    for (i = 0; i < n; i++) {
1756       dst[i][RCOMP] = s[i*3+0];
1757       dst[i][GCOMP] = s[i*3+1];
1758       dst[i][BCOMP] = s[i*3+2];
1759       dst[i][ACOMP] = 0xff;
1760    }
1761 }
1762 
1763 static void
unpack_ubyte_RGB565(const void * src,GLubyte dst[][4],GLuint n)1764 unpack_ubyte_RGB565(const void *src, GLubyte dst[][4], GLuint n)
1765 {
1766    const GLushort *s = ((const GLushort *) src);
1767    GLuint i;
1768    for (i = 0; i < n; i++) {
1769       dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f);
1770       dst[i][GCOMP] = EXPAND_6_8((s[i] >> 5 ) & 0x3f);
1771       dst[i][BCOMP] = EXPAND_5_8( s[i]        & 0x1f);
1772       dst[i][ACOMP] = 0xff;
1773    }
1774 }
1775 
1776 static void
unpack_ubyte_RGB565_REV(const void * src,GLubyte dst[][4],GLuint n)1777 unpack_ubyte_RGB565_REV(const void *src, GLubyte dst[][4], GLuint n)
1778 {
1779    const GLushort *s = ((const GLushort *) src);
1780    GLuint i;
1781    for (i = 0; i < n; i++) {
1782       GLuint t = (s[i] >> 8) | (s[i] << 8); /* byte swap */
1783       dst[i][RCOMP] = EXPAND_5_8((t >> 11) & 0x1f);
1784       dst[i][GCOMP] = EXPAND_6_8((t >> 5 ) & 0x3f);
1785       dst[i][BCOMP] = EXPAND_5_8( t        & 0x1f);
1786       dst[i][ACOMP] = 0xff;
1787    }
1788 }
1789 
1790 static void
unpack_ubyte_ARGB4444(const void * src,GLubyte dst[][4],GLuint n)1791 unpack_ubyte_ARGB4444(const void *src, GLubyte dst[][4], GLuint n)
1792 {
1793    const GLushort *s = ((const GLushort *) src);
1794    GLuint i;
1795    for (i = 0; i < n; i++) {
1796       dst[i][RCOMP] = EXPAND_4_8((s[i] >>  8) & 0xf);
1797       dst[i][GCOMP] = EXPAND_4_8((s[i] >>  4) & 0xf);
1798       dst[i][BCOMP] = EXPAND_4_8((s[i]      ) & 0xf);
1799       dst[i][ACOMP] = EXPAND_4_8((s[i] >> 12) & 0xf);
1800    }
1801 }
1802 
1803 static void
unpack_ubyte_ARGB4444_REV(const void * src,GLubyte dst[][4],GLuint n)1804 unpack_ubyte_ARGB4444_REV(const void *src, GLubyte dst[][4], GLuint n)
1805 {
1806    const GLushort *s = ((const GLushort *) src);
1807    GLuint i;
1808    for (i = 0; i < n; i++) {
1809       dst[i][RCOMP] = EXPAND_4_8((s[i]      ) & 0xf);
1810       dst[i][GCOMP] = EXPAND_4_8((s[i] >> 12) & 0xf);
1811       dst[i][BCOMP] = EXPAND_4_8((s[i] >>  8) & 0xf);
1812       dst[i][ACOMP] = EXPAND_4_8((s[i] >>  4) & 0xf);
1813    }
1814 }
1815 
1816 static void
unpack_ubyte_RGBA5551(const void * src,GLubyte dst[][4],GLuint n)1817 unpack_ubyte_RGBA5551(const void *src, GLubyte dst[][4], GLuint n)
1818 {
1819    const GLushort *s = ((const GLushort *) src);
1820    GLuint i;
1821    for (i = 0; i < n; i++) {
1822       dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f);
1823       dst[i][GCOMP] = EXPAND_5_8((s[i] >>  6) & 0x1f);
1824       dst[i][BCOMP] = EXPAND_5_8((s[i] >>  1) & 0x1f);
1825       dst[i][ACOMP] = EXPAND_1_8((s[i]      ) & 0x01);
1826    }
1827 }
1828 
1829 static void
unpack_ubyte_ARGB1555(const void * src,GLubyte dst[][4],GLuint n)1830 unpack_ubyte_ARGB1555(const void *src, GLubyte dst[][4], GLuint n)
1831 {
1832    const GLushort *s = ((const GLushort *) src);
1833    GLuint i;
1834    for (i = 0; i < n; i++) {
1835       dst[i][RCOMP] = EXPAND_5_8((s[i] >> 10) & 0x1f);
1836       dst[i][GCOMP] = EXPAND_5_8((s[i] >>  5) & 0x1f);
1837       dst[i][BCOMP] = EXPAND_5_8((s[i] >>  0) & 0x1f);
1838       dst[i][ACOMP] = EXPAND_1_8((s[i] >> 15) & 0x01);
1839    }
1840 }
1841 
1842 static void
unpack_ubyte_ARGB1555_REV(const void * src,GLubyte dst[][4],GLuint n)1843 unpack_ubyte_ARGB1555_REV(const void *src, GLubyte dst[][4], GLuint n)
1844 {
1845    const GLushort *s = ((const GLushort *) src);
1846    GLuint i;
1847    for (i = 0; i < n; i++) {
1848       GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */
1849       dst[i][RCOMP] = EXPAND_5_8((tmp >> 10) & 0x1f);
1850       dst[i][GCOMP] = EXPAND_5_8((tmp >>  5) & 0x1f);
1851       dst[i][BCOMP] = EXPAND_5_8((tmp >>  0) & 0x1f);
1852       dst[i][ACOMP] = EXPAND_1_8((tmp >> 15) & 0x01);
1853    }
1854 }
1855 
1856 static void
unpack_ubyte_AL44(const void * src,GLubyte dst[][4],GLuint n)1857 unpack_ubyte_AL44(const void *src, GLubyte dst[][4], GLuint n)
1858 {
1859    const GLubyte *s = ((const GLubyte *) src);
1860    GLuint i;
1861    for (i = 0; i < n; i++) {
1862       dst[i][RCOMP] =
1863       dst[i][GCOMP] =
1864       dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xf);
1865       dst[i][ACOMP] = EXPAND_4_8(s[i] >> 4);
1866    }
1867 }
1868 
1869 static void
unpack_ubyte_AL88(const void * src,GLubyte dst[][4],GLuint n)1870 unpack_ubyte_AL88(const void *src, GLubyte dst[][4], GLuint n)
1871 {
1872    const GLushort *s = ((const GLushort *) src);
1873    GLuint i;
1874    for (i = 0; i < n; i++) {
1875       dst[i][RCOMP] =
1876       dst[i][GCOMP] =
1877       dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xff);
1878       dst[i][ACOMP] = EXPAND_4_8(s[i] >> 8);
1879    }
1880 }
1881 
1882 static void
unpack_ubyte_AL88_REV(const void * src,GLubyte dst[][4],GLuint n)1883 unpack_ubyte_AL88_REV(const void *src, GLubyte dst[][4], GLuint n)
1884 {
1885    const GLushort *s = ((const GLushort *) src);
1886    GLuint i;
1887    for (i = 0; i < n; i++) {
1888       dst[i][RCOMP] =
1889       dst[i][GCOMP] =
1890       dst[i][BCOMP] = EXPAND_4_8(s[i] >> 8);
1891       dst[i][ACOMP] = EXPAND_4_8(s[i] & 0xff);
1892    }
1893 }
1894 
1895 static void
unpack_ubyte_RGB332(const void * src,GLubyte dst[][4],GLuint n)1896 unpack_ubyte_RGB332(const void *src, GLubyte dst[][4], GLuint n)
1897 {
1898    const GLubyte *s = ((const GLubyte *) src);
1899    GLuint i;
1900    for (i = 0; i < n; i++) {
1901       dst[i][RCOMP] = EXPAND_3_8((s[i] >> 5) & 0x7);
1902       dst[i][GCOMP] = EXPAND_3_8((s[i] >> 2) & 0x7);
1903       dst[i][BCOMP] = EXPAND_2_8((s[i]     ) & 0x3);
1904       dst[i][ACOMP] = 0xff;
1905    }
1906 }
1907 
1908 static void
unpack_ubyte_A8(const void * src,GLubyte dst[][4],GLuint n)1909 unpack_ubyte_A8(const void *src, GLubyte dst[][4], GLuint n)
1910 {
1911    const GLubyte *s = ((const GLubyte *) src);
1912    GLuint i;
1913    for (i = 0; i < n; i++) {
1914       dst[i][RCOMP] =
1915       dst[i][GCOMP] =
1916       dst[i][BCOMP] = 0;
1917       dst[i][ACOMP] = s[i];
1918    }
1919 }
1920 
1921 static void
unpack_ubyte_L8(const void * src,GLubyte dst[][4],GLuint n)1922 unpack_ubyte_L8(const void *src, GLubyte dst[][4], GLuint n)
1923 {
1924    const GLubyte *s = ((const GLubyte *) src);
1925    GLuint i;
1926    for (i = 0; i < n; i++) {
1927       dst[i][RCOMP] =
1928       dst[i][GCOMP] =
1929       dst[i][BCOMP] = s[i];
1930       dst[i][ACOMP] = 0xff;
1931    }
1932 }
1933 
1934 
1935 static void
unpack_ubyte_I8(const void * src,GLubyte dst[][4],GLuint n)1936 unpack_ubyte_I8(const void *src, GLubyte dst[][4], GLuint n)
1937 {
1938    const GLubyte *s = ((const GLubyte *) src);
1939    GLuint i;
1940    for (i = 0; i < n; i++) {
1941       dst[i][RCOMP] =
1942       dst[i][GCOMP] =
1943       dst[i][BCOMP] =
1944       dst[i][ACOMP] = s[i];
1945    }
1946 }
1947 
1948 static void
unpack_ubyte_R8(const void * src,GLubyte dst[][4],GLuint n)1949 unpack_ubyte_R8(const void *src, GLubyte dst[][4], GLuint n)
1950 {
1951    const GLubyte *s = ((const GLubyte *) src);
1952    GLuint i;
1953    for (i = 0; i < n; i++) {
1954       dst[i][0] = s[i];
1955       dst[i][1] =
1956       dst[i][2] = 0;
1957       dst[i][3] = 0xff;
1958    }
1959 }
1960 
1961 static void
unpack_ubyte_GR88(const void * src,GLubyte dst[][4],GLuint n)1962 unpack_ubyte_GR88(const void *src, GLubyte dst[][4], GLuint n)
1963 {
1964    const GLushort *s = ((const GLushort *) src);
1965    GLuint i;
1966    for (i = 0; i < n; i++) {
1967       dst[i][RCOMP] = s[i] & 0xff;
1968       dst[i][GCOMP] = s[i] >> 8;
1969       dst[i][BCOMP] = 0;
1970       dst[i][ACOMP] = 0xff;
1971    }
1972 }
1973 
1974 static void
unpack_ubyte_RG88(const void * src,GLubyte dst[][4],GLuint n)1975 unpack_ubyte_RG88(const void *src, GLubyte dst[][4], GLuint n)
1976 {
1977    const GLushort *s = ((const GLushort *) src);
1978    GLuint i;
1979    for (i = 0; i < n; i++) {
1980       dst[i][RCOMP] = s[i] >> 8;
1981       dst[i][GCOMP] = s[i] & 0xff;
1982       dst[i][BCOMP] = 0;
1983       dst[i][ACOMP] = 0xff;
1984    }
1985 }
1986 
1987 
1988 /**
1989  * Unpack rgba colors, returning as GLubyte values.  This should usually
1990  * only be used for unpacking formats that use 8 bits or less per channel.
1991  */
1992 void
_mesa_unpack_ubyte_rgba_row(gl_format format,GLuint n,const void * src,GLubyte dst[][4])1993 _mesa_unpack_ubyte_rgba_row(gl_format format, GLuint n,
1994                             const void *src, GLubyte dst[][4])
1995 {
1996    switch (format) {
1997    case MESA_FORMAT_RGBA8888:
1998       unpack_ubyte_RGBA8888(src, dst, n);
1999       break;
2000    case MESA_FORMAT_RGBA8888_REV:
2001       unpack_ubyte_RGBA8888_REV(src, dst, n);
2002       break;
2003    case MESA_FORMAT_ARGB8888:
2004       unpack_ubyte_ARGB8888(src, dst, n);
2005       break;
2006    case MESA_FORMAT_ARGB8888_REV:
2007       unpack_ubyte_ARGB8888_REV(src, dst, n);
2008       break;
2009    case MESA_FORMAT_RGBX8888:
2010       unpack_ubyte_RGBX8888(src, dst, n);
2011       break;
2012    case MESA_FORMAT_RGBX8888_REV:
2013       unpack_ubyte_RGBX8888_REV(src, dst, n);
2014       break;
2015    case MESA_FORMAT_XRGB8888:
2016       unpack_ubyte_XRGB8888(src, dst, n);
2017       break;
2018    case MESA_FORMAT_XRGB8888_REV:
2019       unpack_ubyte_XRGB8888_REV(src, dst, n);
2020       break;
2021    case MESA_FORMAT_RGB888:
2022       unpack_ubyte_RGB888(src, dst, n);
2023       break;
2024    case MESA_FORMAT_BGR888:
2025       unpack_ubyte_BGR888(src, dst, n);
2026       break;
2027    case MESA_FORMAT_RGB565:
2028       unpack_ubyte_RGB565(src, dst, n);
2029       break;
2030    case MESA_FORMAT_RGB565_REV:
2031       unpack_ubyte_RGB565_REV(src, dst, n);
2032       break;
2033    case MESA_FORMAT_ARGB4444:
2034       unpack_ubyte_ARGB4444(src, dst, n);
2035       break;
2036    case MESA_FORMAT_ARGB4444_REV:
2037       unpack_ubyte_ARGB4444_REV(src, dst, n);
2038       break;
2039    case MESA_FORMAT_RGBA5551:
2040       unpack_ubyte_RGBA5551(src, dst, n);
2041       break;
2042    case MESA_FORMAT_ARGB1555:
2043       unpack_ubyte_ARGB1555(src, dst, n);
2044       break;
2045    case MESA_FORMAT_ARGB1555_REV:
2046       unpack_ubyte_ARGB1555_REV(src, dst, n);
2047       break;
2048    case MESA_FORMAT_AL44:
2049       unpack_ubyte_AL44(src, dst, n);
2050       break;
2051    case MESA_FORMAT_AL88:
2052       unpack_ubyte_AL88(src, dst, n);
2053       break;
2054    case MESA_FORMAT_AL88_REV:
2055       unpack_ubyte_AL88_REV(src, dst, n);
2056       break;
2057    case MESA_FORMAT_RGB332:
2058       unpack_ubyte_RGB332(src, dst, n);
2059       break;
2060    case MESA_FORMAT_A8:
2061       unpack_ubyte_A8(src, dst, n);
2062       break;
2063    case MESA_FORMAT_L8:
2064       unpack_ubyte_L8(src, dst, n);
2065       break;
2066    case MESA_FORMAT_I8:
2067       unpack_ubyte_I8(src, dst, n);
2068       break;
2069    case MESA_FORMAT_R8:
2070       unpack_ubyte_R8(src, dst, n);
2071       break;
2072    case MESA_FORMAT_GR88:
2073       unpack_ubyte_GR88(src, dst, n);
2074       break;
2075    case MESA_FORMAT_RG88:
2076       unpack_ubyte_RG88(src, dst, n);
2077       break;
2078    default:
2079       /* get float values, convert to ubyte */
2080       {
2081          GLfloat *tmp = (GLfloat *) malloc(n * 4 * sizeof(GLfloat));
2082          if (tmp) {
2083             GLuint i;
2084             _mesa_unpack_rgba_row(format, n, src, (GLfloat (*)[4]) tmp);
2085             for (i = 0; i < n; i++) {
2086                UNCLAMPED_FLOAT_TO_UBYTE(dst[i][0], tmp[i*4+0]);
2087                UNCLAMPED_FLOAT_TO_UBYTE(dst[i][1], tmp[i*4+1]);
2088                UNCLAMPED_FLOAT_TO_UBYTE(dst[i][2], tmp[i*4+2]);
2089                UNCLAMPED_FLOAT_TO_UBYTE(dst[i][3], tmp[i*4+3]);
2090             }
2091             free(tmp);
2092          }
2093       }
2094       break;
2095    }
2096 }
2097 
2098 
2099 /**********************************************************************/
2100 /*  Unpack, returning GLuint colors                                   */
2101 /**********************************************************************/
2102 
2103 static void
unpack_int_rgba_RGBA_UINT32(const GLuint * src,GLuint dst[][4],GLuint n)2104 unpack_int_rgba_RGBA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
2105 {
2106    memcpy(dst, src, n * 4 * sizeof(GLuint));
2107 }
2108 
2109 static void
unpack_int_rgba_RGBA_UINT16(const GLushort * src,GLuint dst[][4],GLuint n)2110 unpack_int_rgba_RGBA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
2111 {
2112    unsigned int i;
2113 
2114    for (i = 0; i < n; i++) {
2115       dst[i][0] = src[i * 4 + 0];
2116       dst[i][1] = src[i * 4 + 1];
2117       dst[i][2] = src[i * 4 + 2];
2118       dst[i][3] = src[i * 4 + 3];
2119    }
2120 }
2121 
2122 static void
unpack_int_rgba_RGBA_INT16(const GLshort * src,GLuint dst[][4],GLuint n)2123 unpack_int_rgba_RGBA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
2124 {
2125    unsigned int i;
2126 
2127    for (i = 0; i < n; i++) {
2128       dst[i][0] = src[i * 4 + 0];
2129       dst[i][1] = src[i * 4 + 1];
2130       dst[i][2] = src[i * 4 + 2];
2131       dst[i][3] = src[i * 4 + 3];
2132    }
2133 }
2134 
2135 static void
unpack_int_rgba_RGBA_UINT8(const GLubyte * src,GLuint dst[][4],GLuint n)2136 unpack_int_rgba_RGBA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
2137 {
2138    unsigned int i;
2139 
2140    for (i = 0; i < n; i++) {
2141       dst[i][0] = src[i * 4 + 0];
2142       dst[i][1] = src[i * 4 + 1];
2143       dst[i][2] = src[i * 4 + 2];
2144       dst[i][3] = src[i * 4 + 3];
2145    }
2146 }
2147 
2148 static void
unpack_int_rgba_RGBA_INT8(const GLbyte * src,GLuint dst[][4],GLuint n)2149 unpack_int_rgba_RGBA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
2150 {
2151    unsigned int i;
2152 
2153    for (i = 0; i < n; i++) {
2154       dst[i][0] = src[i * 4 + 0];
2155       dst[i][1] = src[i * 4 + 1];
2156       dst[i][2] = src[i * 4 + 2];
2157       dst[i][3] = src[i * 4 + 3];
2158    }
2159 }
2160 
2161 static void
unpack_int_rgba_ARGB8888(const GLbyte * src,GLuint dst[][4],GLuint n)2162 unpack_int_rgba_ARGB8888(const GLbyte *src, GLuint dst[][4], GLuint n)
2163 {
2164    unsigned int i;
2165 
2166    for (i = 0; i < n; i++) {
2167       dst[i][RCOMP] = (GLubyte) src[i * 4 + 2];
2168       dst[i][GCOMP] = (GLubyte) src[i * 4 + 1];
2169       dst[i][BCOMP] = (GLubyte) src[i * 4 + 0];
2170       dst[i][ACOMP] = (GLubyte) src[i * 4 + 3];
2171    }
2172 }
2173 
2174 static void
unpack_int_rgba_XRGB8888(const GLbyte * src,GLuint dst[][4],GLuint n)2175 unpack_int_rgba_XRGB8888(const GLbyte *src, GLuint dst[][4], GLuint n)
2176 {
2177    unsigned int i;
2178 
2179    for (i = 0; i < n; i++) {
2180       dst[i][RCOMP] = (GLubyte) src[i * 4 + 2];
2181       dst[i][GCOMP] = (GLubyte) src[i * 4 + 1];
2182       dst[i][BCOMP] = (GLubyte) src[i * 4 + 0];
2183       dst[i][ACOMP] = (GLubyte) 0xff;
2184    }
2185 }
2186 
2187 static void
unpack_int_rgba_RGB_UINT32(const GLuint * src,GLuint dst[][4],GLuint n)2188 unpack_int_rgba_RGB_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
2189 {
2190    unsigned int i;
2191 
2192    for (i = 0; i < n; i++) {
2193       dst[i][0] = src[i * 3 + 0];
2194       dst[i][1] = src[i * 3 + 1];
2195       dst[i][2] = src[i * 3 + 2];
2196       dst[i][3] = 1;
2197    }
2198 }
2199 
2200 static void
unpack_int_rgba_RGB_UINT16(const GLushort * src,GLuint dst[][4],GLuint n)2201 unpack_int_rgba_RGB_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
2202 {
2203    unsigned int i;
2204 
2205    for (i = 0; i < n; i++) {
2206       dst[i][0] = src[i * 3 + 0];
2207       dst[i][1] = src[i * 3 + 1];
2208       dst[i][2] = src[i * 3 + 2];
2209       dst[i][3] = 1;
2210    }
2211 }
2212 
2213 static void
unpack_int_rgba_RGB_INT16(const GLshort * src,GLuint dst[][4],GLuint n)2214 unpack_int_rgba_RGB_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
2215 {
2216    unsigned int i;
2217 
2218    for (i = 0; i < n; i++) {
2219       dst[i][0] = src[i * 3 + 0];
2220       dst[i][1] = src[i * 3 + 1];
2221       dst[i][2] = src[i * 3 + 2];
2222       dst[i][3] = 1;
2223    }
2224 }
2225 
2226 static void
unpack_int_rgba_RGB_UINT8(const GLubyte * src,GLuint dst[][4],GLuint n)2227 unpack_int_rgba_RGB_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
2228 {
2229    unsigned int i;
2230 
2231    for (i = 0; i < n; i++) {
2232       dst[i][0] = src[i * 3 + 0];
2233       dst[i][1] = src[i * 3 + 1];
2234       dst[i][2] = src[i * 3 + 2];
2235       dst[i][3] = 1;
2236    }
2237 }
2238 
2239 static void
unpack_int_rgba_RGB_INT8(const GLbyte * src,GLuint dst[][4],GLuint n)2240 unpack_int_rgba_RGB_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
2241 {
2242    unsigned int i;
2243 
2244    for (i = 0; i < n; i++) {
2245       dst[i][0] = src[i * 3 + 0];
2246       dst[i][1] = src[i * 3 + 1];
2247       dst[i][2] = src[i * 3 + 2];
2248       dst[i][3] = 1;
2249    }
2250 }
2251 
2252 static void
unpack_int_rgba_RG_UINT32(const GLuint * src,GLuint dst[][4],GLuint n)2253 unpack_int_rgba_RG_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
2254 {
2255    unsigned int i;
2256 
2257    for (i = 0; i < n; i++) {
2258       dst[i][0] = src[i * 2 + 0];
2259       dst[i][1] = src[i * 2 + 1];
2260       dst[i][2] = 0;
2261       dst[i][3] = 1;
2262    }
2263 }
2264 
2265 static void
unpack_int_rgba_RG_UINT16(const GLushort * src,GLuint dst[][4],GLuint n)2266 unpack_int_rgba_RG_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
2267 {
2268    unsigned int i;
2269 
2270    for (i = 0; i < n; i++) {
2271       dst[i][0] = src[i * 2 + 0];
2272       dst[i][1] = src[i * 2 + 1];
2273       dst[i][2] = 0;
2274       dst[i][3] = 1;
2275    }
2276 }
2277 
2278 static void
unpack_int_rgba_RG_INT16(const GLshort * src,GLuint dst[][4],GLuint n)2279 unpack_int_rgba_RG_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
2280 {
2281    unsigned int i;
2282 
2283    for (i = 0; i < n; i++) {
2284       dst[i][0] = src[i * 2 + 0];
2285       dst[i][1] = src[i * 2 + 1];
2286       dst[i][2] = 0;
2287       dst[i][3] = 1;
2288    }
2289 }
2290 
2291 static void
unpack_int_rgba_RG_UINT8(const GLubyte * src,GLuint dst[][4],GLuint n)2292 unpack_int_rgba_RG_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
2293 {
2294    unsigned int i;
2295 
2296    for (i = 0; i < n; i++) {
2297       dst[i][0] = src[i * 2 + 0];
2298       dst[i][1] = src[i * 2 + 1];
2299       dst[i][2] = 0;
2300       dst[i][3] = 1;
2301    }
2302 }
2303 
2304 static void
unpack_int_rgba_RG_INT8(const GLbyte * src,GLuint dst[][4],GLuint n)2305 unpack_int_rgba_RG_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
2306 {
2307    unsigned int i;
2308 
2309    for (i = 0; i < n; i++) {
2310       dst[i][0] = src[i * 2 + 0];
2311       dst[i][1] = src[i * 2 + 1];
2312       dst[i][2] = 0;
2313       dst[i][3] = 1;
2314    }
2315 }
2316 
2317 static void
unpack_int_rgba_R_UINT32(const GLuint * src,GLuint dst[][4],GLuint n)2318 unpack_int_rgba_R_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
2319 {
2320    unsigned int i;
2321 
2322    for (i = 0; i < n; i++) {
2323       dst[i][0] = src[i];
2324       dst[i][1] = 0;
2325       dst[i][2] = 0;
2326       dst[i][3] = 1;
2327    }
2328 }
2329 
2330 static void
unpack_int_rgba_R_UINT16(const GLushort * src,GLuint dst[][4],GLuint n)2331 unpack_int_rgba_R_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
2332 {
2333    unsigned int i;
2334 
2335    for (i = 0; i < n; i++) {
2336       dst[i][0] = src[i];
2337       dst[i][1] = 0;
2338       dst[i][2] = 0;
2339       dst[i][3] = 1;
2340    }
2341 }
2342 
2343 static void
unpack_int_rgba_R_INT16(const GLshort * src,GLuint dst[][4],GLuint n)2344 unpack_int_rgba_R_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
2345 {
2346    unsigned int i;
2347 
2348    for (i = 0; i < n; i++) {
2349       dst[i][0] = src[i];
2350       dst[i][1] = 0;
2351       dst[i][2] = 0;
2352       dst[i][3] = 1;
2353    }
2354 }
2355 
2356 static void
unpack_int_rgba_R_UINT8(const GLubyte * src,GLuint dst[][4],GLuint n)2357 unpack_int_rgba_R_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
2358 {
2359    unsigned int i;
2360 
2361    for (i = 0; i < n; i++) {
2362       dst[i][0] = src[i];
2363       dst[i][1] = 0;
2364       dst[i][2] = 0;
2365       dst[i][3] = 1;
2366    }
2367 }
2368 
2369 static void
unpack_int_rgba_R_INT8(const GLbyte * src,GLuint dst[][4],GLuint n)2370 unpack_int_rgba_R_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
2371 {
2372    unsigned int i;
2373 
2374    for (i = 0; i < n; i++) {
2375       dst[i][0] = src[i];
2376       dst[i][1] = 0;
2377       dst[i][2] = 0;
2378       dst[i][3] = 1;
2379    }
2380 }
2381 
2382 static void
unpack_int_rgba_ALPHA_UINT32(const GLuint * src,GLuint dst[][4],GLuint n)2383 unpack_int_rgba_ALPHA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
2384 {
2385    unsigned int i;
2386 
2387    for (i = 0; i < n; i++) {
2388       dst[i][0] = dst[i][1] = dst[i][2] = 0;
2389       dst[i][3] = src[i];
2390    }
2391 }
2392 
2393 static void
unpack_int_rgba_ALPHA_UINT16(const GLushort * src,GLuint dst[][4],GLuint n)2394 unpack_int_rgba_ALPHA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
2395 {
2396    unsigned int i;
2397 
2398    for (i = 0; i < n; i++) {
2399       dst[i][0] = dst[i][1] = dst[i][2] = 0;
2400       dst[i][3] = src[i];
2401    }
2402 }
2403 
2404 static void
unpack_int_rgba_ALPHA_INT16(const GLshort * src,GLuint dst[][4],GLuint n)2405 unpack_int_rgba_ALPHA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
2406 {
2407    unsigned int i;
2408 
2409    for (i = 0; i < n; i++) {
2410       dst[i][0] = dst[i][1] = dst[i][2] = 0;
2411       dst[i][3] = src[i];
2412    }
2413 }
2414 
2415 static void
unpack_int_rgba_ALPHA_UINT8(const GLubyte * src,GLuint dst[][4],GLuint n)2416 unpack_int_rgba_ALPHA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
2417 {
2418    unsigned int i;
2419 
2420    for (i = 0; i < n; i++) {
2421       dst[i][0] = dst[i][1] = dst[i][2] = 0;
2422       dst[i][3] = src[i];
2423    }
2424 }
2425 
2426 static void
unpack_int_rgba_ALPHA_INT8(const GLbyte * src,GLuint dst[][4],GLuint n)2427 unpack_int_rgba_ALPHA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
2428 {
2429    unsigned int i;
2430 
2431    for (i = 0; i < n; i++) {
2432       dst[i][0] = dst[i][1] = dst[i][2] = 0;
2433       dst[i][3] = src[i];
2434    }
2435 }
2436 
2437 static void
unpack_int_rgba_LUMINANCE_UINT32(const GLuint * src,GLuint dst[][4],GLuint n)2438 unpack_int_rgba_LUMINANCE_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
2439 {
2440    unsigned int i;
2441 
2442    for (i = 0; i < n; i++) {
2443       dst[i][0] = dst[i][1] = dst[i][2] = src[i];
2444       dst[i][3] = 1;
2445    }
2446 }
2447 
2448 static void
unpack_int_rgba_LUMINANCE_UINT16(const GLushort * src,GLuint dst[][4],GLuint n)2449 unpack_int_rgba_LUMINANCE_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
2450 {
2451    unsigned int i;
2452 
2453    for (i = 0; i < n; i++) {
2454       dst[i][0] = dst[i][1] = dst[i][2] = src[i];
2455       dst[i][3] = 1;
2456    }
2457 }
2458 
2459 static void
unpack_int_rgba_LUMINANCE_INT16(const GLshort * src,GLuint dst[][4],GLuint n)2460 unpack_int_rgba_LUMINANCE_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
2461 {
2462    unsigned int i;
2463 
2464    for (i = 0; i < n; i++) {
2465       dst[i][0] = dst[i][1] = dst[i][2] = src[i];
2466       dst[i][3] = 1;
2467    }
2468 }
2469 
2470 static void
unpack_int_rgba_LUMINANCE_UINT8(const GLubyte * src,GLuint dst[][4],GLuint n)2471 unpack_int_rgba_LUMINANCE_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
2472 {
2473    unsigned int i;
2474 
2475    for (i = 0; i < n; i++) {
2476       dst[i][0] = dst[i][1] = dst[i][2] = src[i];
2477       dst[i][3] = 1;
2478    }
2479 }
2480 
2481 static void
unpack_int_rgba_LUMINANCE_INT8(const GLbyte * src,GLuint dst[][4],GLuint n)2482 unpack_int_rgba_LUMINANCE_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
2483 {
2484    unsigned int i;
2485 
2486    for (i = 0; i < n; i++) {
2487       dst[i][0] = dst[i][1] = dst[i][2] = src[i];
2488       dst[i][3] = 1;
2489    }
2490 }
2491 
2492 
2493 static void
unpack_int_rgba_LUMINANCE_ALPHA_UINT32(const GLuint * src,GLuint dst[][4],GLuint n)2494 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
2495 {
2496    unsigned int i;
2497 
2498    for (i = 0; i < n; i++) {
2499       dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
2500       dst[i][3] = src[i * 2 + 1];
2501    }
2502 }
2503 
2504 static void
unpack_int_rgba_LUMINANCE_ALPHA_UINT16(const GLushort * src,GLuint dst[][4],GLuint n)2505 unpack_int_rgba_LUMINANCE_ALPHA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
2506 {
2507    unsigned int i;
2508 
2509    for (i = 0; i < n; i++) {
2510       dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
2511       dst[i][3] = src[i * 2 + 1];
2512    }
2513 }
2514 
2515 static void
unpack_int_rgba_LUMINANCE_ALPHA_INT16(const GLshort * src,GLuint dst[][4],GLuint n)2516 unpack_int_rgba_LUMINANCE_ALPHA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
2517 {
2518    unsigned int i;
2519 
2520    for (i = 0; i < n; i++) {
2521       dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
2522       dst[i][3] = src[i * 2 + 1];
2523    }
2524 }
2525 
2526 static void
unpack_int_rgba_LUMINANCE_ALPHA_UINT8(const GLubyte * src,GLuint dst[][4],GLuint n)2527 unpack_int_rgba_LUMINANCE_ALPHA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
2528 {
2529    unsigned int i;
2530 
2531    for (i = 0; i < n; i++) {
2532       dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
2533       dst[i][3] = src[i * 2 + 1];
2534    }
2535 }
2536 
2537 static void
unpack_int_rgba_LUMINANCE_ALPHA_INT8(const GLbyte * src,GLuint dst[][4],GLuint n)2538 unpack_int_rgba_LUMINANCE_ALPHA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
2539 {
2540    unsigned int i;
2541 
2542    for (i = 0; i < n; i++) {
2543       dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
2544       dst[i][3] = src[i * 2 + 1];
2545    }
2546 }
2547 
2548 static void
unpack_int_rgba_INTENSITY_UINT32(const GLuint * src,GLuint dst[][4],GLuint n)2549 unpack_int_rgba_INTENSITY_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
2550 {
2551    unsigned int i;
2552 
2553    for (i = 0; i < n; i++) {
2554       dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
2555    }
2556 }
2557 
2558 static void
unpack_int_rgba_INTENSITY_UINT16(const GLushort * src,GLuint dst[][4],GLuint n)2559 unpack_int_rgba_INTENSITY_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
2560 {
2561    unsigned int i;
2562 
2563    for (i = 0; i < n; i++) {
2564       dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
2565    }
2566 }
2567 
2568 static void
unpack_int_rgba_INTENSITY_INT16(const GLshort * src,GLuint dst[][4],GLuint n)2569 unpack_int_rgba_INTENSITY_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
2570 {
2571    unsigned int i;
2572 
2573    for (i = 0; i < n; i++) {
2574       dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
2575    }
2576 }
2577 
2578 static void
unpack_int_rgba_INTENSITY_UINT8(const GLubyte * src,GLuint dst[][4],GLuint n)2579 unpack_int_rgba_INTENSITY_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
2580 {
2581    unsigned int i;
2582 
2583    for (i = 0; i < n; i++) {
2584       dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
2585    }
2586 }
2587 
2588 static void
unpack_int_rgba_INTENSITY_INT8(const GLbyte * src,GLuint dst[][4],GLuint n)2589 unpack_int_rgba_INTENSITY_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
2590 {
2591    unsigned int i;
2592 
2593    for (i = 0; i < n; i++) {
2594       dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
2595    }
2596 }
2597 
2598 static void
unpack_int_rgba_ARGB2101010_UINT(const GLuint * src,GLuint dst[][4],GLuint n)2599 unpack_int_rgba_ARGB2101010_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
2600 {
2601    unsigned int i;
2602 
2603    for (i = 0; i < n; i++) {
2604       GLuint tmp = src[i];
2605       dst[i][0] = (tmp >> 20) & 0x3ff;
2606       dst[i][1] = (tmp >> 10) & 0x3ff;
2607       dst[i][2] = (tmp >> 0) & 0x3ff;
2608       dst[i][3] = (tmp >> 30) & 0x3;
2609    }
2610 }
2611 
2612 static void
unpack_int_rgba_ABGR2101010_UINT(const GLuint * src,GLuint dst[][4],GLuint n)2613 unpack_int_rgba_ABGR2101010_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
2614 {
2615    unsigned int i;
2616 
2617    for (i = 0; i < n; i++) {
2618       GLuint tmp = src[i];
2619       dst[i][0] = (tmp >> 0) & 0x3ff;
2620       dst[i][1] = (tmp >> 10) & 0x3ff;
2621       dst[i][2] = (tmp >> 20) & 0x3ff;
2622       dst[i][3] = (tmp >> 30) & 0x3;
2623    }
2624 }
2625 
2626 static void
unpack_int_rgba_ARGB2101010(const GLuint * src,GLuint dst[][4],GLuint n)2627 unpack_int_rgba_ARGB2101010(const GLuint *src, GLuint dst[][4], GLuint n)
2628 {
2629    unsigned int i;
2630 
2631    for (i = 0; i < n; i++) {
2632       GLuint tmp = src[i];
2633       dst[i][0] = (tmp >> 20) & 0x3ff;
2634       dst[i][1] = (tmp >> 10) & 0x3ff;
2635       dst[i][2] = (tmp >> 0) & 0x3ff;
2636       dst[i][3] = (tmp >> 30) & 0x3;
2637    }
2638 }
2639 
2640 void
_mesa_unpack_uint_rgba_row(gl_format format,GLuint n,const void * src,GLuint dst[][4])2641 _mesa_unpack_uint_rgba_row(gl_format format, GLuint n,
2642                            const void *src, GLuint dst[][4])
2643 {
2644    switch (format) {
2645       /* Since there won't be any sign extension happening, there's no need to
2646        * make separate paths for 32-bit-to-32-bit integer unpack.
2647        */
2648    case MESA_FORMAT_RGBA_UINT32:
2649    case MESA_FORMAT_RGBA_INT32:
2650       unpack_int_rgba_RGBA_UINT32(src, dst, n);
2651       break;
2652 
2653    case MESA_FORMAT_RGBA_UINT16:
2654       unpack_int_rgba_RGBA_UINT16(src, dst, n);
2655       break;
2656    case MESA_FORMAT_RGBA_INT16:
2657       unpack_int_rgba_RGBA_INT16(src, dst, n);
2658       break;
2659 
2660    case MESA_FORMAT_RGBA_UINT8:
2661       unpack_int_rgba_RGBA_UINT8(src, dst, n);
2662       break;
2663    case MESA_FORMAT_RGBA_INT8:
2664       unpack_int_rgba_RGBA_INT8(src, dst, n);
2665       break;
2666 
2667    case MESA_FORMAT_ARGB8888:
2668       unpack_int_rgba_ARGB8888(src, dst, n);
2669       break;
2670 
2671    case MESA_FORMAT_XRGB8888:
2672       unpack_int_rgba_XRGB8888(src, dst, n);
2673       break;
2674 
2675    case MESA_FORMAT_RGB_UINT32:
2676    case MESA_FORMAT_RGB_INT32:
2677       unpack_int_rgba_RGB_UINT32(src, dst, n);
2678       break;
2679 
2680    case MESA_FORMAT_RGB_UINT16:
2681       unpack_int_rgba_RGB_UINT16(src, dst, n);
2682       break;
2683    case MESA_FORMAT_RGB_INT16:
2684       unpack_int_rgba_RGB_INT16(src, dst, n);
2685       break;
2686 
2687    case MESA_FORMAT_RGB_UINT8:
2688       unpack_int_rgba_RGB_UINT8(src, dst, n);
2689       break;
2690    case MESA_FORMAT_RGB_INT8:
2691       unpack_int_rgba_RGB_INT8(src, dst, n);
2692       break;
2693 
2694    case MESA_FORMAT_RG_UINT32:
2695    case MESA_FORMAT_RG_INT32:
2696       unpack_int_rgba_RG_UINT32(src, dst, n);
2697       break;
2698 
2699    case MESA_FORMAT_RG_UINT16:
2700       unpack_int_rgba_RG_UINT16(src, dst, n);
2701       break;
2702    case MESA_FORMAT_RG_INT16:
2703       unpack_int_rgba_RG_INT16(src, dst, n);
2704       break;
2705 
2706    case MESA_FORMAT_RG_UINT8:
2707       unpack_int_rgba_RG_UINT8(src, dst, n);
2708       break;
2709    case MESA_FORMAT_RG_INT8:
2710       unpack_int_rgba_RG_INT8(src, dst, n);
2711       break;
2712 
2713    case MESA_FORMAT_R_UINT32:
2714    case MESA_FORMAT_R_INT32:
2715       unpack_int_rgba_R_UINT32(src, dst, n);
2716       break;
2717 
2718    case MESA_FORMAT_R_UINT16:
2719       unpack_int_rgba_R_UINT16(src, dst, n);
2720       break;
2721    case MESA_FORMAT_R_INT16:
2722       unpack_int_rgba_R_INT16(src, dst, n);
2723       break;
2724 
2725    case MESA_FORMAT_R_UINT8:
2726       unpack_int_rgba_R_UINT8(src, dst, n);
2727       break;
2728    case MESA_FORMAT_R_INT8:
2729       unpack_int_rgba_R_INT8(src, dst, n);
2730       break;
2731 
2732    case MESA_FORMAT_ALPHA_UINT32:
2733    case MESA_FORMAT_ALPHA_INT32:
2734       unpack_int_rgba_ALPHA_UINT32(src, dst, n);
2735       break;
2736 
2737    case MESA_FORMAT_ALPHA_UINT16:
2738       unpack_int_rgba_ALPHA_UINT16(src, dst, n);
2739       break;
2740    case MESA_FORMAT_ALPHA_INT16:
2741       unpack_int_rgba_ALPHA_INT16(src, dst, n);
2742       break;
2743 
2744    case MESA_FORMAT_ALPHA_UINT8:
2745       unpack_int_rgba_ALPHA_UINT8(src, dst, n);
2746       break;
2747    case MESA_FORMAT_ALPHA_INT8:
2748       unpack_int_rgba_ALPHA_INT8(src, dst, n);
2749       break;
2750 
2751    case MESA_FORMAT_LUMINANCE_UINT32:
2752    case MESA_FORMAT_LUMINANCE_INT32:
2753       unpack_int_rgba_LUMINANCE_UINT32(src, dst, n);
2754       break;
2755    case MESA_FORMAT_LUMINANCE_UINT16:
2756       unpack_int_rgba_LUMINANCE_UINT16(src, dst, n);
2757       break;
2758    case MESA_FORMAT_LUMINANCE_INT16:
2759       unpack_int_rgba_LUMINANCE_INT16(src, dst, n);
2760       break;
2761 
2762    case MESA_FORMAT_LUMINANCE_UINT8:
2763       unpack_int_rgba_LUMINANCE_UINT8(src, dst, n);
2764       break;
2765    case MESA_FORMAT_LUMINANCE_INT8:
2766       unpack_int_rgba_LUMINANCE_INT8(src, dst, n);
2767       break;
2768 
2769    case MESA_FORMAT_LUMINANCE_ALPHA_UINT32:
2770    case MESA_FORMAT_LUMINANCE_ALPHA_INT32:
2771       unpack_int_rgba_LUMINANCE_ALPHA_UINT32(src, dst, n);
2772       break;
2773 
2774    case MESA_FORMAT_LUMINANCE_ALPHA_UINT16:
2775       unpack_int_rgba_LUMINANCE_ALPHA_UINT16(src, dst, n);
2776       break;
2777    case MESA_FORMAT_LUMINANCE_ALPHA_INT16:
2778       unpack_int_rgba_LUMINANCE_ALPHA_INT16(src, dst, n);
2779       break;
2780 
2781    case MESA_FORMAT_LUMINANCE_ALPHA_UINT8:
2782       unpack_int_rgba_LUMINANCE_ALPHA_UINT8(src, dst, n);
2783       break;
2784    case MESA_FORMAT_LUMINANCE_ALPHA_INT8:
2785       unpack_int_rgba_LUMINANCE_ALPHA_INT8(src, dst, n);
2786       break;
2787 
2788    case MESA_FORMAT_INTENSITY_UINT32:
2789    case MESA_FORMAT_INTENSITY_INT32:
2790       unpack_int_rgba_INTENSITY_UINT32(src, dst, n);
2791       break;
2792 
2793    case MESA_FORMAT_INTENSITY_UINT16:
2794       unpack_int_rgba_INTENSITY_UINT16(src, dst, n);
2795       break;
2796    case MESA_FORMAT_INTENSITY_INT16:
2797       unpack_int_rgba_INTENSITY_INT16(src, dst, n);
2798       break;
2799 
2800    case MESA_FORMAT_INTENSITY_UINT8:
2801       unpack_int_rgba_INTENSITY_UINT8(src, dst, n);
2802       break;
2803    case MESA_FORMAT_INTENSITY_INT8:
2804       unpack_int_rgba_INTENSITY_INT8(src, dst, n);
2805       break;
2806 
2807    case MESA_FORMAT_ARGB2101010_UINT:
2808       unpack_int_rgba_ARGB2101010_UINT(src, dst, n);
2809       break;
2810 
2811    case MESA_FORMAT_ABGR2101010_UINT:
2812       unpack_int_rgba_ABGR2101010_UINT(src, dst, n);
2813       break;
2814 
2815    case MESA_FORMAT_ARGB2101010:
2816       unpack_int_rgba_ARGB2101010(src, dst, n);
2817       break;
2818 
2819    default:
2820       _mesa_problem(NULL, "%s: bad format %s", __FUNCTION__,
2821                     _mesa_get_format_name(format));
2822       return;
2823    }
2824 }
2825 
2826 /**
2827  * Unpack a 2D rect of pixels returning float RGBA colors.
2828  * \param format  the source image format
2829  * \param src  start address of the source image
2830  * \param srcRowStride  source image row stride in bytes
2831  * \param dst  start address of the dest image
2832  * \param dstRowStride  dest image row stride in bytes
2833  * \param x  source image start X pos
2834  * \param y  source image start Y pos
2835  * \param width  width of rect region to convert
2836  * \param height  height of rect region to convert
2837  */
2838 void
_mesa_unpack_rgba_block(gl_format format,const void * src,GLint srcRowStride,GLfloat dst[][4],GLint dstRowStride,GLuint x,GLuint y,GLuint width,GLuint height)2839 _mesa_unpack_rgba_block(gl_format format,
2840                         const void *src, GLint srcRowStride,
2841                         GLfloat dst[][4], GLint dstRowStride,
2842                         GLuint x, GLuint y, GLuint width, GLuint height)
2843 {
2844    unpack_rgba_func unpack = get_unpack_rgba_function(format);
2845    const GLuint srcPixStride = _mesa_get_format_bytes(format);
2846    const GLuint dstPixStride = 4 * sizeof(GLfloat);
2847    const GLubyte *srcRow;
2848    GLubyte *dstRow;
2849    GLuint i;
2850 
2851    /* XXX needs to be fixed for compressed formats */
2852 
2853    srcRow = ((const GLubyte *) src) + srcRowStride * y + srcPixStride * x;
2854    dstRow = ((GLubyte *) dst) + dstRowStride * y + dstPixStride * x;
2855 
2856    for (i = 0; i < height; i++) {
2857       unpack(srcRow, (GLfloat (*)[4]) dstRow, width);
2858 
2859       dstRow += dstRowStride;
2860       srcRow += srcRowStride;
2861    }
2862 }
2863 
2864 
2865 
2866 
2867 typedef void (*unpack_float_z_func)(GLuint n, const void *src, GLfloat *dst);
2868 
2869 static void
unpack_float_z_Z24_X8(GLuint n,const void * src,GLfloat * dst)2870 unpack_float_z_Z24_X8(GLuint n, const void *src, GLfloat *dst)
2871 {
2872    /* only return Z, not stencil data */
2873    const GLuint *s = ((const GLuint *) src);
2874    const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
2875    GLuint i;
2876    for (i = 0; i < n; i++) {
2877       dst[i] = (s[i] >> 8) * scale;
2878       ASSERT(dst[i] >= 0.0F);
2879       ASSERT(dst[i] <= 1.0F);
2880    }
2881 }
2882 
2883 static void
unpack_float_z_X8_Z24(GLuint n,const void * src,GLfloat * dst)2884 unpack_float_z_X8_Z24(GLuint n, const void *src, GLfloat *dst)
2885 {
2886    /* only return Z, not stencil data */
2887    const GLuint *s = ((const GLuint *) src);
2888    const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
2889    GLuint i;
2890    for (i = 0; i < n; i++) {
2891       dst[i] = (s[i] & 0x00ffffff) * scale;
2892       ASSERT(dst[i] >= 0.0F);
2893       ASSERT(dst[i] <= 1.0F);
2894    }
2895 }
2896 
2897 static void
unpack_float_z_Z16(GLuint n,const void * src,GLfloat * dst)2898 unpack_float_z_Z16(GLuint n, const void *src, GLfloat *dst)
2899 {
2900    const GLushort *s = ((const GLushort *) src);
2901    GLuint i;
2902    for (i = 0; i < n; i++) {
2903       dst[i] = s[i] * (1.0F / 65535.0F);
2904    }
2905 }
2906 
2907 static void
unpack_float_z_Z32(GLuint n,const void * src,GLfloat * dst)2908 unpack_float_z_Z32(GLuint n, const void *src, GLfloat *dst)
2909 {
2910    const GLuint *s = ((const GLuint *) src);
2911    GLuint i;
2912    for (i = 0; i < n; i++) {
2913       dst[i] = s[i] * (1.0F / 0xffffffff);
2914    }
2915 }
2916 
2917 static void
unpack_float_z_Z32F(GLuint n,const void * src,GLfloat * dst)2918 unpack_float_z_Z32F(GLuint n, const void *src, GLfloat *dst)
2919 {
2920    memcpy(dst, src, n * sizeof(float));
2921 }
2922 
2923 static void
unpack_float_z_Z32X24S8(GLuint n,const void * src,GLfloat * dst)2924 unpack_float_z_Z32X24S8(GLuint n, const void *src, GLfloat *dst)
2925 {
2926    const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
2927    GLuint i;
2928    for (i = 0; i < n; i++) {
2929       dst[i] = s[i].z;
2930    }
2931 }
2932 
2933 
2934 
2935 /**
2936  * Unpack Z values.
2937  * The returned values will always be in the range [0.0, 1.0].
2938  */
2939 void
_mesa_unpack_float_z_row(gl_format format,GLuint n,const void * src,GLfloat * dst)2940 _mesa_unpack_float_z_row(gl_format format, GLuint n,
2941                          const void *src, GLfloat *dst)
2942 {
2943    unpack_float_z_func unpack;
2944 
2945    switch (format) {
2946    case MESA_FORMAT_Z24_S8:
2947    case MESA_FORMAT_Z24_X8:
2948       unpack = unpack_float_z_Z24_X8;
2949       break;
2950    case MESA_FORMAT_S8_Z24:
2951    case MESA_FORMAT_X8_Z24:
2952       unpack = unpack_float_z_X8_Z24;
2953       break;
2954    case MESA_FORMAT_Z16:
2955       unpack = unpack_float_z_Z16;
2956       break;
2957    case MESA_FORMAT_Z32:
2958       unpack = unpack_float_z_Z32;
2959       break;
2960    case MESA_FORMAT_Z32_FLOAT:
2961       unpack = unpack_float_z_Z32F;
2962       break;
2963    case MESA_FORMAT_Z32_FLOAT_X24S8:
2964       unpack = unpack_float_z_Z32X24S8;
2965       break;
2966    default:
2967       _mesa_problem(NULL, "bad format %s in _mesa_unpack_float_z_row",
2968                     _mesa_get_format_name(format));
2969       return;
2970    }
2971 
2972    unpack(n, src, dst);
2973 }
2974 
2975 
2976 
2977 typedef void (*unpack_uint_z_func)(const void *src, GLuint *dst, GLuint n);
2978 
2979 static void
unpack_uint_z_Z24_X8(const void * src,GLuint * dst,GLuint n)2980 unpack_uint_z_Z24_X8(const void *src, GLuint *dst, GLuint n)
2981 {
2982    /* only return Z, not stencil data */
2983    const GLuint *s = ((const GLuint *) src);
2984    GLuint i;
2985    for (i = 0; i < n; i++) {
2986       dst[i] = (s[i] & 0xffffff00) | (s[i] >> 24);
2987    }
2988 }
2989 
2990 static void
unpack_uint_z_X8_Z24(const void * src,GLuint * dst,GLuint n)2991 unpack_uint_z_X8_Z24(const void *src, GLuint *dst, GLuint n)
2992 {
2993    /* only return Z, not stencil data */
2994    const GLuint *s = ((const GLuint *) src);
2995    GLuint i;
2996    for (i = 0; i < n; i++) {
2997       dst[i] = (s[i] << 8) | ((s[i] >> 16) & 0xff);
2998    }
2999 }
3000 
3001 static void
unpack_uint_z_Z16(const void * src,GLuint * dst,GLuint n)3002 unpack_uint_z_Z16(const void *src, GLuint *dst, GLuint n)
3003 {
3004    const GLushort *s = ((const GLushort *)src);
3005    GLuint i;
3006    for (i = 0; i < n; i++) {
3007       dst[i] = (s[i] << 16) | s[i];
3008    }
3009 }
3010 
3011 static void
unpack_uint_z_Z32(const void * src,GLuint * dst,GLuint n)3012 unpack_uint_z_Z32(const void *src, GLuint *dst, GLuint n)
3013 {
3014    memcpy(dst, src, n * sizeof(GLuint));
3015 }
3016 
3017 static void
unpack_uint_z_Z32_FLOAT(const void * src,GLuint * dst,GLuint n)3018 unpack_uint_z_Z32_FLOAT(const void *src, GLuint *dst, GLuint n)
3019 {
3020    const float *s = (const float *)src;
3021    GLuint i;
3022    for (i = 0; i < n; i++) {
3023       dst[i] = FLOAT_TO_UINT(CLAMP(s[i], 0.0F, 1.0F));
3024    }
3025 }
3026 
3027 static void
unpack_uint_z_Z32_FLOAT_X24S8(const void * src,GLuint * dst,GLuint n)3028 unpack_uint_z_Z32_FLOAT_X24S8(const void *src, GLuint *dst, GLuint n)
3029 {
3030    const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
3031    GLuint i;
3032 
3033    for (i = 0; i < n; i++) {
3034       dst[i] = FLOAT_TO_UINT(CLAMP(s[i].z, 0.0F, 1.0F));
3035    }
3036 }
3037 
3038 
3039 /**
3040  * Unpack Z values.
3041  * The returned values will always be in the range [0, 0xffffffff].
3042  */
3043 void
_mesa_unpack_uint_z_row(gl_format format,GLuint n,const void * src,GLuint * dst)3044 _mesa_unpack_uint_z_row(gl_format format, GLuint n,
3045                         const void *src, GLuint *dst)
3046 {
3047    unpack_uint_z_func unpack;
3048    const GLubyte *srcPtr = (GLubyte *) src;
3049 
3050    switch (format) {
3051    case MESA_FORMAT_Z24_S8:
3052    case MESA_FORMAT_Z24_X8:
3053       unpack = unpack_uint_z_Z24_X8;
3054       break;
3055    case MESA_FORMAT_S8_Z24:
3056    case MESA_FORMAT_X8_Z24:
3057       unpack = unpack_uint_z_X8_Z24;
3058       break;
3059    case MESA_FORMAT_Z16:
3060       unpack = unpack_uint_z_Z16;
3061       break;
3062    case MESA_FORMAT_Z32:
3063       unpack = unpack_uint_z_Z32;
3064       break;
3065    case MESA_FORMAT_Z32_FLOAT:
3066       unpack = unpack_uint_z_Z32_FLOAT;
3067       break;
3068    case MESA_FORMAT_Z32_FLOAT_X24S8:
3069       unpack = unpack_uint_z_Z32_FLOAT_X24S8;
3070       break;
3071    default:
3072       _mesa_problem(NULL, "bad format %s in _mesa_unpack_uint_z_row",
3073                     _mesa_get_format_name(format));
3074       return;
3075    }
3076 
3077    unpack(srcPtr, dst, n);
3078 }
3079 
3080 
3081 static void
unpack_ubyte_s_S8(const void * src,GLubyte * dst,GLuint n)3082 unpack_ubyte_s_S8(const void *src, GLubyte *dst, GLuint n)
3083 {
3084    memcpy(dst, src, n);
3085 }
3086 
3087 static void
unpack_ubyte_s_Z24_S8(const void * src,GLubyte * dst,GLuint n)3088 unpack_ubyte_s_Z24_S8(const void *src, GLubyte *dst, GLuint n)
3089 {
3090    GLuint i;
3091    const GLuint *src32 = src;
3092 
3093    for (i = 0; i < n; i++)
3094       dst[i] = src32[i] & 0xff;
3095 }
3096 
3097 static void
unpack_ubyte_s_S8_Z24(const void * src,GLubyte * dst,GLuint n)3098 unpack_ubyte_s_S8_Z24(const void *src, GLubyte *dst, GLuint n)
3099 {
3100    GLuint i;
3101    const GLuint *src32 = src;
3102 
3103    for (i = 0; i < n; i++)
3104       dst[i] = src32[i] >> 24;
3105 }
3106 
3107 static void
unpack_ubyte_s_Z32_FLOAT_X24S8(const void * src,GLubyte * dst,GLuint n)3108 unpack_ubyte_s_Z32_FLOAT_X24S8(const void *src, GLubyte *dst, GLuint n)
3109 {
3110    GLuint i;
3111    const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
3112 
3113    for (i = 0; i < n; i++)
3114       dst[i] = s[i].x24s8 & 0xff;
3115 }
3116 
3117 void
_mesa_unpack_ubyte_stencil_row(gl_format format,GLuint n,const void * src,GLubyte * dst)3118 _mesa_unpack_ubyte_stencil_row(gl_format format, GLuint n,
3119 			       const void *src, GLubyte *dst)
3120 {
3121    switch (format) {
3122    case MESA_FORMAT_S8:
3123       unpack_ubyte_s_S8(src, dst, n);
3124       break;
3125    case MESA_FORMAT_Z24_S8:
3126       unpack_ubyte_s_Z24_S8(src, dst, n);
3127       break;
3128    case MESA_FORMAT_S8_Z24:
3129       unpack_ubyte_s_S8_Z24(src, dst, n);
3130       break;
3131    case MESA_FORMAT_Z32_FLOAT_X24S8:
3132       unpack_ubyte_s_Z32_FLOAT_X24S8(src, dst, n);
3133       break;
3134    default:
3135       _mesa_problem(NULL, "bad format %s in _mesa_unpack_ubyte_s_row",
3136                     _mesa_get_format_name(format));
3137       return;
3138    }
3139 }
3140 
3141 static void
unpack_uint_24_8_depth_stencil_S8_Z24(const GLuint * src,GLuint * dst,GLuint n)3142 unpack_uint_24_8_depth_stencil_S8_Z24(const GLuint *src, GLuint *dst, GLuint n)
3143 {
3144    GLuint i;
3145 
3146    for (i = 0; i < n; i++) {
3147       GLuint val = src[i];
3148       dst[i] = val >> 24 | val << 8;
3149    }
3150 }
3151 
3152 static void
unpack_uint_24_8_depth_stencil_Z24_S8(const GLuint * src,GLuint * dst,GLuint n)3153 unpack_uint_24_8_depth_stencil_Z24_S8(const GLuint *src, GLuint *dst, GLuint n)
3154 {
3155    memcpy(dst, src, n * 4);
3156 }
3157 
3158 void
_mesa_unpack_uint_24_8_depth_stencil_row(gl_format format,GLuint n,const void * src,GLuint * dst)3159 _mesa_unpack_uint_24_8_depth_stencil_row(gl_format format, GLuint n,
3160 					 const void *src, GLuint *dst)
3161 {
3162    switch (format) {
3163    case MESA_FORMAT_Z24_S8:
3164       unpack_uint_24_8_depth_stencil_Z24_S8(src, dst, n);
3165       break;
3166    case MESA_FORMAT_S8_Z24:
3167       unpack_uint_24_8_depth_stencil_S8_Z24(src, dst, n);
3168       break;
3169    default:
3170       _mesa_problem(NULL,
3171                     "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row",
3172                     _mesa_get_format_name(format));
3173       return;
3174    }
3175 }
3176