mesa: Add MESA_FORMAT_ABGR2101010.
[mesa.git] / src / mesa / main / format_unpack.c
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 OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25
26 #include "colormac.h"
27 #include "format_unpack.h"
28 #include "macros.h"
29 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
30 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
31
32
33 /** Helper struct for MESA_FORMAT_Z32_FLOAT_X24S8 */
34 struct z32f_x24s8
35 {
36 float z;
37 uint32_t x24s8;
38 };
39
40
41 /* Expand 1, 2, 3, 4, 5, 6-bit values to fill 8 bits */
42
43 #define EXPAND_1_8(X) ( (X) ? 0xff : 0x0 )
44
45 #define EXPAND_2_8(X) ( ((X) << 6) | ((X) << 4) | ((X) << 2) | (X) )
46
47 #define EXPAND_3_8(X) ( ((X) << 5) | ((X) << 2) | ((X) >> 1) )
48
49 #define EXPAND_4_8(X) ( ((X) << 4) | (X) )
50
51 #define EXPAND_5_8(X) ( ((X) << 3) | ((X) >> 2) )
52
53 #define EXPAND_6_8(X) ( ((X) << 2) | ((X) >> 4) )
54
55
56 /**
57 * Convert an 8-bit sRGB value from non-linear space to a
58 * linear RGB value in [0, 1].
59 * Implemented with a 256-entry lookup table.
60 */
61 GLfloat
62 _mesa_nonlinear_to_linear(GLubyte cs8)
63 {
64 static GLfloat table[256];
65 static GLboolean tableReady = GL_FALSE;
66 if (!tableReady) {
67 /* compute lookup table now */
68 GLuint i;
69 for (i = 0; i < 256; i++) {
70 const GLfloat cs = UBYTE_TO_FLOAT(i);
71 if (cs <= 0.04045) {
72 table[i] = cs / 12.92f;
73 }
74 else {
75 table[i] = (GLfloat) pow((cs + 0.055) / 1.055, 2.4);
76 }
77 }
78 tableReady = GL_TRUE;
79 }
80 return table[cs8];
81 }
82
83
84 /**********************************************************************/
85 /* Unpack, returning GLfloat colors */
86 /**********************************************************************/
87
88 typedef void (*unpack_rgba_func)(const void *src, GLfloat dst[][4], GLuint n);
89
90
91 static void
92 unpack_RGBA8888(const void *src, GLfloat dst[][4], GLuint n)
93 {
94 const GLuint *s = ((const GLuint *) src);
95 GLuint i;
96 for (i = 0; i < n; i++) {
97 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
98 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
99 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
100 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
101 }
102 }
103
104 static void
105 unpack_RGBA8888_REV(const void *src, GLfloat dst[][4], GLuint n)
106 {
107 const GLuint *s = ((const GLuint *) src);
108 GLuint i;
109 for (i = 0; i < n; i++) {
110 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
111 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
112 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
113 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
114 }
115 }
116
117 static void
118 unpack_ARGB8888(const void *src, GLfloat dst[][4], GLuint n)
119 {
120 const GLuint *s = ((const GLuint *) src);
121 GLuint i;
122 for (i = 0; i < n; i++) {
123 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
124 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
125 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
126 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
127 }
128 }
129
130 static void
131 unpack_ARGB8888_REV(const void *src, GLfloat dst[][4], GLuint n)
132 {
133 const GLuint *s = ((const GLuint *) src);
134 GLuint i;
135 for (i = 0; i < n; i++) {
136 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
137 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
138 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
139 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
140 }
141 }
142
143 static void
144 unpack_RGBX8888(const void *src, GLfloat dst[][4], GLuint n)
145 {
146 const GLuint *s = ((const GLuint *) src);
147 GLuint i;
148 for (i = 0; i < n; i++) {
149 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
150 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
151 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
152 dst[i][ACOMP] = 1.0f;
153 }
154 }
155
156 static void
157 unpack_RGBX8888_REV(const void *src, GLfloat dst[][4], GLuint n)
158 {
159 const GLuint *s = ((const GLuint *) src);
160 GLuint i;
161 for (i = 0; i < n; i++) {
162 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
163 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
164 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
165 dst[i][ACOMP] = 1.0f;
166 }
167 }
168
169 static void
170 unpack_XRGB8888(const void *src, GLfloat dst[][4], GLuint n)
171 {
172 const GLuint *s = ((const GLuint *) src);
173 GLuint i;
174 for (i = 0; i < n; i++) {
175 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
176 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
177 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
178 dst[i][ACOMP] = 1.0f;
179 }
180 }
181
182 static void
183 unpack_XRGB8888_REV(const void *src, GLfloat dst[][4], GLuint n)
184 {
185 const GLuint *s = ((const GLuint *) src);
186 GLuint i;
187 for (i = 0; i < n; i++) {
188 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
189 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
190 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
191 dst[i][ACOMP] = 1.0f;
192 }
193 }
194
195 static void
196 unpack_RGB888(const void *src, GLfloat dst[][4], GLuint n)
197 {
198 const GLubyte *s = (const GLubyte *) src;
199 GLuint i;
200 for (i = 0; i < n; i++) {
201 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i*3+2] );
202 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i*3+1] );
203 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i*3+0] );
204 dst[i][ACOMP] = 1.0F;
205 }
206 }
207
208 static void
209 unpack_BGR888(const void *src, GLfloat dst[][4], GLuint n)
210 {
211 const GLubyte *s = (const GLubyte *) src;
212 GLuint i;
213 for (i = 0; i < n; i++) {
214 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i*3+0] );
215 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i*3+1] );
216 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i*3+2] );
217 dst[i][ACOMP] = 1.0F;
218 }
219 }
220
221 static void
222 unpack_RGB565(const void *src, GLfloat dst[][4], GLuint n)
223 {
224 const GLushort *s = ((const GLushort *) src);
225 GLuint i;
226 for (i = 0; i < n; i++) {
227 dst[i][RCOMP] = ((s[i] >> 11) & 0x1f) * (1.0F / 31.0F);
228 dst[i][GCOMP] = ((s[i] >> 5 ) & 0x3f) * (1.0F / 63.0F);
229 dst[i][BCOMP] = ((s[i] ) & 0x1f) * (1.0F / 31.0F);
230 dst[i][ACOMP] = 1.0F;
231 }
232 }
233
234 static void
235 unpack_RGB565_REV(const void *src, GLfloat dst[][4], GLuint n)
236 {
237 const GLushort *s = ((const GLushort *) src);
238 GLuint i;
239 for (i = 0; i < n; i++) {
240 GLuint t = (s[i] >> 8) | (s[i] << 8); /* byte swap */
241 dst[i][RCOMP] = UBYTE_TO_FLOAT( ((t >> 8) & 0xf8) | ((t >> 13) & 0x7) );
242 dst[i][GCOMP] = UBYTE_TO_FLOAT( ((t >> 3) & 0xfc) | ((t >> 9) & 0x3) );
243 dst[i][BCOMP] = UBYTE_TO_FLOAT( ((t << 3) & 0xf8) | ((t >> 2) & 0x7) );
244 dst[i][ACOMP] = 1.0F;
245 }
246 }
247
248 static void
249 unpack_ARGB4444(const void *src, GLfloat dst[][4], GLuint n)
250 {
251 const GLushort *s = ((const GLushort *) src);
252 GLuint i;
253 for (i = 0; i < n; i++) {
254 dst[i][RCOMP] = ((s[i] >> 8) & 0xf) * (1.0F / 15.0F);
255 dst[i][GCOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
256 dst[i][BCOMP] = ((s[i] ) & 0xf) * (1.0F / 15.0F);
257 dst[i][ACOMP] = ((s[i] >> 12) & 0xf) * (1.0F / 15.0F);
258 }
259 }
260
261 static void
262 unpack_ARGB4444_REV(const void *src, GLfloat dst[][4], GLuint n)
263 {
264 const GLushort *s = ((const GLushort *) src);
265 GLuint i;
266 for (i = 0; i < n; i++) {
267 dst[i][RCOMP] = ((s[i] ) & 0xf) * (1.0F / 15.0F);
268 dst[i][GCOMP] = ((s[i] >> 12) & 0xf) * (1.0F / 15.0F);
269 dst[i][BCOMP] = ((s[i] >> 8) & 0xf) * (1.0F / 15.0F);
270 dst[i][ACOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
271 }
272 }
273
274 static void
275 unpack_RGBA5551(const void *src, GLfloat dst[][4], GLuint n)
276 {
277 const GLushort *s = ((const GLushort *) src);
278 GLuint i;
279 for (i = 0; i < n; i++) {
280 dst[i][RCOMP] = ((s[i] >> 11) & 0x1f) * (1.0F / 31.0F);
281 dst[i][GCOMP] = ((s[i] >> 6) & 0x1f) * (1.0F / 31.0F);
282 dst[i][BCOMP] = ((s[i] >> 1) & 0x1f) * (1.0F / 31.0F);
283 dst[i][ACOMP] = ((s[i] ) & 0x01) * 1.0F;
284 }
285 }
286
287 static void
288 unpack_ARGB1555(const void *src, GLfloat dst[][4], GLuint n)
289 {
290 const GLushort *s = ((const GLushort *) src);
291 GLuint i;
292 for (i = 0; i < n; i++) {
293 dst[i][RCOMP] = ((s[i] >> 10) & 0x1f) * (1.0F / 31.0F);
294 dst[i][GCOMP] = ((s[i] >> 5) & 0x1f) * (1.0F / 31.0F);
295 dst[i][BCOMP] = ((s[i] >> 0) & 0x1f) * (1.0F / 31.0F);
296 dst[i][ACOMP] = ((s[i] >> 15) & 0x01) * 1.0F;
297 }
298 }
299
300 static void
301 unpack_ARGB1555_REV(const void *src, GLfloat dst[][4], GLuint n)
302 {
303 const GLushort *s = ((const GLushort *) src);
304 GLuint i;
305 for (i = 0; i < n; i++) {
306 GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */
307 dst[i][RCOMP] = ((tmp >> 10) & 0x1f) * (1.0F / 31.0F);
308 dst[i][GCOMP] = ((tmp >> 5) & 0x1f) * (1.0F / 31.0F);
309 dst[i][BCOMP] = ((tmp >> 0) & 0x1f) * (1.0F / 31.0F);
310 dst[i][ACOMP] = ((tmp >> 15) & 0x01) * 1.0F;
311 }
312 }
313
314 static void
315 unpack_AL44(const void *src, GLfloat dst[][4], GLuint n)
316 {
317 const GLubyte *s = ((const GLubyte *) src);
318 GLuint i;
319 for (i = 0; i < n; i++) {
320 dst[i][RCOMP] =
321 dst[i][GCOMP] =
322 dst[i][BCOMP] = (s[i] & 0xf) * (1.0F / 15.0F);
323 dst[i][ACOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
324 }
325 }
326
327 static void
328 unpack_AL88(const void *src, GLfloat dst[][4], GLuint n)
329 {
330 const GLushort *s = ((const GLushort *) src);
331 GLuint i;
332 for (i = 0; i < n; i++) {
333 dst[i][RCOMP] =
334 dst[i][GCOMP] =
335 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
336 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
337 }
338 }
339
340 static void
341 unpack_AL88_REV(const void *src, GLfloat dst[][4], GLuint n)
342 {
343 const GLushort *s = ((const GLushort *) src);
344 GLuint i;
345 for (i = 0; i < n; i++) {
346 dst[i][RCOMP] =
347 dst[i][GCOMP] =
348 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
349 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
350 }
351 }
352
353 static void
354 unpack_AL1616(const void *src, GLfloat dst[][4], GLuint n)
355 {
356 const GLuint *s = ((const GLuint *) src);
357 GLuint i;
358 for (i = 0; i < n; i++) {
359 dst[i][RCOMP] =
360 dst[i][GCOMP] =
361 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
362 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
363 }
364 }
365
366 static void
367 unpack_AL1616_REV(const void *src, GLfloat dst[][4], GLuint n)
368 {
369 const GLuint *s = ((const GLuint *) src);
370 GLuint i;
371 for (i = 0; i < n; i++) {
372 dst[i][RCOMP] =
373 dst[i][GCOMP] =
374 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
375 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
376 }
377 }
378
379 static void
380 unpack_RGB332(const void *src, GLfloat dst[][4], GLuint n)
381 {
382 const GLubyte *s = ((const GLubyte *) src);
383 GLuint i;
384 for (i = 0; i < n; i++) {
385 dst[i][RCOMP] = ((s[i] >> 5) & 0x7) * (1.0F / 7.0F);
386 dst[i][GCOMP] = ((s[i] >> 2) & 0x7) * (1.0F / 7.0F);
387 dst[i][BCOMP] = ((s[i] ) & 0x3) * (1.0F / 3.0F);
388 dst[i][ACOMP] = 1.0F;
389 }
390 }
391
392
393 static void
394 unpack_A8(const void *src, GLfloat dst[][4], GLuint n)
395 {
396 const GLubyte *s = ((const GLubyte *) src);
397 GLuint i;
398 for (i = 0; i < n; i++) {
399 dst[i][RCOMP] =
400 dst[i][GCOMP] =
401 dst[i][BCOMP] = 0.0F;
402 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i]);
403 }
404 }
405
406 static void
407 unpack_A16(const void *src, GLfloat dst[][4], GLuint n)
408 {
409 const GLushort *s = ((const GLushort *) src);
410 GLuint i;
411 for (i = 0; i < n; i++) {
412 dst[i][RCOMP] =
413 dst[i][GCOMP] =
414 dst[i][BCOMP] = 0.0F;
415 dst[i][ACOMP] = USHORT_TO_FLOAT(s[i]);
416 }
417 }
418
419 static void
420 unpack_L8(const void *src, GLfloat dst[][4], GLuint n)
421 {
422 const GLubyte *s = ((const GLubyte *) src);
423 GLuint i;
424 for (i = 0; i < n; i++) {
425 dst[i][RCOMP] =
426 dst[i][GCOMP] =
427 dst[i][BCOMP] = UBYTE_TO_FLOAT(s[i]);
428 dst[i][ACOMP] = 1.0F;
429 }
430 }
431
432 static void
433 unpack_L16(const void *src, GLfloat dst[][4], GLuint n)
434 {
435 const GLushort *s = ((const GLushort *) src);
436 GLuint i;
437 for (i = 0; i < n; i++) {
438 dst[i][RCOMP] =
439 dst[i][GCOMP] =
440 dst[i][BCOMP] = USHORT_TO_FLOAT(s[i]);
441 dst[i][ACOMP] = 1.0F;
442 }
443 }
444
445 static void
446 unpack_I8(const void *src, GLfloat dst[][4], GLuint n)
447 {
448 const GLubyte *s = ((const GLubyte *) src);
449 GLuint i;
450 for (i = 0; i < n; i++) {
451 dst[i][RCOMP] =
452 dst[i][GCOMP] =
453 dst[i][BCOMP] =
454 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i]);
455 }
456 }
457
458 static void
459 unpack_I16(const void *src, GLfloat dst[][4], GLuint n)
460 {
461 const GLushort *s = ((const GLushort *) src);
462 GLuint i;
463 for (i = 0; i < n; i++) {
464 dst[i][RCOMP] =
465 dst[i][GCOMP] =
466 dst[i][BCOMP] =
467 dst[i][ACOMP] = USHORT_TO_FLOAT(s[i]);
468 }
469 }
470
471 static void
472 unpack_YCBCR(const void *src, GLfloat dst[][4], GLuint n)
473 {
474 GLuint i;
475 for (i = 0; i < n; i++) {
476 const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
477 const GLushort *src1 = src0 + 1; /* odd */
478 const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */
479 const GLubyte cb = *src0 & 0xff; /* chroma U */
480 const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */
481 const GLubyte cr = *src1 & 0xff; /* chroma V */
482 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
483 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
484 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
485 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
486 r *= (1.0F / 255.0F);
487 g *= (1.0F / 255.0F);
488 b *= (1.0F / 255.0F);
489 dst[i][RCOMP] = CLAMP(r, 0.0F, 1.0F);
490 dst[i][GCOMP] = CLAMP(g, 0.0F, 1.0F);
491 dst[i][BCOMP] = CLAMP(b, 0.0F, 1.0F);
492 dst[i][ACOMP] = 1.0F;
493 }
494 }
495
496 static void
497 unpack_YCBCR_REV(const void *src, GLfloat dst[][4], GLuint n)
498 {
499 GLuint i;
500 for (i = 0; i < n; i++) {
501 const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
502 const GLushort *src1 = src0 + 1; /* odd */
503 const GLubyte y0 = *src0 & 0xff; /* luminance */
504 const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */
505 const GLubyte y1 = *src1 & 0xff; /* luminance */
506 const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */
507 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
508 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
509 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
510 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
511 r *= (1.0F / 255.0F);
512 g *= (1.0F / 255.0F);
513 b *= (1.0F / 255.0F);
514 dst[i][RCOMP] = CLAMP(r, 0.0F, 1.0F);
515 dst[i][GCOMP] = CLAMP(g, 0.0F, 1.0F);
516 dst[i][BCOMP] = CLAMP(b, 0.0F, 1.0F);
517 dst[i][ACOMP] = 1.0F;
518 }
519 }
520
521 static void
522 unpack_R8(const void *src, GLfloat dst[][4], GLuint n)
523 {
524 const GLubyte *s = ((const GLubyte *) src);
525 GLuint i;
526 for (i = 0; i < n; i++) {
527 dst[i][0] = UBYTE_TO_FLOAT(s[i]);
528 dst[i][1] =
529 dst[i][2] = 0.0F;
530 dst[i][3] = 1.0F;
531 }
532 }
533
534 static void
535 unpack_GR88(const void *src, GLfloat dst[][4], GLuint n)
536 {
537 const GLushort *s = ((const GLushort *) src);
538 GLuint i;
539 for (i = 0; i < n; i++) {
540 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
541 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
542 dst[i][BCOMP] = 0.0;
543 dst[i][ACOMP] = 1.0;
544 }
545 }
546
547 static void
548 unpack_RG88(const void *src, GLfloat dst[][4], GLuint n)
549 {
550 const GLushort *s = ((const GLushort *) src);
551 GLuint i;
552 for (i = 0; i < n; i++) {
553 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
554 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
555 dst[i][BCOMP] = 0.0;
556 dst[i][ACOMP] = 1.0;
557 }
558 }
559
560 static void
561 unpack_R16(const void *src, GLfloat dst[][4], GLuint n)
562 {
563 const GLushort *s = ((const GLushort *) src);
564 GLuint i;
565 for (i = 0; i < n; i++) {
566 dst[i][RCOMP] = USHORT_TO_FLOAT(s[i]);
567 dst[i][GCOMP] = 0.0;
568 dst[i][BCOMP] = 0.0;
569 dst[i][ACOMP] = 1.0;
570 }
571 }
572
573 static void
574 unpack_GR1616(const void *src, GLfloat dst[][4], GLuint n)
575 {
576 const GLuint *s = ((const GLuint *) src);
577 GLuint i;
578 for (i = 0; i < n; i++) {
579 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
580 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
581 dst[i][BCOMP] = 0.0;
582 dst[i][ACOMP] = 1.0;
583 }
584 }
585
586 static void
587 unpack_RG1616(const void *src, GLfloat dst[][4], GLuint n)
588 {
589 const GLuint *s = ((const GLuint *) src);
590 GLuint i;
591 for (i = 0; i < n; i++) {
592 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
593 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
594 dst[i][BCOMP] = 0.0;
595 dst[i][ACOMP] = 1.0;
596 }
597 }
598
599 static void
600 unpack_ARGB2101010(const void *src, GLfloat dst[][4], GLuint n)
601 {
602 const GLuint *s = ((const GLuint *) src);
603 GLuint i;
604 for (i = 0; i < n; i++) {
605 dst[i][RCOMP] = ((s[i] >> 20) & 0x3ff) * (1.0F / 1023.0F);
606 dst[i][GCOMP] = ((s[i] >> 10) & 0x3ff) * (1.0F / 1023.0F);
607 dst[i][BCOMP] = ((s[i] >> 0) & 0x3ff) * (1.0F / 1023.0F);
608 dst[i][ACOMP] = ((s[i] >> 30) & 0x03) * (1.0F / 3.0F);
609 }
610 }
611
612
613 static void
614 unpack_ARGB2101010_UINT(const void *src, GLfloat dst[][4], GLuint n)
615 {
616 const GLuint *s = (const GLuint *) src;
617 GLuint i;
618 for (i = 0; i < n; i++) {
619 dst[i][RCOMP] = (GLfloat)((s[i] >> 20) & 0x3ff);
620 dst[i][GCOMP] = (GLfloat)((s[i] >> 10) & 0x3ff);
621 dst[i][BCOMP] = (GLfloat)((s[i] >> 0) & 0x3ff);
622 dst[i][ACOMP] = (GLfloat)((s[i] >> 30) & 0x03);
623 }
624 }
625
626
627 static void
628 unpack_ABGR2101010_UINT(const void *src, GLfloat dst[][4], GLuint n)
629 {
630 const GLuint *s = ((const GLuint *) src);
631 GLuint i;
632 for (i = 0; i < n; i++) {
633 dst[i][RCOMP] = (GLfloat)((s[i] >> 0) & 0x3ff);
634 dst[i][GCOMP] = (GLfloat)((s[i] >> 10) & 0x3ff);
635 dst[i][BCOMP] = (GLfloat)((s[i] >> 20) & 0x3ff);
636 dst[i][ACOMP] = (GLfloat)((s[i] >> 30) & 0x03);
637 }
638 }
639
640
641 static void
642 unpack_Z24_S8(const void *src, GLfloat dst[][4], GLuint n)
643 {
644 /* only return Z, not stencil data */
645 const GLuint *s = ((const GLuint *) src);
646 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
647 GLuint i;
648 for (i = 0; i < n; i++) {
649 dst[i][0] =
650 dst[i][1] =
651 dst[i][2] = (GLfloat) ((s[i] >> 8) * scale);
652 dst[i][3] = 1.0F;
653 ASSERT(dst[i][0] >= 0.0F);
654 ASSERT(dst[i][0] <= 1.0F);
655 }
656 }
657
658 static void
659 unpack_S8_Z24(const void *src, GLfloat dst[][4], GLuint n)
660 {
661 /* only return Z, not stencil data */
662 const GLuint *s = ((const GLuint *) src);
663 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
664 GLuint i;
665 for (i = 0; i < n; i++) {
666 dst[i][0] =
667 dst[i][1] =
668 dst[i][2] = (float) ((s[i] & 0x00ffffff) * scale);
669 dst[i][3] = 1.0F;
670 ASSERT(dst[i][0] >= 0.0F);
671 ASSERT(dst[i][0] <= 1.0F);
672 }
673 }
674
675 static void
676 unpack_Z16(const void *src, GLfloat dst[][4], GLuint n)
677 {
678 const GLushort *s = ((const GLushort *) src);
679 GLuint i;
680 for (i = 0; i < n; i++) {
681 dst[i][0] =
682 dst[i][1] =
683 dst[i][2] = s[i] * (1.0F / 65535.0F);
684 dst[i][3] = 1.0F;
685 }
686 }
687
688 static void
689 unpack_X8_Z24(const void *src, GLfloat dst[][4], GLuint n)
690 {
691 unpack_S8_Z24(src, dst, n);
692 }
693
694 static void
695 unpack_Z24_X8(const void *src, GLfloat dst[][4], GLuint n)
696 {
697 unpack_Z24_S8(src, dst, n);
698 }
699
700 static void
701 unpack_Z32(const void *src, GLfloat dst[][4], GLuint n)
702 {
703 const GLuint *s = ((const GLuint *) src);
704 GLuint i;
705 for (i = 0; i < n; i++) {
706 dst[i][0] =
707 dst[i][1] =
708 dst[i][2] = s[i] * (1.0F / 0xffffffff);
709 dst[i][3] = 1.0F;
710 }
711 }
712
713 static void
714 unpack_Z32_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
715 {
716 const GLfloat *s = ((const GLfloat *) src);
717 GLuint i;
718 for (i = 0; i < n; i++) {
719 dst[i][0] =
720 dst[i][1] =
721 dst[i][2] = s[i * 2];
722 dst[i][3] = 1.0F;
723 }
724 }
725
726 static void
727 unpack_Z32_FLOAT_X24S8(const void *src, GLfloat dst[][4], GLuint n)
728 {
729 const GLfloat *s = ((const GLfloat *) src);
730 GLuint i;
731 for (i = 0; i < n; i++) {
732 dst[i][0] =
733 dst[i][1] =
734 dst[i][2] = s[i];
735 dst[i][3] = 1.0F;
736 }
737 }
738
739
740 static void
741 unpack_S8(const void *src, GLfloat dst[][4], GLuint n)
742 {
743 /* should never be used */
744 GLuint i;
745 for (i = 0; i < n; i++) {
746 dst[i][0] =
747 dst[i][1] =
748 dst[i][2] = 0.0F;
749 dst[i][3] = 1.0F;
750 }
751 }
752
753
754 static void
755 unpack_SRGB8(const void *src, GLfloat dst[][4], GLuint n)
756 {
757 const GLubyte *s = (const GLubyte *) src;
758 GLuint i;
759 for (i = 0; i < n; i++) {
760 dst[i][RCOMP] = _mesa_nonlinear_to_linear(s[i*3+2]);
761 dst[i][GCOMP] = _mesa_nonlinear_to_linear(s[i*3+1]);
762 dst[i][BCOMP] = _mesa_nonlinear_to_linear(s[i*3+0]);
763 dst[i][ACOMP] = 1.0F;
764 }
765 }
766
767 static void
768 unpack_SRGBA8(const void *src, GLfloat dst[][4], GLuint n)
769 {
770 const GLuint *s = ((const GLuint *) src);
771 GLuint i;
772 for (i = 0; i < n; i++) {
773 dst[i][RCOMP] = _mesa_nonlinear_to_linear( (s[i] >> 24) );
774 dst[i][GCOMP] = _mesa_nonlinear_to_linear( (s[i] >> 16) & 0xff );
775 dst[i][BCOMP] = _mesa_nonlinear_to_linear( (s[i] >> 8) & 0xff );
776 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] & 0xff ); /* linear! */
777 }
778 }
779
780 static void
781 unpack_SARGB8(const void *src, GLfloat dst[][4], GLuint n)
782 {
783 const GLuint *s = ((const GLuint *) src);
784 GLuint i;
785 for (i = 0; i < n; i++) {
786 dst[i][RCOMP] = _mesa_nonlinear_to_linear( (s[i] >> 16) & 0xff );
787 dst[i][GCOMP] = _mesa_nonlinear_to_linear( (s[i] >> 8) & 0xff );
788 dst[i][BCOMP] = _mesa_nonlinear_to_linear( (s[i] ) & 0xff );
789 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 24 ); /* linear! */
790 }
791 }
792
793 static void
794 unpack_SL8(const void *src, GLfloat dst[][4], GLuint n)
795 {
796 const GLubyte *s = ((const GLubyte *) src);
797 GLuint i;
798 for (i = 0; i < n; i++) {
799 dst[i][RCOMP] =
800 dst[i][GCOMP] =
801 dst[i][BCOMP] = _mesa_nonlinear_to_linear(s[i]);
802 dst[i][ACOMP] = 1.0F;
803 }
804 }
805
806 static void
807 unpack_SLA8(const void *src, GLfloat dst[][4], GLuint n)
808 {
809 const GLushort *s = (const GLushort *) src;
810 GLuint i;
811 for (i = 0; i < n; i++) {
812 dst[i][RCOMP] =
813 dst[i][GCOMP] =
814 dst[i][BCOMP] = _mesa_nonlinear_to_linear(s[i] & 0xff);
815 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i] >> 8); /* linear! */
816 }
817 }
818
819 static void
820 unpack_SRGB_DXT1(const void *src, GLfloat dst[][4], GLuint n)
821 {
822 }
823
824 static void
825 unpack_SRGBA_DXT1(const void *src, GLfloat dst[][4], GLuint n)
826 {
827 }
828
829 static void
830 unpack_SRGBA_DXT3(const void *src, GLfloat dst[][4], GLuint n)
831 {
832 }
833
834 static void
835 unpack_SRGBA_DXT5(const void *src, GLfloat dst[][4], GLuint n)
836 {
837 }
838
839 static void
840 unpack_RGB_FXT1(const void *src, GLfloat dst[][4], GLuint n)
841 {
842 }
843
844 static void
845 unpack_RGBA_FXT1(const void *src, GLfloat dst[][4], GLuint n)
846 {
847 }
848
849 static void
850 unpack_RGB_DXT1(const void *src, GLfloat dst[][4], GLuint n)
851 {
852 }
853
854 static void
855 unpack_RGBA_DXT1(const void *src, GLfloat dst[][4], GLuint n)
856 {
857 }
858
859 static void
860 unpack_RGBA_DXT3(const void *src, GLfloat dst[][4], GLuint n)
861 {
862 }
863
864 static void
865 unpack_RGBA_DXT5(const void *src, GLfloat dst[][4], GLuint n)
866 {
867 }
868
869
870 static void
871 unpack_RGBA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
872 {
873 const GLfloat *s = (const GLfloat *) src;
874 GLuint i;
875 for (i = 0; i < n; i++) {
876 dst[i][RCOMP] = s[i*4+0];
877 dst[i][GCOMP] = s[i*4+1];
878 dst[i][BCOMP] = s[i*4+2];
879 dst[i][ACOMP] = s[i*4+3];
880 }
881 }
882
883 static void
884 unpack_RGBA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
885 {
886 const GLhalfARB *s = (const GLhalfARB *) src;
887 GLuint i;
888 for (i = 0; i < n; i++) {
889 dst[i][RCOMP] = _mesa_half_to_float(s[i*4+0]);
890 dst[i][GCOMP] = _mesa_half_to_float(s[i*4+1]);
891 dst[i][BCOMP] = _mesa_half_to_float(s[i*4+2]);
892 dst[i][ACOMP] = _mesa_half_to_float(s[i*4+3]);
893 }
894 }
895
896 static void
897 unpack_RGB_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
898 {
899 const GLfloat *s = (const GLfloat *) src;
900 GLuint i;
901 for (i = 0; i < n; i++) {
902 dst[i][RCOMP] = s[i*3+0];
903 dst[i][GCOMP] = s[i*3+1];
904 dst[i][BCOMP] = s[i*3+2];
905 dst[i][ACOMP] = 1.0F;
906 }
907 }
908
909 static void
910 unpack_RGB_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
911 {
912 const GLhalfARB *s = (const GLhalfARB *) src;
913 GLuint i;
914 for (i = 0; i < n; i++) {
915 dst[i][RCOMP] = _mesa_half_to_float(s[i*3+0]);
916 dst[i][GCOMP] = _mesa_half_to_float(s[i*3+1]);
917 dst[i][BCOMP] = _mesa_half_to_float(s[i*3+2]);
918 dst[i][ACOMP] = 1.0F;
919 }
920 }
921
922 static void
923 unpack_ALPHA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
924 {
925 const GLfloat *s = (const GLfloat *) src;
926 GLuint i;
927 for (i = 0; i < n; i++) {
928 dst[i][RCOMP] =
929 dst[i][GCOMP] =
930 dst[i][BCOMP] = 0.0F;
931 dst[i][ACOMP] = s[i];
932 }
933 }
934
935 static void
936 unpack_ALPHA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
937 {
938 const GLhalfARB *s = (const GLhalfARB *) src;
939 GLuint i;
940 for (i = 0; i < n; i++) {
941 dst[i][RCOMP] =
942 dst[i][GCOMP] =
943 dst[i][BCOMP] = 0.0F;
944 dst[i][ACOMP] = _mesa_half_to_float(s[i]);
945 }
946 }
947
948 static void
949 unpack_LUMINANCE_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
950 {
951 const GLfloat *s = (const GLfloat *) src;
952 GLuint i;
953 for (i = 0; i < n; i++) {
954 dst[i][RCOMP] =
955 dst[i][GCOMP] =
956 dst[i][BCOMP] = s[i];
957 dst[i][ACOMP] = 1.0F;
958 }
959 }
960
961 static void
962 unpack_LUMINANCE_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
963 {
964 const GLhalfARB *s = (const GLhalfARB *) src;
965 GLuint i;
966 for (i = 0; i < n; i++) {
967 dst[i][RCOMP] =
968 dst[i][GCOMP] =
969 dst[i][BCOMP] = _mesa_half_to_float(s[i]);
970 dst[i][ACOMP] = 1.0F;
971 }
972 }
973
974 static void
975 unpack_LUMINANCE_ALPHA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
976 {
977 const GLfloat *s = (const GLfloat *) src;
978 GLuint i;
979 for (i = 0; i < n; i++) {
980 dst[i][RCOMP] =
981 dst[i][GCOMP] =
982 dst[i][BCOMP] = s[i*2+0];
983 dst[i][ACOMP] = s[i*2+1];
984 }
985 }
986
987 static void
988 unpack_LUMINANCE_ALPHA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
989 {
990 const GLhalfARB *s = (const GLhalfARB *) src;
991 GLuint i;
992 for (i = 0; i < n; i++) {
993 dst[i][RCOMP] =
994 dst[i][GCOMP] =
995 dst[i][BCOMP] = _mesa_half_to_float(s[i*2+0]);
996 dst[i][ACOMP] = _mesa_half_to_float(s[i*2+1]);
997 }
998 }
999
1000 static void
1001 unpack_INTENSITY_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
1002 {
1003 const GLfloat *s = (const GLfloat *) src;
1004 GLuint i;
1005 for (i = 0; i < n; i++) {
1006 dst[i][RCOMP] =
1007 dst[i][GCOMP] =
1008 dst[i][BCOMP] =
1009 dst[i][ACOMP] = s[i];
1010 }
1011 }
1012
1013 static void
1014 unpack_INTENSITY_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
1015 {
1016 const GLhalfARB *s = (const GLhalfARB *) src;
1017 GLuint i;
1018 for (i = 0; i < n; i++) {
1019 dst[i][RCOMP] =
1020 dst[i][GCOMP] =
1021 dst[i][BCOMP] =
1022 dst[i][ACOMP] = _mesa_half_to_float(s[i]);
1023 }
1024 }
1025
1026 static void
1027 unpack_R_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
1028 {
1029 const GLfloat *s = (const GLfloat *) src;
1030 GLuint i;
1031 for (i = 0; i < n; i++) {
1032 dst[i][RCOMP] = s[i];
1033 dst[i][GCOMP] = 0.0F;
1034 dst[i][BCOMP] = 0.0F;
1035 dst[i][ACOMP] = 1.0F;
1036 }
1037 }
1038
1039 static void
1040 unpack_R_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
1041 {
1042 const GLhalfARB *s = (const GLhalfARB *) src;
1043 GLuint i;
1044 for (i = 0; i < n; i++) {
1045 dst[i][RCOMP] = _mesa_half_to_float(s[i]);
1046 dst[i][GCOMP] = 0.0F;
1047 dst[i][BCOMP] = 0.0F;
1048 dst[i][ACOMP] = 1.0F;
1049 }
1050 }
1051
1052 static void
1053 unpack_RG_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
1054 {
1055 const GLfloat *s = (const GLfloat *) src;
1056 GLuint i;
1057 for (i = 0; i < n; i++) {
1058 dst[i][RCOMP] = s[i*2+0];
1059 dst[i][GCOMP] = s[i*2+1];
1060 dst[i][BCOMP] = 0.0F;
1061 dst[i][ACOMP] = 1.0F;
1062 }
1063 }
1064
1065 static void
1066 unpack_RG_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
1067 {
1068 const GLhalfARB *s = (const GLhalfARB *) src;
1069 GLuint i;
1070 for (i = 0; i < n; i++) {
1071 dst[i][RCOMP] = _mesa_half_to_float(s[i*2+0]);
1072 dst[i][GCOMP] = _mesa_half_to_float(s[i*2+1]);
1073 dst[i][BCOMP] = 0.0F;
1074 dst[i][ACOMP] = 1.0F;
1075 }
1076 }
1077
1078 static void
1079 unpack_ALPHA_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1080 {
1081 const GLubyte *s = (const GLubyte *) src;
1082 GLuint i;
1083 for (i = 0; i < n; i++) {
1084 dst[i][RCOMP] =
1085 dst[i][GCOMP] =
1086 dst[i][BCOMP] = 0.0;
1087 dst[i][ACOMP] = (GLfloat) s[i];
1088 }
1089 }
1090
1091 static void
1092 unpack_ALPHA_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1093 {
1094 const GLushort *s = (const GLushort *) src;
1095 GLuint i;
1096 for (i = 0; i < n; i++) {
1097 dst[i][RCOMP] =
1098 dst[i][GCOMP] =
1099 dst[i][BCOMP] = 0.0;
1100 dst[i][ACOMP] = (GLfloat) s[i];
1101 }
1102 }
1103
1104 static void
1105 unpack_ALPHA_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1106 {
1107 const GLuint *s = (const GLuint *) src;
1108 GLuint i;
1109 for (i = 0; i < n; i++) {
1110 dst[i][RCOMP] =
1111 dst[i][GCOMP] =
1112 dst[i][BCOMP] = 0.0;
1113 dst[i][ACOMP] = (GLfloat) s[i];
1114 }
1115 }
1116
1117 static void
1118 unpack_ALPHA_INT8(const void *src, GLfloat dst[][4], GLuint n)
1119 {
1120 const GLbyte *s = (const GLbyte *) src;
1121 GLuint i;
1122 for (i = 0; i < n; i++) {
1123 dst[i][RCOMP] =
1124 dst[i][GCOMP] =
1125 dst[i][BCOMP] = 0.0;
1126 dst[i][ACOMP] = (GLfloat) s[i];
1127 }
1128 }
1129
1130 static void
1131 unpack_ALPHA_INT16(const void *src, GLfloat dst[][4], GLuint n)
1132 {
1133 const GLshort *s = (const GLshort *) src;
1134 GLuint i;
1135 for (i = 0; i < n; i++) {
1136 dst[i][RCOMP] =
1137 dst[i][GCOMP] =
1138 dst[i][BCOMP] = 0.0;
1139 dst[i][ACOMP] = (GLfloat) s[i];
1140 }
1141 }
1142
1143 static void
1144 unpack_ALPHA_INT32(const void *src, GLfloat dst[][4], GLuint n)
1145 {
1146 const GLint *s = (const GLint *) src;
1147 GLuint i;
1148 for (i = 0; i < n; i++) {
1149 dst[i][RCOMP] =
1150 dst[i][GCOMP] =
1151 dst[i][BCOMP] = 0.0;
1152 dst[i][ACOMP] = (GLfloat) s[i];
1153 }
1154 }
1155
1156 static void
1157 unpack_INTENSITY_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1158 {
1159 const GLubyte *s = (const GLubyte *) src;
1160 GLuint i;
1161 for (i = 0; i < n; i++) {
1162 dst[i][RCOMP] =
1163 dst[i][GCOMP] =
1164 dst[i][BCOMP] =
1165 dst[i][ACOMP] = (GLfloat) s[i];
1166 }
1167 }
1168
1169 static void
1170 unpack_INTENSITY_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1171 {
1172 const GLushort *s = (const GLushort *) src;
1173 GLuint i;
1174 for (i = 0; i < n; i++) {
1175 dst[i][RCOMP] =
1176 dst[i][GCOMP] =
1177 dst[i][BCOMP] =
1178 dst[i][ACOMP] = (GLfloat) s[i];
1179 }
1180 }
1181
1182 static void
1183 unpack_INTENSITY_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1184 {
1185 const GLuint *s = (const GLuint *) src;
1186 GLuint i;
1187 for (i = 0; i < n; i++) {
1188 dst[i][RCOMP] =
1189 dst[i][GCOMP] =
1190 dst[i][BCOMP] =
1191 dst[i][ACOMP] = (GLfloat) s[i];
1192 }
1193 }
1194
1195 static void
1196 unpack_INTENSITY_INT8(const void *src, GLfloat dst[][4], GLuint n)
1197 {
1198 const GLbyte *s = (const GLbyte *) src;
1199 GLuint i;
1200 for (i = 0; i < n; i++) {
1201 dst[i][RCOMP] =
1202 dst[i][GCOMP] =
1203 dst[i][BCOMP] =
1204 dst[i][ACOMP] = (GLfloat) s[i];
1205 }
1206 }
1207
1208 static void
1209 unpack_INTENSITY_INT16(const void *src, GLfloat dst[][4], GLuint n)
1210 {
1211 const GLshort *s = (const GLshort *) src;
1212 GLuint i;
1213 for (i = 0; i < n; i++) {
1214 dst[i][RCOMP] =
1215 dst[i][GCOMP] =
1216 dst[i][BCOMP] =
1217 dst[i][ACOMP] = (GLfloat) s[i];
1218 }
1219 }
1220
1221 static void
1222 unpack_INTENSITY_INT32(const void *src, GLfloat dst[][4], GLuint n)
1223 {
1224 const GLint *s = (const GLint *) src;
1225 GLuint i;
1226 for (i = 0; i < n; i++) {
1227 dst[i][RCOMP] =
1228 dst[i][GCOMP] =
1229 dst[i][BCOMP] =
1230 dst[i][ACOMP] = (GLfloat) s[i];
1231 }
1232 }
1233
1234 static void
1235 unpack_LUMINANCE_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1236 {
1237 const GLubyte *s = (const GLubyte *) src;
1238 GLuint i;
1239 for (i = 0; i < n; i++) {
1240 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1241 dst[i][ACOMP] = 1.0;
1242 }
1243 }
1244
1245 static void
1246 unpack_LUMINANCE_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1247 {
1248 const GLushort *s = (const GLushort *) src;
1249 GLuint i;
1250 for (i = 0; i < n; i++) {
1251 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1252 dst[i][ACOMP] = 1.0;
1253 }
1254 }
1255
1256 static void
1257 unpack_LUMINANCE_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1258 {
1259 const GLuint *s = (const GLuint *) src;
1260 GLuint i;
1261 for (i = 0; i < n; i++) {
1262 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1263 dst[i][ACOMP] = 1.0;
1264 }
1265 }
1266
1267 static void
1268 unpack_LUMINANCE_INT8(const void *src, GLfloat dst[][4], GLuint n)
1269 {
1270 const GLbyte *s = (const GLbyte *) src;
1271 GLuint i;
1272 for (i = 0; i < n; i++) {
1273 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1274 dst[i][ACOMP] = 1.0;
1275 }
1276 }
1277
1278 static void
1279 unpack_LUMINANCE_INT16(const void *src, GLfloat dst[][4], GLuint n)
1280 {
1281 const GLshort *s = (const GLshort *) src;
1282 GLuint i;
1283 for (i = 0; i < n; i++) {
1284 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1285 dst[i][ACOMP] = 1.0;
1286 }
1287 }
1288
1289 static void
1290 unpack_LUMINANCE_INT32(const void *src, GLfloat dst[][4], GLuint n)
1291 {
1292 const GLint *s = (const GLint *) src;
1293 GLuint i;
1294 for (i = 0; i < n; i++) {
1295 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1296 dst[i][ACOMP] = 1.0;
1297 }
1298 }
1299
1300 static void
1301 unpack_LUMINANCE_ALPHA_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1302 {
1303 const GLubyte *s = (const GLubyte *) src;
1304 GLuint i;
1305 for (i = 0; i < n; i++) {
1306 dst[i][RCOMP] =
1307 dst[i][GCOMP] =
1308 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1309 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1310 }
1311 }
1312
1313 static void
1314 unpack_LUMINANCE_ALPHA_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1315 {
1316 const GLushort *s = (const GLushort *) src;
1317 GLuint i;
1318 for (i = 0; i < n; i++) {
1319 dst[i][RCOMP] =
1320 dst[i][GCOMP] =
1321 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1322 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1323 }
1324 }
1325
1326 static void
1327 unpack_LUMINANCE_ALPHA_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1328 {
1329 const GLuint *s = (const GLuint *) src;
1330 GLuint i;
1331 for (i = 0; i < n; i++) {
1332 dst[i][RCOMP] =
1333 dst[i][GCOMP] =
1334 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1335 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1336 }
1337 }
1338
1339 static void
1340 unpack_LUMINANCE_ALPHA_INT8(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] =
1346 dst[i][GCOMP] =
1347 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1348 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1349 }
1350 }
1351
1352 static void
1353 unpack_LUMINANCE_ALPHA_INT16(const void *src, GLfloat dst[][4], GLuint n)
1354 {
1355 const GLshort *s = (const GLshort *) src;
1356 GLuint i;
1357 for (i = 0; i < n; i++) {
1358 dst[i][RCOMP] =
1359 dst[i][GCOMP] =
1360 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1361 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1362 }
1363 }
1364
1365 static void
1366 unpack_LUMINANCE_ALPHA_INT32(const void *src, GLfloat dst[][4], GLuint n)
1367 {
1368 const GLint *s = (const GLint *) src;
1369 GLuint i;
1370 for (i = 0; i < n; i++) {
1371 dst[i][RCOMP] =
1372 dst[i][GCOMP] =
1373 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1374 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1375 }
1376 }
1377
1378 static void
1379 unpack_R_INT8(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] = (GLfloat) s[i];
1385 dst[i][GCOMP] = 0.0;
1386 dst[i][BCOMP] = 0.0;
1387 dst[i][ACOMP] = 1.0;
1388 }
1389 }
1390
1391 static void
1392 unpack_RG_INT8(const void *src, GLfloat dst[][4], GLuint n)
1393 {
1394 const GLbyte *s = (const GLbyte *) src;
1395 GLuint i;
1396 for (i = 0; i < n; i++) {
1397 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1398 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1399 dst[i][BCOMP] = 0.0;
1400 dst[i][ACOMP] = 1.0;
1401 }
1402 }
1403
1404 static void
1405 unpack_RGB_INT8(const void *src, GLfloat dst[][4], GLuint n)
1406 {
1407 const GLbyte *s = (const GLbyte *) src;
1408 GLuint i;
1409 for (i = 0; i < n; i++) {
1410 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1411 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1412 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1413 dst[i][ACOMP] = 1.0;
1414 }
1415 }
1416
1417 static void
1418 unpack_RGBA_INT8(const void *src, GLfloat dst[][4], GLuint n)
1419 {
1420 const GLbyte *s = (const GLbyte *) src;
1421 GLuint i;
1422 for (i = 0; i < n; i++) {
1423 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1424 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1425 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1426 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1427 }
1428 }
1429
1430 static void
1431 unpack_R_INT16(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] = (GLfloat) s[i];
1437 dst[i][GCOMP] = 0.0;
1438 dst[i][BCOMP] = 0.0;
1439 dst[i][ACOMP] = 1.0;
1440 }
1441 }
1442
1443 static void
1444 unpack_RG_INT16(const void *src, GLfloat dst[][4], GLuint n)
1445 {
1446 const GLshort *s = (const GLshort *) src;
1447 GLuint i;
1448 for (i = 0; i < n; i++) {
1449 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1450 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1451 dst[i][BCOMP] = 0.0;
1452 dst[i][ACOMP] = 1.0;
1453 }
1454 }
1455
1456 static void
1457 unpack_RGB_INT16(const void *src, GLfloat dst[][4], GLuint n)
1458 {
1459 const GLshort *s = (const GLshort *) src;
1460 GLuint i;
1461 for (i = 0; i < n; i++) {
1462 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1463 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1464 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1465 dst[i][ACOMP] = 1.0;
1466 }
1467 }
1468
1469 static void
1470 unpack_RGBA_INT16(const void *src, GLfloat dst[][4], GLuint n)
1471 {
1472 const GLshort *s = (const GLshort *) src;
1473 GLuint i;
1474 for (i = 0; i < n; i++) {
1475 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1476 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1477 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1478 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1479 }
1480 }
1481
1482 static void
1483 unpack_R_INT32(const void *src, GLfloat dst[][4], GLuint n)
1484 {
1485 const GLint *s = (const GLint *) src;
1486 GLuint i;
1487 for (i = 0; i < n; i++) {
1488 dst[i][RCOMP] = (GLfloat) s[i];
1489 dst[i][GCOMP] = 0.0;
1490 dst[i][BCOMP] = 0.0;
1491 dst[i][ACOMP] = 1.0;
1492 }
1493 }
1494
1495 static void
1496 unpack_RG_INT32(const void *src, GLfloat dst[][4], GLuint n)
1497 {
1498 const GLint *s = (const GLint *) src;
1499 GLuint i;
1500 for (i = 0; i < n; i++) {
1501 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1502 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1503 dst[i][BCOMP] = 0.0;
1504 dst[i][ACOMP] = 1.0;
1505 }
1506 }
1507
1508 static void
1509 unpack_RGB_INT32(const void *src, GLfloat dst[][4], GLuint n)
1510 {
1511 const GLint *s = (const GLint *) src;
1512 GLuint i;
1513 for (i = 0; i < n; i++) {
1514 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1515 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1516 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1517 dst[i][ACOMP] = 1.0;
1518 }
1519 }
1520
1521
1522 static void
1523 unpack_RGBA_INT32(const void *src, GLfloat dst[][4], GLuint n)
1524 {
1525 const GLint *s = (const GLint *) src;
1526 GLuint i;
1527 for (i = 0; i < n; i++) {
1528 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1529 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1530 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1531 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1532 }
1533 }
1534
1535 static void
1536 unpack_R_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1537 {
1538 const GLubyte *s = (const GLubyte *) src;
1539 GLuint i;
1540 for (i = 0; i < n; i++) {
1541 dst[i][RCOMP] = (GLfloat) s[i];
1542 dst[i][GCOMP] = 0.0;
1543 dst[i][BCOMP] = 0.0;
1544 dst[i][ACOMP] = 1.0;
1545 }
1546 }
1547
1548 static void
1549 unpack_RG_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1550 {
1551 const GLubyte *s = (const GLubyte *) src;
1552 GLuint i;
1553 for (i = 0; i < n; i++) {
1554 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1555 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1556 dst[i][BCOMP] = 0.0;
1557 dst[i][ACOMP] = 1.0;
1558 }
1559 }
1560
1561 static void
1562 unpack_RGB_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1563 {
1564 const GLubyte *s = (const GLubyte *) src;
1565 GLuint i;
1566 for (i = 0; i < n; i++) {
1567 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1568 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1569 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1570 dst[i][ACOMP] = 1.0;
1571 }
1572 }
1573
1574 static void
1575 unpack_RGBA_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1576 {
1577 const GLubyte *s = (const GLubyte *) src;
1578 GLuint i;
1579 for (i = 0; i < n; i++) {
1580 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1581 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1582 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1583 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1584 }
1585 }
1586
1587 static void
1588 unpack_R_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1589 {
1590 const GLushort *s = (const GLushort *) src;
1591 GLuint i;
1592 for (i = 0; i < n; i++) {
1593 dst[i][RCOMP] = (GLfloat) s[i];
1594 dst[i][GCOMP] = 0.0;
1595 dst[i][BCOMP] = 0.0;
1596 dst[i][ACOMP] = 1.0;
1597 }
1598 }
1599
1600 static void
1601 unpack_RG_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1602 {
1603 const GLushort *s = (const GLushort *) src;
1604 GLuint i;
1605 for (i = 0; i < n; i++) {
1606 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1607 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1608 dst[i][BCOMP] = 0.0;
1609 dst[i][ACOMP] = 1.0;
1610 }
1611 }
1612
1613 static void
1614 unpack_RGB_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1615 {
1616 const GLushort *s = (const GLushort *) src;
1617 GLuint i;
1618 for (i = 0; i < n; i++) {
1619 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1620 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1621 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1622 dst[i][ACOMP] = 1.0;
1623 }
1624 }
1625
1626 static void
1627 unpack_RGBA_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1628 {
1629 const GLushort *s = (const GLushort *) src;
1630 GLuint i;
1631 for (i = 0; i < n; i++) {
1632 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1633 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1634 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1635 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1636 }
1637 }
1638
1639 static void
1640 unpack_R_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1641 {
1642 const GLuint *s = (const GLuint *) src;
1643 GLuint i;
1644 for (i = 0; i < n; i++) {
1645 dst[i][RCOMP] = (GLfloat) s[i];
1646 dst[i][GCOMP] = 0.0;
1647 dst[i][BCOMP] = 0.0;
1648 dst[i][ACOMP] = 1.0;
1649 }
1650 }
1651
1652 static void
1653 unpack_RG_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1654 {
1655 const GLuint *s = (const GLuint *) src;
1656 GLuint i;
1657 for (i = 0; i < n; i++) {
1658 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1659 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1660 dst[i][BCOMP] = 0.0;
1661 dst[i][ACOMP] = 1.0;
1662 }
1663 }
1664
1665 static void
1666 unpack_RGB_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1667 {
1668 const GLuint *s = (const GLuint *) src;
1669 GLuint i;
1670 for (i = 0; i < n; i++) {
1671 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1672 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1673 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1674 dst[i][ACOMP] = 1.0;
1675 }
1676 }
1677
1678 static void
1679 unpack_RGBA_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1680 {
1681 const GLuint *s = (const GLuint *) src;
1682 GLuint i;
1683 for (i = 0; i < n; i++) {
1684 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1685 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1686 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1687 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1688 }
1689 }
1690
1691 static void
1692 unpack_DUDV8(const void *src, GLfloat dst[][4], GLuint n)
1693 {
1694 const GLbyte *s = (const GLbyte *) src;
1695 GLuint i;
1696 for (i = 0; i < n; i++) {
1697 dst[i][RCOMP] = BYTE_TO_FLOAT(s[i*2+0]);
1698 dst[i][GCOMP] = BYTE_TO_FLOAT(s[i*2+1]);
1699 dst[i][BCOMP] = 0;
1700 dst[i][ACOMP] = 0;
1701 }
1702 }
1703
1704 static void
1705 unpack_SIGNED_R8(const void *src, GLfloat dst[][4], GLuint n)
1706 {
1707 const GLbyte *s = ((const GLbyte *) src);
1708 GLuint i;
1709 for (i = 0; i < n; i++) {
1710 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1711 dst[i][GCOMP] = 0.0F;
1712 dst[i][BCOMP] = 0.0F;
1713 dst[i][ACOMP] = 1.0F;
1714 }
1715 }
1716
1717 static void
1718 unpack_SIGNED_RG88_REV(const void *src, GLfloat dst[][4], GLuint n)
1719 {
1720 const GLushort *s = ((const GLushort *) src);
1721 GLuint i;
1722 for (i = 0; i < n; i++) {
1723 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) );
1724 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1725 dst[i][BCOMP] = 0.0F;
1726 dst[i][ACOMP] = 1.0F;
1727 }
1728 }
1729
1730 static void
1731 unpack_SIGNED_RGBX8888(const void *src, GLfloat dst[][4], GLuint n)
1732 {
1733 const GLuint *s = ((const GLuint *) src);
1734 GLuint i;
1735 for (i = 0; i < n; i++) {
1736 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1737 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1738 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1739 dst[i][ACOMP] = 1.0f;
1740 }
1741 }
1742
1743 static void
1744 unpack_SIGNED_RGBA8888(const void *src, GLfloat dst[][4], GLuint n)
1745 {
1746 const GLuint *s = ((const GLuint *) src);
1747 GLuint i;
1748 for (i = 0; i < n; i++) {
1749 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1750 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1751 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1752 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] ) );
1753 }
1754 }
1755
1756 static void
1757 unpack_SIGNED_RGBA8888_REV(const void *src, GLfloat dst[][4], GLuint n)
1758 {
1759 const GLuint *s = ((const GLuint *) src);
1760 GLuint i;
1761 for (i = 0; i < n; i++) {
1762 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] ) );
1763 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1764 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1765 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1766 }
1767 }
1768
1769 static void
1770 unpack_SIGNED_R16(const void *src, GLfloat dst[][4], GLuint n)
1771 {
1772 const GLshort *s = ((const GLshort *) src);
1773 GLuint i;
1774 for (i = 0; i < n; i++) {
1775 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i] );
1776 dst[i][GCOMP] = 0.0F;
1777 dst[i][BCOMP] = 0.0F;
1778 dst[i][ACOMP] = 1.0F;
1779 }
1780 }
1781
1782 static void
1783 unpack_SIGNED_GR1616(const void *src, GLfloat dst[][4], GLuint n)
1784 {
1785 const GLuint *s = ((const GLuint *) src);
1786 GLuint i;
1787 for (i = 0; i < n; i++) {
1788 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] & 0xffff) );
1789 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] >> 16) );
1790 dst[i][BCOMP] = 0.0F;
1791 dst[i][ACOMP] = 1.0F;
1792 }
1793 }
1794
1795 static void
1796 unpack_SIGNED_RGB_16(const void *src, GLfloat dst[][4], GLuint n)
1797 {
1798 const GLshort *s = (const GLshort *) src;
1799 GLuint i;
1800 for (i = 0; i < n; i++) {
1801 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+0] );
1802 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+1] );
1803 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+2] );
1804 dst[i][ACOMP] = 1.0F;
1805 }
1806 }
1807
1808 static void
1809 unpack_SIGNED_RGBA_16(const void *src, GLfloat dst[][4], GLuint n)
1810 {
1811 const GLshort *s = (const GLshort *) src;
1812 GLuint i;
1813 for (i = 0; i < n; i++) {
1814 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+0] );
1815 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+1] );
1816 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+2] );
1817 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i*4+3] );
1818 }
1819 }
1820
1821 static void
1822 unpack_RGBA_16(const void *src, GLfloat dst[][4], GLuint n)
1823 {
1824 const GLushort *s = (const GLushort *) src;
1825 GLuint i;
1826 for (i = 0; i < n; i++) {
1827 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i*4+0] );
1828 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i*4+1] );
1829 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i*4+2] );
1830 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i*4+3] );
1831 }
1832 }
1833
1834 static void
1835 unpack_RED_RGTC1(const void *src, GLfloat dst[][4], GLuint n)
1836 {
1837 /* XXX to do */
1838 }
1839
1840 static void
1841 unpack_SIGNED_RED_RGTC1(const void *src, GLfloat dst[][4], GLuint n)
1842 {
1843 /* XXX to do */
1844 }
1845
1846 static void
1847 unpack_RG_RGTC2(const void *src, GLfloat dst[][4], GLuint n)
1848 {
1849 /* XXX to do */
1850 }
1851
1852 static void
1853 unpack_SIGNED_RG_RGTC2(const void *src, GLfloat dst[][4], GLuint n)
1854 {
1855 /* XXX to do */
1856 }
1857
1858 static void
1859 unpack_L_LATC1(const void *src, GLfloat dst[][4], GLuint n)
1860 {
1861 /* XXX to do */
1862 }
1863
1864 static void
1865 unpack_SIGNED_L_LATC1(const void *src, GLfloat dst[][4], GLuint n)
1866 {
1867 /* XXX to do */
1868 }
1869
1870 static void
1871 unpack_LA_LATC2(const void *src, GLfloat dst[][4], GLuint n)
1872 {
1873 /* XXX to do */
1874 }
1875
1876 static void
1877 unpack_SIGNED_LA_LATC2(const void *src, GLfloat dst[][4], GLuint n)
1878 {
1879 /* XXX to do */
1880 }
1881
1882 static void
1883 unpack_ETC1_RGB8(const void *src, GLfloat dst[][4], GLuint n)
1884 {
1885 /* XXX to do */
1886 }
1887
1888 static void
1889 unpack_ETC2_RGB8(const void *src, GLfloat dst[][4], GLuint n)
1890 {
1891 /* XXX to do */
1892 }
1893
1894 static void
1895 unpack_ETC2_SRGB8(const void *src, GLfloat dst[][4], GLuint n)
1896 {
1897 /* XXX to do */
1898 }
1899
1900 static void
1901 unpack_ETC2_RGBA8_EAC(const void *src, GLfloat dst[][4], GLuint n)
1902 {
1903 /* XXX to do */
1904 }
1905
1906 static void
1907 unpack_ETC2_SRGB8_ALPHA8_EAC(const void *src, GLfloat dst[][4], GLuint n)
1908 {
1909 /* XXX to do */
1910 }
1911
1912 static void
1913 unpack_ETC2_R11_EAC(const void *src, GLfloat dst[][4], GLuint n)
1914 {
1915 /* XXX to do */
1916 }
1917
1918 static void
1919 unpack_ETC2_RG11_EAC(const void *src, GLfloat dst[][4], GLuint n)
1920 {
1921 /* XXX to do */
1922 }
1923
1924 static void
1925 unpack_ETC2_SIGNED_R11_EAC(const void *src, GLfloat dst[][4], GLuint n)
1926 {
1927 /* XXX to do */
1928 }
1929
1930 static void
1931 unpack_ETC2_SIGNED_RG11_EAC(const void *src, GLfloat dst[][4], GLuint n)
1932 {
1933 /* XXX to do */
1934 }
1935
1936 static void
1937 unpack_ETC2_RGB8_PUNCHTHROUGH_ALPHA1(const void *src, GLfloat dst[][4],
1938 GLuint n)
1939 {
1940 /* XXX to do */
1941 }
1942
1943 static void
1944 unpack_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1(const void *src, GLfloat dst[][4],
1945 GLuint n)
1946 {
1947 /* XXX to do */
1948 }
1949
1950 static void
1951 unpack_SIGNED_A8(const void *src, GLfloat dst[][4], GLuint n)
1952 {
1953 const GLbyte *s = ((const GLbyte *) src);
1954 GLuint i;
1955 for (i = 0; i < n; i++) {
1956 dst[i][RCOMP] = 0.0F;
1957 dst[i][GCOMP] = 0.0F;
1958 dst[i][BCOMP] = 0.0F;
1959 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1960 }
1961 }
1962
1963 static void
1964 unpack_SIGNED_L8(const void *src, GLfloat dst[][4], GLuint n)
1965 {
1966 const GLbyte *s = ((const GLbyte *) src);
1967 GLuint i;
1968 for (i = 0; i < n; i++) {
1969 dst[i][RCOMP] =
1970 dst[i][GCOMP] =
1971 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1972 dst[i][ACOMP] = 1.0F;
1973 }
1974 }
1975
1976 static void
1977 unpack_SIGNED_AL88(const void *src, GLfloat dst[][4], GLuint n)
1978 {
1979 const GLshort *s = ((const GLshort *) src);
1980 GLuint i;
1981 for (i = 0; i < n; i++) {
1982 dst[i][RCOMP] =
1983 dst[i][GCOMP] =
1984 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) );
1985 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1986 }
1987 }
1988
1989 static void
1990 unpack_SIGNED_I8(const void *src, GLfloat dst[][4], GLuint n)
1991 {
1992 const GLbyte *s = ((const GLbyte *) src);
1993 GLuint i;
1994 for (i = 0; i < n; i++) {
1995 dst[i][RCOMP] =
1996 dst[i][GCOMP] =
1997 dst[i][BCOMP] =
1998 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1999 }
2000 }
2001
2002 static void
2003 unpack_SIGNED_A16(const void *src, GLfloat dst[][4], GLuint n)
2004 {
2005 const GLshort *s = ((const GLshort *) src);
2006 GLuint i;
2007 for (i = 0; i < n; i++) {
2008 dst[i][RCOMP] = 0.0F;
2009 dst[i][GCOMP] = 0.0F;
2010 dst[i][BCOMP] = 0.0F;
2011 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i] );
2012 }
2013 }
2014
2015 static void
2016 unpack_SIGNED_L16(const void *src, GLfloat dst[][4], GLuint n)
2017 {
2018 const GLshort *s = ((const GLshort *) src);
2019 GLuint i;
2020 for (i = 0; i < n; i++) {
2021 dst[i][RCOMP] =
2022 dst[i][GCOMP] =
2023 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i] );
2024 dst[i][ACOMP] = 1.0F;
2025 }
2026 }
2027
2028 static void
2029 unpack_SIGNED_AL1616(const void *src, GLfloat dst[][4], GLuint n)
2030 {
2031 const GLshort *s = (const GLshort *) src;
2032 GLuint i;
2033 for (i = 0; i < n; i++) {
2034 dst[i][RCOMP] =
2035 dst[i][GCOMP] =
2036 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*2+0] );
2037 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i*2+1] );
2038 }
2039 }
2040
2041 static void
2042 unpack_SIGNED_I16(const void *src, GLfloat dst[][4], GLuint n)
2043 {
2044 const GLshort *s = ((const GLshort *) src);
2045 GLuint i;
2046 for (i = 0; i < n; i++) {
2047 dst[i][RCOMP] =
2048 dst[i][GCOMP] =
2049 dst[i][BCOMP] =
2050 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i] );
2051 }
2052 }
2053
2054 static void
2055 unpack_RGB9_E5_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
2056 {
2057 const GLuint *s = (const GLuint *) src;
2058 GLuint i;
2059 for (i = 0; i < n; i++) {
2060 rgb9e5_to_float3(s[i], dst[i]);
2061 dst[i][ACOMP] = 1.0F;
2062 }
2063 }
2064
2065 static void
2066 unpack_R11_G11_B10_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
2067 {
2068 const GLuint *s = (const GLuint *) src;
2069 GLuint i;
2070 for (i = 0; i < n; i++) {
2071 r11g11b10f_to_float3(s[i], dst[i]);
2072 dst[i][ACOMP] = 1.0F;
2073 }
2074 }
2075
2076 static void
2077 unpack_XRGB4444_UNORM(const void *src, GLfloat dst[][4], GLuint n)
2078 {
2079 const GLushort *s = ((const GLushort *) src);
2080 GLuint i;
2081 for (i = 0; i < n; i++) {
2082 dst[i][RCOMP] = ((s[i] >> 8) & 0xf) * (1.0F / 15.0F);
2083 dst[i][GCOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
2084 dst[i][BCOMP] = ((s[i] ) & 0xf) * (1.0F / 15.0F);
2085 dst[i][ACOMP] = 1.0;
2086 }
2087 }
2088
2089 static void
2090 unpack_XRGB1555_UNORM(const void *src, GLfloat dst[][4], GLuint n)
2091 {
2092 const GLushort *s = ((const GLushort *) src);
2093 GLuint i;
2094 for (i = 0; i < n; i++) {
2095 dst[i][RCOMP] = ((s[i] >> 10) & 0x1f) * (1.0F / 31.0F);
2096 dst[i][GCOMP] = ((s[i] >> 5) & 0x1f) * (1.0F / 31.0F);
2097 dst[i][BCOMP] = ((s[i] >> 0) & 0x1f) * (1.0F / 31.0F);
2098 dst[i][ACOMP] = 1.0;
2099 }
2100 }
2101
2102 static void
2103 unpack_XBGR8888_SNORM(const void *src, GLfloat dst[][4], GLuint n)
2104 {
2105 const GLuint *s = ((const GLuint *) src);
2106 GLuint i;
2107 for (i = 0; i < n; i++) {
2108 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] ) );
2109 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
2110 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
2111 dst[i][ACOMP] = 1.0;
2112 }
2113 }
2114
2115 static void
2116 unpack_XBGR8888_SRGB(const void *src, GLfloat dst[][4], GLuint n)
2117 {
2118 const GLuint *s = ((const GLuint *) src);
2119 GLuint i;
2120 for (i = 0; i < n; i++) {
2121 dst[i][RCOMP] = _mesa_nonlinear_to_linear( (s[i] ) & 0xff );
2122 dst[i][GCOMP] = _mesa_nonlinear_to_linear( (s[i] >> 8) & 0xff );
2123 dst[i][BCOMP] = _mesa_nonlinear_to_linear( (s[i] >> 16) & 0xff );
2124 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 24 ); /* linear! */
2125 }
2126 }
2127
2128 static void
2129 unpack_XBGR8888_UINT(const void *src, GLfloat dst[][4], GLuint n)
2130 {
2131 const GLbyte *s = (const GLbyte *) src;
2132 GLuint i;
2133 for (i = 0; i < n; i++) {
2134 dst[i][RCOMP] = s[i*4+0];
2135 dst[i][GCOMP] = s[i*4+1];
2136 dst[i][BCOMP] = s[i*4+2];
2137 dst[i][ACOMP] = 1.0;
2138 }
2139 }
2140
2141 static void
2142 unpack_XBGR8888_SINT(const void *src, GLfloat dst[][4], GLuint n)
2143 {
2144 const GLbyte *s = (const GLbyte *) src;
2145 GLuint i;
2146 for (i = 0; i < n; i++) {
2147 dst[i][RCOMP] = s[i*4+0];
2148 dst[i][GCOMP] = s[i*4+1];
2149 dst[i][BCOMP] = s[i*4+2];
2150 dst[i][ACOMP] = 1.0;
2151 }
2152 }
2153
2154 static void
2155 unpack_XRGB2101010_UNORM(const void *src, GLfloat dst[][4], GLuint n)
2156 {
2157 const GLuint *s = ((const GLuint *) src);
2158 GLuint i;
2159 for (i = 0; i < n; i++) {
2160 dst[i][RCOMP] = ((s[i] >> 20) & 0x3ff) * (1.0F / 1023.0F);
2161 dst[i][GCOMP] = ((s[i] >> 10) & 0x3ff) * (1.0F / 1023.0F);
2162 dst[i][BCOMP] = ((s[i] >> 0) & 0x3ff) * (1.0F / 1023.0F);
2163 dst[i][ACOMP] = 1.0;
2164 }
2165 }
2166
2167 static void
2168 unpack_XBGR16161616_UNORM(const void *src, GLfloat dst[][4], GLuint n)
2169 {
2170 const GLushort *s = (const GLushort *) src;
2171 GLuint i;
2172 for (i = 0; i < n; i++) {
2173 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i*4+0] );
2174 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i*4+1] );
2175 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i*4+2] );
2176 dst[i][ACOMP] = 1.0;
2177 }
2178 }
2179
2180 static void
2181 unpack_XBGR16161616_SNORM(const void *src, GLfloat dst[][4], GLuint n)
2182 {
2183 const GLshort *s = (const GLshort *) src;
2184 GLuint i;
2185 for (i = 0; i < n; i++) {
2186 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+0] );
2187 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+1] );
2188 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+2] );
2189 dst[i][ACOMP] = 1.0;
2190 }
2191 }
2192
2193 static void
2194 unpack_XBGR16161616_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
2195 {
2196 const GLshort *s = (const GLshort *) src;
2197 GLuint i;
2198 for (i = 0; i < n; i++) {
2199 dst[i][RCOMP] = _mesa_half_to_float(s[i*4+0]);
2200 dst[i][GCOMP] = _mesa_half_to_float(s[i*4+1]);
2201 dst[i][BCOMP] = _mesa_half_to_float(s[i*4+2]);
2202 dst[i][ACOMP] = 1.0;
2203 }
2204 }
2205
2206 static void
2207 unpack_XBGR16161616_UINT(const void *src, GLfloat dst[][4], GLuint n)
2208 {
2209 const GLushort *s = (const GLushort *) src;
2210 GLuint i;
2211 for (i = 0; i < n; i++) {
2212 dst[i][RCOMP] = (GLfloat) s[i*4+0];
2213 dst[i][GCOMP] = (GLfloat) s[i*4+1];
2214 dst[i][BCOMP] = (GLfloat) s[i*4+2];
2215 dst[i][ACOMP] = 1.0;
2216 }
2217 }
2218
2219 static void
2220 unpack_XBGR16161616_SINT(const void *src, GLfloat dst[][4], GLuint n)
2221 {
2222 const GLshort *s = (const GLshort *) src;
2223 GLuint i;
2224 for (i = 0; i < n; i++) {
2225 dst[i][RCOMP] = (GLfloat) s[i*4+0];
2226 dst[i][GCOMP] = (GLfloat) s[i*4+1];
2227 dst[i][BCOMP] = (GLfloat) s[i*4+2];
2228 dst[i][ACOMP] = 1.0;
2229 }
2230 }
2231
2232 static void
2233 unpack_XBGR32323232_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
2234 {
2235 const GLfloat *s = (const GLfloat *) src;
2236 GLuint i;
2237 for (i = 0; i < n; i++) {
2238 dst[i][RCOMP] = s[i*4+0];
2239 dst[i][GCOMP] = s[i*4+1];
2240 dst[i][BCOMP] = s[i*4+2];
2241 dst[i][ACOMP] = 1.0;
2242 }
2243 }
2244
2245 static void
2246 unpack_XBGR32323232_UINT(const void *src, GLfloat dst[][4], GLuint n)
2247 {
2248 const GLuint *s = (const GLuint *) src;
2249 GLuint i;
2250 for (i = 0; i < n; i++) {
2251 dst[i][RCOMP] = (GLfloat) s[i*4+0];
2252 dst[i][GCOMP] = (GLfloat) s[i*4+1];
2253 dst[i][BCOMP] = (GLfloat) s[i*4+2];
2254 dst[i][ACOMP] = 1.0;
2255 }
2256 }
2257
2258 static void
2259 unpack_XBGR32323232_SINT(const void *src, GLfloat dst[][4], GLuint n)
2260 {
2261 const GLint *s = (const GLint *) src;
2262 GLuint i;
2263 for (i = 0; i < n; i++) {
2264 dst[i][RCOMP] = (GLfloat) s[i*4+0];
2265 dst[i][GCOMP] = (GLfloat) s[i*4+1];
2266 dst[i][BCOMP] = (GLfloat) s[i*4+2];
2267 dst[i][ACOMP] = 1.0;
2268 }
2269 }
2270
2271 static void
2272 unpack_ABGR2101010(const void *src, GLfloat dst[][4], GLuint n)
2273 {
2274 const GLuint *s = ((const GLuint *) src);
2275 GLuint i;
2276 for (i = 0; i < n; i++) {
2277 dst[i][RCOMP] = ((s[i] >> 0) & 0x3ff) * (1.0F / 1023.0F);
2278 dst[i][GCOMP] = ((s[i] >> 10) & 0x3ff) * (1.0F / 1023.0F);
2279 dst[i][BCOMP] = ((s[i] >> 20) & 0x3ff) * (1.0F / 1023.0F);
2280 dst[i][ACOMP] = ((s[i] >> 30) & 0x03) * (1.0F / 3.0F);
2281 }
2282 }
2283
2284 /**
2285 * Return the unpacker function for the given format.
2286 */
2287 static unpack_rgba_func
2288 get_unpack_rgba_function(gl_format format)
2289 {
2290 static unpack_rgba_func table[MESA_FORMAT_COUNT];
2291 static GLboolean initialized = GL_FALSE;
2292
2293 if (!initialized) {
2294 table[MESA_FORMAT_NONE] = NULL;
2295
2296 table[MESA_FORMAT_RGBA8888] = unpack_RGBA8888;
2297 table[MESA_FORMAT_RGBA8888_REV] = unpack_RGBA8888_REV;
2298 table[MESA_FORMAT_ARGB8888] = unpack_ARGB8888;
2299 table[MESA_FORMAT_ARGB8888_REV] = unpack_ARGB8888_REV;
2300 table[MESA_FORMAT_RGBX8888] = unpack_RGBX8888;
2301 table[MESA_FORMAT_RGBX8888_REV] = unpack_RGBX8888_REV;
2302 table[MESA_FORMAT_XRGB8888] = unpack_XRGB8888;
2303 table[MESA_FORMAT_XRGB8888_REV] = unpack_XRGB8888_REV;
2304 table[MESA_FORMAT_RGB888] = unpack_RGB888;
2305 table[MESA_FORMAT_BGR888] = unpack_BGR888;
2306 table[MESA_FORMAT_RGB565] = unpack_RGB565;
2307 table[MESA_FORMAT_RGB565_REV] = unpack_RGB565_REV;
2308 table[MESA_FORMAT_ARGB4444] = unpack_ARGB4444;
2309 table[MESA_FORMAT_ARGB4444_REV] = unpack_ARGB4444_REV;
2310 table[MESA_FORMAT_RGBA5551] = unpack_RGBA5551;
2311 table[MESA_FORMAT_ARGB1555] = unpack_ARGB1555;
2312 table[MESA_FORMAT_ARGB1555_REV] = unpack_ARGB1555_REV;
2313 table[MESA_FORMAT_AL44] = unpack_AL44;
2314 table[MESA_FORMAT_AL88] = unpack_AL88;
2315 table[MESA_FORMAT_AL88_REV] = unpack_AL88_REV;
2316 table[MESA_FORMAT_AL1616] = unpack_AL1616;
2317 table[MESA_FORMAT_AL1616_REV] = unpack_AL1616_REV;
2318 table[MESA_FORMAT_RGB332] = unpack_RGB332;
2319 table[MESA_FORMAT_A8] = unpack_A8;
2320 table[MESA_FORMAT_A16] = unpack_A16;
2321 table[MESA_FORMAT_L8] = unpack_L8;
2322 table[MESA_FORMAT_L16] = unpack_L16;
2323 table[MESA_FORMAT_I8] = unpack_I8;
2324 table[MESA_FORMAT_I16] = unpack_I16;
2325 table[MESA_FORMAT_YCBCR] = unpack_YCBCR;
2326 table[MESA_FORMAT_YCBCR_REV] = unpack_YCBCR_REV;
2327 table[MESA_FORMAT_R8] = unpack_R8;
2328 table[MESA_FORMAT_GR88] = unpack_GR88;
2329 table[MESA_FORMAT_RG88] = unpack_RG88;
2330 table[MESA_FORMAT_R16] = unpack_R16;
2331 table[MESA_FORMAT_GR1616] = unpack_GR1616;
2332 table[MESA_FORMAT_RG1616] = unpack_RG1616;
2333 table[MESA_FORMAT_ARGB2101010] = unpack_ARGB2101010;
2334 table[MESA_FORMAT_ARGB2101010_UINT] = unpack_ARGB2101010_UINT;
2335 table[MESA_FORMAT_ABGR2101010_UINT] = unpack_ABGR2101010_UINT;
2336 table[MESA_FORMAT_Z24_S8] = unpack_Z24_S8;
2337 table[MESA_FORMAT_S8_Z24] = unpack_S8_Z24;
2338 table[MESA_FORMAT_Z16] = unpack_Z16;
2339 table[MESA_FORMAT_X8_Z24] = unpack_X8_Z24;
2340 table[MESA_FORMAT_Z24_X8] = unpack_Z24_X8;
2341 table[MESA_FORMAT_Z32] = unpack_Z32;
2342 table[MESA_FORMAT_S8] = unpack_S8;
2343 table[MESA_FORMAT_SRGB8] = unpack_SRGB8;
2344 table[MESA_FORMAT_SRGBA8] = unpack_SRGBA8;
2345 table[MESA_FORMAT_SARGB8] = unpack_SARGB8;
2346 table[MESA_FORMAT_SL8] = unpack_SL8;
2347 table[MESA_FORMAT_SLA8] = unpack_SLA8;
2348 table[MESA_FORMAT_SRGB_DXT1] = unpack_SRGB_DXT1;
2349 table[MESA_FORMAT_SRGBA_DXT1] = unpack_SRGBA_DXT1;
2350 table[MESA_FORMAT_SRGBA_DXT3] = unpack_SRGBA_DXT3;
2351 table[MESA_FORMAT_SRGBA_DXT5] = unpack_SRGBA_DXT5;
2352
2353 table[MESA_FORMAT_RGB_FXT1] = unpack_RGB_FXT1;
2354 table[MESA_FORMAT_RGBA_FXT1] = unpack_RGBA_FXT1;
2355 table[MESA_FORMAT_RGB_DXT1] = unpack_RGB_DXT1;
2356 table[MESA_FORMAT_RGBA_DXT1] = unpack_RGBA_DXT1;
2357 table[MESA_FORMAT_RGBA_DXT3] = unpack_RGBA_DXT3;
2358 table[MESA_FORMAT_RGBA_DXT5] = unpack_RGBA_DXT5;
2359
2360 table[MESA_FORMAT_RGBA_FLOAT32] = unpack_RGBA_FLOAT32;
2361 table[MESA_FORMAT_RGBA_FLOAT16] = unpack_RGBA_FLOAT16;
2362 table[MESA_FORMAT_RGB_FLOAT32] = unpack_RGB_FLOAT32;
2363 table[MESA_FORMAT_RGB_FLOAT16] = unpack_RGB_FLOAT16;
2364 table[MESA_FORMAT_ALPHA_FLOAT32] = unpack_ALPHA_FLOAT32;
2365 table[MESA_FORMAT_ALPHA_FLOAT16] = unpack_ALPHA_FLOAT16;
2366 table[MESA_FORMAT_LUMINANCE_FLOAT32] = unpack_LUMINANCE_FLOAT32;
2367 table[MESA_FORMAT_LUMINANCE_FLOAT16] = unpack_LUMINANCE_FLOAT16;
2368 table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = unpack_LUMINANCE_ALPHA_FLOAT32;
2369 table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = unpack_LUMINANCE_ALPHA_FLOAT16;
2370 table[MESA_FORMAT_INTENSITY_FLOAT32] = unpack_INTENSITY_FLOAT32;
2371 table[MESA_FORMAT_INTENSITY_FLOAT16] = unpack_INTENSITY_FLOAT16;
2372 table[MESA_FORMAT_R_FLOAT32] = unpack_R_FLOAT32;
2373 table[MESA_FORMAT_R_FLOAT16] = unpack_R_FLOAT16;
2374 table[MESA_FORMAT_RG_FLOAT32] = unpack_RG_FLOAT32;
2375 table[MESA_FORMAT_RG_FLOAT16] = unpack_RG_FLOAT16;
2376
2377 table[MESA_FORMAT_ALPHA_UINT8] = unpack_ALPHA_UINT8;
2378 table[MESA_FORMAT_ALPHA_UINT16] = unpack_ALPHA_UINT16;
2379 table[MESA_FORMAT_ALPHA_UINT32] = unpack_ALPHA_UINT32;
2380 table[MESA_FORMAT_ALPHA_INT8] = unpack_ALPHA_INT8;
2381 table[MESA_FORMAT_ALPHA_INT16] = unpack_ALPHA_INT16;
2382 table[MESA_FORMAT_ALPHA_INT32] = unpack_ALPHA_INT32;
2383
2384 table[MESA_FORMAT_INTENSITY_UINT8] = unpack_INTENSITY_UINT8;
2385 table[MESA_FORMAT_INTENSITY_UINT16] = unpack_INTENSITY_UINT16;
2386 table[MESA_FORMAT_INTENSITY_UINT32] = unpack_INTENSITY_UINT32;
2387 table[MESA_FORMAT_INTENSITY_INT8] = unpack_INTENSITY_INT8;
2388 table[MESA_FORMAT_INTENSITY_INT16] = unpack_INTENSITY_INT16;
2389 table[MESA_FORMAT_INTENSITY_INT32] = unpack_INTENSITY_INT32;
2390
2391 table[MESA_FORMAT_LUMINANCE_UINT8] = unpack_LUMINANCE_UINT8;
2392 table[MESA_FORMAT_LUMINANCE_UINT16] = unpack_LUMINANCE_UINT16;
2393 table[MESA_FORMAT_LUMINANCE_UINT32] = unpack_LUMINANCE_UINT32;
2394 table[MESA_FORMAT_LUMINANCE_INT8] = unpack_LUMINANCE_INT8;
2395 table[MESA_FORMAT_LUMINANCE_INT16] = unpack_LUMINANCE_INT16;
2396 table[MESA_FORMAT_LUMINANCE_INT32] = unpack_LUMINANCE_INT32;
2397
2398 table[MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = unpack_LUMINANCE_ALPHA_UINT8;
2399 table[MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = unpack_LUMINANCE_ALPHA_UINT16;
2400 table[MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = unpack_LUMINANCE_ALPHA_UINT32;
2401 table[MESA_FORMAT_LUMINANCE_ALPHA_INT8] = unpack_LUMINANCE_ALPHA_INT8;
2402 table[MESA_FORMAT_LUMINANCE_ALPHA_INT16] = unpack_LUMINANCE_ALPHA_INT16;
2403 table[MESA_FORMAT_LUMINANCE_ALPHA_INT32] = unpack_LUMINANCE_ALPHA_INT32;
2404
2405 table[MESA_FORMAT_R_INT8] = unpack_R_INT8;
2406 table[MESA_FORMAT_RG_INT8] = unpack_RG_INT8;
2407 table[MESA_FORMAT_RGB_INT8] = unpack_RGB_INT8;
2408 table[MESA_FORMAT_RGBA_INT8] = unpack_RGBA_INT8;
2409 table[MESA_FORMAT_R_INT16] = unpack_R_INT16;
2410 table[MESA_FORMAT_RG_INT16] = unpack_RG_INT16;
2411 table[MESA_FORMAT_RGB_INT16] = unpack_RGB_INT16;
2412 table[MESA_FORMAT_RGBA_INT16] = unpack_RGBA_INT16;
2413 table[MESA_FORMAT_R_INT32] = unpack_R_INT32;
2414 table[MESA_FORMAT_RG_INT32] = unpack_RG_INT32;
2415 table[MESA_FORMAT_RGB_INT32] = unpack_RGB_INT32;
2416 table[MESA_FORMAT_RGBA_INT32] = unpack_RGBA_INT32;
2417 table[MESA_FORMAT_R_UINT8] = unpack_R_UINT8;
2418 table[MESA_FORMAT_RG_UINT8] = unpack_RG_UINT8;
2419 table[MESA_FORMAT_RGB_UINT8] = unpack_RGB_UINT8;
2420 table[MESA_FORMAT_RGBA_UINT8] = unpack_RGBA_UINT8;
2421 table[MESA_FORMAT_R_UINT16] = unpack_R_UINT16;
2422 table[MESA_FORMAT_RG_UINT16] = unpack_RG_UINT16;
2423 table[MESA_FORMAT_RGB_UINT16] = unpack_RGB_UINT16;
2424 table[MESA_FORMAT_RGBA_UINT16] = unpack_RGBA_UINT16;
2425 table[MESA_FORMAT_R_UINT32] = unpack_R_UINT32;
2426 table[MESA_FORMAT_RG_UINT32] = unpack_RG_UINT32;
2427 table[MESA_FORMAT_RGB_UINT32] = unpack_RGB_UINT32;
2428 table[MESA_FORMAT_RGBA_UINT32] = unpack_RGBA_UINT32;
2429
2430 table[MESA_FORMAT_DUDV8] = unpack_DUDV8;
2431 table[MESA_FORMAT_SIGNED_R8] = unpack_SIGNED_R8;
2432 table[MESA_FORMAT_SIGNED_RG88_REV] = unpack_SIGNED_RG88_REV;
2433 table[MESA_FORMAT_SIGNED_RGBX8888] = unpack_SIGNED_RGBX8888;
2434 table[MESA_FORMAT_SIGNED_RGBA8888] = unpack_SIGNED_RGBA8888;
2435 table[MESA_FORMAT_SIGNED_RGBA8888_REV] = unpack_SIGNED_RGBA8888_REV;
2436 table[MESA_FORMAT_SIGNED_R16] = unpack_SIGNED_R16;
2437 table[MESA_FORMAT_SIGNED_GR1616] = unpack_SIGNED_GR1616;
2438 table[MESA_FORMAT_SIGNED_RGB_16] = unpack_SIGNED_RGB_16;
2439 table[MESA_FORMAT_SIGNED_RGBA_16] = unpack_SIGNED_RGBA_16;
2440 table[MESA_FORMAT_RGBA_16] = unpack_RGBA_16;
2441
2442 table[MESA_FORMAT_RED_RGTC1] = unpack_RED_RGTC1;
2443 table[MESA_FORMAT_SIGNED_RED_RGTC1] = unpack_SIGNED_RED_RGTC1;
2444 table[MESA_FORMAT_RG_RGTC2] = unpack_RG_RGTC2;
2445 table[MESA_FORMAT_SIGNED_RG_RGTC2] = unpack_SIGNED_RG_RGTC2;
2446
2447 table[MESA_FORMAT_L_LATC1] = unpack_L_LATC1;
2448 table[MESA_FORMAT_SIGNED_L_LATC1] = unpack_SIGNED_L_LATC1;
2449 table[MESA_FORMAT_LA_LATC2] = unpack_LA_LATC2;
2450 table[MESA_FORMAT_SIGNED_LA_LATC2] = unpack_SIGNED_LA_LATC2;
2451
2452 table[MESA_FORMAT_ETC1_RGB8] = unpack_ETC1_RGB8;
2453 table[MESA_FORMAT_ETC2_RGB8] = unpack_ETC2_RGB8;
2454 table[MESA_FORMAT_ETC2_SRGB8] = unpack_ETC2_SRGB8;
2455 table[MESA_FORMAT_ETC2_RGBA8_EAC] = unpack_ETC2_RGBA8_EAC;
2456 table[MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC] = unpack_ETC2_SRGB8_ALPHA8_EAC;
2457 table[MESA_FORMAT_ETC2_R11_EAC] = unpack_ETC2_R11_EAC;
2458 table[MESA_FORMAT_ETC2_RG11_EAC] = unpack_ETC2_RG11_EAC;
2459 table[MESA_FORMAT_ETC2_SIGNED_R11_EAC] = unpack_ETC2_SIGNED_R11_EAC;
2460 table[MESA_FORMAT_ETC2_SIGNED_RG11_EAC] = unpack_ETC2_SIGNED_RG11_EAC;
2461 table[MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1] =
2462 unpack_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
2463 table[MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1] =
2464 unpack_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
2465 table[MESA_FORMAT_SIGNED_A8] = unpack_SIGNED_A8;
2466 table[MESA_FORMAT_SIGNED_L8] = unpack_SIGNED_L8;
2467 table[MESA_FORMAT_SIGNED_AL88] = unpack_SIGNED_AL88;
2468 table[MESA_FORMAT_SIGNED_I8] = unpack_SIGNED_I8;
2469 table[MESA_FORMAT_SIGNED_A16] = unpack_SIGNED_A16;
2470 table[MESA_FORMAT_SIGNED_L16] = unpack_SIGNED_L16;
2471 table[MESA_FORMAT_SIGNED_AL1616] = unpack_SIGNED_AL1616;
2472 table[MESA_FORMAT_SIGNED_I16] = unpack_SIGNED_I16;
2473
2474 table[MESA_FORMAT_RGB9_E5_FLOAT] = unpack_RGB9_E5_FLOAT;
2475 table[MESA_FORMAT_R11_G11_B10_FLOAT] = unpack_R11_G11_B10_FLOAT;
2476
2477 table[MESA_FORMAT_Z32_FLOAT] = unpack_Z32_FLOAT;
2478 table[MESA_FORMAT_Z32_FLOAT_X24S8] = unpack_Z32_FLOAT_X24S8;
2479
2480 table[MESA_FORMAT_XRGB4444_UNORM] = unpack_XRGB4444_UNORM;
2481 table[MESA_FORMAT_XRGB1555_UNORM] = unpack_XRGB1555_UNORM;
2482 table[MESA_FORMAT_XBGR8888_SNORM] = unpack_XBGR8888_SNORM;
2483 table[MESA_FORMAT_XBGR8888_SRGB] = unpack_XBGR8888_SRGB;
2484 table[MESA_FORMAT_XBGR8888_UINT] = unpack_XBGR8888_UINT;
2485 table[MESA_FORMAT_XBGR8888_SINT] = unpack_XBGR8888_SINT;
2486 table[MESA_FORMAT_XRGB2101010_UNORM] = unpack_XRGB2101010_UNORM;
2487 table[MESA_FORMAT_XBGR16161616_UNORM] = unpack_XBGR16161616_UNORM;
2488 table[MESA_FORMAT_XBGR16161616_SNORM] = unpack_XBGR16161616_SNORM;
2489 table[MESA_FORMAT_XBGR16161616_FLOAT] = unpack_XBGR16161616_FLOAT;
2490 table[MESA_FORMAT_XBGR16161616_UINT] = unpack_XBGR16161616_UINT;
2491 table[MESA_FORMAT_XBGR16161616_SINT] = unpack_XBGR16161616_SINT;
2492 table[MESA_FORMAT_XBGR32323232_FLOAT] = unpack_XBGR32323232_FLOAT;
2493 table[MESA_FORMAT_XBGR32323232_UINT] = unpack_XBGR32323232_UINT;
2494 table[MESA_FORMAT_XBGR32323232_SINT] = unpack_XBGR32323232_SINT;
2495
2496 table[MESA_FORMAT_ABGR2101010] = unpack_ABGR2101010;
2497
2498 initialized = GL_TRUE;
2499 }
2500
2501 if (table[format] == NULL) {
2502 _mesa_problem(NULL, "unsupported unpack for format %s",
2503 _mesa_get_format_name(format));
2504 }
2505
2506 return table[format];
2507 }
2508
2509
2510 /**
2511 * Unpack rgba colors, returning as GLfloat values.
2512 */
2513 void
2514 _mesa_unpack_rgba_row(gl_format format, GLuint n,
2515 const void *src, GLfloat dst[][4])
2516 {
2517 unpack_rgba_func unpack = get_unpack_rgba_function(format);
2518 unpack(src, dst, n);
2519 }
2520
2521
2522 /**********************************************************************/
2523 /* Unpack, returning GLubyte colors */
2524 /**********************************************************************/
2525
2526
2527 static void
2528 unpack_ubyte_RGBA8888(const void *src, GLubyte dst[][4], GLuint n)
2529 {
2530 const GLuint *s = ((const GLuint *) src);
2531 GLuint i;
2532 for (i = 0; i < n; i++) {
2533 dst[i][RCOMP] = (s[i] >> 24);
2534 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2535 dst[i][BCOMP] = (s[i] >> 8) & 0xff;
2536 dst[i][ACOMP] = (s[i] ) & 0xff;
2537 }
2538 }
2539
2540 static void
2541 unpack_ubyte_RGBA8888_REV(const void *src, GLubyte dst[][4], GLuint n)
2542 {
2543 const GLuint *s = ((const GLuint *) src);
2544 GLuint i;
2545 for (i = 0; i < n; i++) {
2546 dst[i][RCOMP] = (s[i] ) & 0xff;
2547 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2548 dst[i][BCOMP] = (s[i] >> 16) & 0xff;
2549 dst[i][ACOMP] = (s[i] >> 24);
2550 }
2551 }
2552
2553 static void
2554 unpack_ubyte_ARGB8888(const void *src, GLubyte dst[][4], GLuint n)
2555 {
2556 const GLuint *s = ((const GLuint *) src);
2557 GLuint i;
2558 for (i = 0; i < n; i++) {
2559 dst[i][RCOMP] = (s[i] >> 16) & 0xff;
2560 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2561 dst[i][BCOMP] = (s[i] ) & 0xff;
2562 dst[i][ACOMP] = (s[i] >> 24);
2563 }
2564 }
2565
2566 static void
2567 unpack_ubyte_ARGB8888_REV(const void *src, GLubyte dst[][4], GLuint n)
2568 {
2569 const GLuint *s = ((const GLuint *) src);
2570 GLuint i;
2571 for (i = 0; i < n; i++) {
2572 dst[i][RCOMP] = (s[i] >> 8) & 0xff;
2573 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2574 dst[i][BCOMP] = (s[i] >> 24);
2575 dst[i][ACOMP] = (s[i] ) & 0xff;
2576 }
2577 }
2578
2579 static void
2580 unpack_ubyte_RGBX8888(const void *src, GLubyte dst[][4], GLuint n)
2581 {
2582 const GLuint *s = ((const GLuint *) src);
2583 GLuint i;
2584 for (i = 0; i < n; i++) {
2585 dst[i][RCOMP] = (s[i] >> 24);
2586 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2587 dst[i][BCOMP] = (s[i] >> 8) & 0xff;
2588 dst[i][ACOMP] = 0xff;
2589 }
2590 }
2591
2592 static void
2593 unpack_ubyte_RGBX8888_REV(const void *src, GLubyte dst[][4], GLuint n)
2594 {
2595 const GLuint *s = ((const GLuint *) src);
2596 GLuint i;
2597 for (i = 0; i < n; i++) {
2598 dst[i][RCOMP] = (s[i] ) & 0xff;
2599 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2600 dst[i][BCOMP] = (s[i] >> 16) & 0xff;
2601 dst[i][ACOMP] = 0xff;
2602 }
2603 }
2604
2605 static void
2606 unpack_ubyte_XRGB8888(const void *src, GLubyte dst[][4], GLuint n)
2607 {
2608 const GLuint *s = ((const GLuint *) src);
2609 GLuint i;
2610 for (i = 0; i < n; i++) {
2611 dst[i][RCOMP] = (s[i] >> 16) & 0xff;
2612 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2613 dst[i][BCOMP] = (s[i] ) & 0xff;
2614 dst[i][ACOMP] = 0xff;
2615 }
2616 }
2617
2618 static void
2619 unpack_ubyte_XRGB8888_REV(const void *src, GLubyte dst[][4], GLuint n)
2620 {
2621 const GLuint *s = ((const GLuint *) src);
2622 GLuint i;
2623 for (i = 0; i < n; i++) {
2624 dst[i][RCOMP] = (s[i] >> 8) & 0xff;
2625 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2626 dst[i][BCOMP] = (s[i] >> 24);
2627 dst[i][ACOMP] = 0xff;
2628 }
2629 }
2630
2631 static void
2632 unpack_ubyte_RGB888(const void *src, GLubyte dst[][4], GLuint n)
2633 {
2634 const GLubyte *s = (const GLubyte *) src;
2635 GLuint i;
2636 for (i = 0; i < n; i++) {
2637 dst[i][RCOMP] = s[i*3+2];
2638 dst[i][GCOMP] = s[i*3+1];
2639 dst[i][BCOMP] = s[i*3+0];
2640 dst[i][ACOMP] = 0xff;
2641 }
2642 }
2643
2644 static void
2645 unpack_ubyte_BGR888(const void *src, GLubyte dst[][4], GLuint n)
2646 {
2647 const GLubyte *s = (const GLubyte *) src;
2648 GLuint i;
2649 for (i = 0; i < n; i++) {
2650 dst[i][RCOMP] = s[i*3+0];
2651 dst[i][GCOMP] = s[i*3+1];
2652 dst[i][BCOMP] = s[i*3+2];
2653 dst[i][ACOMP] = 0xff;
2654 }
2655 }
2656
2657 static void
2658 unpack_ubyte_RGB565(const void *src, GLubyte dst[][4], GLuint n)
2659 {
2660 const GLushort *s = ((const GLushort *) src);
2661 GLuint i;
2662 for (i = 0; i < n; i++) {
2663 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f);
2664 dst[i][GCOMP] = EXPAND_6_8((s[i] >> 5 ) & 0x3f);
2665 dst[i][BCOMP] = EXPAND_5_8( s[i] & 0x1f);
2666 dst[i][ACOMP] = 0xff;
2667 }
2668 }
2669
2670 static void
2671 unpack_ubyte_RGB565_REV(const void *src, GLubyte dst[][4], GLuint n)
2672 {
2673 const GLushort *s = ((const GLushort *) src);
2674 GLuint i;
2675 for (i = 0; i < n; i++) {
2676 GLuint t = (s[i] >> 8) | (s[i] << 8); /* byte swap */
2677 dst[i][RCOMP] = EXPAND_5_8((t >> 11) & 0x1f);
2678 dst[i][GCOMP] = EXPAND_6_8((t >> 5 ) & 0x3f);
2679 dst[i][BCOMP] = EXPAND_5_8( t & 0x1f);
2680 dst[i][ACOMP] = 0xff;
2681 }
2682 }
2683
2684 static void
2685 unpack_ubyte_ARGB4444(const void *src, GLubyte dst[][4], GLuint n)
2686 {
2687 const GLushort *s = ((const GLushort *) src);
2688 GLuint i;
2689 for (i = 0; i < n; i++) {
2690 dst[i][RCOMP] = EXPAND_4_8((s[i] >> 8) & 0xf);
2691 dst[i][GCOMP] = EXPAND_4_8((s[i] >> 4) & 0xf);
2692 dst[i][BCOMP] = EXPAND_4_8((s[i] ) & 0xf);
2693 dst[i][ACOMP] = EXPAND_4_8((s[i] >> 12) & 0xf);
2694 }
2695 }
2696
2697 static void
2698 unpack_ubyte_ARGB4444_REV(const void *src, GLubyte dst[][4], GLuint n)
2699 {
2700 const GLushort *s = ((const GLushort *) src);
2701 GLuint i;
2702 for (i = 0; i < n; i++) {
2703 dst[i][RCOMP] = EXPAND_4_8((s[i] ) & 0xf);
2704 dst[i][GCOMP] = EXPAND_4_8((s[i] >> 12) & 0xf);
2705 dst[i][BCOMP] = EXPAND_4_8((s[i] >> 8) & 0xf);
2706 dst[i][ACOMP] = EXPAND_4_8((s[i] >> 4) & 0xf);
2707 }
2708 }
2709
2710 static void
2711 unpack_ubyte_RGBA5551(const void *src, GLubyte dst[][4], GLuint n)
2712 {
2713 const GLushort *s = ((const GLushort *) src);
2714 GLuint i;
2715 for (i = 0; i < n; i++) {
2716 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f);
2717 dst[i][GCOMP] = EXPAND_5_8((s[i] >> 6) & 0x1f);
2718 dst[i][BCOMP] = EXPAND_5_8((s[i] >> 1) & 0x1f);
2719 dst[i][ACOMP] = EXPAND_1_8((s[i] ) & 0x01);
2720 }
2721 }
2722
2723 static void
2724 unpack_ubyte_ARGB1555(const void *src, GLubyte dst[][4], GLuint n)
2725 {
2726 const GLushort *s = ((const GLushort *) src);
2727 GLuint i;
2728 for (i = 0; i < n; i++) {
2729 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 10) & 0x1f);
2730 dst[i][GCOMP] = EXPAND_5_8((s[i] >> 5) & 0x1f);
2731 dst[i][BCOMP] = EXPAND_5_8((s[i] >> 0) & 0x1f);
2732 dst[i][ACOMP] = EXPAND_1_8((s[i] >> 15) & 0x01);
2733 }
2734 }
2735
2736 static void
2737 unpack_ubyte_ARGB1555_REV(const void *src, GLubyte dst[][4], GLuint n)
2738 {
2739 const GLushort *s = ((const GLushort *) src);
2740 GLuint i;
2741 for (i = 0; i < n; i++) {
2742 GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */
2743 dst[i][RCOMP] = EXPAND_5_8((tmp >> 10) & 0x1f);
2744 dst[i][GCOMP] = EXPAND_5_8((tmp >> 5) & 0x1f);
2745 dst[i][BCOMP] = EXPAND_5_8((tmp >> 0) & 0x1f);
2746 dst[i][ACOMP] = EXPAND_1_8((tmp >> 15) & 0x01);
2747 }
2748 }
2749
2750 static void
2751 unpack_ubyte_AL44(const void *src, GLubyte dst[][4], GLuint n)
2752 {
2753 const GLubyte *s = ((const GLubyte *) src);
2754 GLuint i;
2755 for (i = 0; i < n; i++) {
2756 dst[i][RCOMP] =
2757 dst[i][GCOMP] =
2758 dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xf);
2759 dst[i][ACOMP] = EXPAND_4_8(s[i] >> 4);
2760 }
2761 }
2762
2763 static void
2764 unpack_ubyte_AL88(const void *src, GLubyte dst[][4], GLuint n)
2765 {
2766 const GLushort *s = ((const GLushort *) src);
2767 GLuint i;
2768 for (i = 0; i < n; i++) {
2769 dst[i][RCOMP] =
2770 dst[i][GCOMP] =
2771 dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xff);
2772 dst[i][ACOMP] = EXPAND_4_8(s[i] >> 8);
2773 }
2774 }
2775
2776 static void
2777 unpack_ubyte_AL88_REV(const void *src, GLubyte dst[][4], GLuint n)
2778 {
2779 const GLushort *s = ((const GLushort *) src);
2780 GLuint i;
2781 for (i = 0; i < n; i++) {
2782 dst[i][RCOMP] =
2783 dst[i][GCOMP] =
2784 dst[i][BCOMP] = EXPAND_4_8(s[i] >> 8);
2785 dst[i][ACOMP] = EXPAND_4_8(s[i] & 0xff);
2786 }
2787 }
2788
2789 static void
2790 unpack_ubyte_RGB332(const void *src, GLubyte dst[][4], GLuint n)
2791 {
2792 const GLubyte *s = ((const GLubyte *) src);
2793 GLuint i;
2794 for (i = 0; i < n; i++) {
2795 dst[i][RCOMP] = EXPAND_3_8((s[i] >> 5) & 0x7);
2796 dst[i][GCOMP] = EXPAND_3_8((s[i] >> 2) & 0x7);
2797 dst[i][BCOMP] = EXPAND_2_8((s[i] ) & 0x3);
2798 dst[i][ACOMP] = 0xff;
2799 }
2800 }
2801
2802 static void
2803 unpack_ubyte_A8(const void *src, GLubyte dst[][4], GLuint n)
2804 {
2805 const GLubyte *s = ((const GLubyte *) src);
2806 GLuint i;
2807 for (i = 0; i < n; i++) {
2808 dst[i][RCOMP] =
2809 dst[i][GCOMP] =
2810 dst[i][BCOMP] = 0;
2811 dst[i][ACOMP] = s[i];
2812 }
2813 }
2814
2815 static void
2816 unpack_ubyte_L8(const void *src, GLubyte dst[][4], GLuint n)
2817 {
2818 const GLubyte *s = ((const GLubyte *) src);
2819 GLuint i;
2820 for (i = 0; i < n; i++) {
2821 dst[i][RCOMP] =
2822 dst[i][GCOMP] =
2823 dst[i][BCOMP] = s[i];
2824 dst[i][ACOMP] = 0xff;
2825 }
2826 }
2827
2828
2829 static void
2830 unpack_ubyte_I8(const void *src, GLubyte dst[][4], GLuint n)
2831 {
2832 const GLubyte *s = ((const GLubyte *) src);
2833 GLuint i;
2834 for (i = 0; i < n; i++) {
2835 dst[i][RCOMP] =
2836 dst[i][GCOMP] =
2837 dst[i][BCOMP] =
2838 dst[i][ACOMP] = s[i];
2839 }
2840 }
2841
2842 static void
2843 unpack_ubyte_R8(const void *src, GLubyte dst[][4], GLuint n)
2844 {
2845 const GLubyte *s = ((const GLubyte *) src);
2846 GLuint i;
2847 for (i = 0; i < n; i++) {
2848 dst[i][0] = s[i];
2849 dst[i][1] =
2850 dst[i][2] = 0;
2851 dst[i][3] = 0xff;
2852 }
2853 }
2854
2855 static void
2856 unpack_ubyte_GR88(const void *src, GLubyte dst[][4], GLuint n)
2857 {
2858 const GLushort *s = ((const GLushort *) src);
2859 GLuint i;
2860 for (i = 0; i < n; i++) {
2861 dst[i][RCOMP] = s[i] & 0xff;
2862 dst[i][GCOMP] = s[i] >> 8;
2863 dst[i][BCOMP] = 0;
2864 dst[i][ACOMP] = 0xff;
2865 }
2866 }
2867
2868 static void
2869 unpack_ubyte_RG88(const void *src, GLubyte dst[][4], GLuint n)
2870 {
2871 const GLushort *s = ((const GLushort *) src);
2872 GLuint i;
2873 for (i = 0; i < n; i++) {
2874 dst[i][RCOMP] = s[i] >> 8;
2875 dst[i][GCOMP] = s[i] & 0xff;
2876 dst[i][BCOMP] = 0;
2877 dst[i][ACOMP] = 0xff;
2878 }
2879 }
2880
2881
2882 /**
2883 * Unpack rgba colors, returning as GLubyte values. This should usually
2884 * only be used for unpacking formats that use 8 bits or less per channel.
2885 */
2886 void
2887 _mesa_unpack_ubyte_rgba_row(gl_format format, GLuint n,
2888 const void *src, GLubyte dst[][4])
2889 {
2890 switch (format) {
2891 case MESA_FORMAT_RGBA8888:
2892 unpack_ubyte_RGBA8888(src, dst, n);
2893 break;
2894 case MESA_FORMAT_RGBA8888_REV:
2895 unpack_ubyte_RGBA8888_REV(src, dst, n);
2896 break;
2897 case MESA_FORMAT_ARGB8888:
2898 unpack_ubyte_ARGB8888(src, dst, n);
2899 break;
2900 case MESA_FORMAT_ARGB8888_REV:
2901 unpack_ubyte_ARGB8888_REV(src, dst, n);
2902 break;
2903 case MESA_FORMAT_RGBX8888:
2904 unpack_ubyte_RGBX8888(src, dst, n);
2905 break;
2906 case MESA_FORMAT_RGBX8888_REV:
2907 unpack_ubyte_RGBX8888_REV(src, dst, n);
2908 break;
2909 case MESA_FORMAT_XRGB8888:
2910 unpack_ubyte_XRGB8888(src, dst, n);
2911 break;
2912 case MESA_FORMAT_XRGB8888_REV:
2913 unpack_ubyte_XRGB8888_REV(src, dst, n);
2914 break;
2915 case MESA_FORMAT_RGB888:
2916 unpack_ubyte_RGB888(src, dst, n);
2917 break;
2918 case MESA_FORMAT_BGR888:
2919 unpack_ubyte_BGR888(src, dst, n);
2920 break;
2921 case MESA_FORMAT_RGB565:
2922 unpack_ubyte_RGB565(src, dst, n);
2923 break;
2924 case MESA_FORMAT_RGB565_REV:
2925 unpack_ubyte_RGB565_REV(src, dst, n);
2926 break;
2927 case MESA_FORMAT_ARGB4444:
2928 unpack_ubyte_ARGB4444(src, dst, n);
2929 break;
2930 case MESA_FORMAT_ARGB4444_REV:
2931 unpack_ubyte_ARGB4444_REV(src, dst, n);
2932 break;
2933 case MESA_FORMAT_RGBA5551:
2934 unpack_ubyte_RGBA5551(src, dst, n);
2935 break;
2936 case MESA_FORMAT_ARGB1555:
2937 unpack_ubyte_ARGB1555(src, dst, n);
2938 break;
2939 case MESA_FORMAT_ARGB1555_REV:
2940 unpack_ubyte_ARGB1555_REV(src, dst, n);
2941 break;
2942 case MESA_FORMAT_AL44:
2943 unpack_ubyte_AL44(src, dst, n);
2944 break;
2945 case MESA_FORMAT_AL88:
2946 unpack_ubyte_AL88(src, dst, n);
2947 break;
2948 case MESA_FORMAT_AL88_REV:
2949 unpack_ubyte_AL88_REV(src, dst, n);
2950 break;
2951 case MESA_FORMAT_RGB332:
2952 unpack_ubyte_RGB332(src, dst, n);
2953 break;
2954 case MESA_FORMAT_A8:
2955 unpack_ubyte_A8(src, dst, n);
2956 break;
2957 case MESA_FORMAT_L8:
2958 unpack_ubyte_L8(src, dst, n);
2959 break;
2960 case MESA_FORMAT_I8:
2961 unpack_ubyte_I8(src, dst, n);
2962 break;
2963 case MESA_FORMAT_R8:
2964 unpack_ubyte_R8(src, dst, n);
2965 break;
2966 case MESA_FORMAT_GR88:
2967 unpack_ubyte_GR88(src, dst, n);
2968 break;
2969 case MESA_FORMAT_RG88:
2970 unpack_ubyte_RG88(src, dst, n);
2971 break;
2972 default:
2973 /* get float values, convert to ubyte */
2974 {
2975 GLfloat *tmp = malloc(n * 4 * sizeof(GLfloat));
2976 if (tmp) {
2977 GLuint i;
2978 _mesa_unpack_rgba_row(format, n, src, (GLfloat (*)[4]) tmp);
2979 for (i = 0; i < n; i++) {
2980 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][0], tmp[i*4+0]);
2981 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][1], tmp[i*4+1]);
2982 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][2], tmp[i*4+2]);
2983 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][3], tmp[i*4+3]);
2984 }
2985 free(tmp);
2986 }
2987 }
2988 break;
2989 }
2990 }
2991
2992
2993 /**********************************************************************/
2994 /* Unpack, returning GLuint colors */
2995 /**********************************************************************/
2996
2997 static void
2998 unpack_int_rgba_RGBA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
2999 {
3000 memcpy(dst, src, n * 4 * sizeof(GLuint));
3001 }
3002
3003 static void
3004 unpack_int_rgba_RGBA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3005 {
3006 unsigned int i;
3007
3008 for (i = 0; i < n; i++) {
3009 dst[i][0] = src[i * 4 + 0];
3010 dst[i][1] = src[i * 4 + 1];
3011 dst[i][2] = src[i * 4 + 2];
3012 dst[i][3] = src[i * 4 + 3];
3013 }
3014 }
3015
3016 static void
3017 unpack_int_rgba_RGBA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3018 {
3019 unsigned int i;
3020
3021 for (i = 0; i < n; i++) {
3022 dst[i][0] = src[i * 4 + 0];
3023 dst[i][1] = src[i * 4 + 1];
3024 dst[i][2] = src[i * 4 + 2];
3025 dst[i][3] = src[i * 4 + 3];
3026 }
3027 }
3028
3029 static void
3030 unpack_int_rgba_RGBA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3031 {
3032 unsigned int i;
3033
3034 for (i = 0; i < n; i++) {
3035 dst[i][0] = src[i * 4 + 0];
3036 dst[i][1] = src[i * 4 + 1];
3037 dst[i][2] = src[i * 4 + 2];
3038 dst[i][3] = src[i * 4 + 3];
3039 }
3040 }
3041
3042 static void
3043 unpack_int_rgba_RGBA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3044 {
3045 unsigned int i;
3046
3047 for (i = 0; i < n; i++) {
3048 dst[i][0] = src[i * 4 + 0];
3049 dst[i][1] = src[i * 4 + 1];
3050 dst[i][2] = src[i * 4 + 2];
3051 dst[i][3] = src[i * 4 + 3];
3052 }
3053 }
3054
3055 static void
3056 unpack_int_rgba_ARGB8888(const GLbyte *src, GLuint dst[][4], GLuint n)
3057 {
3058 unsigned int i;
3059
3060 for (i = 0; i < n; i++) {
3061 dst[i][RCOMP] = (GLubyte) src[i * 4 + 2];
3062 dst[i][GCOMP] = (GLubyte) src[i * 4 + 1];
3063 dst[i][BCOMP] = (GLubyte) src[i * 4 + 0];
3064 dst[i][ACOMP] = (GLubyte) src[i * 4 + 3];
3065 }
3066 }
3067
3068 static void
3069 unpack_int_rgba_XRGB8888(const GLbyte *src, GLuint dst[][4], GLuint n)
3070 {
3071 unsigned int i;
3072
3073 for (i = 0; i < n; i++) {
3074 dst[i][RCOMP] = (GLubyte) src[i * 4 + 2];
3075 dst[i][GCOMP] = (GLubyte) src[i * 4 + 1];
3076 dst[i][BCOMP] = (GLubyte) src[i * 4 + 0];
3077 dst[i][ACOMP] = (GLubyte) 0xff;
3078 }
3079 }
3080
3081 static void
3082 unpack_int_rgba_RGB_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3083 {
3084 unsigned int i;
3085
3086 for (i = 0; i < n; i++) {
3087 dst[i][0] = src[i * 3 + 0];
3088 dst[i][1] = src[i * 3 + 1];
3089 dst[i][2] = src[i * 3 + 2];
3090 dst[i][3] = 1;
3091 }
3092 }
3093
3094 static void
3095 unpack_int_rgba_RGB_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3096 {
3097 unsigned int i;
3098
3099 for (i = 0; i < n; i++) {
3100 dst[i][0] = src[i * 3 + 0];
3101 dst[i][1] = src[i * 3 + 1];
3102 dst[i][2] = src[i * 3 + 2];
3103 dst[i][3] = 1;
3104 }
3105 }
3106
3107 static void
3108 unpack_int_rgba_RGB_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3109 {
3110 unsigned int i;
3111
3112 for (i = 0; i < n; i++) {
3113 dst[i][0] = src[i * 3 + 0];
3114 dst[i][1] = src[i * 3 + 1];
3115 dst[i][2] = src[i * 3 + 2];
3116 dst[i][3] = 1;
3117 }
3118 }
3119
3120 static void
3121 unpack_int_rgba_RGB_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3122 {
3123 unsigned int i;
3124
3125 for (i = 0; i < n; i++) {
3126 dst[i][0] = src[i * 3 + 0];
3127 dst[i][1] = src[i * 3 + 1];
3128 dst[i][2] = src[i * 3 + 2];
3129 dst[i][3] = 1;
3130 }
3131 }
3132
3133 static void
3134 unpack_int_rgba_RGB_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3135 {
3136 unsigned int i;
3137
3138 for (i = 0; i < n; i++) {
3139 dst[i][0] = src[i * 3 + 0];
3140 dst[i][1] = src[i * 3 + 1];
3141 dst[i][2] = src[i * 3 + 2];
3142 dst[i][3] = 1;
3143 }
3144 }
3145
3146 static void
3147 unpack_int_rgba_RG_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3148 {
3149 unsigned int i;
3150
3151 for (i = 0; i < n; i++) {
3152 dst[i][0] = src[i * 2 + 0];
3153 dst[i][1] = src[i * 2 + 1];
3154 dst[i][2] = 0;
3155 dst[i][3] = 1;
3156 }
3157 }
3158
3159 static void
3160 unpack_int_rgba_RG_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3161 {
3162 unsigned int i;
3163
3164 for (i = 0; i < n; i++) {
3165 dst[i][0] = src[i * 2 + 0];
3166 dst[i][1] = src[i * 2 + 1];
3167 dst[i][2] = 0;
3168 dst[i][3] = 1;
3169 }
3170 }
3171
3172 static void
3173 unpack_int_rgba_RG_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3174 {
3175 unsigned int i;
3176
3177 for (i = 0; i < n; i++) {
3178 dst[i][0] = src[i * 2 + 0];
3179 dst[i][1] = src[i * 2 + 1];
3180 dst[i][2] = 0;
3181 dst[i][3] = 1;
3182 }
3183 }
3184
3185 static void
3186 unpack_int_rgba_RG_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3187 {
3188 unsigned int i;
3189
3190 for (i = 0; i < n; i++) {
3191 dst[i][0] = src[i * 2 + 0];
3192 dst[i][1] = src[i * 2 + 1];
3193 dst[i][2] = 0;
3194 dst[i][3] = 1;
3195 }
3196 }
3197
3198 static void
3199 unpack_int_rgba_RG_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3200 {
3201 unsigned int i;
3202
3203 for (i = 0; i < n; i++) {
3204 dst[i][0] = src[i * 2 + 0];
3205 dst[i][1] = src[i * 2 + 1];
3206 dst[i][2] = 0;
3207 dst[i][3] = 1;
3208 }
3209 }
3210
3211 static void
3212 unpack_int_rgba_R_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3213 {
3214 unsigned int i;
3215
3216 for (i = 0; i < n; i++) {
3217 dst[i][0] = src[i];
3218 dst[i][1] = 0;
3219 dst[i][2] = 0;
3220 dst[i][3] = 1;
3221 }
3222 }
3223
3224 static void
3225 unpack_int_rgba_R_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3226 {
3227 unsigned int i;
3228
3229 for (i = 0; i < n; i++) {
3230 dst[i][0] = src[i];
3231 dst[i][1] = 0;
3232 dst[i][2] = 0;
3233 dst[i][3] = 1;
3234 }
3235 }
3236
3237 static void
3238 unpack_int_rgba_R_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3239 {
3240 unsigned int i;
3241
3242 for (i = 0; i < n; i++) {
3243 dst[i][0] = src[i];
3244 dst[i][1] = 0;
3245 dst[i][2] = 0;
3246 dst[i][3] = 1;
3247 }
3248 }
3249
3250 static void
3251 unpack_int_rgba_R_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3252 {
3253 unsigned int i;
3254
3255 for (i = 0; i < n; i++) {
3256 dst[i][0] = src[i];
3257 dst[i][1] = 0;
3258 dst[i][2] = 0;
3259 dst[i][3] = 1;
3260 }
3261 }
3262
3263 static void
3264 unpack_int_rgba_R_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3265 {
3266 unsigned int i;
3267
3268 for (i = 0; i < n; i++) {
3269 dst[i][0] = src[i];
3270 dst[i][1] = 0;
3271 dst[i][2] = 0;
3272 dst[i][3] = 1;
3273 }
3274 }
3275
3276 static void
3277 unpack_int_rgba_ALPHA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3278 {
3279 unsigned int i;
3280
3281 for (i = 0; i < n; i++) {
3282 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3283 dst[i][3] = src[i];
3284 }
3285 }
3286
3287 static void
3288 unpack_int_rgba_ALPHA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3289 {
3290 unsigned int i;
3291
3292 for (i = 0; i < n; i++) {
3293 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3294 dst[i][3] = src[i];
3295 }
3296 }
3297
3298 static void
3299 unpack_int_rgba_ALPHA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3300 {
3301 unsigned int i;
3302
3303 for (i = 0; i < n; i++) {
3304 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3305 dst[i][3] = src[i];
3306 }
3307 }
3308
3309 static void
3310 unpack_int_rgba_ALPHA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3311 {
3312 unsigned int i;
3313
3314 for (i = 0; i < n; i++) {
3315 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3316 dst[i][3] = src[i];
3317 }
3318 }
3319
3320 static void
3321 unpack_int_rgba_ALPHA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3322 {
3323 unsigned int i;
3324
3325 for (i = 0; i < n; i++) {
3326 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3327 dst[i][3] = src[i];
3328 }
3329 }
3330
3331 static void
3332 unpack_int_rgba_LUMINANCE_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3333 {
3334 unsigned int i;
3335
3336 for (i = 0; i < n; i++) {
3337 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3338 dst[i][3] = 1;
3339 }
3340 }
3341
3342 static void
3343 unpack_int_rgba_LUMINANCE_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3344 {
3345 unsigned int i;
3346
3347 for (i = 0; i < n; i++) {
3348 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3349 dst[i][3] = 1;
3350 }
3351 }
3352
3353 static void
3354 unpack_int_rgba_LUMINANCE_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3355 {
3356 unsigned int i;
3357
3358 for (i = 0; i < n; i++) {
3359 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3360 dst[i][3] = 1;
3361 }
3362 }
3363
3364 static void
3365 unpack_int_rgba_LUMINANCE_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3366 {
3367 unsigned int i;
3368
3369 for (i = 0; i < n; i++) {
3370 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3371 dst[i][3] = 1;
3372 }
3373 }
3374
3375 static void
3376 unpack_int_rgba_LUMINANCE_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3377 {
3378 unsigned int i;
3379
3380 for (i = 0; i < n; i++) {
3381 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3382 dst[i][3] = 1;
3383 }
3384 }
3385
3386
3387 static void
3388 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3389 {
3390 unsigned int i;
3391
3392 for (i = 0; i < n; i++) {
3393 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3394 dst[i][3] = src[i * 2 + 1];
3395 }
3396 }
3397
3398 static void
3399 unpack_int_rgba_LUMINANCE_ALPHA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3400 {
3401 unsigned int i;
3402
3403 for (i = 0; i < n; i++) {
3404 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3405 dst[i][3] = src[i * 2 + 1];
3406 }
3407 }
3408
3409 static void
3410 unpack_int_rgba_LUMINANCE_ALPHA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3411 {
3412 unsigned int i;
3413
3414 for (i = 0; i < n; i++) {
3415 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3416 dst[i][3] = src[i * 2 + 1];
3417 }
3418 }
3419
3420 static void
3421 unpack_int_rgba_LUMINANCE_ALPHA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3422 {
3423 unsigned int i;
3424
3425 for (i = 0; i < n; i++) {
3426 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3427 dst[i][3] = src[i * 2 + 1];
3428 }
3429 }
3430
3431 static void
3432 unpack_int_rgba_LUMINANCE_ALPHA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3433 {
3434 unsigned int i;
3435
3436 for (i = 0; i < n; i++) {
3437 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3438 dst[i][3] = src[i * 2 + 1];
3439 }
3440 }
3441
3442 static void
3443 unpack_int_rgba_INTENSITY_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3444 {
3445 unsigned int i;
3446
3447 for (i = 0; i < n; i++) {
3448 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3449 }
3450 }
3451
3452 static void
3453 unpack_int_rgba_INTENSITY_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3454 {
3455 unsigned int i;
3456
3457 for (i = 0; i < n; i++) {
3458 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3459 }
3460 }
3461
3462 static void
3463 unpack_int_rgba_INTENSITY_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3464 {
3465 unsigned int i;
3466
3467 for (i = 0; i < n; i++) {
3468 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3469 }
3470 }
3471
3472 static void
3473 unpack_int_rgba_INTENSITY_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3474 {
3475 unsigned int i;
3476
3477 for (i = 0; i < n; i++) {
3478 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3479 }
3480 }
3481
3482 static void
3483 unpack_int_rgba_INTENSITY_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3484 {
3485 unsigned int i;
3486
3487 for (i = 0; i < n; i++) {
3488 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3489 }
3490 }
3491
3492 static void
3493 unpack_int_rgba_ARGB2101010_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
3494 {
3495 unsigned int i;
3496
3497 for (i = 0; i < n; i++) {
3498 GLuint tmp = src[i];
3499 dst[i][0] = (tmp >> 20) & 0x3ff;
3500 dst[i][1] = (tmp >> 10) & 0x3ff;
3501 dst[i][2] = (tmp >> 0) & 0x3ff;
3502 dst[i][3] = (tmp >> 30) & 0x3;
3503 }
3504 }
3505
3506 static void
3507 unpack_int_rgba_ABGR2101010_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
3508 {
3509 unsigned int i;
3510
3511 for (i = 0; i < n; i++) {
3512 GLuint tmp = src[i];
3513 dst[i][0] = (tmp >> 0) & 0x3ff;
3514 dst[i][1] = (tmp >> 10) & 0x3ff;
3515 dst[i][2] = (tmp >> 20) & 0x3ff;
3516 dst[i][3] = (tmp >> 30) & 0x3;
3517 }
3518 }
3519
3520 static void
3521 unpack_int_rgba_ARGB2101010(const GLuint *src, GLuint dst[][4], GLuint n)
3522 {
3523 unsigned int i;
3524
3525 for (i = 0; i < n; i++) {
3526 GLuint tmp = src[i];
3527 dst[i][0] = (tmp >> 20) & 0x3ff;
3528 dst[i][1] = (tmp >> 10) & 0x3ff;
3529 dst[i][2] = (tmp >> 0) & 0x3ff;
3530 dst[i][3] = (tmp >> 30) & 0x3;
3531 }
3532 }
3533
3534 static void
3535 unpack_int_rgba_XBGR8888_UINT(const GLubyte *src, GLuint dst[][4], GLuint n)
3536 {
3537 unsigned int i;
3538
3539 for (i = 0; i < n; i++) {
3540 dst[i][0] = src[i * 4 + 0];
3541 dst[i][1] = src[i * 4 + 1];
3542 dst[i][2] = src[i * 4 + 2];
3543 dst[i][3] = 1;
3544 }
3545 }
3546
3547 static void
3548 unpack_int_rgba_XBGR8888_SINT(const GLbyte *src, GLuint dst[][4], GLuint n)
3549 {
3550 unsigned int i;
3551
3552 for (i = 0; i < n; i++) {
3553 dst[i][0] = src[i * 4 + 0];
3554 dst[i][1] = src[i * 4 + 1];
3555 dst[i][2] = src[i * 4 + 2];
3556 dst[i][3] = 1;
3557 }
3558 }
3559
3560 static void
3561 unpack_int_rgba_XBGR16161616_UINT(const GLushort *src, GLuint dst[][4], GLuint n)
3562 {
3563 unsigned int i;
3564
3565 for (i = 0; i < n; i++) {
3566 dst[i][0] = src[i * 4 + 0];
3567 dst[i][1] = src[i * 4 + 1];
3568 dst[i][2] = src[i * 4 + 2];
3569 dst[i][3] = 1;
3570 }
3571 }
3572
3573 static void
3574 unpack_int_rgba_XBGR16161616_SINT(const GLshort *src, GLuint dst[][4], GLuint n)
3575 {
3576 unsigned int i;
3577
3578 for (i = 0; i < n; i++) {
3579 dst[i][0] = src[i * 4 + 0];
3580 dst[i][1] = src[i * 4 + 1];
3581 dst[i][2] = src[i * 4 + 2];
3582 dst[i][3] = 1;
3583 }
3584 }
3585
3586 static void
3587 unpack_int_rgba_XBGR32323232_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
3588 {
3589 unsigned int i;
3590
3591 for (i = 0; i < n; i++) {
3592 dst[i][0] = src[i * 4 + 0];
3593 dst[i][1] = src[i * 4 + 1];
3594 dst[i][2] = src[i * 4 + 2];
3595 dst[i][3] = 1;
3596 }
3597 }
3598
3599 static void
3600 unpack_int_rgba_ABGR2101010(const GLuint *src, GLuint dst[][4], GLuint n)
3601 {
3602 unsigned int i;
3603
3604 for (i = 0; i < n; i++) {
3605 GLuint tmp = src[i];
3606 dst[i][0] = (tmp >> 0) & 0x3ff;
3607 dst[i][1] = (tmp >> 10) & 0x3ff;
3608 dst[i][2] = (tmp >> 20) & 0x3ff;
3609 dst[i][3] = (tmp >> 30) & 0x3;
3610 }
3611 }
3612
3613 void
3614 _mesa_unpack_uint_rgba_row(gl_format format, GLuint n,
3615 const void *src, GLuint dst[][4])
3616 {
3617 switch (format) {
3618 /* Since there won't be any sign extension happening, there's no need to
3619 * make separate paths for 32-bit-to-32-bit integer unpack.
3620 */
3621 case MESA_FORMAT_RGBA_UINT32:
3622 case MESA_FORMAT_RGBA_INT32:
3623 unpack_int_rgba_RGBA_UINT32(src, dst, n);
3624 break;
3625
3626 case MESA_FORMAT_RGBA_UINT16:
3627 unpack_int_rgba_RGBA_UINT16(src, dst, n);
3628 break;
3629 case MESA_FORMAT_RGBA_INT16:
3630 unpack_int_rgba_RGBA_INT16(src, dst, n);
3631 break;
3632
3633 case MESA_FORMAT_RGBA_UINT8:
3634 unpack_int_rgba_RGBA_UINT8(src, dst, n);
3635 break;
3636 case MESA_FORMAT_RGBA_INT8:
3637 unpack_int_rgba_RGBA_INT8(src, dst, n);
3638 break;
3639
3640 case MESA_FORMAT_ARGB8888:
3641 unpack_int_rgba_ARGB8888(src, dst, n);
3642 break;
3643
3644 case MESA_FORMAT_XRGB8888:
3645 unpack_int_rgba_XRGB8888(src, dst, n);
3646 break;
3647
3648 case MESA_FORMAT_RGB_UINT32:
3649 case MESA_FORMAT_RGB_INT32:
3650 unpack_int_rgba_RGB_UINT32(src, dst, n);
3651 break;
3652
3653 case MESA_FORMAT_RGB_UINT16:
3654 unpack_int_rgba_RGB_UINT16(src, dst, n);
3655 break;
3656 case MESA_FORMAT_RGB_INT16:
3657 unpack_int_rgba_RGB_INT16(src, dst, n);
3658 break;
3659
3660 case MESA_FORMAT_RGB_UINT8:
3661 unpack_int_rgba_RGB_UINT8(src, dst, n);
3662 break;
3663 case MESA_FORMAT_RGB_INT8:
3664 unpack_int_rgba_RGB_INT8(src, dst, n);
3665 break;
3666
3667 case MESA_FORMAT_RG_UINT32:
3668 case MESA_FORMAT_RG_INT32:
3669 unpack_int_rgba_RG_UINT32(src, dst, n);
3670 break;
3671
3672 case MESA_FORMAT_RG_UINT16:
3673 unpack_int_rgba_RG_UINT16(src, dst, n);
3674 break;
3675 case MESA_FORMAT_RG_INT16:
3676 unpack_int_rgba_RG_INT16(src, dst, n);
3677 break;
3678
3679 case MESA_FORMAT_RG_UINT8:
3680 unpack_int_rgba_RG_UINT8(src, dst, n);
3681 break;
3682 case MESA_FORMAT_RG_INT8:
3683 unpack_int_rgba_RG_INT8(src, dst, n);
3684 break;
3685
3686 case MESA_FORMAT_R_UINT32:
3687 case MESA_FORMAT_R_INT32:
3688 unpack_int_rgba_R_UINT32(src, dst, n);
3689 break;
3690
3691 case MESA_FORMAT_R_UINT16:
3692 unpack_int_rgba_R_UINT16(src, dst, n);
3693 break;
3694 case MESA_FORMAT_R_INT16:
3695 unpack_int_rgba_R_INT16(src, dst, n);
3696 break;
3697
3698 case MESA_FORMAT_R_UINT8:
3699 unpack_int_rgba_R_UINT8(src, dst, n);
3700 break;
3701 case MESA_FORMAT_R_INT8:
3702 unpack_int_rgba_R_INT8(src, dst, n);
3703 break;
3704
3705 case MESA_FORMAT_ALPHA_UINT32:
3706 case MESA_FORMAT_ALPHA_INT32:
3707 unpack_int_rgba_ALPHA_UINT32(src, dst, n);
3708 break;
3709
3710 case MESA_FORMAT_ALPHA_UINT16:
3711 unpack_int_rgba_ALPHA_UINT16(src, dst, n);
3712 break;
3713 case MESA_FORMAT_ALPHA_INT16:
3714 unpack_int_rgba_ALPHA_INT16(src, dst, n);
3715 break;
3716
3717 case MESA_FORMAT_ALPHA_UINT8:
3718 unpack_int_rgba_ALPHA_UINT8(src, dst, n);
3719 break;
3720 case MESA_FORMAT_ALPHA_INT8:
3721 unpack_int_rgba_ALPHA_INT8(src, dst, n);
3722 break;
3723
3724 case MESA_FORMAT_LUMINANCE_UINT32:
3725 case MESA_FORMAT_LUMINANCE_INT32:
3726 unpack_int_rgba_LUMINANCE_UINT32(src, dst, n);
3727 break;
3728 case MESA_FORMAT_LUMINANCE_UINT16:
3729 unpack_int_rgba_LUMINANCE_UINT16(src, dst, n);
3730 break;
3731 case MESA_FORMAT_LUMINANCE_INT16:
3732 unpack_int_rgba_LUMINANCE_INT16(src, dst, n);
3733 break;
3734
3735 case MESA_FORMAT_LUMINANCE_UINT8:
3736 unpack_int_rgba_LUMINANCE_UINT8(src, dst, n);
3737 break;
3738 case MESA_FORMAT_LUMINANCE_INT8:
3739 unpack_int_rgba_LUMINANCE_INT8(src, dst, n);
3740 break;
3741
3742 case MESA_FORMAT_LUMINANCE_ALPHA_UINT32:
3743 case MESA_FORMAT_LUMINANCE_ALPHA_INT32:
3744 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(src, dst, n);
3745 break;
3746
3747 case MESA_FORMAT_LUMINANCE_ALPHA_UINT16:
3748 unpack_int_rgba_LUMINANCE_ALPHA_UINT16(src, dst, n);
3749 break;
3750 case MESA_FORMAT_LUMINANCE_ALPHA_INT16:
3751 unpack_int_rgba_LUMINANCE_ALPHA_INT16(src, dst, n);
3752 break;
3753
3754 case MESA_FORMAT_LUMINANCE_ALPHA_UINT8:
3755 unpack_int_rgba_LUMINANCE_ALPHA_UINT8(src, dst, n);
3756 break;
3757 case MESA_FORMAT_LUMINANCE_ALPHA_INT8:
3758 unpack_int_rgba_LUMINANCE_ALPHA_INT8(src, dst, n);
3759 break;
3760
3761 case MESA_FORMAT_INTENSITY_UINT32:
3762 case MESA_FORMAT_INTENSITY_INT32:
3763 unpack_int_rgba_INTENSITY_UINT32(src, dst, n);
3764 break;
3765
3766 case MESA_FORMAT_INTENSITY_UINT16:
3767 unpack_int_rgba_INTENSITY_UINT16(src, dst, n);
3768 break;
3769 case MESA_FORMAT_INTENSITY_INT16:
3770 unpack_int_rgba_INTENSITY_INT16(src, dst, n);
3771 break;
3772
3773 case MESA_FORMAT_INTENSITY_UINT8:
3774 unpack_int_rgba_INTENSITY_UINT8(src, dst, n);
3775 break;
3776 case MESA_FORMAT_INTENSITY_INT8:
3777 unpack_int_rgba_INTENSITY_INT8(src, dst, n);
3778 break;
3779
3780 case MESA_FORMAT_ARGB2101010_UINT:
3781 unpack_int_rgba_ARGB2101010_UINT(src, dst, n);
3782 break;
3783
3784 case MESA_FORMAT_ABGR2101010_UINT:
3785 unpack_int_rgba_ABGR2101010_UINT(src, dst, n);
3786 break;
3787
3788 case MESA_FORMAT_ARGB2101010:
3789 unpack_int_rgba_ARGB2101010(src, dst, n);
3790 break;
3791
3792 case MESA_FORMAT_XBGR8888_UINT:
3793 unpack_int_rgba_XBGR8888_UINT(src, dst, n);
3794 break;
3795
3796 case MESA_FORMAT_XBGR8888_SINT:
3797 unpack_int_rgba_XBGR8888_SINT(src, dst, n);
3798 break;
3799
3800 case MESA_FORMAT_XBGR16161616_UINT:
3801 unpack_int_rgba_XBGR16161616_UINT(src, dst, n);
3802 break;
3803
3804 case MESA_FORMAT_XBGR16161616_SINT:
3805 unpack_int_rgba_XBGR16161616_SINT(src, dst, n);
3806 break;
3807
3808 case MESA_FORMAT_XBGR32323232_UINT:
3809 case MESA_FORMAT_XBGR32323232_SINT:
3810 unpack_int_rgba_XBGR32323232_UINT(src, dst, n);
3811 break;
3812
3813 case MESA_FORMAT_ABGR2101010:
3814 unpack_int_rgba_ABGR2101010(src, dst, n);
3815 break;
3816
3817 default:
3818 _mesa_problem(NULL, "%s: bad format %s", __FUNCTION__,
3819 _mesa_get_format_name(format));
3820 return;
3821 }
3822 }
3823
3824 /**
3825 * Unpack a 2D rect of pixels returning float RGBA colors.
3826 * \param format the source image format
3827 * \param src start address of the source image
3828 * \param srcRowStride source image row stride in bytes
3829 * \param dst start address of the dest image
3830 * \param dstRowStride dest image row stride in bytes
3831 * \param x source image start X pos
3832 * \param y source image start Y pos
3833 * \param width width of rect region to convert
3834 * \param height height of rect region to convert
3835 */
3836 void
3837 _mesa_unpack_rgba_block(gl_format format,
3838 const void *src, GLint srcRowStride,
3839 GLfloat dst[][4], GLint dstRowStride,
3840 GLuint x, GLuint y, GLuint width, GLuint height)
3841 {
3842 unpack_rgba_func unpack = get_unpack_rgba_function(format);
3843 const GLuint srcPixStride = _mesa_get_format_bytes(format);
3844 const GLuint dstPixStride = 4 * sizeof(GLfloat);
3845 const GLubyte *srcRow;
3846 GLubyte *dstRow;
3847 GLuint i;
3848
3849 /* XXX needs to be fixed for compressed formats */
3850
3851 srcRow = ((const GLubyte *) src) + srcRowStride * y + srcPixStride * x;
3852 dstRow = ((GLubyte *) dst) + dstRowStride * y + dstPixStride * x;
3853
3854 for (i = 0; i < height; i++) {
3855 unpack(srcRow, (GLfloat (*)[4]) dstRow, width);
3856
3857 dstRow += dstRowStride;
3858 srcRow += srcRowStride;
3859 }
3860 }
3861
3862
3863
3864
3865 typedef void (*unpack_float_z_func)(GLuint n, const void *src, GLfloat *dst);
3866
3867 static void
3868 unpack_float_z_Z24_X8(GLuint n, const void *src, GLfloat *dst)
3869 {
3870 /* only return Z, not stencil data */
3871 const GLuint *s = ((const GLuint *) src);
3872 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
3873 GLuint i;
3874 for (i = 0; i < n; i++) {
3875 dst[i] = (GLfloat) ((s[i] >> 8) * scale);
3876 ASSERT(dst[i] >= 0.0F);
3877 ASSERT(dst[i] <= 1.0F);
3878 }
3879 }
3880
3881 static void
3882 unpack_float_z_X8_Z24(GLuint n, const void *src, GLfloat *dst)
3883 {
3884 /* only return Z, not stencil data */
3885 const GLuint *s = ((const GLuint *) src);
3886 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
3887 GLuint i;
3888 for (i = 0; i < n; i++) {
3889 dst[i] = (GLfloat) ((s[i] & 0x00ffffff) * scale);
3890 ASSERT(dst[i] >= 0.0F);
3891 ASSERT(dst[i] <= 1.0F);
3892 }
3893 }
3894
3895 static void
3896 unpack_float_z_Z16(GLuint n, const void *src, GLfloat *dst)
3897 {
3898 const GLushort *s = ((const GLushort *) src);
3899 GLuint i;
3900 for (i = 0; i < n; i++) {
3901 dst[i] = s[i] * (1.0F / 65535.0F);
3902 }
3903 }
3904
3905 static void
3906 unpack_float_z_Z32(GLuint n, const void *src, GLfloat *dst)
3907 {
3908 const GLuint *s = ((const GLuint *) src);
3909 GLuint i;
3910 for (i = 0; i < n; i++) {
3911 dst[i] = s[i] * (1.0F / 0xffffffff);
3912 }
3913 }
3914
3915 static void
3916 unpack_float_z_Z32F(GLuint n, const void *src, GLfloat *dst)
3917 {
3918 memcpy(dst, src, n * sizeof(float));
3919 }
3920
3921 static void
3922 unpack_float_z_Z32X24S8(GLuint n, const void *src, GLfloat *dst)
3923 {
3924 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
3925 GLuint i;
3926 for (i = 0; i < n; i++) {
3927 dst[i] = s[i].z;
3928 }
3929 }
3930
3931
3932
3933 /**
3934 * Unpack Z values.
3935 * The returned values will always be in the range [0.0, 1.0].
3936 */
3937 void
3938 _mesa_unpack_float_z_row(gl_format format, GLuint n,
3939 const void *src, GLfloat *dst)
3940 {
3941 unpack_float_z_func unpack;
3942
3943 switch (format) {
3944 case MESA_FORMAT_Z24_S8:
3945 case MESA_FORMAT_Z24_X8:
3946 unpack = unpack_float_z_Z24_X8;
3947 break;
3948 case MESA_FORMAT_S8_Z24:
3949 case MESA_FORMAT_X8_Z24:
3950 unpack = unpack_float_z_X8_Z24;
3951 break;
3952 case MESA_FORMAT_Z16:
3953 unpack = unpack_float_z_Z16;
3954 break;
3955 case MESA_FORMAT_Z32:
3956 unpack = unpack_float_z_Z32;
3957 break;
3958 case MESA_FORMAT_Z32_FLOAT:
3959 unpack = unpack_float_z_Z32F;
3960 break;
3961 case MESA_FORMAT_Z32_FLOAT_X24S8:
3962 unpack = unpack_float_z_Z32X24S8;
3963 break;
3964 default:
3965 _mesa_problem(NULL, "bad format %s in _mesa_unpack_float_z_row",
3966 _mesa_get_format_name(format));
3967 return;
3968 }
3969
3970 unpack(n, src, dst);
3971 }
3972
3973
3974
3975 typedef void (*unpack_uint_z_func)(const void *src, GLuint *dst, GLuint n);
3976
3977 static void
3978 unpack_uint_z_Z24_X8(const void *src, GLuint *dst, GLuint n)
3979 {
3980 /* only return Z, not stencil data */
3981 const GLuint *s = ((const GLuint *) src);
3982 GLuint i;
3983 for (i = 0; i < n; i++) {
3984 dst[i] = (s[i] & 0xffffff00) | (s[i] >> 24);
3985 }
3986 }
3987
3988 static void
3989 unpack_uint_z_X8_Z24(const void *src, GLuint *dst, GLuint n)
3990 {
3991 /* only return Z, not stencil data */
3992 const GLuint *s = ((const GLuint *) src);
3993 GLuint i;
3994 for (i = 0; i < n; i++) {
3995 dst[i] = (s[i] << 8) | ((s[i] >> 16) & 0xff);
3996 }
3997 }
3998
3999 static void
4000 unpack_uint_z_Z16(const void *src, GLuint *dst, GLuint n)
4001 {
4002 const GLushort *s = ((const GLushort *)src);
4003 GLuint i;
4004 for (i = 0; i < n; i++) {
4005 dst[i] = (s[i] << 16) | s[i];
4006 }
4007 }
4008
4009 static void
4010 unpack_uint_z_Z32(const void *src, GLuint *dst, GLuint n)
4011 {
4012 memcpy(dst, src, n * sizeof(GLuint));
4013 }
4014
4015 static void
4016 unpack_uint_z_Z32_FLOAT(const void *src, GLuint *dst, GLuint n)
4017 {
4018 const float *s = (const float *)src;
4019 GLuint i;
4020 for (i = 0; i < n; i++) {
4021 dst[i] = FLOAT_TO_UINT(CLAMP(s[i], 0.0F, 1.0F));
4022 }
4023 }
4024
4025 static void
4026 unpack_uint_z_Z32_FLOAT_X24S8(const void *src, GLuint *dst, GLuint n)
4027 {
4028 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
4029 GLuint i;
4030
4031 for (i = 0; i < n; i++) {
4032 dst[i] = FLOAT_TO_UINT(CLAMP(s[i].z, 0.0F, 1.0F));
4033 }
4034 }
4035
4036
4037 /**
4038 * Unpack Z values.
4039 * The returned values will always be in the range [0, 0xffffffff].
4040 */
4041 void
4042 _mesa_unpack_uint_z_row(gl_format format, GLuint n,
4043 const void *src, GLuint *dst)
4044 {
4045 unpack_uint_z_func unpack;
4046 const GLubyte *srcPtr = (GLubyte *) src;
4047
4048 switch (format) {
4049 case MESA_FORMAT_Z24_S8:
4050 case MESA_FORMAT_Z24_X8:
4051 unpack = unpack_uint_z_Z24_X8;
4052 break;
4053 case MESA_FORMAT_S8_Z24:
4054 case MESA_FORMAT_X8_Z24:
4055 unpack = unpack_uint_z_X8_Z24;
4056 break;
4057 case MESA_FORMAT_Z16:
4058 unpack = unpack_uint_z_Z16;
4059 break;
4060 case MESA_FORMAT_Z32:
4061 unpack = unpack_uint_z_Z32;
4062 break;
4063 case MESA_FORMAT_Z32_FLOAT:
4064 unpack = unpack_uint_z_Z32_FLOAT;
4065 break;
4066 case MESA_FORMAT_Z32_FLOAT_X24S8:
4067 unpack = unpack_uint_z_Z32_FLOAT_X24S8;
4068 break;
4069 default:
4070 _mesa_problem(NULL, "bad format %s in _mesa_unpack_uint_z_row",
4071 _mesa_get_format_name(format));
4072 return;
4073 }
4074
4075 unpack(srcPtr, dst, n);
4076 }
4077
4078
4079 static void
4080 unpack_ubyte_s_S8(const void *src, GLubyte *dst, GLuint n)
4081 {
4082 memcpy(dst, src, n);
4083 }
4084
4085 static void
4086 unpack_ubyte_s_Z24_S8(const void *src, GLubyte *dst, GLuint n)
4087 {
4088 GLuint i;
4089 const GLuint *src32 = src;
4090
4091 for (i = 0; i < n; i++)
4092 dst[i] = src32[i] & 0xff;
4093 }
4094
4095 static void
4096 unpack_ubyte_s_S8_Z24(const void *src, GLubyte *dst, GLuint n)
4097 {
4098 GLuint i;
4099 const GLuint *src32 = src;
4100
4101 for (i = 0; i < n; i++)
4102 dst[i] = src32[i] >> 24;
4103 }
4104
4105 static void
4106 unpack_ubyte_s_Z32_FLOAT_X24S8(const void *src, GLubyte *dst, GLuint n)
4107 {
4108 GLuint i;
4109 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
4110
4111 for (i = 0; i < n; i++)
4112 dst[i] = s[i].x24s8 & 0xff;
4113 }
4114
4115 void
4116 _mesa_unpack_ubyte_stencil_row(gl_format format, GLuint n,
4117 const void *src, GLubyte *dst)
4118 {
4119 switch (format) {
4120 case MESA_FORMAT_S8:
4121 unpack_ubyte_s_S8(src, dst, n);
4122 break;
4123 case MESA_FORMAT_Z24_S8:
4124 unpack_ubyte_s_Z24_S8(src, dst, n);
4125 break;
4126 case MESA_FORMAT_S8_Z24:
4127 unpack_ubyte_s_S8_Z24(src, dst, n);
4128 break;
4129 case MESA_FORMAT_Z32_FLOAT_X24S8:
4130 unpack_ubyte_s_Z32_FLOAT_X24S8(src, dst, n);
4131 break;
4132 default:
4133 _mesa_problem(NULL, "bad format %s in _mesa_unpack_ubyte_s_row",
4134 _mesa_get_format_name(format));
4135 return;
4136 }
4137 }
4138
4139 static void
4140 unpack_uint_24_8_depth_stencil_S8_Z24(const GLuint *src, GLuint *dst, GLuint n)
4141 {
4142 GLuint i;
4143
4144 for (i = 0; i < n; i++) {
4145 GLuint val = src[i];
4146 dst[i] = val >> 24 | val << 8;
4147 }
4148 }
4149
4150 static void
4151 unpack_uint_24_8_depth_stencil_Z24_S8(const GLuint *src, GLuint *dst, GLuint n)
4152 {
4153 memcpy(dst, src, n * 4);
4154 }
4155
4156 void
4157 _mesa_unpack_uint_24_8_depth_stencil_row(gl_format format, GLuint n,
4158 const void *src, GLuint *dst)
4159 {
4160 switch (format) {
4161 case MESA_FORMAT_Z24_S8:
4162 unpack_uint_24_8_depth_stencil_Z24_S8(src, dst, n);
4163 break;
4164 case MESA_FORMAT_S8_Z24:
4165 unpack_uint_24_8_depth_stencil_S8_Z24(src, dst, n);
4166 break;
4167 default:
4168 _mesa_problem(NULL,
4169 "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row",
4170 _mesa_get_format_name(format));
4171 return;
4172 }
4173 }