2 * Mesa 3-D graphics library
4 * Copyright (c) 2011 VMware, Inc.
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:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
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.
26 #include "format_unpack.h"
28 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
29 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
33 * Convert an 8-bit sRGB value from non-linear space to a
34 * linear RGB value in [0, 1].
35 * Implemented with a 256-entry lookup table.
38 nonlinear_to_linear(GLubyte cs8
)
40 static GLfloat table
[256];
41 static GLboolean tableReady
= GL_FALSE
;
43 /* compute lookup table now */
45 for (i
= 0; i
< 256; i
++) {
46 const GLfloat cs
= UBYTE_TO_FLOAT(i
);
48 table
[i
] = cs
/ 12.92f
;
51 table
[i
] = (GLfloat
) pow((cs
+ 0.055) / 1.055, 2.4);
60 typedef void (*unpack_rgba_func
)(const void *src
, GLfloat dst
[4]);
64 unpack_RGBA8888(const void *src
, GLfloat dst
[4])
66 const GLuint s
= *((const GLuint
*) src
);
67 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
>> 24) );
68 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
69 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
70 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff );
74 unpack_RGBA8888_REV(const void *src
, GLfloat dst
[4])
76 const GLuint s
= *((const GLuint
*) src
);
77 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff );
78 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
79 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
80 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
>> 24) );
84 unpack_ARGB8888(const void *src
, GLfloat dst
[4])
86 const GLuint s
= *((const GLuint
*) src
);
87 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
88 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
89 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff );
90 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
>> 24) );
94 unpack_ARGB8888_REV(const void *src
, GLfloat dst
[4])
96 const GLuint s
= *((const GLuint
*) src
);
97 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
98 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
99 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
>> 24) );
100 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff );
104 unpack_XRGB8888(const void *src
, GLfloat dst
[4])
106 const GLuint s
= *((const GLuint
*) src
);
107 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
108 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
109 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff );
114 unpack_XRGB8888_REV(const void *src
, GLfloat dst
[4])
116 const GLuint s
= *((const GLuint
*) src
);
117 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
118 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
119 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
>> 24) );
124 unpack_RGB888(const void *src
, GLfloat dst
[4])
126 const GLubyte
*s
= (const GLubyte
*) src
;
127 dst
[RCOMP
] = UBYTE_TO_FLOAT( s
[2] );
128 dst
[GCOMP
] = UBYTE_TO_FLOAT( s
[1] );
129 dst
[BCOMP
] = UBYTE_TO_FLOAT( s
[0] );
134 unpack_BGR888(const void *src
, GLfloat dst
[4])
136 const GLubyte
*s
= (const GLubyte
*) src
;
137 dst
[RCOMP
] = UBYTE_TO_FLOAT( s
[0] );
138 dst
[GCOMP
] = UBYTE_TO_FLOAT( s
[1] );
139 dst
[BCOMP
] = UBYTE_TO_FLOAT( s
[2] );
144 unpack_RGB565(const void *src
, GLfloat dst
[4])
146 const GLushort s
= *((const GLushort
*) src
);
147 dst
[RCOMP
] = ((s
>> 11) & 0x1f) * (1.0F
/ 31.0F
);
148 dst
[GCOMP
] = ((s
>> 5 ) & 0x3f) * (1.0F
/ 63.0F
);
149 dst
[BCOMP
] = ((s
) & 0x1f) * (1.0F
/ 31.0F
);
154 unpack_RGB565_REV(const void *src
, GLfloat dst
[4])
156 GLushort s
= *((const GLushort
*) src
);
157 s
= (s
>> 8) | (s
<< 8); /* byte swap */
158 dst
[RCOMP
] = UBYTE_TO_FLOAT( ((s
>> 8) & 0xf8) | ((s
>> 13) & 0x7) );
159 dst
[GCOMP
] = UBYTE_TO_FLOAT( ((s
>> 3) & 0xfc) | ((s
>> 9) & 0x3) );
160 dst
[BCOMP
] = UBYTE_TO_FLOAT( ((s
<< 3) & 0xf8) | ((s
>> 2) & 0x7) );
165 unpack_ARGB4444(const void *src
, GLfloat dst
[4])
167 const GLushort s
= *((const GLushort
*) src
);
168 dst
[RCOMP
] = ((s
>> 8) & 0xf) * (1.0F
/ 15.0F
);
169 dst
[GCOMP
] = ((s
>> 4) & 0xf) * (1.0F
/ 15.0F
);
170 dst
[BCOMP
] = ((s
) & 0xf) * (1.0F
/ 15.0F
);
171 dst
[ACOMP
] = ((s
>> 12) & 0xf) * (1.0F
/ 15.0F
);
175 unpack_ARGB4444_REV(const void *src
, GLfloat dst
[4])
177 const GLushort s
= *((const GLushort
*) src
);
178 dst
[RCOMP
] = ((s
) & 0xf) * (1.0F
/ 15.0F
);
179 dst
[GCOMP
] = ((s
>> 12) & 0xf) * (1.0F
/ 15.0F
);
180 dst
[BCOMP
] = ((s
>> 8) & 0xf) * (1.0F
/ 15.0F
);
181 dst
[ACOMP
] = ((s
>> 4) & 0xf) * (1.0F
/ 15.0F
);
185 unpack_RGBA5551(const void *src
, GLfloat dst
[4])
187 const GLushort s
= *((const GLushort
*) src
);
188 dst
[RCOMP
] = ((s
>> 11) & 0x1f) * (1.0F
/ 31.0F
);
189 dst
[GCOMP
] = ((s
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
190 dst
[BCOMP
] = ((s
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
191 dst
[ACOMP
] = ((s
) & 0x01) * 1.0F
;
195 unpack_ARGB1555(const void *src
, GLfloat dst
[4])
197 const GLushort s
= *((const GLushort
*) src
);
198 dst
[RCOMP
] = ((s
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
199 dst
[GCOMP
] = ((s
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
200 dst
[BCOMP
] = ((s
>> 0) & 0x1f) * (1.0F
/ 31.0F
);
201 dst
[ACOMP
] = ((s
>> 15) & 0x01) * 1.0F
;
205 unpack_ARGB1555_REV(const void *src
, GLfloat dst
[4])
207 const GLushort s
= *((const GLushort
*) src
);
208 dst
[RCOMP
] = UBYTE_TO_FLOAT( ((s
>> 7) & 0xf8) | ((s
>> 12) & 0x7) );
209 dst
[GCOMP
] = UBYTE_TO_FLOAT( ((s
>> 2) & 0xf8) | ((s
>> 7) & 0x7) );
210 dst
[BCOMP
] = UBYTE_TO_FLOAT( ((s
<< 3) & 0xf8) | ((s
>> 2) & 0x7) );
211 dst
[ACOMP
] = UBYTE_TO_FLOAT( ((s
>> 15) & 0x01) * 255 );
215 unpack_AL44(const void *src
, GLfloat dst
[4])
217 const GLubyte s
= *((const GLubyte
*) src
);
220 dst
[BCOMP
] = (s
& 0xf) * (1.0F
/ 15.0F
);
221 dst
[ACOMP
] = ((s
>> 4) & 0xf) * (1.0F
/ 15.0F
);
225 unpack_AL88(const void *src
, GLfloat dst
[4])
227 const GLushort s
= *((const GLushort
*) src
);
230 dst
[BCOMP
] = UBYTE_TO_FLOAT( s
& 0xff );
231 dst
[ACOMP
] = UBYTE_TO_FLOAT( s
>> 8 );
235 unpack_AL88_REV(const void *src
, GLfloat dst
[4])
237 const GLushort s
= *((const GLushort
*) src
);
240 dst
[BCOMP
] = UBYTE_TO_FLOAT( s
>> 8 );
241 dst
[ACOMP
] = UBYTE_TO_FLOAT( s
& 0xff );
245 unpack_AL1616(const void *src
, GLfloat dst
[4])
247 const GLuint s
= *((const GLuint
*) src
);
250 dst
[BCOMP
] = USHORT_TO_FLOAT( s
& 0xffff );
251 dst
[ACOMP
] = USHORT_TO_FLOAT( s
>> 16 );
255 unpack_AL1616_REV(const void *src
, GLfloat dst
[4])
257 const GLuint s
= *((const GLuint
*) src
);
260 dst
[BCOMP
] = USHORT_TO_FLOAT( s
>> 16 );
261 dst
[ACOMP
] = USHORT_TO_FLOAT( s
& 0xffff );
265 unpack_RGB332(const void *src
, GLfloat dst
[4])
267 const GLubyte s
= *((const GLubyte
*) src
);
268 dst
[RCOMP
] = ((s
>> 5) & 0x7) * (1.0F
/ 7.0F
);
269 dst
[GCOMP
] = ((s
>> 2) & 0x7) * (1.0F
/ 7.0F
);
270 dst
[BCOMP
] = ((s
) & 0x3) * (1.0F
/ 3.0F
);
276 unpack_A8(const void *src
, GLfloat dst
[4])
278 const GLubyte s
= *((const GLubyte
*) src
);
282 dst
[ACOMP
] = UBYTE_TO_FLOAT(s
);
286 unpack_A16(const void *src
, GLfloat dst
[4])
288 const GLushort s
= *((const GLushort
*) src
);
292 dst
[ACOMP
] = USHORT_TO_FLOAT(s
);
296 unpack_L8(const void *src
, GLfloat dst
[4])
298 const GLubyte s
= *((const GLubyte
*) src
);
301 dst
[BCOMP
] = UBYTE_TO_FLOAT(s
);
306 unpack_L16(const void *src
, GLfloat dst
[4])
308 const GLushort s
= *((const GLushort
*) src
);
311 dst
[BCOMP
] = USHORT_TO_FLOAT(s
);
316 unpack_I8(const void *src
, GLfloat dst
[4])
318 const GLubyte s
= *((const GLubyte
*) src
);
322 dst
[ACOMP
] = UBYTE_TO_FLOAT(s
);
326 unpack_I16(const void *src
, GLfloat dst
[4])
328 const GLushort s
= *((const GLushort
*) src
);
332 dst
[ACOMP
] = USHORT_TO_FLOAT(s
);
336 unpack_YCBCR(const void *src
, GLfloat dst
[4])
339 const GLushort
*src0
= (const GLushort
*) src
;
340 const GLushort
*src1
= src0
+ 1; /* odd */
341 const GLubyte y0
= (*src0
>> 8) & 0xff; /* luminance */
342 const GLubyte cb
= *src0
& 0xff; /* chroma U */
343 const GLubyte y1
= (*src1
>> 8) & 0xff; /* luminance */
344 const GLubyte cr
= *src1
& 0xff; /* chroma V */
345 const GLubyte y
= (i
& 1) ? y1
: y0
; /* choose even/odd luminance */
346 GLfloat r
= 1.164F
* (y
- 16) + 1.596F
* (cr
- 128);
347 GLfloat g
= 1.164F
* (y
- 16) - 0.813F
* (cr
- 128) - 0.391F
* (cb
- 128);
348 GLfloat b
= 1.164F
* (y
- 16) + 2.018F
* (cb
- 128);
349 r
*= (1.0F
/ 255.0F
);
350 g
*= (1.0F
/ 255.0F
);
351 b
*= (1.0F
/ 255.0F
);
352 dst
[RCOMP
] = CLAMP(r
, 0.0F
, 1.0F
);
353 dst
[GCOMP
] = CLAMP(g
, 0.0F
, 1.0F
);
354 dst
[BCOMP
] = CLAMP(b
, 0.0F
, 1.0F
);
359 unpack_YCBCR_REV(const void *src
, GLfloat dst
[4])
362 const GLushort
*src0
= (const GLushort
*) src
;
363 const GLushort
*src1
= src0
+ 1; /* odd */
364 const GLubyte y0
= *src0
& 0xff; /* luminance */
365 const GLubyte cr
= (*src0
>> 8) & 0xff; /* chroma V */
366 const GLubyte y1
= *src1
& 0xff; /* luminance */
367 const GLubyte cb
= (*src1
>> 8) & 0xff; /* chroma U */
368 const GLubyte y
= (i
& 1) ? y1
: y0
; /* choose even/odd luminance */
369 GLfloat r
= 1.164F
* (y
- 16) + 1.596F
* (cr
- 128);
370 GLfloat g
= 1.164F
* (y
- 16) - 0.813F
* (cr
- 128) - 0.391F
* (cb
- 128);
371 GLfloat b
= 1.164F
* (y
- 16) + 2.018F
* (cb
- 128);
372 r
*= (1.0F
/ 255.0F
);
373 g
*= (1.0F
/ 255.0F
);
374 b
*= (1.0F
/ 255.0F
);
375 dst
[RCOMP
] = CLAMP(r
, 0.0F
, 1.0F
);
376 dst
[GCOMP
] = CLAMP(g
, 0.0F
, 1.0F
);
377 dst
[BCOMP
] = CLAMP(b
, 0.0F
, 1.0F
);
382 unpack_R8(const void *src
, GLfloat dst
[4])
384 const GLubyte s
= *((const GLubyte
*) src
);
385 dst
[0] = UBYTE_TO_FLOAT(s
);
386 dst
[1] = dst
[2] = 0.0F
;
391 unpack_RG88(const void *src
, GLfloat dst
[4])
393 const GLushort s
= *((const GLushort
*) src
);
394 dst
[RCOMP
] = UBYTE_TO_FLOAT( s
& 0xff );
395 dst
[GCOMP
] = UBYTE_TO_FLOAT( s
>> 8 );
401 unpack_RG88_REV(const void *src
, GLfloat dst
[4])
403 const GLushort s
= *((const GLushort
*) src
);
404 dst
[RCOMP
] = UBYTE_TO_FLOAT( s
& 0xff );
405 dst
[GCOMP
] = UBYTE_TO_FLOAT( s
>> 8 );
411 unpack_R16(const void *src
, GLfloat dst
[4])
413 const GLushort s
= *((const GLushort
*) src
);
414 dst
[RCOMP
] = USHORT_TO_FLOAT(s
);
421 unpack_RG1616(const void *src
, GLfloat dst
[4])
423 const GLuint s
= *((const GLuint
*) src
);
424 dst
[RCOMP
] = USHORT_TO_FLOAT( s
& 0xffff );
425 dst
[GCOMP
] = USHORT_TO_FLOAT( s
>> 16 );
431 unpack_RG1616_REV(const void *src
, GLfloat dst
[4])
433 const GLuint s
= *((const GLuint
*) src
);
434 dst
[RCOMP
] = USHORT_TO_FLOAT( s
>> 16 );
435 dst
[GCOMP
] = USHORT_TO_FLOAT( s
& 0xffff );
441 unpack_ARGB2101010(const void *src
, GLfloat dst
[4])
443 const GLuint s
= *((const GLuint
*) src
);
444 dst
[RCOMP
] = ((s
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
445 dst
[GCOMP
] = ((s
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
446 dst
[BCOMP
] = ((s
>> 0) & 0x3ff) * (1.0F
/ 1023.0F
);
447 dst
[ACOMP
] = ((s
>> 30) & 0x03) * (1.0F
/ 3.0F
);
452 unpack_Z24_S8(const void *src
, GLfloat dst
[4])
454 /* only return Z, not stencil data */
455 const GLuint s
= *((const GLuint
*) src
);
456 const GLfloat scale
= 1.0F
/ (GLfloat
) 0xffffff;
457 dst
[0] = dst
[1] = dst
[2] = (s
>> 8) * scale
;
459 ASSERT(dst
[0] >= 0.0F
);
460 ASSERT(dst
[0] <= 1.0F
);
464 unpack_S8_Z24(const void *src
, GLfloat dst
[4])
466 /* only return Z, not stencil data */
467 const GLuint s
= *((const GLuint
*) src
);
468 const GLfloat scale
= 1.0F
/ (GLfloat
) 0xffffff;
469 dst
[0] = dst
[1] = dst
[2] = (s
& 0x00ffffff) * scale
;
471 ASSERT(dst
[0] >= 0.0F
);
472 ASSERT(dst
[0] <= 1.0F
);
476 unpack_Z16(const void *src
, GLfloat dst
[4])
478 const GLushort s
= *((const GLushort
*) src
);
479 dst
[0] = dst
[1] = dst
[2] = s
* (1.0F
/ 65535.0F
);
484 unpack_X8_Z24(const void *src
, GLfloat dst
[4])
486 unpack_S8_Z24(src
, dst
);
490 unpack_Z24_X8(const void *src
, GLfloat dst
[4])
492 unpack_Z24_S8(src
, dst
);
496 unpack_Z32(const void *src
, GLfloat dst
[4])
498 const GLuint s
= *((const GLuint
*) src
);
499 dst
[0] = dst
[1] = dst
[2] = s
* (1.0F
/ 0xffffffff);
504 unpack_Z32_FLOAT(const void *src
, GLfloat dst
[4])
506 const GLfloat s
= *((const GLfloat
*) src
);
507 dst
[0] = dst
[1] = dst
[2] = s
;
512 unpack_Z32_FLOAT_X24S8(const void *src
, GLfloat dst
[4])
514 const GLfloat s
= *((const GLfloat
*) src
);
515 dst
[0] = dst
[1] = dst
[2] = s
;
521 unpack_S8(const void *src
, GLfloat dst
[4])
523 /* should never be used */
524 dst
[0] = dst
[1] = dst
[2] = 0.0F
;
530 unpack_SRGB8(const void *src
, GLfloat dst
[4])
532 const GLubyte
*s
= (const GLubyte
*) src
;
533 dst
[RCOMP
] = nonlinear_to_linear(s
[2]);
534 dst
[GCOMP
] = nonlinear_to_linear(s
[1]);
535 dst
[BCOMP
] = nonlinear_to_linear(s
[0]);
540 unpack_SRGBA8(const void *src
, GLfloat dst
[4])
542 const GLuint s
= *((const GLuint
*) src
);
543 dst
[RCOMP
] = nonlinear_to_linear( (s
>> 24) );
544 dst
[GCOMP
] = nonlinear_to_linear( (s
>> 16) & 0xff );
545 dst
[BCOMP
] = nonlinear_to_linear( (s
>> 8) & 0xff );
546 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff ); /* linear! */
550 unpack_SARGB8(const void *src
, GLfloat dst
[4])
552 const GLuint s
= *((const GLuint
*) src
);
553 dst
[RCOMP
] = nonlinear_to_linear( (s
>> 16) & 0xff );
554 dst
[GCOMP
] = nonlinear_to_linear( (s
>> 8) & 0xff );
555 dst
[BCOMP
] = nonlinear_to_linear( (s
) & 0xff );
556 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
>> 24) ); /* linear! */
560 unpack_SL8(const void *src
, GLfloat dst
[4])
562 const GLubyte s
= *((const GLubyte
*) src
);
565 dst
[BCOMP
] = nonlinear_to_linear(s
);
570 unpack_SLA8(const void *src
, GLfloat dst
[4])
572 const GLubyte
*s
= (const GLubyte
*) src
;
575 dst
[BCOMP
] = nonlinear_to_linear(s
[0]);
576 dst
[ACOMP
] = UBYTE_TO_FLOAT(s
[1]); /* linear */
580 unpack_SRGB_DXT1(const void *src
, GLfloat dst
[4])
585 unpack_SRGBA_DXT1(const void *src
, GLfloat dst
[4])
590 unpack_SRGBA_DXT3(const void *src
, GLfloat dst
[4])
595 unpack_SRGBA_DXT5(const void *src
, GLfloat dst
[4])
600 unpack_RGB_FXT1(const void *src
, GLfloat dst
[4])
605 unpack_RGBA_FXT1(const void *src
, GLfloat dst
[4])
610 unpack_RGB_DXT1(const void *src
, GLfloat dst
[4])
615 unpack_RGBA_DXT1(const void *src
, GLfloat dst
[4])
620 unpack_RGBA_DXT3(const void *src
, GLfloat dst
[4])
625 unpack_RGBA_DXT5(const void *src
, GLfloat dst
[4])
631 unpack_RGBA_FLOAT32(const void *src
, GLfloat dst
[4])
633 const GLfloat
*s
= (const GLfloat
*) src
;
641 unpack_RGBA_FLOAT16(const void *src
, GLfloat dst
[4])
643 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
644 dst
[RCOMP
] = _mesa_half_to_float(s
[0]);
645 dst
[GCOMP
] = _mesa_half_to_float(s
[1]);
646 dst
[BCOMP
] = _mesa_half_to_float(s
[2]);
647 dst
[ACOMP
] = _mesa_half_to_float(s
[3]);
651 unpack_RGB_FLOAT32(const void *src
, GLfloat dst
[4])
653 const GLfloat
*s
= (const GLfloat
*) src
;
661 unpack_RGB_FLOAT16(const void *src
, GLfloat dst
[4])
663 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
664 dst
[RCOMP
] = _mesa_half_to_float(s
[0]);
665 dst
[GCOMP
] = _mesa_half_to_float(s
[1]);
666 dst
[BCOMP
] = _mesa_half_to_float(s
[2]);
671 unpack_ALPHA_FLOAT32(const void *src
, GLfloat dst
[4])
673 const GLfloat
*s
= (const GLfloat
*) src
;
681 unpack_ALPHA_FLOAT16(const void *src
, GLfloat dst
[4])
683 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
687 dst
[ACOMP
] = _mesa_half_to_float(s
[0]);
691 unpack_LUMINANCE_FLOAT32(const void *src
, GLfloat dst
[4])
693 const GLfloat
*s
= (const GLfloat
*) src
;
701 unpack_LUMINANCE_FLOAT16(const void *src
, GLfloat dst
[4])
703 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
706 dst
[BCOMP
] = _mesa_half_to_float(s
[0]);
711 unpack_LUMINANCE_ALPHA_FLOAT32(const void *src
, GLfloat dst
[4])
713 const GLfloat
*s
= (const GLfloat
*) src
;
721 unpack_LUMINANCE_ALPHA_FLOAT16(const void *src
, GLfloat dst
[4])
723 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
726 dst
[BCOMP
] = _mesa_half_to_float(s
[0]);
727 dst
[ACOMP
] = _mesa_half_to_float(s
[1]);
731 unpack_INTENSITY_FLOAT32(const void *src
, GLfloat dst
[4])
733 const GLfloat
*s
= (const GLfloat
*) src
;
741 unpack_INTENSITY_FLOAT16(const void *src
, GLfloat dst
[4])
743 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
751 unpack_R_FLOAT32(const void *src
, GLfloat dst
[4])
753 const GLfloat
*s
= (const GLfloat
*) src
;
761 unpack_R_FLOAT16(const void *src
, GLfloat dst
[4])
763 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
764 dst
[RCOMP
] = _mesa_half_to_float(s
[0]);
771 unpack_RG_FLOAT32(const void *src
, GLfloat dst
[4])
773 const GLfloat
*s
= (const GLfloat
*) src
;
781 unpack_RG_FLOAT16(const void *src
, GLfloat dst
[4])
783 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
784 dst
[RCOMP
] = _mesa_half_to_float(s
[0]);
785 dst
[GCOMP
] = _mesa_half_to_float(s
[1]);
792 unpack_RGBA_INT8(const void *src
, GLfloat dst
[4])
794 const GLbyte
*s
= (const GLbyte
*) src
;
795 dst
[RCOMP
] = (GLfloat
) s
[0];
796 dst
[GCOMP
] = (GLfloat
) s
[1];
797 dst
[BCOMP
] = (GLfloat
) s
[2];
798 dst
[ACOMP
] = (GLfloat
) s
[3];
802 unpack_RGBA_INT16(const void *src
, GLfloat dst
[4])
804 const GLshort
*s
= (const GLshort
*) src
;
805 dst
[RCOMP
] = (GLfloat
) s
[0];
806 dst
[GCOMP
] = (GLfloat
) s
[1];
807 dst
[BCOMP
] = (GLfloat
) s
[2];
808 dst
[ACOMP
] = (GLfloat
) s
[3];
812 unpack_RGBA_INT32(const void *src
, GLfloat dst
[4])
814 const GLint
*s
= (const GLint
*) src
;
815 dst
[RCOMP
] = (GLfloat
) s
[0];
816 dst
[GCOMP
] = (GLfloat
) s
[1];
817 dst
[BCOMP
] = (GLfloat
) s
[2];
818 dst
[ACOMP
] = (GLfloat
) s
[3];
822 unpack_RGBA_UINT8(const void *src
, GLfloat dst
[4])
824 const GLubyte
*s
= (const GLubyte
*) src
;
825 dst
[RCOMP
] = (GLfloat
) s
[0];
826 dst
[GCOMP
] = (GLfloat
) s
[1];
827 dst
[BCOMP
] = (GLfloat
) s
[2];
828 dst
[ACOMP
] = (GLfloat
) s
[3];
832 unpack_RGBA_UINT16(const void *src
, GLfloat dst
[4])
834 const GLushort
*s
= (const GLushort
*) src
;
835 dst
[RCOMP
] = (GLfloat
) s
[0];
836 dst
[GCOMP
] = (GLfloat
) s
[1];
837 dst
[BCOMP
] = (GLfloat
) s
[2];
838 dst
[ACOMP
] = (GLfloat
) s
[3];
842 unpack_RGBA_UINT32(const void *src
, GLfloat dst
[4])
844 const GLuint
*s
= (const GLuint
*) src
;
845 dst
[RCOMP
] = (GLfloat
) s
[0];
846 dst
[GCOMP
] = (GLfloat
) s
[1];
847 dst
[BCOMP
] = (GLfloat
) s
[2];
848 dst
[ACOMP
] = (GLfloat
) s
[3];
852 unpack_DUDV8(const void *src
, GLfloat dst
[4])
854 const GLbyte
*s
= (const GLbyte
*) src
;
855 dst
[RCOMP
] = BYTE_TO_FLOAT(s
[0]);
856 dst
[GCOMP
] = BYTE_TO_FLOAT(s
[1]);
862 unpack_SIGNED_R8(const void *src
, GLfloat dst
[4])
864 const GLbyte s
= *((const GLbyte
*) src
);
865 dst
[RCOMP
] = BYTE_TO_FLOAT_TEX( s
);
872 unpack_SIGNED_RG88_REV(const void *src
, GLfloat dst
[4])
874 const GLushort s
= *((const GLushort
*) src
);
875 dst
[RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
& 0xff) );
876 dst
[GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 8) );
882 unpack_SIGNED_RGBX8888(const void *src
, GLfloat dst
[4])
884 const GLuint s
= *((const GLuint
*) src
);
885 dst
[RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 24) );
886 dst
[GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 16) );
887 dst
[BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 8) );
892 unpack_SIGNED_RGBA8888(const void *src
, GLfloat dst
[4])
894 const GLuint s
= *((const GLuint
*) src
);
895 dst
[RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 24) );
896 dst
[GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 16) );
897 dst
[BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 8) );
898 dst
[ACOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
) );
902 unpack_SIGNED_RGBA8888_REV(const void *src
, GLfloat dst
[4])
904 const GLuint s
= *((const GLuint
*) src
);
905 dst
[RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
) );
906 dst
[GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 8) );
907 dst
[BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 16) );
908 dst
[ACOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 24) );
912 unpack_SIGNED_R16(const void *src
, GLfloat dst
[4])
914 const GLshort s
= *((const GLshort
*) src
);
915 dst
[RCOMP
] = SHORT_TO_FLOAT_TEX( s
);
922 unpack_SIGNED_GR1616(const void *src
, GLfloat dst
[4])
924 const GLuint s
= *((const GLuint
*) src
);
925 dst
[RCOMP
] = SHORT_TO_FLOAT_TEX( s
& 0xffff );
926 dst
[GCOMP
] = SHORT_TO_FLOAT_TEX( s
>> 16 );
932 unpack_SIGNED_RGB_16(const void *src
, GLfloat dst
[4])
934 const GLshort
*s
= (const GLshort
*) src
;
935 dst
[RCOMP
] = SHORT_TO_FLOAT_TEX( s
[0] );
936 dst
[GCOMP
] = SHORT_TO_FLOAT_TEX( s
[1] );
937 dst
[BCOMP
] = SHORT_TO_FLOAT_TEX( s
[2] );
942 unpack_SIGNED_RGBA_16(const void *src
, GLfloat dst
[4])
944 const GLshort
*s
= (const GLshort
*) src
;
945 dst
[RCOMP
] = SHORT_TO_FLOAT_TEX( s
[0] );
946 dst
[GCOMP
] = SHORT_TO_FLOAT_TEX( s
[1] );
947 dst
[BCOMP
] = SHORT_TO_FLOAT_TEX( s
[2] );
948 dst
[ACOMP
] = SHORT_TO_FLOAT_TEX( s
[3] );
952 unpack_RGBA_16(const void *src
, GLfloat dst
[4])
954 const GLushort
*s
= (const GLushort
*) src
;
955 dst
[RCOMP
] = USHORT_TO_FLOAT( s
[0] );
956 dst
[GCOMP
] = USHORT_TO_FLOAT( s
[1] );
957 dst
[BCOMP
] = USHORT_TO_FLOAT( s
[2] );
958 dst
[ACOMP
] = USHORT_TO_FLOAT( s
[3] );
962 unpack_RED_RGTC1(const void *src
, GLfloat dst
[4])
968 unpack_SIGNED_RED_RGTC1(const void *src
, GLfloat dst
[4])
974 unpack_RG_RGTC2(const void *src
, GLfloat dst
[4])
980 unpack_SIGNED_RG_RGTC2(const void *src
, GLfloat dst
[4])
986 unpack_L_LATC1(const void *src
, GLfloat dst
[4])
992 unpack_SIGNED_L_LATC1(const void *src
, GLfloat dst
[4])
998 unpack_LA_LATC2(const void *src
, GLfloat dst
[4])
1004 unpack_SIGNED_LA_LATC2(const void *src
, GLfloat dst
[4])
1010 unpack_SIGNED_A8(const void *src
, GLfloat dst
[4])
1012 const GLbyte s
= *((const GLbyte
*) src
);
1016 dst
[ACOMP
] = BYTE_TO_FLOAT_TEX( s
);
1020 unpack_SIGNED_L8(const void *src
, GLfloat dst
[4])
1022 const GLbyte s
= *((const GLbyte
*) src
);
1025 dst
[BCOMP
] = BYTE_TO_FLOAT_TEX( s
);
1030 unpack_SIGNED_AL88(const void *src
, GLfloat dst
[4])
1032 const GLushort s
= *((const GLshort
*) src
);
1035 dst
[BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
& 0xff) );
1036 dst
[ACOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 8) );
1040 unpack_SIGNED_I8(const void *src
, GLfloat dst
[4])
1042 const GLbyte s
= *((const GLbyte
*) src
);
1046 dst
[ACOMP
] = BYTE_TO_FLOAT_TEX( s
);
1050 unpack_SIGNED_A16(const void *src
, GLfloat dst
[4])
1052 const GLshort s
= *((const GLshort
*) src
);
1056 dst
[ACOMP
] = SHORT_TO_FLOAT_TEX( s
);
1060 unpack_SIGNED_L16(const void *src
, GLfloat dst
[4])
1062 const GLshort s
= *((const GLshort
*) src
);
1065 dst
[BCOMP
] = SHORT_TO_FLOAT_TEX( s
);
1070 unpack_SIGNED_AL1616(const void *src
, GLfloat dst
[4])
1072 const GLshort
*s
= (const GLshort
*) src
;
1075 dst
[BCOMP
] = SHORT_TO_FLOAT_TEX( s
[0] );
1076 dst
[ACOMP
] = SHORT_TO_FLOAT_TEX( s
[1] );
1080 unpack_SIGNED_I16(const void *src
, GLfloat dst
[4])
1082 const GLshort s
= *((const GLshort
*) src
);
1086 dst
[ACOMP
] = SHORT_TO_FLOAT_TEX( s
);
1090 unpack_RGB9_E5_FLOAT(const void *src
, GLfloat dst
[4])
1092 const GLuint
*s
= (const GLuint
*) src
;
1093 rgb9e5_to_float3(*s
, dst
);
1098 unpack_R11_G11_B10_FLOAT(const void *src
, GLfloat dst
[4])
1100 const GLuint
*s
= (const GLuint
*) src
;
1101 r11g11b10f_to_float3(*s
, dst
);
1107 * Return the unpacker function for the given format.
1109 static unpack_rgba_func
1110 get_unpack_rgba_function(gl_format format
)
1112 static unpack_rgba_func table
[MESA_FORMAT_COUNT
];
1113 static GLboolean initialized
= GL_FALSE
;
1116 table
[MESA_FORMAT_NONE
] = NULL
;
1118 table
[MESA_FORMAT_RGBA8888
] = unpack_RGBA8888
;
1119 table
[MESA_FORMAT_RGBA8888_REV
] = unpack_RGBA8888_REV
;
1120 table
[MESA_FORMAT_ARGB8888
] = unpack_ARGB8888
;
1121 table
[MESA_FORMAT_ARGB8888_REV
] = unpack_ARGB8888_REV
;
1122 table
[MESA_FORMAT_XRGB8888
] = unpack_XRGB8888
;
1123 table
[MESA_FORMAT_XRGB8888_REV
] = unpack_XRGB8888_REV
;
1124 table
[MESA_FORMAT_RGB888
] = unpack_RGB888
;
1125 table
[MESA_FORMAT_BGR888
] = unpack_BGR888
;
1126 table
[MESA_FORMAT_RGB565
] = unpack_RGB565
;
1127 table
[MESA_FORMAT_RGB565_REV
] = unpack_RGB565_REV
;
1128 table
[MESA_FORMAT_ARGB4444
] = unpack_ARGB4444
;
1129 table
[MESA_FORMAT_ARGB4444_REV
] = unpack_ARGB4444_REV
;
1130 table
[MESA_FORMAT_RGBA5551
] = unpack_RGBA5551
;
1131 table
[MESA_FORMAT_ARGB1555
] = unpack_ARGB1555
;
1132 table
[MESA_FORMAT_ARGB1555_REV
] = unpack_ARGB1555_REV
;
1133 table
[MESA_FORMAT_AL44
] = unpack_AL44
;
1134 table
[MESA_FORMAT_AL88
] = unpack_AL88
;
1135 table
[MESA_FORMAT_AL88_REV
] = unpack_AL88_REV
;
1136 table
[MESA_FORMAT_AL1616
] = unpack_AL1616
;
1137 table
[MESA_FORMAT_AL1616_REV
] = unpack_AL1616_REV
;
1138 table
[MESA_FORMAT_RGB332
] = unpack_RGB332
;
1139 table
[MESA_FORMAT_A8
] = unpack_A8
;
1140 table
[MESA_FORMAT_A16
] = unpack_A16
;
1141 table
[MESA_FORMAT_L8
] = unpack_L8
;
1142 table
[MESA_FORMAT_L16
] = unpack_L16
;
1143 table
[MESA_FORMAT_I8
] = unpack_I8
;
1144 table
[MESA_FORMAT_I16
] = unpack_I16
;
1145 table
[MESA_FORMAT_YCBCR
] = unpack_YCBCR
;
1146 table
[MESA_FORMAT_YCBCR_REV
] = unpack_YCBCR_REV
;
1147 table
[MESA_FORMAT_R8
] = unpack_R8
;
1148 table
[MESA_FORMAT_RG88
] = unpack_RG88
;
1149 table
[MESA_FORMAT_RG88_REV
] = unpack_RG88_REV
;
1150 table
[MESA_FORMAT_R16
] = unpack_R16
;
1151 table
[MESA_FORMAT_RG1616
] = unpack_RG1616
;
1152 table
[MESA_FORMAT_RG1616_REV
] = unpack_RG1616_REV
;
1153 table
[MESA_FORMAT_ARGB2101010
] = unpack_ARGB2101010
;
1154 table
[MESA_FORMAT_Z24_S8
] = unpack_Z24_S8
;
1155 table
[MESA_FORMAT_S8_Z24
] = unpack_S8_Z24
;
1156 table
[MESA_FORMAT_Z16
] = unpack_Z16
;
1157 table
[MESA_FORMAT_X8_Z24
] = unpack_X8_Z24
;
1158 table
[MESA_FORMAT_Z24_X8
] = unpack_Z24_X8
;
1159 table
[MESA_FORMAT_Z32
] = unpack_Z32
;
1160 table
[MESA_FORMAT_S8
] = unpack_S8
;
1161 table
[MESA_FORMAT_SRGB8
] = unpack_SRGB8
;
1162 table
[MESA_FORMAT_SRGBA8
] = unpack_SRGBA8
;
1163 table
[MESA_FORMAT_SARGB8
] = unpack_SARGB8
;
1164 table
[MESA_FORMAT_SL8
] = unpack_SL8
;
1165 table
[MESA_FORMAT_SLA8
] = unpack_SLA8
;
1166 table
[MESA_FORMAT_SRGB_DXT1
] = unpack_SRGB_DXT1
;
1167 table
[MESA_FORMAT_SRGBA_DXT1
] = unpack_SRGBA_DXT1
;
1168 table
[MESA_FORMAT_SRGBA_DXT3
] = unpack_SRGBA_DXT3
;
1169 table
[MESA_FORMAT_SRGBA_DXT5
] = unpack_SRGBA_DXT5
;
1171 table
[MESA_FORMAT_RGB_FXT1
] = unpack_RGB_FXT1
;
1172 table
[MESA_FORMAT_RGBA_FXT1
] = unpack_RGBA_FXT1
;
1173 table
[MESA_FORMAT_RGB_DXT1
] = unpack_RGB_DXT1
;
1174 table
[MESA_FORMAT_RGBA_DXT1
] = unpack_RGBA_DXT1
;
1175 table
[MESA_FORMAT_RGBA_DXT3
] = unpack_RGBA_DXT3
;
1176 table
[MESA_FORMAT_RGBA_DXT5
] = unpack_RGBA_DXT5
;
1178 table
[MESA_FORMAT_RGBA_FLOAT32
] = unpack_RGBA_FLOAT32
;
1179 table
[MESA_FORMAT_RGBA_FLOAT16
] = unpack_RGBA_FLOAT16
;
1180 table
[MESA_FORMAT_RGB_FLOAT32
] = unpack_RGB_FLOAT32
;
1181 table
[MESA_FORMAT_RGB_FLOAT16
] = unpack_RGB_FLOAT16
;
1182 table
[MESA_FORMAT_ALPHA_FLOAT32
] = unpack_ALPHA_FLOAT32
;
1183 table
[MESA_FORMAT_ALPHA_FLOAT16
] = unpack_ALPHA_FLOAT16
;
1184 table
[MESA_FORMAT_LUMINANCE_FLOAT32
] = unpack_LUMINANCE_FLOAT32
;
1185 table
[MESA_FORMAT_LUMINANCE_FLOAT16
] = unpack_LUMINANCE_FLOAT16
;
1186 table
[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
] = unpack_LUMINANCE_ALPHA_FLOAT32
;
1187 table
[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
] = unpack_LUMINANCE_ALPHA_FLOAT16
;
1188 table
[MESA_FORMAT_INTENSITY_FLOAT32
] = unpack_INTENSITY_FLOAT32
;
1189 table
[MESA_FORMAT_INTENSITY_FLOAT16
] = unpack_INTENSITY_FLOAT16
;
1190 table
[MESA_FORMAT_R_FLOAT32
] = unpack_R_FLOAT32
;
1191 table
[MESA_FORMAT_R_FLOAT16
] = unpack_R_FLOAT16
;
1192 table
[MESA_FORMAT_RG_FLOAT32
] = unpack_RG_FLOAT32
;
1193 table
[MESA_FORMAT_RG_FLOAT16
] = unpack_RG_FLOAT16
;
1195 table
[MESA_FORMAT_RGBA_INT8
] = unpack_RGBA_INT8
;
1196 table
[MESA_FORMAT_RGBA_INT16
] = unpack_RGBA_INT16
;
1197 table
[MESA_FORMAT_RGBA_INT32
] = unpack_RGBA_INT32
;
1198 table
[MESA_FORMAT_RGBA_UINT8
] = unpack_RGBA_UINT8
;
1199 table
[MESA_FORMAT_RGBA_UINT16
] = unpack_RGBA_UINT16
;
1200 table
[MESA_FORMAT_RGBA_UINT32
] = unpack_RGBA_UINT32
;
1202 table
[MESA_FORMAT_DUDV8
] = unpack_DUDV8
;
1203 table
[MESA_FORMAT_SIGNED_R8
] = unpack_SIGNED_R8
;
1204 table
[MESA_FORMAT_SIGNED_RG88_REV
] = unpack_SIGNED_RG88_REV
;
1205 table
[MESA_FORMAT_SIGNED_RGBX8888
] = unpack_SIGNED_RGBX8888
;
1206 table
[MESA_FORMAT_SIGNED_RGBA8888
] = unpack_SIGNED_RGBA8888
;
1207 table
[MESA_FORMAT_SIGNED_RGBA8888_REV
] = unpack_SIGNED_RGBA8888_REV
;
1208 table
[MESA_FORMAT_SIGNED_R16
] = unpack_SIGNED_R16
;
1209 table
[MESA_FORMAT_SIGNED_GR1616
] = unpack_SIGNED_GR1616
;
1210 table
[MESA_FORMAT_SIGNED_RGB_16
] = unpack_SIGNED_RGB_16
;
1211 table
[MESA_FORMAT_SIGNED_RGBA_16
] = unpack_SIGNED_RGBA_16
;
1212 table
[MESA_FORMAT_RGBA_16
] = unpack_RGBA_16
;
1214 table
[MESA_FORMAT_RED_RGTC1
] = unpack_RED_RGTC1
;
1215 table
[MESA_FORMAT_SIGNED_RED_RGTC1
] = unpack_SIGNED_RED_RGTC1
;
1216 table
[MESA_FORMAT_RG_RGTC2
] = unpack_RG_RGTC2
;
1217 table
[MESA_FORMAT_SIGNED_RG_RGTC2
] = unpack_SIGNED_RG_RGTC2
;
1219 table
[MESA_FORMAT_L_LATC1
] = unpack_L_LATC1
;
1220 table
[MESA_FORMAT_SIGNED_L_LATC1
] = unpack_SIGNED_L_LATC1
;
1221 table
[MESA_FORMAT_LA_LATC2
] = unpack_LA_LATC2
;
1222 table
[MESA_FORMAT_SIGNED_LA_LATC2
] = unpack_SIGNED_LA_LATC2
;
1224 table
[MESA_FORMAT_SIGNED_A8
] = unpack_SIGNED_A8
;
1225 table
[MESA_FORMAT_SIGNED_L8
] = unpack_SIGNED_L8
;
1226 table
[MESA_FORMAT_SIGNED_AL88
] = unpack_SIGNED_AL88
;
1227 table
[MESA_FORMAT_SIGNED_I8
] = unpack_SIGNED_I8
;
1228 table
[MESA_FORMAT_SIGNED_A16
] = unpack_SIGNED_A16
;
1229 table
[MESA_FORMAT_SIGNED_L16
] = unpack_SIGNED_L16
;
1230 table
[MESA_FORMAT_SIGNED_AL1616
] = unpack_SIGNED_AL1616
;
1231 table
[MESA_FORMAT_SIGNED_I16
] = unpack_SIGNED_I16
;
1233 table
[MESA_FORMAT_RGB9_E5_FLOAT
] = unpack_RGB9_E5_FLOAT
;
1234 table
[MESA_FORMAT_R11_G11_B10_FLOAT
] = unpack_R11_G11_B10_FLOAT
;
1236 table
[MESA_FORMAT_Z32_FLOAT
] = unpack_Z32_FLOAT
;
1237 table
[MESA_FORMAT_Z32_FLOAT_X24S8
] = unpack_Z32_FLOAT_X24S8
;
1239 initialized
= GL_TRUE
;
1242 return table
[format
];
1247 _mesa_unpack_rgba_row(gl_format format
, GLuint n
,
1248 const void *src
, GLfloat dst
[][4])
1250 unpack_rgba_func unpack
= get_unpack_rgba_function(format
);
1251 GLuint srcStride
= _mesa_get_format_bytes(format
);
1252 const GLubyte
*srcPtr
= (GLubyte
*) src
;
1255 for (i
= 0; i
< n
; i
++) {
1256 unpack(srcPtr
, dst
[i
]);
1257 srcPtr
+= srcStride
;
1264 * Unpack a 2D rect of pixels returning float RGBA colors.
1265 * \param format the source image format
1266 * \param src start address of the source image
1267 * \param srcRowStride source image row stride in bytes
1268 * \param dst start address of the dest image
1269 * \param dstRowStride dest image row stride in bytes
1270 * \param x source image start X pos
1271 * \param y source image start Y pos
1272 * \param width width of rect region to convert
1273 * \param height height of rect region to convert
1276 _mesa_unpack_rgba_block(gl_format format
,
1277 const void *src
, GLint srcRowStride
,
1278 GLfloat dst
[][4], GLint dstRowStride
,
1279 GLuint x
, GLuint y
, GLuint width
, GLuint height
)
1281 unpack_rgba_func unpack
= get_unpack_rgba_function(format
);
1282 const GLuint srcPixStride
= _mesa_get_format_bytes(format
);
1283 const GLuint dstPixStride
= 4 * sizeof(GLfloat
);
1284 const GLubyte
*srcRow
, *srcPix
;
1289 /* XXX needs to be fixed for compressed formats */
1291 srcRow
= ((const GLubyte
*) src
) + srcRowStride
* y
+ srcPixStride
* x
;
1292 dstRow
= ((GLubyte
*) dst
) + dstRowStride
* y
+ dstPixStride
* x
;
1294 for (i
= 0; i
< height
; i
++) {
1296 dstPix
= (GLfloat
*) dstRow
;
1298 for (j
= 0; j
< width
; j
++) {
1299 unpack(srcPix
, dstPix
);
1300 srcPix
+= srcPixStride
;
1301 dstPix
+= dstPixStride
;
1304 dstRow
+= dstRowStride
;
1305 srcRow
+= srcRowStride
;
1312 typedef void (*unpack_float_z_func
)(const void *src
, GLfloat
*dst
);
1315 unpack_float_z_Z24_S8(const void *src
, GLfloat
*dst
)
1317 /* only return Z, not stencil data */
1318 const GLuint s
= *((const GLuint
*) src
);
1319 const GLfloat scale
= 1.0F
/ (GLfloat
) 0xffffff;
1320 *dst
= (s
>> 8) * scale
;
1321 ASSERT(*dst
>= 0.0F
);
1322 ASSERT(*dst
<= 1.0F
);
1326 unpack_float_z_S8_Z24(const void *src
, GLfloat
*dst
)
1328 /* only return Z, not stencil data */
1329 const GLuint s
= *((const GLuint
*) src
);
1330 const GLfloat scale
= 1.0F
/ (GLfloat
) 0xffffff;
1331 *dst
= (s
& 0x00ffffff) * scale
;
1332 ASSERT(*dst
>= 0.0F
);
1333 ASSERT(*dst
<= 1.0F
);
1337 unpack_float_z_Z16(const void *src
, GLfloat
*dst
)
1339 const GLushort s
= *((const GLushort
*) src
);
1340 *dst
= s
* (1.0F
/ 65535.0F
);
1344 unpack_float_z_X8_Z24(const void *src
, GLfloat
*dst
)
1346 unpack_float_z_S8_Z24(src
, dst
);
1350 unpack_float_z_Z24_X8(const void *src
, GLfloat
*dst
)
1352 unpack_float_z_Z24_S8(src
, dst
);
1356 unpack_float_z_Z32(const void *src
, GLfloat
*dst
)
1358 const GLuint s
= *((const GLuint
*) src
);
1359 *dst
= s
* (1.0F
/ 0xffffffff);
1363 unpack_float_z_Z32X24S8(const void *src
, GLfloat
*dst
)
1365 *dst
= *((const GLfloat
*) src
);
1371 _mesa_unpack_float_z_row(gl_format format
, GLuint n
,
1372 const void *src
, GLfloat
*dst
)
1374 unpack_float_z_func unpack
;
1375 GLuint srcStride
= _mesa_get_format_bytes(format
);
1376 const GLubyte
*srcPtr
= (GLubyte
*) src
;
1380 case MESA_FORMAT_Z24_S8
:
1381 unpack
= unpack_float_z_Z24_S8
;
1383 case MESA_FORMAT_S8_Z24
:
1384 unpack
= unpack_float_z_S8_Z24
;
1386 case MESA_FORMAT_Z16
:
1387 unpack
= unpack_float_z_Z16
;
1389 case MESA_FORMAT_X8_Z24
:
1390 unpack
= unpack_float_z_X8_Z24
;
1392 case MESA_FORMAT_Z24_X8
:
1393 unpack
= unpack_float_z_Z24_X8
;
1395 case MESA_FORMAT_Z32
:
1396 unpack
= unpack_float_z_Z32
;
1398 case MESA_FORMAT_Z32_FLOAT_X24S8
:
1399 unpack
= unpack_float_z_Z32X24S8
;
1402 _mesa_problem(NULL
, "bad format %s in _mesa_unpack_float_z_row",
1403 _mesa_get_format_name(format
));
1407 for (i
= 0; i
< n
; i
++) {
1408 unpack(srcPtr
, &dst
[i
]);
1409 srcPtr
+= srcStride
;
1415 typedef void (*unpack_uint_z_func
)(const void *src
, GLuint
*dst
);
1418 unpack_uint_z_Z24_S8(const void *src
, GLuint
*dst
)
1420 /* only return Z, not stencil data */
1421 const GLuint s
= *((const GLuint
*) src
);
1426 unpack_uint_z_S8_Z24(const void *src
, GLuint
*dst
)
1428 /* only return Z, not stencil data */
1429 const GLuint s
= *((const GLuint
*) src
);
1430 *dst
= s
& 0x00ffffff;
1434 unpack_uint_z_Z16(const void *src
, GLuint
*dst
)
1436 *dst
= *((const GLushort
*) src
);
1440 unpack_uint_z_X8_Z24(const void *src
, GLuint
*dst
)
1442 unpack_uint_z_S8_Z24(src
, dst
);
1446 unpack_uint_z_Z24_X8(const void *src
, GLuint
*dst
)
1448 unpack_uint_z_Z24_S8(src
, dst
);
1452 unpack_uint_z_Z32(const void *src
, GLuint
*dst
)
1454 *dst
= *((const GLuint
*) src
);
1459 _mesa_unpack_uint_z_row(gl_format format
, GLuint n
,
1460 const void *src
, GLuint
*dst
)
1462 unpack_uint_z_func unpack
;
1463 GLuint srcStride
= _mesa_get_format_bytes(format
);
1464 const GLubyte
*srcPtr
= (GLubyte
*) src
;
1468 case MESA_FORMAT_Z24_S8
:
1469 unpack
= unpack_uint_z_Z24_S8
;
1471 case MESA_FORMAT_S8_Z24
:
1472 unpack
= unpack_uint_z_S8_Z24
;
1474 case MESA_FORMAT_Z16
:
1475 unpack
= unpack_uint_z_Z16
;
1477 case MESA_FORMAT_X8_Z24
:
1478 unpack
= unpack_uint_z_X8_Z24
;
1480 case MESA_FORMAT_Z24_X8
:
1481 unpack
= unpack_uint_z_Z24_X8
;
1483 case MESA_FORMAT_Z32
:
1484 unpack
= unpack_uint_z_Z32
;
1487 _mesa_problem(NULL
, "bad format %s in _mesa_unpack_uint_z_row",
1488 _mesa_get_format_name(format
));
1492 for (i
= 0; i
< n
; i
++) {
1493 unpack(srcPtr
, &dst
[i
]);
1494 srcPtr
+= srcStride
;