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