mesa: Validate image units when the texture state changes.
[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 static void
2285 unpack_SIGNED_RG88(const void *src, GLfloat dst[][4], GLuint n)
2286 {
2287 const GLushort *s = ((const GLushort *) src);
2288 GLuint i;
2289 for (i = 0; i < n; i++) {
2290 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
2291 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) );
2292 dst[i][BCOMP] = 0.0F;
2293 dst[i][ACOMP] = 1.0F;
2294 }
2295 }
2296
2297 static void
2298 unpack_SIGNED_RG1616(const void *src, GLfloat dst[][4], GLuint n)
2299 {
2300 const GLuint *s = ((const GLuint *) src);
2301 GLuint i;
2302 for (i = 0; i < n; i++) {
2303 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] >> 16) );
2304 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] & 0xffff) );
2305 dst[i][BCOMP] = 0.0F;
2306 dst[i][ACOMP] = 1.0F;
2307 }
2308 }
2309
2310 /**
2311 * Return the unpacker function for the given format.
2312 */
2313 static unpack_rgba_func
2314 get_unpack_rgba_function(gl_format format)
2315 {
2316 static unpack_rgba_func table[MESA_FORMAT_COUNT];
2317 static GLboolean initialized = GL_FALSE;
2318
2319 if (!initialized) {
2320 table[MESA_FORMAT_NONE] = NULL;
2321
2322 table[MESA_FORMAT_RGBA8888] = unpack_RGBA8888;
2323 table[MESA_FORMAT_RGBA8888_REV] = unpack_RGBA8888_REV;
2324 table[MESA_FORMAT_ARGB8888] = unpack_ARGB8888;
2325 table[MESA_FORMAT_ARGB8888_REV] = unpack_ARGB8888_REV;
2326 table[MESA_FORMAT_RGBX8888] = unpack_RGBX8888;
2327 table[MESA_FORMAT_RGBX8888_REV] = unpack_RGBX8888_REV;
2328 table[MESA_FORMAT_XRGB8888] = unpack_XRGB8888;
2329 table[MESA_FORMAT_XRGB8888_REV] = unpack_XRGB8888_REV;
2330 table[MESA_FORMAT_RGB888] = unpack_RGB888;
2331 table[MESA_FORMAT_BGR888] = unpack_BGR888;
2332 table[MESA_FORMAT_RGB565] = unpack_RGB565;
2333 table[MESA_FORMAT_RGB565_REV] = unpack_RGB565_REV;
2334 table[MESA_FORMAT_ARGB4444] = unpack_ARGB4444;
2335 table[MESA_FORMAT_ARGB4444_REV] = unpack_ARGB4444_REV;
2336 table[MESA_FORMAT_RGBA5551] = unpack_RGBA5551;
2337 table[MESA_FORMAT_ARGB1555] = unpack_ARGB1555;
2338 table[MESA_FORMAT_ARGB1555_REV] = unpack_ARGB1555_REV;
2339 table[MESA_FORMAT_AL44] = unpack_AL44;
2340 table[MESA_FORMAT_AL88] = unpack_AL88;
2341 table[MESA_FORMAT_AL88_REV] = unpack_AL88_REV;
2342 table[MESA_FORMAT_AL1616] = unpack_AL1616;
2343 table[MESA_FORMAT_AL1616_REV] = unpack_AL1616_REV;
2344 table[MESA_FORMAT_RGB332] = unpack_RGB332;
2345 table[MESA_FORMAT_A8] = unpack_A8;
2346 table[MESA_FORMAT_A16] = unpack_A16;
2347 table[MESA_FORMAT_L8] = unpack_L8;
2348 table[MESA_FORMAT_L16] = unpack_L16;
2349 table[MESA_FORMAT_I8] = unpack_I8;
2350 table[MESA_FORMAT_I16] = unpack_I16;
2351 table[MESA_FORMAT_YCBCR] = unpack_YCBCR;
2352 table[MESA_FORMAT_YCBCR_REV] = unpack_YCBCR_REV;
2353 table[MESA_FORMAT_R8] = unpack_R8;
2354 table[MESA_FORMAT_GR88] = unpack_GR88;
2355 table[MESA_FORMAT_RG88] = unpack_RG88;
2356 table[MESA_FORMAT_R16] = unpack_R16;
2357 table[MESA_FORMAT_GR1616] = unpack_GR1616;
2358 table[MESA_FORMAT_RG1616] = unpack_RG1616;
2359 table[MESA_FORMAT_ARGB2101010] = unpack_ARGB2101010;
2360 table[MESA_FORMAT_ARGB2101010_UINT] = unpack_ARGB2101010_UINT;
2361 table[MESA_FORMAT_ABGR2101010_UINT] = unpack_ABGR2101010_UINT;
2362 table[MESA_FORMAT_Z24_S8] = unpack_Z24_S8;
2363 table[MESA_FORMAT_S8_Z24] = unpack_S8_Z24;
2364 table[MESA_FORMAT_Z16] = unpack_Z16;
2365 table[MESA_FORMAT_X8_Z24] = unpack_X8_Z24;
2366 table[MESA_FORMAT_Z24_X8] = unpack_Z24_X8;
2367 table[MESA_FORMAT_Z32] = unpack_Z32;
2368 table[MESA_FORMAT_S8] = unpack_S8;
2369 table[MESA_FORMAT_SRGB8] = unpack_SRGB8;
2370 table[MESA_FORMAT_SRGBA8] = unpack_SRGBA8;
2371 table[MESA_FORMAT_SARGB8] = unpack_SARGB8;
2372 table[MESA_FORMAT_SL8] = unpack_SL8;
2373 table[MESA_FORMAT_SLA8] = unpack_SLA8;
2374 table[MESA_FORMAT_SRGB_DXT1] = unpack_SRGB_DXT1;
2375 table[MESA_FORMAT_SRGBA_DXT1] = unpack_SRGBA_DXT1;
2376 table[MESA_FORMAT_SRGBA_DXT3] = unpack_SRGBA_DXT3;
2377 table[MESA_FORMAT_SRGBA_DXT5] = unpack_SRGBA_DXT5;
2378
2379 table[MESA_FORMAT_RGB_FXT1] = unpack_RGB_FXT1;
2380 table[MESA_FORMAT_RGBA_FXT1] = unpack_RGBA_FXT1;
2381 table[MESA_FORMAT_RGB_DXT1] = unpack_RGB_DXT1;
2382 table[MESA_FORMAT_RGBA_DXT1] = unpack_RGBA_DXT1;
2383 table[MESA_FORMAT_RGBA_DXT3] = unpack_RGBA_DXT3;
2384 table[MESA_FORMAT_RGBA_DXT5] = unpack_RGBA_DXT5;
2385
2386 table[MESA_FORMAT_RGBA_FLOAT32] = unpack_RGBA_FLOAT32;
2387 table[MESA_FORMAT_RGBA_FLOAT16] = unpack_RGBA_FLOAT16;
2388 table[MESA_FORMAT_RGB_FLOAT32] = unpack_RGB_FLOAT32;
2389 table[MESA_FORMAT_RGB_FLOAT16] = unpack_RGB_FLOAT16;
2390 table[MESA_FORMAT_ALPHA_FLOAT32] = unpack_ALPHA_FLOAT32;
2391 table[MESA_FORMAT_ALPHA_FLOAT16] = unpack_ALPHA_FLOAT16;
2392 table[MESA_FORMAT_LUMINANCE_FLOAT32] = unpack_LUMINANCE_FLOAT32;
2393 table[MESA_FORMAT_LUMINANCE_FLOAT16] = unpack_LUMINANCE_FLOAT16;
2394 table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = unpack_LUMINANCE_ALPHA_FLOAT32;
2395 table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = unpack_LUMINANCE_ALPHA_FLOAT16;
2396 table[MESA_FORMAT_INTENSITY_FLOAT32] = unpack_INTENSITY_FLOAT32;
2397 table[MESA_FORMAT_INTENSITY_FLOAT16] = unpack_INTENSITY_FLOAT16;
2398 table[MESA_FORMAT_R_FLOAT32] = unpack_R_FLOAT32;
2399 table[MESA_FORMAT_R_FLOAT16] = unpack_R_FLOAT16;
2400 table[MESA_FORMAT_RG_FLOAT32] = unpack_RG_FLOAT32;
2401 table[MESA_FORMAT_RG_FLOAT16] = unpack_RG_FLOAT16;
2402
2403 table[MESA_FORMAT_ALPHA_UINT8] = unpack_ALPHA_UINT8;
2404 table[MESA_FORMAT_ALPHA_UINT16] = unpack_ALPHA_UINT16;
2405 table[MESA_FORMAT_ALPHA_UINT32] = unpack_ALPHA_UINT32;
2406 table[MESA_FORMAT_ALPHA_INT8] = unpack_ALPHA_INT8;
2407 table[MESA_FORMAT_ALPHA_INT16] = unpack_ALPHA_INT16;
2408 table[MESA_FORMAT_ALPHA_INT32] = unpack_ALPHA_INT32;
2409
2410 table[MESA_FORMAT_INTENSITY_UINT8] = unpack_INTENSITY_UINT8;
2411 table[MESA_FORMAT_INTENSITY_UINT16] = unpack_INTENSITY_UINT16;
2412 table[MESA_FORMAT_INTENSITY_UINT32] = unpack_INTENSITY_UINT32;
2413 table[MESA_FORMAT_INTENSITY_INT8] = unpack_INTENSITY_INT8;
2414 table[MESA_FORMAT_INTENSITY_INT16] = unpack_INTENSITY_INT16;
2415 table[MESA_FORMAT_INTENSITY_INT32] = unpack_INTENSITY_INT32;
2416
2417 table[MESA_FORMAT_LUMINANCE_UINT8] = unpack_LUMINANCE_UINT8;
2418 table[MESA_FORMAT_LUMINANCE_UINT16] = unpack_LUMINANCE_UINT16;
2419 table[MESA_FORMAT_LUMINANCE_UINT32] = unpack_LUMINANCE_UINT32;
2420 table[MESA_FORMAT_LUMINANCE_INT8] = unpack_LUMINANCE_INT8;
2421 table[MESA_FORMAT_LUMINANCE_INT16] = unpack_LUMINANCE_INT16;
2422 table[MESA_FORMAT_LUMINANCE_INT32] = unpack_LUMINANCE_INT32;
2423
2424 table[MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = unpack_LUMINANCE_ALPHA_UINT8;
2425 table[MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = unpack_LUMINANCE_ALPHA_UINT16;
2426 table[MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = unpack_LUMINANCE_ALPHA_UINT32;
2427 table[MESA_FORMAT_LUMINANCE_ALPHA_INT8] = unpack_LUMINANCE_ALPHA_INT8;
2428 table[MESA_FORMAT_LUMINANCE_ALPHA_INT16] = unpack_LUMINANCE_ALPHA_INT16;
2429 table[MESA_FORMAT_LUMINANCE_ALPHA_INT32] = unpack_LUMINANCE_ALPHA_INT32;
2430
2431 table[MESA_FORMAT_R_INT8] = unpack_R_INT8;
2432 table[MESA_FORMAT_RG_INT8] = unpack_RG_INT8;
2433 table[MESA_FORMAT_RGB_INT8] = unpack_RGB_INT8;
2434 table[MESA_FORMAT_RGBA_INT8] = unpack_RGBA_INT8;
2435 table[MESA_FORMAT_R_INT16] = unpack_R_INT16;
2436 table[MESA_FORMAT_RG_INT16] = unpack_RG_INT16;
2437 table[MESA_FORMAT_RGB_INT16] = unpack_RGB_INT16;
2438 table[MESA_FORMAT_RGBA_INT16] = unpack_RGBA_INT16;
2439 table[MESA_FORMAT_R_INT32] = unpack_R_INT32;
2440 table[MESA_FORMAT_RG_INT32] = unpack_RG_INT32;
2441 table[MESA_FORMAT_RGB_INT32] = unpack_RGB_INT32;
2442 table[MESA_FORMAT_RGBA_INT32] = unpack_RGBA_INT32;
2443 table[MESA_FORMAT_R_UINT8] = unpack_R_UINT8;
2444 table[MESA_FORMAT_RG_UINT8] = unpack_RG_UINT8;
2445 table[MESA_FORMAT_RGB_UINT8] = unpack_RGB_UINT8;
2446 table[MESA_FORMAT_RGBA_UINT8] = unpack_RGBA_UINT8;
2447 table[MESA_FORMAT_R_UINT16] = unpack_R_UINT16;
2448 table[MESA_FORMAT_RG_UINT16] = unpack_RG_UINT16;
2449 table[MESA_FORMAT_RGB_UINT16] = unpack_RGB_UINT16;
2450 table[MESA_FORMAT_RGBA_UINT16] = unpack_RGBA_UINT16;
2451 table[MESA_FORMAT_R_UINT32] = unpack_R_UINT32;
2452 table[MESA_FORMAT_RG_UINT32] = unpack_RG_UINT32;
2453 table[MESA_FORMAT_RGB_UINT32] = unpack_RGB_UINT32;
2454 table[MESA_FORMAT_RGBA_UINT32] = unpack_RGBA_UINT32;
2455
2456 table[MESA_FORMAT_DUDV8] = unpack_DUDV8;
2457 table[MESA_FORMAT_SIGNED_R8] = unpack_SIGNED_R8;
2458 table[MESA_FORMAT_SIGNED_RG88_REV] = unpack_SIGNED_RG88_REV;
2459 table[MESA_FORMAT_SIGNED_RGBX8888] = unpack_SIGNED_RGBX8888;
2460 table[MESA_FORMAT_SIGNED_RGBA8888] = unpack_SIGNED_RGBA8888;
2461 table[MESA_FORMAT_SIGNED_RGBA8888_REV] = unpack_SIGNED_RGBA8888_REV;
2462 table[MESA_FORMAT_SIGNED_R16] = unpack_SIGNED_R16;
2463 table[MESA_FORMAT_SIGNED_GR1616] = unpack_SIGNED_GR1616;
2464 table[MESA_FORMAT_SIGNED_RGB_16] = unpack_SIGNED_RGB_16;
2465 table[MESA_FORMAT_SIGNED_RGBA_16] = unpack_SIGNED_RGBA_16;
2466 table[MESA_FORMAT_RGBA_16] = unpack_RGBA_16;
2467
2468 table[MESA_FORMAT_RED_RGTC1] = unpack_RED_RGTC1;
2469 table[MESA_FORMAT_SIGNED_RED_RGTC1] = unpack_SIGNED_RED_RGTC1;
2470 table[MESA_FORMAT_RG_RGTC2] = unpack_RG_RGTC2;
2471 table[MESA_FORMAT_SIGNED_RG_RGTC2] = unpack_SIGNED_RG_RGTC2;
2472
2473 table[MESA_FORMAT_L_LATC1] = unpack_L_LATC1;
2474 table[MESA_FORMAT_SIGNED_L_LATC1] = unpack_SIGNED_L_LATC1;
2475 table[MESA_FORMAT_LA_LATC2] = unpack_LA_LATC2;
2476 table[MESA_FORMAT_SIGNED_LA_LATC2] = unpack_SIGNED_LA_LATC2;
2477
2478 table[MESA_FORMAT_ETC1_RGB8] = unpack_ETC1_RGB8;
2479 table[MESA_FORMAT_ETC2_RGB8] = unpack_ETC2_RGB8;
2480 table[MESA_FORMAT_ETC2_SRGB8] = unpack_ETC2_SRGB8;
2481 table[MESA_FORMAT_ETC2_RGBA8_EAC] = unpack_ETC2_RGBA8_EAC;
2482 table[MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC] = unpack_ETC2_SRGB8_ALPHA8_EAC;
2483 table[MESA_FORMAT_ETC2_R11_EAC] = unpack_ETC2_R11_EAC;
2484 table[MESA_FORMAT_ETC2_RG11_EAC] = unpack_ETC2_RG11_EAC;
2485 table[MESA_FORMAT_ETC2_SIGNED_R11_EAC] = unpack_ETC2_SIGNED_R11_EAC;
2486 table[MESA_FORMAT_ETC2_SIGNED_RG11_EAC] = unpack_ETC2_SIGNED_RG11_EAC;
2487 table[MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1] =
2488 unpack_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
2489 table[MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1] =
2490 unpack_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
2491 table[MESA_FORMAT_SIGNED_A8] = unpack_SIGNED_A8;
2492 table[MESA_FORMAT_SIGNED_L8] = unpack_SIGNED_L8;
2493 table[MESA_FORMAT_SIGNED_AL88] = unpack_SIGNED_AL88;
2494 table[MESA_FORMAT_SIGNED_I8] = unpack_SIGNED_I8;
2495 table[MESA_FORMAT_SIGNED_A16] = unpack_SIGNED_A16;
2496 table[MESA_FORMAT_SIGNED_L16] = unpack_SIGNED_L16;
2497 table[MESA_FORMAT_SIGNED_AL1616] = unpack_SIGNED_AL1616;
2498 table[MESA_FORMAT_SIGNED_I16] = unpack_SIGNED_I16;
2499
2500 table[MESA_FORMAT_RGB9_E5_FLOAT] = unpack_RGB9_E5_FLOAT;
2501 table[MESA_FORMAT_R11_G11_B10_FLOAT] = unpack_R11_G11_B10_FLOAT;
2502
2503 table[MESA_FORMAT_Z32_FLOAT] = unpack_Z32_FLOAT;
2504 table[MESA_FORMAT_Z32_FLOAT_X24S8] = unpack_Z32_FLOAT_X24S8;
2505
2506 table[MESA_FORMAT_XRGB4444_UNORM] = unpack_XRGB4444_UNORM;
2507 table[MESA_FORMAT_XRGB1555_UNORM] = unpack_XRGB1555_UNORM;
2508 table[MESA_FORMAT_XBGR8888_SNORM] = unpack_XBGR8888_SNORM;
2509 table[MESA_FORMAT_XBGR8888_SRGB] = unpack_XBGR8888_SRGB;
2510 table[MESA_FORMAT_XBGR8888_UINT] = unpack_XBGR8888_UINT;
2511 table[MESA_FORMAT_XBGR8888_SINT] = unpack_XBGR8888_SINT;
2512 table[MESA_FORMAT_XRGB2101010_UNORM] = unpack_XRGB2101010_UNORM;
2513 table[MESA_FORMAT_XBGR16161616_UNORM] = unpack_XBGR16161616_UNORM;
2514 table[MESA_FORMAT_XBGR16161616_SNORM] = unpack_XBGR16161616_SNORM;
2515 table[MESA_FORMAT_XBGR16161616_FLOAT] = unpack_XBGR16161616_FLOAT;
2516 table[MESA_FORMAT_XBGR16161616_UINT] = unpack_XBGR16161616_UINT;
2517 table[MESA_FORMAT_XBGR16161616_SINT] = unpack_XBGR16161616_SINT;
2518 table[MESA_FORMAT_XBGR32323232_FLOAT] = unpack_XBGR32323232_FLOAT;
2519 table[MESA_FORMAT_XBGR32323232_UINT] = unpack_XBGR32323232_UINT;
2520 table[MESA_FORMAT_XBGR32323232_SINT] = unpack_XBGR32323232_SINT;
2521
2522 table[MESA_FORMAT_ABGR2101010] = unpack_ABGR2101010;
2523
2524 table[MESA_FORMAT_SIGNED_RG88] = unpack_SIGNED_RG88;
2525 table[MESA_FORMAT_SIGNED_RG1616] = unpack_SIGNED_RG1616;
2526
2527 initialized = GL_TRUE;
2528 }
2529
2530 if (table[format] == NULL) {
2531 _mesa_problem(NULL, "unsupported unpack for format %s",
2532 _mesa_get_format_name(format));
2533 }
2534
2535 return table[format];
2536 }
2537
2538
2539 /**
2540 * Unpack rgba colors, returning as GLfloat values.
2541 */
2542 void
2543 _mesa_unpack_rgba_row(gl_format format, GLuint n,
2544 const void *src, GLfloat dst[][4])
2545 {
2546 unpack_rgba_func unpack = get_unpack_rgba_function(format);
2547 unpack(src, dst, n);
2548 }
2549
2550
2551 /**********************************************************************/
2552 /* Unpack, returning GLubyte colors */
2553 /**********************************************************************/
2554
2555
2556 static void
2557 unpack_ubyte_RGBA8888(const void *src, GLubyte dst[][4], GLuint n)
2558 {
2559 const GLuint *s = ((const GLuint *) src);
2560 GLuint i;
2561 for (i = 0; i < n; i++) {
2562 dst[i][RCOMP] = (s[i] >> 24);
2563 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2564 dst[i][BCOMP] = (s[i] >> 8) & 0xff;
2565 dst[i][ACOMP] = (s[i] ) & 0xff;
2566 }
2567 }
2568
2569 static void
2570 unpack_ubyte_RGBA8888_REV(const void *src, GLubyte dst[][4], GLuint n)
2571 {
2572 const GLuint *s = ((const GLuint *) src);
2573 GLuint i;
2574 for (i = 0; i < n; i++) {
2575 dst[i][RCOMP] = (s[i] ) & 0xff;
2576 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2577 dst[i][BCOMP] = (s[i] >> 16) & 0xff;
2578 dst[i][ACOMP] = (s[i] >> 24);
2579 }
2580 }
2581
2582 static void
2583 unpack_ubyte_ARGB8888(const void *src, GLubyte dst[][4], GLuint n)
2584 {
2585 const GLuint *s = ((const GLuint *) src);
2586 GLuint i;
2587 for (i = 0; i < n; i++) {
2588 dst[i][RCOMP] = (s[i] >> 16) & 0xff;
2589 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2590 dst[i][BCOMP] = (s[i] ) & 0xff;
2591 dst[i][ACOMP] = (s[i] >> 24);
2592 }
2593 }
2594
2595 static void
2596 unpack_ubyte_ARGB8888_REV(const void *src, GLubyte dst[][4], GLuint n)
2597 {
2598 const GLuint *s = ((const GLuint *) src);
2599 GLuint i;
2600 for (i = 0; i < n; i++) {
2601 dst[i][RCOMP] = (s[i] >> 8) & 0xff;
2602 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2603 dst[i][BCOMP] = (s[i] >> 24);
2604 dst[i][ACOMP] = (s[i] ) & 0xff;
2605 }
2606 }
2607
2608 static void
2609 unpack_ubyte_RGBX8888(const void *src, GLubyte dst[][4], GLuint n)
2610 {
2611 const GLuint *s = ((const GLuint *) src);
2612 GLuint i;
2613 for (i = 0; i < n; i++) {
2614 dst[i][RCOMP] = (s[i] >> 24);
2615 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2616 dst[i][BCOMP] = (s[i] >> 8) & 0xff;
2617 dst[i][ACOMP] = 0xff;
2618 }
2619 }
2620
2621 static void
2622 unpack_ubyte_RGBX8888_REV(const void *src, GLubyte dst[][4], GLuint n)
2623 {
2624 const GLuint *s = ((const GLuint *) src);
2625 GLuint i;
2626 for (i = 0; i < n; i++) {
2627 dst[i][RCOMP] = (s[i] ) & 0xff;
2628 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2629 dst[i][BCOMP] = (s[i] >> 16) & 0xff;
2630 dst[i][ACOMP] = 0xff;
2631 }
2632 }
2633
2634 static void
2635 unpack_ubyte_XRGB8888(const void *src, GLubyte dst[][4], GLuint n)
2636 {
2637 const GLuint *s = ((const GLuint *) src);
2638 GLuint i;
2639 for (i = 0; i < n; i++) {
2640 dst[i][RCOMP] = (s[i] >> 16) & 0xff;
2641 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2642 dst[i][BCOMP] = (s[i] ) & 0xff;
2643 dst[i][ACOMP] = 0xff;
2644 }
2645 }
2646
2647 static void
2648 unpack_ubyte_XRGB8888_REV(const void *src, GLubyte dst[][4], GLuint n)
2649 {
2650 const GLuint *s = ((const GLuint *) src);
2651 GLuint i;
2652 for (i = 0; i < n; i++) {
2653 dst[i][RCOMP] = (s[i] >> 8) & 0xff;
2654 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2655 dst[i][BCOMP] = (s[i] >> 24);
2656 dst[i][ACOMP] = 0xff;
2657 }
2658 }
2659
2660 static void
2661 unpack_ubyte_RGB888(const void *src, GLubyte dst[][4], GLuint n)
2662 {
2663 const GLubyte *s = (const GLubyte *) src;
2664 GLuint i;
2665 for (i = 0; i < n; i++) {
2666 dst[i][RCOMP] = s[i*3+2];
2667 dst[i][GCOMP] = s[i*3+1];
2668 dst[i][BCOMP] = s[i*3+0];
2669 dst[i][ACOMP] = 0xff;
2670 }
2671 }
2672
2673 static void
2674 unpack_ubyte_BGR888(const void *src, GLubyte dst[][4], GLuint n)
2675 {
2676 const GLubyte *s = (const GLubyte *) src;
2677 GLuint i;
2678 for (i = 0; i < n; i++) {
2679 dst[i][RCOMP] = s[i*3+0];
2680 dst[i][GCOMP] = s[i*3+1];
2681 dst[i][BCOMP] = s[i*3+2];
2682 dst[i][ACOMP] = 0xff;
2683 }
2684 }
2685
2686 static void
2687 unpack_ubyte_RGB565(const void *src, GLubyte dst[][4], GLuint n)
2688 {
2689 const GLushort *s = ((const GLushort *) src);
2690 GLuint i;
2691 for (i = 0; i < n; i++) {
2692 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f);
2693 dst[i][GCOMP] = EXPAND_6_8((s[i] >> 5 ) & 0x3f);
2694 dst[i][BCOMP] = EXPAND_5_8( s[i] & 0x1f);
2695 dst[i][ACOMP] = 0xff;
2696 }
2697 }
2698
2699 static void
2700 unpack_ubyte_RGB565_REV(const void *src, GLubyte dst[][4], GLuint n)
2701 {
2702 const GLushort *s = ((const GLushort *) src);
2703 GLuint i;
2704 for (i = 0; i < n; i++) {
2705 GLuint t = (s[i] >> 8) | (s[i] << 8); /* byte swap */
2706 dst[i][RCOMP] = EXPAND_5_8((t >> 11) & 0x1f);
2707 dst[i][GCOMP] = EXPAND_6_8((t >> 5 ) & 0x3f);
2708 dst[i][BCOMP] = EXPAND_5_8( t & 0x1f);
2709 dst[i][ACOMP] = 0xff;
2710 }
2711 }
2712
2713 static void
2714 unpack_ubyte_ARGB4444(const void *src, GLubyte dst[][4], GLuint n)
2715 {
2716 const GLushort *s = ((const GLushort *) src);
2717 GLuint i;
2718 for (i = 0; i < n; i++) {
2719 dst[i][RCOMP] = EXPAND_4_8((s[i] >> 8) & 0xf);
2720 dst[i][GCOMP] = EXPAND_4_8((s[i] >> 4) & 0xf);
2721 dst[i][BCOMP] = EXPAND_4_8((s[i] ) & 0xf);
2722 dst[i][ACOMP] = EXPAND_4_8((s[i] >> 12) & 0xf);
2723 }
2724 }
2725
2726 static void
2727 unpack_ubyte_ARGB4444_REV(const void *src, GLubyte dst[][4], GLuint n)
2728 {
2729 const GLushort *s = ((const GLushort *) src);
2730 GLuint i;
2731 for (i = 0; i < n; i++) {
2732 dst[i][RCOMP] = EXPAND_4_8((s[i] ) & 0xf);
2733 dst[i][GCOMP] = EXPAND_4_8((s[i] >> 12) & 0xf);
2734 dst[i][BCOMP] = EXPAND_4_8((s[i] >> 8) & 0xf);
2735 dst[i][ACOMP] = EXPAND_4_8((s[i] >> 4) & 0xf);
2736 }
2737 }
2738
2739 static void
2740 unpack_ubyte_RGBA5551(const void *src, GLubyte dst[][4], GLuint n)
2741 {
2742 const GLushort *s = ((const GLushort *) src);
2743 GLuint i;
2744 for (i = 0; i < n; i++) {
2745 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f);
2746 dst[i][GCOMP] = EXPAND_5_8((s[i] >> 6) & 0x1f);
2747 dst[i][BCOMP] = EXPAND_5_8((s[i] >> 1) & 0x1f);
2748 dst[i][ACOMP] = EXPAND_1_8((s[i] ) & 0x01);
2749 }
2750 }
2751
2752 static void
2753 unpack_ubyte_ARGB1555(const void *src, GLubyte dst[][4], GLuint n)
2754 {
2755 const GLushort *s = ((const GLushort *) src);
2756 GLuint i;
2757 for (i = 0; i < n; i++) {
2758 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 10) & 0x1f);
2759 dst[i][GCOMP] = EXPAND_5_8((s[i] >> 5) & 0x1f);
2760 dst[i][BCOMP] = EXPAND_5_8((s[i] >> 0) & 0x1f);
2761 dst[i][ACOMP] = EXPAND_1_8((s[i] >> 15) & 0x01);
2762 }
2763 }
2764
2765 static void
2766 unpack_ubyte_ARGB1555_REV(const void *src, GLubyte dst[][4], GLuint n)
2767 {
2768 const GLushort *s = ((const GLushort *) src);
2769 GLuint i;
2770 for (i = 0; i < n; i++) {
2771 GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */
2772 dst[i][RCOMP] = EXPAND_5_8((tmp >> 10) & 0x1f);
2773 dst[i][GCOMP] = EXPAND_5_8((tmp >> 5) & 0x1f);
2774 dst[i][BCOMP] = EXPAND_5_8((tmp >> 0) & 0x1f);
2775 dst[i][ACOMP] = EXPAND_1_8((tmp >> 15) & 0x01);
2776 }
2777 }
2778
2779 static void
2780 unpack_ubyte_AL44(const void *src, GLubyte dst[][4], GLuint n)
2781 {
2782 const GLubyte *s = ((const GLubyte *) src);
2783 GLuint i;
2784 for (i = 0; i < n; i++) {
2785 dst[i][RCOMP] =
2786 dst[i][GCOMP] =
2787 dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xf);
2788 dst[i][ACOMP] = EXPAND_4_8(s[i] >> 4);
2789 }
2790 }
2791
2792 static void
2793 unpack_ubyte_AL88(const void *src, GLubyte dst[][4], GLuint n)
2794 {
2795 const GLushort *s = ((const GLushort *) src);
2796 GLuint i;
2797 for (i = 0; i < n; i++) {
2798 dst[i][RCOMP] =
2799 dst[i][GCOMP] =
2800 dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xff);
2801 dst[i][ACOMP] = EXPAND_4_8(s[i] >> 8);
2802 }
2803 }
2804
2805 static void
2806 unpack_ubyte_AL88_REV(const void *src, GLubyte dst[][4], GLuint n)
2807 {
2808 const GLushort *s = ((const GLushort *) src);
2809 GLuint i;
2810 for (i = 0; i < n; i++) {
2811 dst[i][RCOMP] =
2812 dst[i][GCOMP] =
2813 dst[i][BCOMP] = EXPAND_4_8(s[i] >> 8);
2814 dst[i][ACOMP] = EXPAND_4_8(s[i] & 0xff);
2815 }
2816 }
2817
2818 static void
2819 unpack_ubyte_RGB332(const void *src, GLubyte dst[][4], GLuint n)
2820 {
2821 const GLubyte *s = ((const GLubyte *) src);
2822 GLuint i;
2823 for (i = 0; i < n; i++) {
2824 dst[i][RCOMP] = EXPAND_3_8((s[i] >> 5) & 0x7);
2825 dst[i][GCOMP] = EXPAND_3_8((s[i] >> 2) & 0x7);
2826 dst[i][BCOMP] = EXPAND_2_8((s[i] ) & 0x3);
2827 dst[i][ACOMP] = 0xff;
2828 }
2829 }
2830
2831 static void
2832 unpack_ubyte_A8(const void *src, GLubyte dst[][4], GLuint n)
2833 {
2834 const GLubyte *s = ((const GLubyte *) src);
2835 GLuint i;
2836 for (i = 0; i < n; i++) {
2837 dst[i][RCOMP] =
2838 dst[i][GCOMP] =
2839 dst[i][BCOMP] = 0;
2840 dst[i][ACOMP] = s[i];
2841 }
2842 }
2843
2844 static void
2845 unpack_ubyte_L8(const void *src, GLubyte dst[][4], GLuint n)
2846 {
2847 const GLubyte *s = ((const GLubyte *) src);
2848 GLuint i;
2849 for (i = 0; i < n; i++) {
2850 dst[i][RCOMP] =
2851 dst[i][GCOMP] =
2852 dst[i][BCOMP] = s[i];
2853 dst[i][ACOMP] = 0xff;
2854 }
2855 }
2856
2857
2858 static void
2859 unpack_ubyte_I8(const void *src, GLubyte dst[][4], GLuint n)
2860 {
2861 const GLubyte *s = ((const GLubyte *) src);
2862 GLuint i;
2863 for (i = 0; i < n; i++) {
2864 dst[i][RCOMP] =
2865 dst[i][GCOMP] =
2866 dst[i][BCOMP] =
2867 dst[i][ACOMP] = s[i];
2868 }
2869 }
2870
2871 static void
2872 unpack_ubyte_R8(const void *src, GLubyte dst[][4], GLuint n)
2873 {
2874 const GLubyte *s = ((const GLubyte *) src);
2875 GLuint i;
2876 for (i = 0; i < n; i++) {
2877 dst[i][0] = s[i];
2878 dst[i][1] =
2879 dst[i][2] = 0;
2880 dst[i][3] = 0xff;
2881 }
2882 }
2883
2884 static void
2885 unpack_ubyte_GR88(const void *src, GLubyte dst[][4], GLuint n)
2886 {
2887 const GLushort *s = ((const GLushort *) src);
2888 GLuint i;
2889 for (i = 0; i < n; i++) {
2890 dst[i][RCOMP] = s[i] & 0xff;
2891 dst[i][GCOMP] = s[i] >> 8;
2892 dst[i][BCOMP] = 0;
2893 dst[i][ACOMP] = 0xff;
2894 }
2895 }
2896
2897 static void
2898 unpack_ubyte_RG88(const void *src, GLubyte dst[][4], GLuint n)
2899 {
2900 const GLushort *s = ((const GLushort *) src);
2901 GLuint i;
2902 for (i = 0; i < n; i++) {
2903 dst[i][RCOMP] = s[i] >> 8;
2904 dst[i][GCOMP] = s[i] & 0xff;
2905 dst[i][BCOMP] = 0;
2906 dst[i][ACOMP] = 0xff;
2907 }
2908 }
2909
2910
2911 /**
2912 * Unpack rgba colors, returning as GLubyte values. This should usually
2913 * only be used for unpacking formats that use 8 bits or less per channel.
2914 */
2915 void
2916 _mesa_unpack_ubyte_rgba_row(gl_format format, GLuint n,
2917 const void *src, GLubyte dst[][4])
2918 {
2919 switch (format) {
2920 case MESA_FORMAT_RGBA8888:
2921 unpack_ubyte_RGBA8888(src, dst, n);
2922 break;
2923 case MESA_FORMAT_RGBA8888_REV:
2924 unpack_ubyte_RGBA8888_REV(src, dst, n);
2925 break;
2926 case MESA_FORMAT_ARGB8888:
2927 unpack_ubyte_ARGB8888(src, dst, n);
2928 break;
2929 case MESA_FORMAT_ARGB8888_REV:
2930 unpack_ubyte_ARGB8888_REV(src, dst, n);
2931 break;
2932 case MESA_FORMAT_RGBX8888:
2933 unpack_ubyte_RGBX8888(src, dst, n);
2934 break;
2935 case MESA_FORMAT_RGBX8888_REV:
2936 unpack_ubyte_RGBX8888_REV(src, dst, n);
2937 break;
2938 case MESA_FORMAT_XRGB8888:
2939 unpack_ubyte_XRGB8888(src, dst, n);
2940 break;
2941 case MESA_FORMAT_XRGB8888_REV:
2942 unpack_ubyte_XRGB8888_REV(src, dst, n);
2943 break;
2944 case MESA_FORMAT_RGB888:
2945 unpack_ubyte_RGB888(src, dst, n);
2946 break;
2947 case MESA_FORMAT_BGR888:
2948 unpack_ubyte_BGR888(src, dst, n);
2949 break;
2950 case MESA_FORMAT_RGB565:
2951 unpack_ubyte_RGB565(src, dst, n);
2952 break;
2953 case MESA_FORMAT_RGB565_REV:
2954 unpack_ubyte_RGB565_REV(src, dst, n);
2955 break;
2956 case MESA_FORMAT_ARGB4444:
2957 unpack_ubyte_ARGB4444(src, dst, n);
2958 break;
2959 case MESA_FORMAT_ARGB4444_REV:
2960 unpack_ubyte_ARGB4444_REV(src, dst, n);
2961 break;
2962 case MESA_FORMAT_RGBA5551:
2963 unpack_ubyte_RGBA5551(src, dst, n);
2964 break;
2965 case MESA_FORMAT_ARGB1555:
2966 unpack_ubyte_ARGB1555(src, dst, n);
2967 break;
2968 case MESA_FORMAT_ARGB1555_REV:
2969 unpack_ubyte_ARGB1555_REV(src, dst, n);
2970 break;
2971 case MESA_FORMAT_AL44:
2972 unpack_ubyte_AL44(src, dst, n);
2973 break;
2974 case MESA_FORMAT_AL88:
2975 unpack_ubyte_AL88(src, dst, n);
2976 break;
2977 case MESA_FORMAT_AL88_REV:
2978 unpack_ubyte_AL88_REV(src, dst, n);
2979 break;
2980 case MESA_FORMAT_RGB332:
2981 unpack_ubyte_RGB332(src, dst, n);
2982 break;
2983 case MESA_FORMAT_A8:
2984 unpack_ubyte_A8(src, dst, n);
2985 break;
2986 case MESA_FORMAT_L8:
2987 unpack_ubyte_L8(src, dst, n);
2988 break;
2989 case MESA_FORMAT_I8:
2990 unpack_ubyte_I8(src, dst, n);
2991 break;
2992 case MESA_FORMAT_R8:
2993 unpack_ubyte_R8(src, dst, n);
2994 break;
2995 case MESA_FORMAT_GR88:
2996 unpack_ubyte_GR88(src, dst, n);
2997 break;
2998 case MESA_FORMAT_RG88:
2999 unpack_ubyte_RG88(src, dst, n);
3000 break;
3001 default:
3002 /* get float values, convert to ubyte */
3003 {
3004 GLfloat *tmp = malloc(n * 4 * sizeof(GLfloat));
3005 if (tmp) {
3006 GLuint i;
3007 _mesa_unpack_rgba_row(format, n, src, (GLfloat (*)[4]) tmp);
3008 for (i = 0; i < n; i++) {
3009 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][0], tmp[i*4+0]);
3010 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][1], tmp[i*4+1]);
3011 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][2], tmp[i*4+2]);
3012 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][3], tmp[i*4+3]);
3013 }
3014 free(tmp);
3015 }
3016 }
3017 break;
3018 }
3019 }
3020
3021
3022 /**********************************************************************/
3023 /* Unpack, returning GLuint colors */
3024 /**********************************************************************/
3025
3026 static void
3027 unpack_int_rgba_RGBA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3028 {
3029 memcpy(dst, src, n * 4 * sizeof(GLuint));
3030 }
3031
3032 static void
3033 unpack_int_rgba_RGBA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3034 {
3035 unsigned int i;
3036
3037 for (i = 0; i < n; i++) {
3038 dst[i][0] = src[i * 4 + 0];
3039 dst[i][1] = src[i * 4 + 1];
3040 dst[i][2] = src[i * 4 + 2];
3041 dst[i][3] = src[i * 4 + 3];
3042 }
3043 }
3044
3045 static void
3046 unpack_int_rgba_RGBA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3047 {
3048 unsigned int i;
3049
3050 for (i = 0; i < n; i++) {
3051 dst[i][0] = src[i * 4 + 0];
3052 dst[i][1] = src[i * 4 + 1];
3053 dst[i][2] = src[i * 4 + 2];
3054 dst[i][3] = src[i * 4 + 3];
3055 }
3056 }
3057
3058 static void
3059 unpack_int_rgba_RGBA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3060 {
3061 unsigned int i;
3062
3063 for (i = 0; i < n; i++) {
3064 dst[i][0] = src[i * 4 + 0];
3065 dst[i][1] = src[i * 4 + 1];
3066 dst[i][2] = src[i * 4 + 2];
3067 dst[i][3] = src[i * 4 + 3];
3068 }
3069 }
3070
3071 static void
3072 unpack_int_rgba_RGBA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3073 {
3074 unsigned int i;
3075
3076 for (i = 0; i < n; i++) {
3077 dst[i][0] = src[i * 4 + 0];
3078 dst[i][1] = src[i * 4 + 1];
3079 dst[i][2] = src[i * 4 + 2];
3080 dst[i][3] = src[i * 4 + 3];
3081 }
3082 }
3083
3084 static void
3085 unpack_int_rgba_ARGB8888(const GLbyte *src, GLuint dst[][4], GLuint n)
3086 {
3087 unsigned int i;
3088
3089 for (i = 0; i < n; i++) {
3090 dst[i][RCOMP] = (GLubyte) src[i * 4 + 2];
3091 dst[i][GCOMP] = (GLubyte) src[i * 4 + 1];
3092 dst[i][BCOMP] = (GLubyte) src[i * 4 + 0];
3093 dst[i][ACOMP] = (GLubyte) src[i * 4 + 3];
3094 }
3095 }
3096
3097 static void
3098 unpack_int_rgba_XRGB8888(const GLbyte *src, GLuint dst[][4], GLuint n)
3099 {
3100 unsigned int i;
3101
3102 for (i = 0; i < n; i++) {
3103 dst[i][RCOMP] = (GLubyte) src[i * 4 + 2];
3104 dst[i][GCOMP] = (GLubyte) src[i * 4 + 1];
3105 dst[i][BCOMP] = (GLubyte) src[i * 4 + 0];
3106 dst[i][ACOMP] = (GLubyte) 0xff;
3107 }
3108 }
3109
3110 static void
3111 unpack_int_rgba_RGB_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3112 {
3113 unsigned int i;
3114
3115 for (i = 0; i < n; i++) {
3116 dst[i][0] = src[i * 3 + 0];
3117 dst[i][1] = src[i * 3 + 1];
3118 dst[i][2] = src[i * 3 + 2];
3119 dst[i][3] = 1;
3120 }
3121 }
3122
3123 static void
3124 unpack_int_rgba_RGB_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3125 {
3126 unsigned int i;
3127
3128 for (i = 0; i < n; i++) {
3129 dst[i][0] = src[i * 3 + 0];
3130 dst[i][1] = src[i * 3 + 1];
3131 dst[i][2] = src[i * 3 + 2];
3132 dst[i][3] = 1;
3133 }
3134 }
3135
3136 static void
3137 unpack_int_rgba_RGB_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3138 {
3139 unsigned int i;
3140
3141 for (i = 0; i < n; i++) {
3142 dst[i][0] = src[i * 3 + 0];
3143 dst[i][1] = src[i * 3 + 1];
3144 dst[i][2] = src[i * 3 + 2];
3145 dst[i][3] = 1;
3146 }
3147 }
3148
3149 static void
3150 unpack_int_rgba_RGB_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3151 {
3152 unsigned int i;
3153
3154 for (i = 0; i < n; i++) {
3155 dst[i][0] = src[i * 3 + 0];
3156 dst[i][1] = src[i * 3 + 1];
3157 dst[i][2] = src[i * 3 + 2];
3158 dst[i][3] = 1;
3159 }
3160 }
3161
3162 static void
3163 unpack_int_rgba_RGB_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3164 {
3165 unsigned int i;
3166
3167 for (i = 0; i < n; i++) {
3168 dst[i][0] = src[i * 3 + 0];
3169 dst[i][1] = src[i * 3 + 1];
3170 dst[i][2] = src[i * 3 + 2];
3171 dst[i][3] = 1;
3172 }
3173 }
3174
3175 static void
3176 unpack_int_rgba_RG_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3177 {
3178 unsigned int i;
3179
3180 for (i = 0; i < n; i++) {
3181 dst[i][0] = src[i * 2 + 0];
3182 dst[i][1] = src[i * 2 + 1];
3183 dst[i][2] = 0;
3184 dst[i][3] = 1;
3185 }
3186 }
3187
3188 static void
3189 unpack_int_rgba_RG_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3190 {
3191 unsigned int i;
3192
3193 for (i = 0; i < n; i++) {
3194 dst[i][0] = src[i * 2 + 0];
3195 dst[i][1] = src[i * 2 + 1];
3196 dst[i][2] = 0;
3197 dst[i][3] = 1;
3198 }
3199 }
3200
3201 static void
3202 unpack_int_rgba_RG_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3203 {
3204 unsigned int i;
3205
3206 for (i = 0; i < n; i++) {
3207 dst[i][0] = src[i * 2 + 0];
3208 dst[i][1] = src[i * 2 + 1];
3209 dst[i][2] = 0;
3210 dst[i][3] = 1;
3211 }
3212 }
3213
3214 static void
3215 unpack_int_rgba_RG_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3216 {
3217 unsigned int i;
3218
3219 for (i = 0; i < n; i++) {
3220 dst[i][0] = src[i * 2 + 0];
3221 dst[i][1] = src[i * 2 + 1];
3222 dst[i][2] = 0;
3223 dst[i][3] = 1;
3224 }
3225 }
3226
3227 static void
3228 unpack_int_rgba_RG_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3229 {
3230 unsigned int i;
3231
3232 for (i = 0; i < n; i++) {
3233 dst[i][0] = src[i * 2 + 0];
3234 dst[i][1] = src[i * 2 + 1];
3235 dst[i][2] = 0;
3236 dst[i][3] = 1;
3237 }
3238 }
3239
3240 static void
3241 unpack_int_rgba_R_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3242 {
3243 unsigned int i;
3244
3245 for (i = 0; i < n; i++) {
3246 dst[i][0] = src[i];
3247 dst[i][1] = 0;
3248 dst[i][2] = 0;
3249 dst[i][3] = 1;
3250 }
3251 }
3252
3253 static void
3254 unpack_int_rgba_R_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3255 {
3256 unsigned int i;
3257
3258 for (i = 0; i < n; i++) {
3259 dst[i][0] = src[i];
3260 dst[i][1] = 0;
3261 dst[i][2] = 0;
3262 dst[i][3] = 1;
3263 }
3264 }
3265
3266 static void
3267 unpack_int_rgba_R_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3268 {
3269 unsigned int i;
3270
3271 for (i = 0; i < n; i++) {
3272 dst[i][0] = src[i];
3273 dst[i][1] = 0;
3274 dst[i][2] = 0;
3275 dst[i][3] = 1;
3276 }
3277 }
3278
3279 static void
3280 unpack_int_rgba_R_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3281 {
3282 unsigned int i;
3283
3284 for (i = 0; i < n; i++) {
3285 dst[i][0] = src[i];
3286 dst[i][1] = 0;
3287 dst[i][2] = 0;
3288 dst[i][3] = 1;
3289 }
3290 }
3291
3292 static void
3293 unpack_int_rgba_R_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3294 {
3295 unsigned int i;
3296
3297 for (i = 0; i < n; i++) {
3298 dst[i][0] = src[i];
3299 dst[i][1] = 0;
3300 dst[i][2] = 0;
3301 dst[i][3] = 1;
3302 }
3303 }
3304
3305 static void
3306 unpack_int_rgba_ALPHA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3307 {
3308 unsigned int i;
3309
3310 for (i = 0; i < n; i++) {
3311 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3312 dst[i][3] = src[i];
3313 }
3314 }
3315
3316 static void
3317 unpack_int_rgba_ALPHA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3318 {
3319 unsigned int i;
3320
3321 for (i = 0; i < n; i++) {
3322 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3323 dst[i][3] = src[i];
3324 }
3325 }
3326
3327 static void
3328 unpack_int_rgba_ALPHA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3329 {
3330 unsigned int i;
3331
3332 for (i = 0; i < n; i++) {
3333 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3334 dst[i][3] = src[i];
3335 }
3336 }
3337
3338 static void
3339 unpack_int_rgba_ALPHA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3340 {
3341 unsigned int i;
3342
3343 for (i = 0; i < n; i++) {
3344 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3345 dst[i][3] = src[i];
3346 }
3347 }
3348
3349 static void
3350 unpack_int_rgba_ALPHA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3351 {
3352 unsigned int i;
3353
3354 for (i = 0; i < n; i++) {
3355 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3356 dst[i][3] = src[i];
3357 }
3358 }
3359
3360 static void
3361 unpack_int_rgba_LUMINANCE_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3362 {
3363 unsigned int i;
3364
3365 for (i = 0; i < n; i++) {
3366 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3367 dst[i][3] = 1;
3368 }
3369 }
3370
3371 static void
3372 unpack_int_rgba_LUMINANCE_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3373 {
3374 unsigned int i;
3375
3376 for (i = 0; i < n; i++) {
3377 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3378 dst[i][3] = 1;
3379 }
3380 }
3381
3382 static void
3383 unpack_int_rgba_LUMINANCE_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3384 {
3385 unsigned int i;
3386
3387 for (i = 0; i < n; i++) {
3388 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3389 dst[i][3] = 1;
3390 }
3391 }
3392
3393 static void
3394 unpack_int_rgba_LUMINANCE_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3395 {
3396 unsigned int i;
3397
3398 for (i = 0; i < n; i++) {
3399 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3400 dst[i][3] = 1;
3401 }
3402 }
3403
3404 static void
3405 unpack_int_rgba_LUMINANCE_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3406 {
3407 unsigned int i;
3408
3409 for (i = 0; i < n; i++) {
3410 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3411 dst[i][3] = 1;
3412 }
3413 }
3414
3415
3416 static void
3417 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3418 {
3419 unsigned int i;
3420
3421 for (i = 0; i < n; i++) {
3422 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3423 dst[i][3] = src[i * 2 + 1];
3424 }
3425 }
3426
3427 static void
3428 unpack_int_rgba_LUMINANCE_ALPHA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3429 {
3430 unsigned int i;
3431
3432 for (i = 0; i < n; i++) {
3433 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3434 dst[i][3] = src[i * 2 + 1];
3435 }
3436 }
3437
3438 static void
3439 unpack_int_rgba_LUMINANCE_ALPHA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3440 {
3441 unsigned int i;
3442
3443 for (i = 0; i < n; i++) {
3444 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3445 dst[i][3] = src[i * 2 + 1];
3446 }
3447 }
3448
3449 static void
3450 unpack_int_rgba_LUMINANCE_ALPHA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3451 {
3452 unsigned int i;
3453
3454 for (i = 0; i < n; i++) {
3455 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3456 dst[i][3] = src[i * 2 + 1];
3457 }
3458 }
3459
3460 static void
3461 unpack_int_rgba_LUMINANCE_ALPHA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3462 {
3463 unsigned int i;
3464
3465 for (i = 0; i < n; i++) {
3466 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3467 dst[i][3] = src[i * 2 + 1];
3468 }
3469 }
3470
3471 static void
3472 unpack_int_rgba_INTENSITY_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3473 {
3474 unsigned int i;
3475
3476 for (i = 0; i < n; i++) {
3477 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3478 }
3479 }
3480
3481 static void
3482 unpack_int_rgba_INTENSITY_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3483 {
3484 unsigned int i;
3485
3486 for (i = 0; i < n; i++) {
3487 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3488 }
3489 }
3490
3491 static void
3492 unpack_int_rgba_INTENSITY_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3493 {
3494 unsigned int i;
3495
3496 for (i = 0; i < n; i++) {
3497 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3498 }
3499 }
3500
3501 static void
3502 unpack_int_rgba_INTENSITY_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3503 {
3504 unsigned int i;
3505
3506 for (i = 0; i < n; i++) {
3507 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3508 }
3509 }
3510
3511 static void
3512 unpack_int_rgba_INTENSITY_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3513 {
3514 unsigned int i;
3515
3516 for (i = 0; i < n; i++) {
3517 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3518 }
3519 }
3520
3521 static void
3522 unpack_int_rgba_ARGB2101010_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
3523 {
3524 unsigned int i;
3525
3526 for (i = 0; i < n; i++) {
3527 GLuint tmp = src[i];
3528 dst[i][0] = (tmp >> 20) & 0x3ff;
3529 dst[i][1] = (tmp >> 10) & 0x3ff;
3530 dst[i][2] = (tmp >> 0) & 0x3ff;
3531 dst[i][3] = (tmp >> 30) & 0x3;
3532 }
3533 }
3534
3535 static void
3536 unpack_int_rgba_ABGR2101010_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
3537 {
3538 unsigned int i;
3539
3540 for (i = 0; i < n; i++) {
3541 GLuint tmp = src[i];
3542 dst[i][0] = (tmp >> 0) & 0x3ff;
3543 dst[i][1] = (tmp >> 10) & 0x3ff;
3544 dst[i][2] = (tmp >> 20) & 0x3ff;
3545 dst[i][3] = (tmp >> 30) & 0x3;
3546 }
3547 }
3548
3549 static void
3550 unpack_int_rgba_ARGB2101010(const GLuint *src, GLuint dst[][4], GLuint n)
3551 {
3552 unsigned int i;
3553
3554 for (i = 0; i < n; i++) {
3555 GLuint tmp = src[i];
3556 dst[i][0] = (tmp >> 20) & 0x3ff;
3557 dst[i][1] = (tmp >> 10) & 0x3ff;
3558 dst[i][2] = (tmp >> 0) & 0x3ff;
3559 dst[i][3] = (tmp >> 30) & 0x3;
3560 }
3561 }
3562
3563 static void
3564 unpack_int_rgba_XBGR8888_UINT(const GLubyte *src, GLuint dst[][4], GLuint n)
3565 {
3566 unsigned int i;
3567
3568 for (i = 0; i < n; i++) {
3569 dst[i][0] = src[i * 4 + 0];
3570 dst[i][1] = src[i * 4 + 1];
3571 dst[i][2] = src[i * 4 + 2];
3572 dst[i][3] = 1;
3573 }
3574 }
3575
3576 static void
3577 unpack_int_rgba_XBGR8888_SINT(const GLbyte *src, GLuint dst[][4], GLuint n)
3578 {
3579 unsigned int i;
3580
3581 for (i = 0; i < n; i++) {
3582 dst[i][0] = src[i * 4 + 0];
3583 dst[i][1] = src[i * 4 + 1];
3584 dst[i][2] = src[i * 4 + 2];
3585 dst[i][3] = 1;
3586 }
3587 }
3588
3589 static void
3590 unpack_int_rgba_XBGR16161616_UINT(const GLushort *src, GLuint dst[][4], GLuint n)
3591 {
3592 unsigned int i;
3593
3594 for (i = 0; i < n; i++) {
3595 dst[i][0] = src[i * 4 + 0];
3596 dst[i][1] = src[i * 4 + 1];
3597 dst[i][2] = src[i * 4 + 2];
3598 dst[i][3] = 1;
3599 }
3600 }
3601
3602 static void
3603 unpack_int_rgba_XBGR16161616_SINT(const GLshort *src, GLuint dst[][4], GLuint n)
3604 {
3605 unsigned int i;
3606
3607 for (i = 0; i < n; i++) {
3608 dst[i][0] = src[i * 4 + 0];
3609 dst[i][1] = src[i * 4 + 1];
3610 dst[i][2] = src[i * 4 + 2];
3611 dst[i][3] = 1;
3612 }
3613 }
3614
3615 static void
3616 unpack_int_rgba_XBGR32323232_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
3617 {
3618 unsigned int i;
3619
3620 for (i = 0; i < n; i++) {
3621 dst[i][0] = src[i * 4 + 0];
3622 dst[i][1] = src[i * 4 + 1];
3623 dst[i][2] = src[i * 4 + 2];
3624 dst[i][3] = 1;
3625 }
3626 }
3627
3628 static void
3629 unpack_int_rgba_ABGR2101010(const GLuint *src, GLuint dst[][4], GLuint n)
3630 {
3631 unsigned int i;
3632
3633 for (i = 0; i < n; i++) {
3634 GLuint tmp = src[i];
3635 dst[i][0] = (tmp >> 0) & 0x3ff;
3636 dst[i][1] = (tmp >> 10) & 0x3ff;
3637 dst[i][2] = (tmp >> 20) & 0x3ff;
3638 dst[i][3] = (tmp >> 30) & 0x3;
3639 }
3640 }
3641
3642 void
3643 _mesa_unpack_uint_rgba_row(gl_format format, GLuint n,
3644 const void *src, GLuint dst[][4])
3645 {
3646 switch (format) {
3647 /* Since there won't be any sign extension happening, there's no need to
3648 * make separate paths for 32-bit-to-32-bit integer unpack.
3649 */
3650 case MESA_FORMAT_RGBA_UINT32:
3651 case MESA_FORMAT_RGBA_INT32:
3652 unpack_int_rgba_RGBA_UINT32(src, dst, n);
3653 break;
3654
3655 case MESA_FORMAT_RGBA_UINT16:
3656 unpack_int_rgba_RGBA_UINT16(src, dst, n);
3657 break;
3658 case MESA_FORMAT_RGBA_INT16:
3659 unpack_int_rgba_RGBA_INT16(src, dst, n);
3660 break;
3661
3662 case MESA_FORMAT_RGBA_UINT8:
3663 unpack_int_rgba_RGBA_UINT8(src, dst, n);
3664 break;
3665 case MESA_FORMAT_RGBA_INT8:
3666 unpack_int_rgba_RGBA_INT8(src, dst, n);
3667 break;
3668
3669 case MESA_FORMAT_ARGB8888:
3670 unpack_int_rgba_ARGB8888(src, dst, n);
3671 break;
3672
3673 case MESA_FORMAT_XRGB8888:
3674 unpack_int_rgba_XRGB8888(src, dst, n);
3675 break;
3676
3677 case MESA_FORMAT_RGB_UINT32:
3678 case MESA_FORMAT_RGB_INT32:
3679 unpack_int_rgba_RGB_UINT32(src, dst, n);
3680 break;
3681
3682 case MESA_FORMAT_RGB_UINT16:
3683 unpack_int_rgba_RGB_UINT16(src, dst, n);
3684 break;
3685 case MESA_FORMAT_RGB_INT16:
3686 unpack_int_rgba_RGB_INT16(src, dst, n);
3687 break;
3688
3689 case MESA_FORMAT_RGB_UINT8:
3690 unpack_int_rgba_RGB_UINT8(src, dst, n);
3691 break;
3692 case MESA_FORMAT_RGB_INT8:
3693 unpack_int_rgba_RGB_INT8(src, dst, n);
3694 break;
3695
3696 case MESA_FORMAT_RG_UINT32:
3697 case MESA_FORMAT_RG_INT32:
3698 unpack_int_rgba_RG_UINT32(src, dst, n);
3699 break;
3700
3701 case MESA_FORMAT_RG_UINT16:
3702 unpack_int_rgba_RG_UINT16(src, dst, n);
3703 break;
3704 case MESA_FORMAT_RG_INT16:
3705 unpack_int_rgba_RG_INT16(src, dst, n);
3706 break;
3707
3708 case MESA_FORMAT_RG_UINT8:
3709 unpack_int_rgba_RG_UINT8(src, dst, n);
3710 break;
3711 case MESA_FORMAT_RG_INT8:
3712 unpack_int_rgba_RG_INT8(src, dst, n);
3713 break;
3714
3715 case MESA_FORMAT_R_UINT32:
3716 case MESA_FORMAT_R_INT32:
3717 unpack_int_rgba_R_UINT32(src, dst, n);
3718 break;
3719
3720 case MESA_FORMAT_R_UINT16:
3721 unpack_int_rgba_R_UINT16(src, dst, n);
3722 break;
3723 case MESA_FORMAT_R_INT16:
3724 unpack_int_rgba_R_INT16(src, dst, n);
3725 break;
3726
3727 case MESA_FORMAT_R_UINT8:
3728 unpack_int_rgba_R_UINT8(src, dst, n);
3729 break;
3730 case MESA_FORMAT_R_INT8:
3731 unpack_int_rgba_R_INT8(src, dst, n);
3732 break;
3733
3734 case MESA_FORMAT_ALPHA_UINT32:
3735 case MESA_FORMAT_ALPHA_INT32:
3736 unpack_int_rgba_ALPHA_UINT32(src, dst, n);
3737 break;
3738
3739 case MESA_FORMAT_ALPHA_UINT16:
3740 unpack_int_rgba_ALPHA_UINT16(src, dst, n);
3741 break;
3742 case MESA_FORMAT_ALPHA_INT16:
3743 unpack_int_rgba_ALPHA_INT16(src, dst, n);
3744 break;
3745
3746 case MESA_FORMAT_ALPHA_UINT8:
3747 unpack_int_rgba_ALPHA_UINT8(src, dst, n);
3748 break;
3749 case MESA_FORMAT_ALPHA_INT8:
3750 unpack_int_rgba_ALPHA_INT8(src, dst, n);
3751 break;
3752
3753 case MESA_FORMAT_LUMINANCE_UINT32:
3754 case MESA_FORMAT_LUMINANCE_INT32:
3755 unpack_int_rgba_LUMINANCE_UINT32(src, dst, n);
3756 break;
3757 case MESA_FORMAT_LUMINANCE_UINT16:
3758 unpack_int_rgba_LUMINANCE_UINT16(src, dst, n);
3759 break;
3760 case MESA_FORMAT_LUMINANCE_INT16:
3761 unpack_int_rgba_LUMINANCE_INT16(src, dst, n);
3762 break;
3763
3764 case MESA_FORMAT_LUMINANCE_UINT8:
3765 unpack_int_rgba_LUMINANCE_UINT8(src, dst, n);
3766 break;
3767 case MESA_FORMAT_LUMINANCE_INT8:
3768 unpack_int_rgba_LUMINANCE_INT8(src, dst, n);
3769 break;
3770
3771 case MESA_FORMAT_LUMINANCE_ALPHA_UINT32:
3772 case MESA_FORMAT_LUMINANCE_ALPHA_INT32:
3773 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(src, dst, n);
3774 break;
3775
3776 case MESA_FORMAT_LUMINANCE_ALPHA_UINT16:
3777 unpack_int_rgba_LUMINANCE_ALPHA_UINT16(src, dst, n);
3778 break;
3779 case MESA_FORMAT_LUMINANCE_ALPHA_INT16:
3780 unpack_int_rgba_LUMINANCE_ALPHA_INT16(src, dst, n);
3781 break;
3782
3783 case MESA_FORMAT_LUMINANCE_ALPHA_UINT8:
3784 unpack_int_rgba_LUMINANCE_ALPHA_UINT8(src, dst, n);
3785 break;
3786 case MESA_FORMAT_LUMINANCE_ALPHA_INT8:
3787 unpack_int_rgba_LUMINANCE_ALPHA_INT8(src, dst, n);
3788 break;
3789
3790 case MESA_FORMAT_INTENSITY_UINT32:
3791 case MESA_FORMAT_INTENSITY_INT32:
3792 unpack_int_rgba_INTENSITY_UINT32(src, dst, n);
3793 break;
3794
3795 case MESA_FORMAT_INTENSITY_UINT16:
3796 unpack_int_rgba_INTENSITY_UINT16(src, dst, n);
3797 break;
3798 case MESA_FORMAT_INTENSITY_INT16:
3799 unpack_int_rgba_INTENSITY_INT16(src, dst, n);
3800 break;
3801
3802 case MESA_FORMAT_INTENSITY_UINT8:
3803 unpack_int_rgba_INTENSITY_UINT8(src, dst, n);
3804 break;
3805 case MESA_FORMAT_INTENSITY_INT8:
3806 unpack_int_rgba_INTENSITY_INT8(src, dst, n);
3807 break;
3808
3809 case MESA_FORMAT_ARGB2101010_UINT:
3810 unpack_int_rgba_ARGB2101010_UINT(src, dst, n);
3811 break;
3812
3813 case MESA_FORMAT_ABGR2101010_UINT:
3814 unpack_int_rgba_ABGR2101010_UINT(src, dst, n);
3815 break;
3816
3817 case MESA_FORMAT_ARGB2101010:
3818 unpack_int_rgba_ARGB2101010(src, dst, n);
3819 break;
3820
3821 case MESA_FORMAT_XBGR8888_UINT:
3822 unpack_int_rgba_XBGR8888_UINT(src, dst, n);
3823 break;
3824
3825 case MESA_FORMAT_XBGR8888_SINT:
3826 unpack_int_rgba_XBGR8888_SINT(src, dst, n);
3827 break;
3828
3829 case MESA_FORMAT_XBGR16161616_UINT:
3830 unpack_int_rgba_XBGR16161616_UINT(src, dst, n);
3831 break;
3832
3833 case MESA_FORMAT_XBGR16161616_SINT:
3834 unpack_int_rgba_XBGR16161616_SINT(src, dst, n);
3835 break;
3836
3837 case MESA_FORMAT_XBGR32323232_UINT:
3838 case MESA_FORMAT_XBGR32323232_SINT:
3839 unpack_int_rgba_XBGR32323232_UINT(src, dst, n);
3840 break;
3841
3842 case MESA_FORMAT_ABGR2101010:
3843 unpack_int_rgba_ABGR2101010(src, dst, n);
3844 break;
3845
3846 default:
3847 _mesa_problem(NULL, "%s: bad format %s", __FUNCTION__,
3848 _mesa_get_format_name(format));
3849 return;
3850 }
3851 }
3852
3853 /**
3854 * Unpack a 2D rect of pixels returning float RGBA colors.
3855 * \param format the source image format
3856 * \param src start address of the source image
3857 * \param srcRowStride source image row stride in bytes
3858 * \param dst start address of the dest image
3859 * \param dstRowStride dest image row stride in bytes
3860 * \param x source image start X pos
3861 * \param y source image start Y pos
3862 * \param width width of rect region to convert
3863 * \param height height of rect region to convert
3864 */
3865 void
3866 _mesa_unpack_rgba_block(gl_format format,
3867 const void *src, GLint srcRowStride,
3868 GLfloat dst[][4], GLint dstRowStride,
3869 GLuint x, GLuint y, GLuint width, GLuint height)
3870 {
3871 unpack_rgba_func unpack = get_unpack_rgba_function(format);
3872 const GLuint srcPixStride = _mesa_get_format_bytes(format);
3873 const GLuint dstPixStride = 4 * sizeof(GLfloat);
3874 const GLubyte *srcRow;
3875 GLubyte *dstRow;
3876 GLuint i;
3877
3878 /* XXX needs to be fixed for compressed formats */
3879
3880 srcRow = ((const GLubyte *) src) + srcRowStride * y + srcPixStride * x;
3881 dstRow = ((GLubyte *) dst) + dstRowStride * y + dstPixStride * x;
3882
3883 for (i = 0; i < height; i++) {
3884 unpack(srcRow, (GLfloat (*)[4]) dstRow, width);
3885
3886 dstRow += dstRowStride;
3887 srcRow += srcRowStride;
3888 }
3889 }
3890
3891
3892
3893
3894 typedef void (*unpack_float_z_func)(GLuint n, const void *src, GLfloat *dst);
3895
3896 static void
3897 unpack_float_z_Z24_X8(GLuint n, const void *src, GLfloat *dst)
3898 {
3899 /* only return Z, not stencil data */
3900 const GLuint *s = ((const GLuint *) src);
3901 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
3902 GLuint i;
3903 for (i = 0; i < n; i++) {
3904 dst[i] = (GLfloat) ((s[i] >> 8) * scale);
3905 ASSERT(dst[i] >= 0.0F);
3906 ASSERT(dst[i] <= 1.0F);
3907 }
3908 }
3909
3910 static void
3911 unpack_float_z_X8_Z24(GLuint n, const void *src, GLfloat *dst)
3912 {
3913 /* only return Z, not stencil data */
3914 const GLuint *s = ((const GLuint *) src);
3915 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
3916 GLuint i;
3917 for (i = 0; i < n; i++) {
3918 dst[i] = (GLfloat) ((s[i] & 0x00ffffff) * scale);
3919 ASSERT(dst[i] >= 0.0F);
3920 ASSERT(dst[i] <= 1.0F);
3921 }
3922 }
3923
3924 static void
3925 unpack_float_z_Z16(GLuint n, const void *src, GLfloat *dst)
3926 {
3927 const GLushort *s = ((const GLushort *) src);
3928 GLuint i;
3929 for (i = 0; i < n; i++) {
3930 dst[i] = s[i] * (1.0F / 65535.0F);
3931 }
3932 }
3933
3934 static void
3935 unpack_float_z_Z32(GLuint n, const void *src, GLfloat *dst)
3936 {
3937 const GLuint *s = ((const GLuint *) src);
3938 GLuint i;
3939 for (i = 0; i < n; i++) {
3940 dst[i] = s[i] * (1.0F / 0xffffffff);
3941 }
3942 }
3943
3944 static void
3945 unpack_float_z_Z32F(GLuint n, const void *src, GLfloat *dst)
3946 {
3947 memcpy(dst, src, n * sizeof(float));
3948 }
3949
3950 static void
3951 unpack_float_z_Z32X24S8(GLuint n, const void *src, GLfloat *dst)
3952 {
3953 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
3954 GLuint i;
3955 for (i = 0; i < n; i++) {
3956 dst[i] = s[i].z;
3957 }
3958 }
3959
3960
3961
3962 /**
3963 * Unpack Z values.
3964 * The returned values will always be in the range [0.0, 1.0].
3965 */
3966 void
3967 _mesa_unpack_float_z_row(gl_format format, GLuint n,
3968 const void *src, GLfloat *dst)
3969 {
3970 unpack_float_z_func unpack;
3971
3972 switch (format) {
3973 case MESA_FORMAT_Z24_S8:
3974 case MESA_FORMAT_Z24_X8:
3975 unpack = unpack_float_z_Z24_X8;
3976 break;
3977 case MESA_FORMAT_S8_Z24:
3978 case MESA_FORMAT_X8_Z24:
3979 unpack = unpack_float_z_X8_Z24;
3980 break;
3981 case MESA_FORMAT_Z16:
3982 unpack = unpack_float_z_Z16;
3983 break;
3984 case MESA_FORMAT_Z32:
3985 unpack = unpack_float_z_Z32;
3986 break;
3987 case MESA_FORMAT_Z32_FLOAT:
3988 unpack = unpack_float_z_Z32F;
3989 break;
3990 case MESA_FORMAT_Z32_FLOAT_X24S8:
3991 unpack = unpack_float_z_Z32X24S8;
3992 break;
3993 default:
3994 _mesa_problem(NULL, "bad format %s in _mesa_unpack_float_z_row",
3995 _mesa_get_format_name(format));
3996 return;
3997 }
3998
3999 unpack(n, src, dst);
4000 }
4001
4002
4003
4004 typedef void (*unpack_uint_z_func)(const void *src, GLuint *dst, GLuint n);
4005
4006 static void
4007 unpack_uint_z_Z24_X8(const void *src, GLuint *dst, GLuint n)
4008 {
4009 /* only return Z, not stencil data */
4010 const GLuint *s = ((const GLuint *) src);
4011 GLuint i;
4012 for (i = 0; i < n; i++) {
4013 dst[i] = (s[i] & 0xffffff00) | (s[i] >> 24);
4014 }
4015 }
4016
4017 static void
4018 unpack_uint_z_X8_Z24(const void *src, GLuint *dst, GLuint n)
4019 {
4020 /* only return Z, not stencil data */
4021 const GLuint *s = ((const GLuint *) src);
4022 GLuint i;
4023 for (i = 0; i < n; i++) {
4024 dst[i] = (s[i] << 8) | ((s[i] >> 16) & 0xff);
4025 }
4026 }
4027
4028 static void
4029 unpack_uint_z_Z16(const void *src, GLuint *dst, GLuint n)
4030 {
4031 const GLushort *s = ((const GLushort *)src);
4032 GLuint i;
4033 for (i = 0; i < n; i++) {
4034 dst[i] = (s[i] << 16) | s[i];
4035 }
4036 }
4037
4038 static void
4039 unpack_uint_z_Z32(const void *src, GLuint *dst, GLuint n)
4040 {
4041 memcpy(dst, src, n * sizeof(GLuint));
4042 }
4043
4044 static void
4045 unpack_uint_z_Z32_FLOAT(const void *src, GLuint *dst, GLuint n)
4046 {
4047 const float *s = (const float *)src;
4048 GLuint i;
4049 for (i = 0; i < n; i++) {
4050 dst[i] = FLOAT_TO_UINT(CLAMP(s[i], 0.0F, 1.0F));
4051 }
4052 }
4053
4054 static void
4055 unpack_uint_z_Z32_FLOAT_X24S8(const void *src, GLuint *dst, GLuint n)
4056 {
4057 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
4058 GLuint i;
4059
4060 for (i = 0; i < n; i++) {
4061 dst[i] = FLOAT_TO_UINT(CLAMP(s[i].z, 0.0F, 1.0F));
4062 }
4063 }
4064
4065
4066 /**
4067 * Unpack Z values.
4068 * The returned values will always be in the range [0, 0xffffffff].
4069 */
4070 void
4071 _mesa_unpack_uint_z_row(gl_format format, GLuint n,
4072 const void *src, GLuint *dst)
4073 {
4074 unpack_uint_z_func unpack;
4075 const GLubyte *srcPtr = (GLubyte *) src;
4076
4077 switch (format) {
4078 case MESA_FORMAT_Z24_S8:
4079 case MESA_FORMAT_Z24_X8:
4080 unpack = unpack_uint_z_Z24_X8;
4081 break;
4082 case MESA_FORMAT_S8_Z24:
4083 case MESA_FORMAT_X8_Z24:
4084 unpack = unpack_uint_z_X8_Z24;
4085 break;
4086 case MESA_FORMAT_Z16:
4087 unpack = unpack_uint_z_Z16;
4088 break;
4089 case MESA_FORMAT_Z32:
4090 unpack = unpack_uint_z_Z32;
4091 break;
4092 case MESA_FORMAT_Z32_FLOAT:
4093 unpack = unpack_uint_z_Z32_FLOAT;
4094 break;
4095 case MESA_FORMAT_Z32_FLOAT_X24S8:
4096 unpack = unpack_uint_z_Z32_FLOAT_X24S8;
4097 break;
4098 default:
4099 _mesa_problem(NULL, "bad format %s in _mesa_unpack_uint_z_row",
4100 _mesa_get_format_name(format));
4101 return;
4102 }
4103
4104 unpack(srcPtr, dst, n);
4105 }
4106
4107
4108 static void
4109 unpack_ubyte_s_S8(const void *src, GLubyte *dst, GLuint n)
4110 {
4111 memcpy(dst, src, n);
4112 }
4113
4114 static void
4115 unpack_ubyte_s_Z24_S8(const void *src, GLubyte *dst, GLuint n)
4116 {
4117 GLuint i;
4118 const GLuint *src32 = src;
4119
4120 for (i = 0; i < n; i++)
4121 dst[i] = src32[i] & 0xff;
4122 }
4123
4124 static void
4125 unpack_ubyte_s_S8_Z24(const void *src, GLubyte *dst, GLuint n)
4126 {
4127 GLuint i;
4128 const GLuint *src32 = src;
4129
4130 for (i = 0; i < n; i++)
4131 dst[i] = src32[i] >> 24;
4132 }
4133
4134 static void
4135 unpack_ubyte_s_Z32_FLOAT_X24S8(const void *src, GLubyte *dst, GLuint n)
4136 {
4137 GLuint i;
4138 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
4139
4140 for (i = 0; i < n; i++)
4141 dst[i] = s[i].x24s8 & 0xff;
4142 }
4143
4144 void
4145 _mesa_unpack_ubyte_stencil_row(gl_format format, GLuint n,
4146 const void *src, GLubyte *dst)
4147 {
4148 switch (format) {
4149 case MESA_FORMAT_S8:
4150 unpack_ubyte_s_S8(src, dst, n);
4151 break;
4152 case MESA_FORMAT_Z24_S8:
4153 unpack_ubyte_s_Z24_S8(src, dst, n);
4154 break;
4155 case MESA_FORMAT_S8_Z24:
4156 unpack_ubyte_s_S8_Z24(src, dst, n);
4157 break;
4158 case MESA_FORMAT_Z32_FLOAT_X24S8:
4159 unpack_ubyte_s_Z32_FLOAT_X24S8(src, dst, n);
4160 break;
4161 default:
4162 _mesa_problem(NULL, "bad format %s in _mesa_unpack_ubyte_s_row",
4163 _mesa_get_format_name(format));
4164 return;
4165 }
4166 }
4167
4168 static void
4169 unpack_uint_24_8_depth_stencil_S8_Z24(const GLuint *src, GLuint *dst, GLuint n)
4170 {
4171 GLuint i;
4172
4173 for (i = 0; i < n; i++) {
4174 GLuint val = src[i];
4175 dst[i] = val >> 24 | val << 8;
4176 }
4177 }
4178
4179 static void
4180 unpack_uint_24_8_depth_stencil_Z24_S8(const GLuint *src, GLuint *dst, GLuint n)
4181 {
4182 memcpy(dst, src, n * 4);
4183 }
4184
4185 void
4186 _mesa_unpack_uint_24_8_depth_stencil_row(gl_format format, GLuint n,
4187 const void *src, GLuint *dst)
4188 {
4189 switch (format) {
4190 case MESA_FORMAT_Z24_S8:
4191 unpack_uint_24_8_depth_stencil_Z24_S8(src, dst, n);
4192 break;
4193 case MESA_FORMAT_S8_Z24:
4194 unpack_uint_24_8_depth_stencil_S8_Z24(src, dst, n);
4195 break;
4196 default:
4197 _mesa_problem(NULL,
4198 "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row",
4199 _mesa_get_format_name(format));
4200 return;
4201 }
4202 }