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"
32 /** Helper struct for MESA_FORMAT_Z32_FLOAT_X24S8 */
40 /* Expand 1, 2, 3, 4, 5, 6-bit values to fill 8 bits */
42 #define EXPAND_1_8(X) ( (X) ? 0xff : 0x0 )
44 #define EXPAND_2_8(X) ( ((X) << 6) | ((X) << 4) | ((X) << 2) | (X) )
46 #define EXPAND_3_8(X) ( ((X) << 5) | ((X) << 2) | ((X) >> 1) )
48 #define EXPAND_4_8(X) ( ((X) << 4) | (X) )
50 #define EXPAND_5_8(X) ( ((X) << 3) | ((X) >> 2) )
52 #define EXPAND_6_8(X) ( ((X) << 2) | ((X) >> 4) )
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.
61 nonlinear_to_linear(GLubyte cs8
)
63 static GLfloat table
[256];
64 static GLboolean tableReady
= GL_FALSE
;
66 /* compute lookup table now */
68 for (i
= 0; i
< 256; i
++) {
69 const GLfloat cs
= UBYTE_TO_FLOAT(i
);
71 table
[i
] = cs
/ 12.92f
;
74 table
[i
] = (GLfloat
) pow((cs
+ 0.055) / 1.055, 2.4);
83 /**********************************************************************/
84 /* Unpack, returning GLfloat colors */
85 /**********************************************************************/
87 typedef void (*unpack_rgba_func
)(const void *src
, GLfloat dst
[][4], GLuint n
);
91 unpack_RGBA8888(const void *src
, GLfloat dst
[][4], GLuint n
)
93 const GLuint
*s
= ((const GLuint
*) src
);
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 );
104 unpack_RGBA8888_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
106 const GLuint
*s
= ((const GLuint
*) src
);
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) );
117 unpack_ARGB8888(const void *src
, GLfloat dst
[][4], GLuint n
)
119 const GLuint
*s
= ((const GLuint
*) src
);
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) );
130 unpack_ARGB8888_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
132 const GLuint
*s
= ((const GLuint
*) src
);
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 );
143 unpack_RGBX8888(const void *src
, GLfloat dst
[][4], GLuint n
)
145 const GLuint
*s
= ((const GLuint
*) src
);
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
;
156 unpack_RGBX8888_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
158 const GLuint
*s
= ((const GLuint
*) src
);
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
;
169 unpack_XRGB8888(const void *src
, GLfloat dst
[][4], GLuint n
)
171 const GLuint
*s
= ((const GLuint
*) src
);
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
;
182 unpack_XRGB8888_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
184 const GLuint
*s
= ((const GLuint
*) src
);
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
;
195 unpack_RGB888(const void *src
, GLfloat dst
[][4], GLuint n
)
197 const GLubyte
*s
= (const GLubyte
*) src
;
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
;
208 unpack_BGR888(const void *src
, GLfloat dst
[][4], GLuint n
)
210 const GLubyte
*s
= (const GLubyte
*) src
;
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
;
221 unpack_RGB565(const void *src
, GLfloat dst
[][4], GLuint n
)
223 const GLushort
*s
= ((const GLushort
*) src
);
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
;
234 unpack_RGB565_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
236 const GLushort
*s
= ((const GLushort
*) src
);
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
;
248 unpack_ARGB4444(const void *src
, GLfloat dst
[][4], GLuint n
)
250 const GLushort
*s
= ((const GLushort
*) src
);
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
);
261 unpack_ARGB4444_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
263 const GLushort
*s
= ((const GLushort
*) src
);
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
);
274 unpack_RGBA5551(const void *src
, GLfloat dst
[][4], GLuint n
)
276 const GLushort
*s
= ((const GLushort
*) src
);
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
;
287 unpack_ARGB1555(const void *src
, GLfloat dst
[][4], GLuint n
)
289 const GLushort
*s
= ((const GLushort
*) src
);
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
;
300 unpack_ARGB1555_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
302 const GLushort
*s
= ((const GLushort
*) src
);
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
;
314 unpack_AL44(const void *src
, GLfloat dst
[][4], GLuint n
)
316 const GLubyte
*s
= ((const GLubyte
*) src
);
318 for (i
= 0; i
< n
; i
++) {
321 dst
[i
][BCOMP
] = (s
[i
] & 0xf) * (1.0F
/ 15.0F
);
322 dst
[i
][ACOMP
] = ((s
[i
] >> 4) & 0xf) * (1.0F
/ 15.0F
);
327 unpack_AL88(const void *src
, GLfloat dst
[][4], GLuint n
)
329 const GLushort
*s
= ((const GLushort
*) src
);
331 for (i
= 0; i
< n
; i
++) {
334 dst
[i
][BCOMP
] = UBYTE_TO_FLOAT( s
[i
] & 0xff );
335 dst
[i
][ACOMP
] = UBYTE_TO_FLOAT( s
[i
] >> 8 );
340 unpack_AL88_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
342 const GLushort
*s
= ((const GLushort
*) src
);
344 for (i
= 0; i
< n
; i
++) {
347 dst
[i
][BCOMP
] = UBYTE_TO_FLOAT( s
[i
] >> 8 );
348 dst
[i
][ACOMP
] = UBYTE_TO_FLOAT( s
[i
] & 0xff );
353 unpack_AL1616(const void *src
, GLfloat dst
[][4], GLuint n
)
355 const GLuint
*s
= ((const GLuint
*) src
);
357 for (i
= 0; i
< n
; i
++) {
360 dst
[i
][BCOMP
] = USHORT_TO_FLOAT( s
[i
] & 0xffff );
361 dst
[i
][ACOMP
] = USHORT_TO_FLOAT( s
[i
] >> 16 );
366 unpack_AL1616_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
368 const GLuint
*s
= ((const GLuint
*) src
);
370 for (i
= 0; i
< n
; i
++) {
373 dst
[i
][BCOMP
] = USHORT_TO_FLOAT( s
[i
] >> 16 );
374 dst
[i
][ACOMP
] = USHORT_TO_FLOAT( s
[i
] & 0xffff );
379 unpack_RGB332(const void *src
, GLfloat dst
[][4], GLuint n
)
381 const GLubyte
*s
= ((const GLubyte
*) src
);
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
;
393 unpack_A8(const void *src
, GLfloat dst
[][4], GLuint n
)
395 const GLubyte
*s
= ((const GLubyte
*) src
);
397 for (i
= 0; i
< n
; i
++) {
400 dst
[i
][BCOMP
] = 0.0F
;
401 dst
[i
][ACOMP
] = UBYTE_TO_FLOAT(s
[i
]);
406 unpack_A16(const void *src
, GLfloat dst
[][4], GLuint n
)
408 const GLushort
*s
= ((const GLushort
*) src
);
410 for (i
= 0; i
< n
; i
++) {
413 dst
[i
][BCOMP
] = 0.0F
;
414 dst
[i
][ACOMP
] = USHORT_TO_FLOAT(s
[i
]);
419 unpack_L8(const void *src
, GLfloat dst
[][4], GLuint n
)
421 const GLubyte
*s
= ((const GLubyte
*) src
);
423 for (i
= 0; i
< n
; i
++) {
426 dst
[i
][BCOMP
] = UBYTE_TO_FLOAT(s
[i
]);
427 dst
[i
][ACOMP
] = 1.0F
;
432 unpack_L16(const void *src
, GLfloat dst
[][4], GLuint n
)
434 const GLushort
*s
= ((const GLushort
*) src
);
436 for (i
= 0; i
< n
; i
++) {
439 dst
[i
][BCOMP
] = USHORT_TO_FLOAT(s
[i
]);
440 dst
[i
][ACOMP
] = 1.0F
;
445 unpack_I8(const void *src
, GLfloat dst
[][4], GLuint n
)
447 const GLubyte
*s
= ((const GLubyte
*) src
);
449 for (i
= 0; i
< n
; i
++) {
453 dst
[i
][ACOMP
] = UBYTE_TO_FLOAT(s
[i
]);
458 unpack_I16(const void *src
, GLfloat dst
[][4], GLuint n
)
460 const GLushort
*s
= ((const GLushort
*) src
);
462 for (i
= 0; i
< n
; i
++) {
466 dst
[i
][ACOMP
] = USHORT_TO_FLOAT(s
[i
]);
471 unpack_YCBCR(const void *src
, GLfloat dst
[][4], GLuint n
)
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
;
496 unpack_YCBCR_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
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
;
521 unpack_R8(const void *src
, GLfloat dst
[][4], GLuint n
)
523 const GLubyte
*s
= ((const GLubyte
*) src
);
525 for (i
= 0; i
< n
; i
++) {
526 dst
[i
][0] = UBYTE_TO_FLOAT(s
[i
]);
534 unpack_GR88(const void *src
, GLfloat dst
[][4], GLuint n
)
536 const GLushort
*s
= ((const GLushort
*) src
);
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 );
547 unpack_RG88(const void *src
, GLfloat dst
[][4], GLuint n
)
549 const GLushort
*s
= ((const GLushort
*) src
);
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 );
560 unpack_R16(const void *src
, GLfloat dst
[][4], GLuint n
)
562 const GLushort
*s
= ((const GLushort
*) src
);
564 for (i
= 0; i
< n
; i
++) {
565 dst
[i
][RCOMP
] = USHORT_TO_FLOAT(s
[i
]);
573 unpack_RG1616(const void *src
, GLfloat dst
[][4], GLuint n
)
575 const GLuint
*s
= ((const GLuint
*) src
);
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 );
586 unpack_RG1616_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
588 const GLuint
*s
= ((const GLuint
*) src
);
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 );
599 unpack_ARGB2101010(const void *src
, GLfloat dst
[][4], GLuint n
)
601 const GLuint
*s
= ((const GLuint
*) src
);
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
);
613 unpack_Z24_S8(const void *src
, GLfloat dst
[][4], GLuint n
)
615 /* only return Z, not stencil data */
616 const GLuint
*s
= ((const GLuint
*) src
);
617 const GLdouble scale
= 1.0 / (GLdouble
) 0xffffff;
619 for (i
= 0; i
< n
; i
++) {
622 dst
[i
][2] = (s
[i
] >> 8) * scale
;
624 ASSERT(dst
[i
][0] >= 0.0F
);
625 ASSERT(dst
[i
][0] <= 1.0F
);
630 unpack_S8_Z24(const void *src
, GLfloat dst
[][4], GLuint n
)
632 /* only return Z, not stencil data */
633 const GLuint
*s
= ((const GLuint
*) src
);
634 const GLdouble scale
= 1.0 / (GLdouble
) 0xffffff;
636 for (i
= 0; i
< n
; i
++) {
639 dst
[i
][2] = (s
[i
] & 0x00ffffff) * scale
;
641 ASSERT(dst
[i
][0] >= 0.0F
);
642 ASSERT(dst
[i
][0] <= 1.0F
);
647 unpack_Z16(const void *src
, GLfloat dst
[][4], GLuint n
)
649 const GLushort
*s
= ((const GLushort
*) src
);
651 for (i
= 0; i
< n
; i
++) {
654 dst
[i
][2] = s
[i
] * (1.0F
/ 65535.0F
);
660 unpack_X8_Z24(const void *src
, GLfloat dst
[][4], GLuint n
)
662 unpack_S8_Z24(src
, dst
, n
);
666 unpack_Z24_X8(const void *src
, GLfloat dst
[][4], GLuint n
)
668 unpack_Z24_S8(src
, dst
, n
);
672 unpack_Z32(const void *src
, GLfloat dst
[][4], GLuint n
)
674 const GLuint
*s
= ((const GLuint
*) src
);
676 for (i
= 0; i
< n
; i
++) {
679 dst
[i
][2] = s
[i
] * (1.0F
/ 0xffffffff);
685 unpack_Z32_FLOAT(const void *src
, GLfloat dst
[][4], GLuint n
)
687 const GLfloat
*s
= ((const GLfloat
*) src
);
689 for (i
= 0; i
< n
; i
++) {
692 dst
[i
][2] = s
[i
* 2];
698 unpack_Z32_FLOAT_X24S8(const void *src
, GLfloat dst
[][4], GLuint n
)
700 const GLfloat
*s
= ((const GLfloat
*) src
);
702 for (i
= 0; i
< n
; i
++) {
712 unpack_S8(const void *src
, GLfloat dst
[][4], GLuint n
)
714 /* should never be used */
716 for (i
= 0; i
< n
; i
++) {
726 unpack_SRGB8(const void *src
, GLfloat dst
[][4], GLuint n
)
728 const GLubyte
*s
= (const GLubyte
*) src
;
730 for (i
= 0; i
< n
; i
++) {
731 dst
[i
][RCOMP
] = nonlinear_to_linear(s
[i
*3+2]);
732 dst
[i
][GCOMP
] = nonlinear_to_linear(s
[i
*3+1]);
733 dst
[i
][BCOMP
] = nonlinear_to_linear(s
[i
*3+0]);
734 dst
[i
][ACOMP
] = 1.0F
;
739 unpack_SRGBA8(const void *src
, GLfloat dst
[][4], GLuint n
)
741 const GLuint
*s
= ((const GLuint
*) src
);
743 for (i
= 0; i
< n
; i
++) {
744 dst
[i
][RCOMP
] = nonlinear_to_linear( (s
[i
] >> 24) );
745 dst
[i
][GCOMP
] = nonlinear_to_linear( (s
[i
] >> 16) & 0xff );
746 dst
[i
][BCOMP
] = nonlinear_to_linear( (s
[i
] >> 8) & 0xff );
747 dst
[i
][ACOMP
] = UBYTE_TO_FLOAT( s
[i
] & 0xff ); /* linear! */
752 unpack_SARGB8(const void *src
, GLfloat dst
[][4], GLuint n
)
754 const GLuint
*s
= ((const GLuint
*) src
);
756 for (i
= 0; i
< n
; i
++) {
757 dst
[i
][RCOMP
] = nonlinear_to_linear( (s
[i
] >> 16) & 0xff );
758 dst
[i
][GCOMP
] = nonlinear_to_linear( (s
[i
] >> 8) & 0xff );
759 dst
[i
][BCOMP
] = nonlinear_to_linear( (s
[i
] ) & 0xff );
760 dst
[i
][ACOMP
] = UBYTE_TO_FLOAT( s
[i
] >> 24 ); /* linear! */
765 unpack_SL8(const void *src
, GLfloat dst
[][4], GLuint n
)
767 const GLubyte
*s
= ((const GLubyte
*) src
);
769 for (i
= 0; i
< n
; i
++) {
772 dst
[i
][BCOMP
] = nonlinear_to_linear(s
[i
]);
773 dst
[i
][ACOMP
] = 1.0F
;
778 unpack_SLA8(const void *src
, GLfloat dst
[][4], GLuint n
)
780 const GLushort
*s
= (const GLushort
*) src
;
782 for (i
= 0; i
< n
; i
++) {
785 dst
[i
][BCOMP
] = nonlinear_to_linear(s
[i
] & 0xff);
786 dst
[i
][ACOMP
] = UBYTE_TO_FLOAT(s
[i
] >> 8); /* linear! */
791 unpack_SRGB_DXT1(const void *src
, GLfloat dst
[][4], GLuint n
)
796 unpack_SRGBA_DXT1(const void *src
, GLfloat dst
[][4], GLuint n
)
801 unpack_SRGBA_DXT3(const void *src
, GLfloat dst
[][4], GLuint n
)
806 unpack_SRGBA_DXT5(const void *src
, GLfloat dst
[][4], GLuint n
)
811 unpack_RGB_FXT1(const void *src
, GLfloat dst
[][4], GLuint n
)
816 unpack_RGBA_FXT1(const void *src
, GLfloat dst
[][4], GLuint n
)
821 unpack_RGB_DXT1(const void *src
, GLfloat dst
[][4], GLuint n
)
826 unpack_RGBA_DXT1(const void *src
, GLfloat dst
[][4], GLuint n
)
831 unpack_RGBA_DXT3(const void *src
, GLfloat dst
[][4], GLuint n
)
836 unpack_RGBA_DXT5(const void *src
, GLfloat dst
[][4], GLuint n
)
842 unpack_RGBA_FLOAT32(const void *src
, GLfloat dst
[][4], GLuint n
)
844 const GLfloat
*s
= (const GLfloat
*) src
;
846 for (i
= 0; i
< n
; i
++) {
847 dst
[i
][RCOMP
] = s
[i
*4+0];
848 dst
[i
][GCOMP
] = s
[i
*4+1];
849 dst
[i
][BCOMP
] = s
[i
*4+2];
850 dst
[i
][ACOMP
] = s
[i
*4+3];
855 unpack_RGBA_FLOAT16(const void *src
, GLfloat dst
[][4], GLuint n
)
857 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
859 for (i
= 0; i
< n
; i
++) {
860 dst
[i
][RCOMP
] = _mesa_half_to_float(s
[i
*4+0]);
861 dst
[i
][GCOMP
] = _mesa_half_to_float(s
[i
*4+1]);
862 dst
[i
][BCOMP
] = _mesa_half_to_float(s
[i
*4+2]);
863 dst
[i
][ACOMP
] = _mesa_half_to_float(s
[i
*4+3]);
868 unpack_RGB_FLOAT32(const void *src
, GLfloat dst
[][4], GLuint n
)
870 const GLfloat
*s
= (const GLfloat
*) src
;
872 for (i
= 0; i
< n
; i
++) {
873 dst
[i
][RCOMP
] = s
[i
*3+0];
874 dst
[i
][GCOMP
] = s
[i
*3+1];
875 dst
[i
][BCOMP
] = s
[i
*3+2];
876 dst
[i
][ACOMP
] = 1.0F
;
881 unpack_RGB_FLOAT16(const void *src
, GLfloat dst
[][4], GLuint n
)
883 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
885 for (i
= 0; i
< n
; i
++) {
886 dst
[i
][RCOMP
] = _mesa_half_to_float(s
[i
*3+0]);
887 dst
[i
][GCOMP
] = _mesa_half_to_float(s
[i
*3+1]);
888 dst
[i
][BCOMP
] = _mesa_half_to_float(s
[i
*3+2]);
889 dst
[i
][ACOMP
] = 1.0F
;
894 unpack_ALPHA_FLOAT32(const void *src
, GLfloat dst
[][4], GLuint n
)
896 const GLfloat
*s
= (const GLfloat
*) src
;
898 for (i
= 0; i
< n
; i
++) {
901 dst
[i
][BCOMP
] = 0.0F
;
902 dst
[i
][ACOMP
] = s
[i
];
907 unpack_ALPHA_FLOAT16(const void *src
, GLfloat dst
[][4], GLuint n
)
909 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
911 for (i
= 0; i
< n
; i
++) {
914 dst
[i
][BCOMP
] = 0.0F
;
915 dst
[i
][ACOMP
] = _mesa_half_to_float(s
[i
]);
920 unpack_LUMINANCE_FLOAT32(const void *src
, GLfloat dst
[][4], GLuint n
)
922 const GLfloat
*s
= (const GLfloat
*) src
;
924 for (i
= 0; i
< n
; i
++) {
927 dst
[i
][BCOMP
] = s
[i
];
928 dst
[i
][ACOMP
] = 1.0F
;
933 unpack_LUMINANCE_FLOAT16(const void *src
, GLfloat dst
[][4], GLuint n
)
935 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
937 for (i
= 0; i
< n
; i
++) {
940 dst
[i
][BCOMP
] = _mesa_half_to_float(s
[i
]);
941 dst
[i
][ACOMP
] = 1.0F
;
946 unpack_LUMINANCE_ALPHA_FLOAT32(const void *src
, GLfloat dst
[][4], GLuint n
)
948 const GLfloat
*s
= (const GLfloat
*) src
;
950 for (i
= 0; i
< n
; i
++) {
953 dst
[i
][BCOMP
] = s
[i
*2+0];
954 dst
[i
][ACOMP
] = s
[i
*2+1];
959 unpack_LUMINANCE_ALPHA_FLOAT16(const void *src
, GLfloat dst
[][4], GLuint n
)
961 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
963 for (i
= 0; i
< n
; i
++) {
966 dst
[i
][BCOMP
] = _mesa_half_to_float(s
[i
*2+0]);
967 dst
[i
][ACOMP
] = _mesa_half_to_float(s
[i
*2+1]);
972 unpack_INTENSITY_FLOAT32(const void *src
, GLfloat dst
[][4], GLuint n
)
974 const GLfloat
*s
= (const GLfloat
*) src
;
976 for (i
= 0; i
< n
; i
++) {
980 dst
[i
][ACOMP
] = s
[i
];
985 unpack_INTENSITY_FLOAT16(const void *src
, GLfloat dst
[][4], GLuint n
)
987 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
989 for (i
= 0; i
< n
; i
++) {
993 dst
[i
][ACOMP
] = _mesa_half_to_float(s
[i
]);
998 unpack_R_FLOAT32(const void *src
, GLfloat dst
[][4], GLuint n
)
1000 const GLfloat
*s
= (const GLfloat
*) src
;
1002 for (i
= 0; i
< n
; i
++) {
1003 dst
[i
][RCOMP
] = s
[i
];
1004 dst
[i
][GCOMP
] = 0.0F
;
1005 dst
[i
][BCOMP
] = 0.0F
;
1006 dst
[i
][ACOMP
] = 1.0F
;
1011 unpack_R_FLOAT16(const void *src
, GLfloat dst
[][4], GLuint n
)
1013 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
1015 for (i
= 0; i
< n
; i
++) {
1016 dst
[i
][RCOMP
] = _mesa_half_to_float(s
[i
]);
1017 dst
[i
][GCOMP
] = 0.0F
;
1018 dst
[i
][BCOMP
] = 0.0F
;
1019 dst
[i
][ACOMP
] = 1.0F
;
1024 unpack_RG_FLOAT32(const void *src
, GLfloat dst
[][4], GLuint n
)
1026 const GLfloat
*s
= (const GLfloat
*) src
;
1028 for (i
= 0; i
< n
; i
++) {
1029 dst
[i
][RCOMP
] = s
[i
*2+0];
1030 dst
[i
][GCOMP
] = s
[i
*2+1];
1031 dst
[i
][BCOMP
] = 0.0F
;
1032 dst
[i
][ACOMP
] = 1.0F
;
1037 unpack_RG_FLOAT16(const void *src
, GLfloat dst
[][4], GLuint n
)
1039 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
1041 for (i
= 0; i
< n
; i
++) {
1042 dst
[i
][RCOMP
] = _mesa_half_to_float(s
[i
*2+0]);
1043 dst
[i
][GCOMP
] = _mesa_half_to_float(s
[i
*2+1]);
1044 dst
[i
][BCOMP
] = 0.0F
;
1045 dst
[i
][ACOMP
] = 1.0F
;
1051 unpack_RGBA_INT8(const void *src
, GLfloat dst
[][4], GLuint n
)
1053 const GLbyte
*s
= (const GLbyte
*) src
;
1055 for (i
= 0; i
< n
; i
++) {
1056 dst
[i
][RCOMP
] = (GLfloat
) s
[i
*4+0];
1057 dst
[i
][GCOMP
] = (GLfloat
) s
[i
*4+1];
1058 dst
[i
][BCOMP
] = (GLfloat
) s
[i
*4+2];
1059 dst
[i
][ACOMP
] = (GLfloat
) s
[i
*4+3];
1064 unpack_RGBA_INT16(const void *src
, GLfloat dst
[][4], GLuint n
)
1066 const GLshort
*s
= (const GLshort
*) src
;
1068 for (i
= 0; i
< n
; i
++) {
1069 dst
[i
][RCOMP
] = (GLfloat
) s
[i
*4+0];
1070 dst
[i
][GCOMP
] = (GLfloat
) s
[i
*4+1];
1071 dst
[i
][BCOMP
] = (GLfloat
) s
[i
*4+2];
1072 dst
[i
][ACOMP
] = (GLfloat
) s
[i
*4+3];
1077 unpack_RGBA_INT32(const void *src
, GLfloat dst
[][4], GLuint n
)
1079 const GLint
*s
= (const GLint
*) src
;
1081 for (i
= 0; i
< n
; i
++) {
1082 dst
[i
][RCOMP
] = (GLfloat
) s
[i
*4+0];
1083 dst
[i
][GCOMP
] = (GLfloat
) s
[i
*4+1];
1084 dst
[i
][BCOMP
] = (GLfloat
) s
[i
*4+2];
1085 dst
[i
][ACOMP
] = (GLfloat
) s
[i
*4+3];
1090 unpack_RGBA_UINT8(const void *src
, GLfloat dst
[][4], GLuint n
)
1092 const GLubyte
*s
= (const GLubyte
*) src
;
1094 for (i
= 0; i
< n
; i
++) {
1095 dst
[i
][RCOMP
] = (GLfloat
) s
[i
*4+0];
1096 dst
[i
][GCOMP
] = (GLfloat
) s
[i
*4+1];
1097 dst
[i
][BCOMP
] = (GLfloat
) s
[i
*4+2];
1098 dst
[i
][ACOMP
] = (GLfloat
) s
[i
*4+3];
1103 unpack_RGBA_UINT16(const void *src
, GLfloat dst
[][4], GLuint n
)
1105 const GLushort
*s
= (const GLushort
*) src
;
1107 for (i
= 0; i
< n
; i
++) {
1108 dst
[i
][RCOMP
] = (GLfloat
) s
[i
*4+0];
1109 dst
[i
][GCOMP
] = (GLfloat
) s
[i
*4+1];
1110 dst
[i
][BCOMP
] = (GLfloat
) s
[i
*4+2];
1111 dst
[i
][ACOMP
] = (GLfloat
) s
[i
*4+3];
1116 unpack_RGBA_UINT32(const void *src
, GLfloat dst
[][4], GLuint n
)
1118 const GLuint
*s
= (const GLuint
*) src
;
1120 for (i
= 0; i
< n
; i
++) {
1121 dst
[i
][RCOMP
] = (GLfloat
) s
[i
*4+0];
1122 dst
[i
][GCOMP
] = (GLfloat
) s
[i
*4+1];
1123 dst
[i
][BCOMP
] = (GLfloat
) s
[i
*4+2];
1124 dst
[i
][ACOMP
] = (GLfloat
) s
[i
*4+3];
1129 unpack_DUDV8(const void *src
, GLfloat dst
[][4], GLuint n
)
1131 const GLbyte
*s
= (const GLbyte
*) src
;
1133 for (i
= 0; i
< n
; i
++) {
1134 dst
[i
][RCOMP
] = BYTE_TO_FLOAT(s
[i
*2+0]);
1135 dst
[i
][GCOMP
] = BYTE_TO_FLOAT(s
[i
*2+1]);
1142 unpack_SIGNED_R8(const void *src
, GLfloat dst
[][4], GLuint n
)
1144 const GLbyte
*s
= ((const GLbyte
*) src
);
1146 for (i
= 0; i
< n
; i
++) {
1147 dst
[i
][RCOMP
] = BYTE_TO_FLOAT_TEX( s
[i
] );
1148 dst
[i
][GCOMP
] = 0.0F
;
1149 dst
[i
][BCOMP
] = 0.0F
;
1150 dst
[i
][ACOMP
] = 1.0F
;
1155 unpack_SIGNED_RG88_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
1157 const GLushort
*s
= ((const GLushort
*) src
);
1159 for (i
= 0; i
< n
; i
++) {
1160 dst
[i
][RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] & 0xff) );
1161 dst
[i
][GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] >> 8) );
1162 dst
[i
][BCOMP
] = 0.0F
;
1163 dst
[i
][ACOMP
] = 1.0F
;
1168 unpack_SIGNED_RGBX8888(const void *src
, GLfloat dst
[][4], GLuint n
)
1170 const GLuint
*s
= ((const GLuint
*) src
);
1172 for (i
= 0; i
< n
; i
++) {
1173 dst
[i
][RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] >> 24) );
1174 dst
[i
][GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] >> 16) );
1175 dst
[i
][BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] >> 8) );
1176 dst
[i
][ACOMP
] = 1.0f
;
1181 unpack_SIGNED_RGBA8888(const void *src
, GLfloat dst
[][4], GLuint n
)
1183 const GLuint
*s
= ((const GLuint
*) src
);
1185 for (i
= 0; i
< n
; i
++) {
1186 dst
[i
][RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] >> 24) );
1187 dst
[i
][GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] >> 16) );
1188 dst
[i
][BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] >> 8) );
1189 dst
[i
][ACOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] ) );
1194 unpack_SIGNED_RGBA8888_REV(const void *src
, GLfloat dst
[][4], GLuint n
)
1196 const GLuint
*s
= ((const GLuint
*) src
);
1198 for (i
= 0; i
< n
; i
++) {
1199 dst
[i
][RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] ) );
1200 dst
[i
][GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] >> 8) );
1201 dst
[i
][BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] >> 16) );
1202 dst
[i
][ACOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] >> 24) );
1207 unpack_SIGNED_R16(const void *src
, GLfloat dst
[][4], GLuint n
)
1209 const GLshort
*s
= ((const GLshort
*) src
);
1211 for (i
= 0; i
< n
; i
++) {
1212 dst
[i
][RCOMP
] = SHORT_TO_FLOAT_TEX( s
[i
] );
1213 dst
[i
][GCOMP
] = 0.0F
;
1214 dst
[i
][BCOMP
] = 0.0F
;
1215 dst
[i
][ACOMP
] = 1.0F
;
1220 unpack_SIGNED_GR1616(const void *src
, GLfloat dst
[][4], GLuint n
)
1222 const GLuint
*s
= ((const GLuint
*) src
);
1224 for (i
= 0; i
< n
; i
++) {
1225 dst
[i
][RCOMP
] = SHORT_TO_FLOAT_TEX( (GLshort
) (s
[i
] & 0xffff) );
1226 dst
[i
][GCOMP
] = SHORT_TO_FLOAT_TEX( (GLshort
) (s
[i
] >> 16) );
1227 dst
[i
][BCOMP
] = 0.0F
;
1228 dst
[i
][ACOMP
] = 1.0F
;
1233 unpack_SIGNED_RGB_16(const void *src
, GLfloat dst
[][4], GLuint n
)
1235 const GLshort
*s
= (const GLshort
*) src
;
1237 for (i
= 0; i
< n
; i
++) {
1238 dst
[i
][RCOMP
] = SHORT_TO_FLOAT_TEX( s
[i
*3+0] );
1239 dst
[i
][GCOMP
] = SHORT_TO_FLOAT_TEX( s
[i
*3+1] );
1240 dst
[i
][BCOMP
] = SHORT_TO_FLOAT_TEX( s
[i
*3+2] );
1241 dst
[i
][ACOMP
] = 1.0F
;
1246 unpack_SIGNED_RGBA_16(const void *src
, GLfloat dst
[][4], GLuint n
)
1248 const GLshort
*s
= (const GLshort
*) src
;
1250 for (i
= 0; i
< n
; i
++) {
1251 dst
[i
][RCOMP
] = SHORT_TO_FLOAT_TEX( s
[i
*4+0] );
1252 dst
[i
][GCOMP
] = SHORT_TO_FLOAT_TEX( s
[i
*4+1] );
1253 dst
[i
][BCOMP
] = SHORT_TO_FLOAT_TEX( s
[i
*4+2] );
1254 dst
[i
][ACOMP
] = SHORT_TO_FLOAT_TEX( s
[i
*4+3] );
1259 unpack_RGBA_16(const void *src
, GLfloat dst
[][4], GLuint n
)
1261 const GLushort
*s
= (const GLushort
*) src
;
1263 for (i
= 0; i
< n
; i
++) {
1264 dst
[i
][RCOMP
] = USHORT_TO_FLOAT( s
[i
*4+0] );
1265 dst
[i
][GCOMP
] = USHORT_TO_FLOAT( s
[i
*4+1] );
1266 dst
[i
][BCOMP
] = USHORT_TO_FLOAT( s
[i
*4+2] );
1267 dst
[i
][ACOMP
] = USHORT_TO_FLOAT( s
[i
*4+3] );
1272 unpack_RED_RGTC1(const void *src
, GLfloat dst
[][4], GLuint n
)
1278 unpack_SIGNED_RED_RGTC1(const void *src
, GLfloat dst
[][4], GLuint n
)
1284 unpack_RG_RGTC2(const void *src
, GLfloat dst
[][4], GLuint n
)
1290 unpack_SIGNED_RG_RGTC2(const void *src
, GLfloat dst
[][4], GLuint n
)
1296 unpack_L_LATC1(const void *src
, GLfloat dst
[][4], GLuint n
)
1302 unpack_SIGNED_L_LATC1(const void *src
, GLfloat dst
[][4], GLuint n
)
1308 unpack_LA_LATC2(const void *src
, GLfloat dst
[][4], GLuint n
)
1314 unpack_SIGNED_LA_LATC2(const void *src
, GLfloat dst
[][4], GLuint n
)
1320 unpack_ETC1_RGB8(const void *src
, GLfloat dst
[][4], GLuint n
)
1326 unpack_SIGNED_A8(const void *src
, GLfloat dst
[][4], GLuint n
)
1328 const GLbyte
*s
= ((const GLbyte
*) src
);
1330 for (i
= 0; i
< n
; i
++) {
1331 dst
[i
][RCOMP
] = 0.0F
;
1332 dst
[i
][GCOMP
] = 0.0F
;
1333 dst
[i
][BCOMP
] = 0.0F
;
1334 dst
[i
][ACOMP
] = BYTE_TO_FLOAT_TEX( s
[i
] );
1339 unpack_SIGNED_L8(const void *src
, GLfloat dst
[][4], GLuint n
)
1341 const GLbyte
*s
= ((const GLbyte
*) src
);
1343 for (i
= 0; i
< n
; i
++) {
1346 dst
[i
][BCOMP
] = BYTE_TO_FLOAT_TEX( s
[i
] );
1347 dst
[i
][ACOMP
] = 1.0F
;
1352 unpack_SIGNED_AL88(const void *src
, GLfloat dst
[][4], GLuint n
)
1354 const GLshort
*s
= ((const GLshort
*) src
);
1356 for (i
= 0; i
< n
; i
++) {
1359 dst
[i
][BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] & 0xff) );
1360 dst
[i
][ACOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
[i
] >> 8) );
1365 unpack_SIGNED_I8(const void *src
, GLfloat dst
[][4], GLuint n
)
1367 const GLbyte
*s
= ((const GLbyte
*) src
);
1369 for (i
= 0; i
< n
; i
++) {
1373 dst
[i
][ACOMP
] = BYTE_TO_FLOAT_TEX( s
[i
] );
1378 unpack_SIGNED_A16(const void *src
, GLfloat dst
[][4], GLuint n
)
1380 const GLshort
*s
= ((const GLshort
*) src
);
1382 for (i
= 0; i
< n
; i
++) {
1383 dst
[i
][RCOMP
] = 0.0F
;
1384 dst
[i
][GCOMP
] = 0.0F
;
1385 dst
[i
][BCOMP
] = 0.0F
;
1386 dst
[i
][ACOMP
] = SHORT_TO_FLOAT_TEX( s
[i
] );
1391 unpack_SIGNED_L16(const void *src
, GLfloat dst
[][4], GLuint n
)
1393 const GLshort
*s
= ((const GLshort
*) src
);
1395 for (i
= 0; i
< n
; i
++) {
1398 dst
[i
][BCOMP
] = SHORT_TO_FLOAT_TEX( s
[i
] );
1399 dst
[i
][ACOMP
] = 1.0F
;
1404 unpack_SIGNED_AL1616(const void *src
, GLfloat dst
[][4], GLuint n
)
1406 const GLshort
*s
= (const GLshort
*) src
;
1408 for (i
= 0; i
< n
; i
++) {
1411 dst
[i
][BCOMP
] = SHORT_TO_FLOAT_TEX( s
[i
*2+0] );
1412 dst
[i
][ACOMP
] = SHORT_TO_FLOAT_TEX( s
[i
*2+1] );
1417 unpack_SIGNED_I16(const void *src
, GLfloat dst
[][4], GLuint n
)
1419 const GLshort
*s
= ((const GLshort
*) src
);
1421 for (i
= 0; i
< n
; i
++) {
1425 dst
[i
][ACOMP
] = SHORT_TO_FLOAT_TEX( s
[i
] );
1430 unpack_RGB9_E5_FLOAT(const void *src
, GLfloat dst
[][4], GLuint n
)
1432 const GLuint
*s
= (const GLuint
*) src
;
1434 for (i
= 0; i
< n
; i
++) {
1435 rgb9e5_to_float3(s
[i
], dst
[i
]);
1436 dst
[i
][ACOMP
] = 1.0F
;
1441 unpack_R11_G11_B10_FLOAT(const void *src
, GLfloat dst
[][4], GLuint n
)
1443 const GLuint
*s
= (const GLuint
*) src
;
1445 for (i
= 0; i
< n
; i
++) {
1446 r11g11b10f_to_float3(s
[i
], dst
[i
]);
1447 dst
[i
][ACOMP
] = 1.0F
;
1453 * Return the unpacker function for the given format.
1455 static unpack_rgba_func
1456 get_unpack_rgba_function(gl_format format
)
1458 static unpack_rgba_func table
[MESA_FORMAT_COUNT
];
1459 static GLboolean initialized
= GL_FALSE
;
1462 table
[MESA_FORMAT_NONE
] = NULL
;
1464 table
[MESA_FORMAT_RGBA8888
] = unpack_RGBA8888
;
1465 table
[MESA_FORMAT_RGBA8888_REV
] = unpack_RGBA8888_REV
;
1466 table
[MESA_FORMAT_ARGB8888
] = unpack_ARGB8888
;
1467 table
[MESA_FORMAT_ARGB8888_REV
] = unpack_ARGB8888_REV
;
1468 table
[MESA_FORMAT_RGBX8888
] = unpack_RGBX8888
;
1469 table
[MESA_FORMAT_RGBX8888_REV
] = unpack_RGBX8888_REV
;
1470 table
[MESA_FORMAT_XRGB8888
] = unpack_XRGB8888
;
1471 table
[MESA_FORMAT_XRGB8888_REV
] = unpack_XRGB8888_REV
;
1472 table
[MESA_FORMAT_RGB888
] = unpack_RGB888
;
1473 table
[MESA_FORMAT_BGR888
] = unpack_BGR888
;
1474 table
[MESA_FORMAT_RGB565
] = unpack_RGB565
;
1475 table
[MESA_FORMAT_RGB565_REV
] = unpack_RGB565_REV
;
1476 table
[MESA_FORMAT_ARGB4444
] = unpack_ARGB4444
;
1477 table
[MESA_FORMAT_ARGB4444_REV
] = unpack_ARGB4444_REV
;
1478 table
[MESA_FORMAT_RGBA5551
] = unpack_RGBA5551
;
1479 table
[MESA_FORMAT_ARGB1555
] = unpack_ARGB1555
;
1480 table
[MESA_FORMAT_ARGB1555_REV
] = unpack_ARGB1555_REV
;
1481 table
[MESA_FORMAT_AL44
] = unpack_AL44
;
1482 table
[MESA_FORMAT_AL88
] = unpack_AL88
;
1483 table
[MESA_FORMAT_AL88_REV
] = unpack_AL88_REV
;
1484 table
[MESA_FORMAT_AL1616
] = unpack_AL1616
;
1485 table
[MESA_FORMAT_AL1616_REV
] = unpack_AL1616_REV
;
1486 table
[MESA_FORMAT_RGB332
] = unpack_RGB332
;
1487 table
[MESA_FORMAT_A8
] = unpack_A8
;
1488 table
[MESA_FORMAT_A16
] = unpack_A16
;
1489 table
[MESA_FORMAT_L8
] = unpack_L8
;
1490 table
[MESA_FORMAT_L16
] = unpack_L16
;
1491 table
[MESA_FORMAT_I8
] = unpack_I8
;
1492 table
[MESA_FORMAT_I16
] = unpack_I16
;
1493 table
[MESA_FORMAT_YCBCR
] = unpack_YCBCR
;
1494 table
[MESA_FORMAT_YCBCR_REV
] = unpack_YCBCR_REV
;
1495 table
[MESA_FORMAT_R8
] = unpack_R8
;
1496 table
[MESA_FORMAT_GR88
] = unpack_GR88
;
1497 table
[MESA_FORMAT_RG88
] = unpack_RG88
;
1498 table
[MESA_FORMAT_R16
] = unpack_R16
;
1499 table
[MESA_FORMAT_RG1616
] = unpack_RG1616
;
1500 table
[MESA_FORMAT_RG1616_REV
] = unpack_RG1616_REV
;
1501 table
[MESA_FORMAT_ARGB2101010
] = unpack_ARGB2101010
;
1502 table
[MESA_FORMAT_Z24_S8
] = unpack_Z24_S8
;
1503 table
[MESA_FORMAT_S8_Z24
] = unpack_S8_Z24
;
1504 table
[MESA_FORMAT_Z16
] = unpack_Z16
;
1505 table
[MESA_FORMAT_X8_Z24
] = unpack_X8_Z24
;
1506 table
[MESA_FORMAT_Z24_X8
] = unpack_Z24_X8
;
1507 table
[MESA_FORMAT_Z32
] = unpack_Z32
;
1508 table
[MESA_FORMAT_S8
] = unpack_S8
;
1509 table
[MESA_FORMAT_SRGB8
] = unpack_SRGB8
;
1510 table
[MESA_FORMAT_SRGBA8
] = unpack_SRGBA8
;
1511 table
[MESA_FORMAT_SARGB8
] = unpack_SARGB8
;
1512 table
[MESA_FORMAT_SL8
] = unpack_SL8
;
1513 table
[MESA_FORMAT_SLA8
] = unpack_SLA8
;
1514 table
[MESA_FORMAT_SRGB_DXT1
] = unpack_SRGB_DXT1
;
1515 table
[MESA_FORMAT_SRGBA_DXT1
] = unpack_SRGBA_DXT1
;
1516 table
[MESA_FORMAT_SRGBA_DXT3
] = unpack_SRGBA_DXT3
;
1517 table
[MESA_FORMAT_SRGBA_DXT5
] = unpack_SRGBA_DXT5
;
1519 table
[MESA_FORMAT_RGB_FXT1
] = unpack_RGB_FXT1
;
1520 table
[MESA_FORMAT_RGBA_FXT1
] = unpack_RGBA_FXT1
;
1521 table
[MESA_FORMAT_RGB_DXT1
] = unpack_RGB_DXT1
;
1522 table
[MESA_FORMAT_RGBA_DXT1
] = unpack_RGBA_DXT1
;
1523 table
[MESA_FORMAT_RGBA_DXT3
] = unpack_RGBA_DXT3
;
1524 table
[MESA_FORMAT_RGBA_DXT5
] = unpack_RGBA_DXT5
;
1526 table
[MESA_FORMAT_RGBA_FLOAT32
] = unpack_RGBA_FLOAT32
;
1527 table
[MESA_FORMAT_RGBA_FLOAT16
] = unpack_RGBA_FLOAT16
;
1528 table
[MESA_FORMAT_RGB_FLOAT32
] = unpack_RGB_FLOAT32
;
1529 table
[MESA_FORMAT_RGB_FLOAT16
] = unpack_RGB_FLOAT16
;
1530 table
[MESA_FORMAT_ALPHA_FLOAT32
] = unpack_ALPHA_FLOAT32
;
1531 table
[MESA_FORMAT_ALPHA_FLOAT16
] = unpack_ALPHA_FLOAT16
;
1532 table
[MESA_FORMAT_LUMINANCE_FLOAT32
] = unpack_LUMINANCE_FLOAT32
;
1533 table
[MESA_FORMAT_LUMINANCE_FLOAT16
] = unpack_LUMINANCE_FLOAT16
;
1534 table
[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
] = unpack_LUMINANCE_ALPHA_FLOAT32
;
1535 table
[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
] = unpack_LUMINANCE_ALPHA_FLOAT16
;
1536 table
[MESA_FORMAT_INTENSITY_FLOAT32
] = unpack_INTENSITY_FLOAT32
;
1537 table
[MESA_FORMAT_INTENSITY_FLOAT16
] = unpack_INTENSITY_FLOAT16
;
1538 table
[MESA_FORMAT_R_FLOAT32
] = unpack_R_FLOAT32
;
1539 table
[MESA_FORMAT_R_FLOAT16
] = unpack_R_FLOAT16
;
1540 table
[MESA_FORMAT_RG_FLOAT32
] = unpack_RG_FLOAT32
;
1541 table
[MESA_FORMAT_RG_FLOAT16
] = unpack_RG_FLOAT16
;
1543 table
[MESA_FORMAT_RGBA_INT8
] = unpack_RGBA_INT8
;
1544 table
[MESA_FORMAT_RGBA_INT16
] = unpack_RGBA_INT16
;
1545 table
[MESA_FORMAT_RGBA_INT32
] = unpack_RGBA_INT32
;
1546 table
[MESA_FORMAT_RGBA_UINT8
] = unpack_RGBA_UINT8
;
1547 table
[MESA_FORMAT_RGBA_UINT16
] = unpack_RGBA_UINT16
;
1548 table
[MESA_FORMAT_RGBA_UINT32
] = unpack_RGBA_UINT32
;
1550 table
[MESA_FORMAT_DUDV8
] = unpack_DUDV8
;
1551 table
[MESA_FORMAT_SIGNED_R8
] = unpack_SIGNED_R8
;
1552 table
[MESA_FORMAT_SIGNED_RG88_REV
] = unpack_SIGNED_RG88_REV
;
1553 table
[MESA_FORMAT_SIGNED_RGBX8888
] = unpack_SIGNED_RGBX8888
;
1554 table
[MESA_FORMAT_SIGNED_RGBA8888
] = unpack_SIGNED_RGBA8888
;
1555 table
[MESA_FORMAT_SIGNED_RGBA8888_REV
] = unpack_SIGNED_RGBA8888_REV
;
1556 table
[MESA_FORMAT_SIGNED_R16
] = unpack_SIGNED_R16
;
1557 table
[MESA_FORMAT_SIGNED_GR1616
] = unpack_SIGNED_GR1616
;
1558 table
[MESA_FORMAT_SIGNED_RGB_16
] = unpack_SIGNED_RGB_16
;
1559 table
[MESA_FORMAT_SIGNED_RGBA_16
] = unpack_SIGNED_RGBA_16
;
1560 table
[MESA_FORMAT_RGBA_16
] = unpack_RGBA_16
;
1562 table
[MESA_FORMAT_RED_RGTC1
] = unpack_RED_RGTC1
;
1563 table
[MESA_FORMAT_SIGNED_RED_RGTC1
] = unpack_SIGNED_RED_RGTC1
;
1564 table
[MESA_FORMAT_RG_RGTC2
] = unpack_RG_RGTC2
;
1565 table
[MESA_FORMAT_SIGNED_RG_RGTC2
] = unpack_SIGNED_RG_RGTC2
;
1567 table
[MESA_FORMAT_L_LATC1
] = unpack_L_LATC1
;
1568 table
[MESA_FORMAT_SIGNED_L_LATC1
] = unpack_SIGNED_L_LATC1
;
1569 table
[MESA_FORMAT_LA_LATC2
] = unpack_LA_LATC2
;
1570 table
[MESA_FORMAT_SIGNED_LA_LATC2
] = unpack_SIGNED_LA_LATC2
;
1572 table
[MESA_FORMAT_ETC1_RGB8
] = unpack_ETC1_RGB8
;
1574 table
[MESA_FORMAT_SIGNED_A8
] = unpack_SIGNED_A8
;
1575 table
[MESA_FORMAT_SIGNED_L8
] = unpack_SIGNED_L8
;
1576 table
[MESA_FORMAT_SIGNED_AL88
] = unpack_SIGNED_AL88
;
1577 table
[MESA_FORMAT_SIGNED_I8
] = unpack_SIGNED_I8
;
1578 table
[MESA_FORMAT_SIGNED_A16
] = unpack_SIGNED_A16
;
1579 table
[MESA_FORMAT_SIGNED_L16
] = unpack_SIGNED_L16
;
1580 table
[MESA_FORMAT_SIGNED_AL1616
] = unpack_SIGNED_AL1616
;
1581 table
[MESA_FORMAT_SIGNED_I16
] = unpack_SIGNED_I16
;
1583 table
[MESA_FORMAT_RGB9_E5_FLOAT
] = unpack_RGB9_E5_FLOAT
;
1584 table
[MESA_FORMAT_R11_G11_B10_FLOAT
] = unpack_R11_G11_B10_FLOAT
;
1586 table
[MESA_FORMAT_Z32_FLOAT
] = unpack_Z32_FLOAT
;
1587 table
[MESA_FORMAT_Z32_FLOAT_X24S8
] = unpack_Z32_FLOAT_X24S8
;
1589 initialized
= GL_TRUE
;
1592 return table
[format
];
1597 * Unpack rgba colors, returning as GLfloat values.
1600 _mesa_unpack_rgba_row(gl_format format
, GLuint n
,
1601 const void *src
, GLfloat dst
[][4])
1603 unpack_rgba_func unpack
= get_unpack_rgba_function(format
);
1604 unpack(src
, dst
, n
);
1608 /**********************************************************************/
1609 /* Unpack, returning GLubyte colors */
1610 /**********************************************************************/
1614 unpack_ubyte_RGBA8888(const void *src
, GLubyte dst
[][4], GLuint n
)
1616 const GLuint
*s
= ((const GLuint
*) src
);
1618 for (i
= 0; i
< n
; i
++) {
1619 dst
[i
][RCOMP
] = (s
[i
] >> 24);
1620 dst
[i
][GCOMP
] = (s
[i
] >> 16) & 0xff;
1621 dst
[i
][BCOMP
] = (s
[i
] >> 8) & 0xff;
1622 dst
[i
][ACOMP
] = (s
[i
] ) & 0xff;
1627 unpack_ubyte_RGBA8888_REV(const void *src
, GLubyte dst
[][4], GLuint n
)
1629 const GLuint
*s
= ((const GLuint
*) src
);
1631 for (i
= 0; i
< n
; i
++) {
1632 dst
[i
][RCOMP
] = (s
[i
] ) & 0xff;
1633 dst
[i
][GCOMP
] = (s
[i
] >> 8) & 0xff;
1634 dst
[i
][BCOMP
] = (s
[i
] >> 16) & 0xff;
1635 dst
[i
][ACOMP
] = (s
[i
] >> 24);
1640 unpack_ubyte_ARGB8888(const void *src
, GLubyte dst
[][4], GLuint n
)
1642 const GLuint
*s
= ((const GLuint
*) src
);
1644 for (i
= 0; i
< n
; i
++) {
1645 dst
[i
][RCOMP
] = (s
[i
] >> 16) & 0xff;
1646 dst
[i
][GCOMP
] = (s
[i
] >> 8) & 0xff;
1647 dst
[i
][BCOMP
] = (s
[i
] ) & 0xff;
1648 dst
[i
][ACOMP
] = (s
[i
] >> 24);
1653 unpack_ubyte_ARGB8888_REV(const void *src
, GLubyte dst
[][4], GLuint n
)
1655 const GLuint
*s
= ((const GLuint
*) src
);
1657 for (i
= 0; i
< n
; i
++) {
1658 dst
[i
][RCOMP
] = (s
[i
] >> 8) & 0xff;
1659 dst
[i
][GCOMP
] = (s
[i
] >> 16) & 0xff;
1660 dst
[i
][BCOMP
] = (s
[i
] >> 24);
1661 dst
[i
][ACOMP
] = (s
[i
] ) & 0xff;
1666 unpack_ubyte_RGBX8888(const void *src
, GLubyte dst
[][4], GLuint n
)
1668 const GLuint
*s
= ((const GLuint
*) src
);
1670 for (i
= 0; i
< n
; i
++) {
1671 dst
[i
][RCOMP
] = (s
[i
] >> 24);
1672 dst
[i
][GCOMP
] = (s
[i
] >> 16) & 0xff;
1673 dst
[i
][BCOMP
] = (s
[i
] >> 8) & 0xff;
1674 dst
[i
][ACOMP
] = 0xff;
1679 unpack_ubyte_RGBX8888_REV(const void *src
, GLubyte dst
[][4], GLuint n
)
1681 const GLuint
*s
= ((const GLuint
*) src
);
1683 for (i
= 0; i
< n
; i
++) {
1684 dst
[i
][RCOMP
] = (s
[i
] ) & 0xff;
1685 dst
[i
][GCOMP
] = (s
[i
] >> 8) & 0xff;
1686 dst
[i
][BCOMP
] = (s
[i
] >> 16) & 0xff;
1687 dst
[i
][ACOMP
] = 0xff;
1692 unpack_ubyte_XRGB8888(const void *src
, GLubyte dst
[][4], GLuint n
)
1694 const GLuint
*s
= ((const GLuint
*) src
);
1696 for (i
= 0; i
< n
; i
++) {
1697 dst
[i
][RCOMP
] = (s
[i
] >> 16) & 0xff;
1698 dst
[i
][GCOMP
] = (s
[i
] >> 8) & 0xff;
1699 dst
[i
][BCOMP
] = (s
[i
] ) & 0xff;
1700 dst
[i
][ACOMP
] = 0xff;
1705 unpack_ubyte_XRGB8888_REV(const void *src
, GLubyte dst
[][4], GLuint n
)
1707 const GLuint
*s
= ((const GLuint
*) src
);
1709 for (i
= 0; i
< n
; i
++) {
1710 dst
[i
][RCOMP
] = (s
[i
] >> 8) & 0xff;
1711 dst
[i
][GCOMP
] = (s
[i
] >> 16) & 0xff;
1712 dst
[i
][BCOMP
] = (s
[i
] >> 24);
1713 dst
[i
][ACOMP
] = 0xff;
1718 unpack_ubyte_RGB888(const void *src
, GLubyte dst
[][4], GLuint n
)
1720 const GLubyte
*s
= (const GLubyte
*) src
;
1722 for (i
= 0; i
< n
; i
++) {
1723 dst
[i
][RCOMP
] = s
[i
*3+2];
1724 dst
[i
][GCOMP
] = s
[i
*3+1];
1725 dst
[i
][BCOMP
] = s
[i
*3+0];
1726 dst
[i
][ACOMP
] = 0xff;
1731 unpack_ubyte_BGR888(const void *src
, GLubyte dst
[][4], GLuint n
)
1733 const GLubyte
*s
= (const GLubyte
*) src
;
1735 for (i
= 0; i
< n
; i
++) {
1736 dst
[i
][RCOMP
] = s
[i
*3+0];
1737 dst
[i
][GCOMP
] = s
[i
*3+1];
1738 dst
[i
][BCOMP
] = s
[i
*3+2];
1739 dst
[i
][ACOMP
] = 0xff;
1744 unpack_ubyte_RGB565(const void *src
, GLubyte dst
[][4], GLuint n
)
1746 const GLushort
*s
= ((const GLushort
*) src
);
1748 for (i
= 0; i
< n
; i
++) {
1749 dst
[i
][RCOMP
] = EXPAND_5_8((s
[i
] >> 11) & 0x1f);
1750 dst
[i
][GCOMP
] = EXPAND_6_8((s
[i
] >> 5 ) & 0x3f);
1751 dst
[i
][BCOMP
] = EXPAND_5_8( s
[i
] & 0x1f);
1752 dst
[i
][ACOMP
] = 0xff;
1757 unpack_ubyte_RGB565_REV(const void *src
, GLubyte dst
[][4], GLuint n
)
1759 const GLushort
*s
= ((const GLushort
*) src
);
1761 for (i
= 0; i
< n
; i
++) {
1762 GLuint t
= (s
[i
] >> 8) | (s
[i
] << 8); /* byte swap */
1763 dst
[i
][RCOMP
] = EXPAND_5_8((t
>> 11) & 0x1f);
1764 dst
[i
][GCOMP
] = EXPAND_6_8((t
>> 5 ) & 0x3f);
1765 dst
[i
][BCOMP
] = EXPAND_5_8( t
& 0x1f);
1766 dst
[i
][ACOMP
] = 0xff;
1771 unpack_ubyte_ARGB4444(const void *src
, GLubyte dst
[][4], GLuint n
)
1773 const GLushort
*s
= ((const GLushort
*) src
);
1775 for (i
= 0; i
< n
; i
++) {
1776 dst
[i
][RCOMP
] = EXPAND_4_8((s
[i
] >> 8) & 0xf);
1777 dst
[i
][GCOMP
] = EXPAND_4_8((s
[i
] >> 4) & 0xf);
1778 dst
[i
][BCOMP
] = EXPAND_4_8((s
[i
] ) & 0xf);
1779 dst
[i
][ACOMP
] = EXPAND_4_8((s
[i
] >> 12) & 0xf);
1784 unpack_ubyte_ARGB4444_REV(const void *src
, GLubyte dst
[][4], GLuint n
)
1786 const GLushort
*s
= ((const GLushort
*) src
);
1788 for (i
= 0; i
< n
; i
++) {
1789 dst
[i
][RCOMP
] = EXPAND_4_8((s
[i
] ) & 0xf);
1790 dst
[i
][GCOMP
] = EXPAND_4_8((s
[i
] >> 12) & 0xf);
1791 dst
[i
][BCOMP
] = EXPAND_4_8((s
[i
] >> 8) & 0xf);
1792 dst
[i
][ACOMP
] = EXPAND_4_8((s
[i
] >> 4) & 0xf);
1797 unpack_ubyte_RGBA5551(const void *src
, GLubyte dst
[][4], GLuint n
)
1799 const GLushort
*s
= ((const GLushort
*) src
);
1801 for (i
= 0; i
< n
; i
++) {
1802 dst
[i
][RCOMP
] = EXPAND_5_8((s
[i
] >> 11) & 0x1f);
1803 dst
[i
][GCOMP
] = EXPAND_5_8((s
[i
] >> 6) & 0x1f);
1804 dst
[i
][BCOMP
] = EXPAND_5_8((s
[i
] >> 1) & 0x1f);
1805 dst
[i
][ACOMP
] = EXPAND_1_8((s
[i
] ) & 0x01);
1810 unpack_ubyte_ARGB1555(const void *src
, GLubyte dst
[][4], GLuint n
)
1812 const GLushort
*s
= ((const GLushort
*) src
);
1814 for (i
= 0; i
< n
; i
++) {
1815 dst
[i
][RCOMP
] = EXPAND_5_8((s
[i
] >> 10) & 0x1f);
1816 dst
[i
][GCOMP
] = EXPAND_5_8((s
[i
] >> 5) & 0x1f);
1817 dst
[i
][BCOMP
] = EXPAND_5_8((s
[i
] >> 0) & 0x1f);
1818 dst
[i
][ACOMP
] = EXPAND_1_8((s
[i
] >> 15) & 0x01);
1823 unpack_ubyte_ARGB1555_REV(const void *src
, GLubyte dst
[][4], GLuint n
)
1825 const GLushort
*s
= ((const GLushort
*) src
);
1827 for (i
= 0; i
< n
; i
++) {
1828 GLushort tmp
= (s
[i
] << 8) | (s
[i
] >> 8); /* byteswap */
1829 dst
[i
][RCOMP
] = EXPAND_5_8((tmp
>> 10) & 0x1f);
1830 dst
[i
][GCOMP
] = EXPAND_5_8((tmp
>> 5) & 0x1f);
1831 dst
[i
][BCOMP
] = EXPAND_5_8((tmp
>> 0) & 0x1f);
1832 dst
[i
][ACOMP
] = EXPAND_1_8((tmp
>> 15) & 0x01);
1837 unpack_ubyte_AL44(const void *src
, GLubyte dst
[][4], GLuint n
)
1839 const GLubyte
*s
= ((const GLubyte
*) src
);
1841 for (i
= 0; i
< n
; i
++) {
1844 dst
[i
][BCOMP
] = EXPAND_4_8(s
[i
] & 0xf);
1845 dst
[i
][ACOMP
] = EXPAND_4_8(s
[i
] >> 4);
1850 unpack_ubyte_AL88(const void *src
, GLubyte dst
[][4], GLuint n
)
1852 const GLushort
*s
= ((const GLushort
*) src
);
1854 for (i
= 0; i
< n
; i
++) {
1857 dst
[i
][BCOMP
] = EXPAND_4_8(s
[i
] & 0xff);
1858 dst
[i
][ACOMP
] = EXPAND_4_8(s
[i
] >> 8);
1863 unpack_ubyte_AL88_REV(const void *src
, GLubyte dst
[][4], GLuint n
)
1865 const GLushort
*s
= ((const GLushort
*) src
);
1867 for (i
= 0; i
< n
; i
++) {
1870 dst
[i
][BCOMP
] = EXPAND_4_8(s
[i
] >> 8);
1871 dst
[i
][ACOMP
] = EXPAND_4_8(s
[i
] & 0xff);
1876 unpack_ubyte_RGB332(const void *src
, GLubyte dst
[][4], GLuint n
)
1878 const GLubyte
*s
= ((const GLubyte
*) src
);
1880 for (i
= 0; i
< n
; i
++) {
1881 dst
[i
][RCOMP
] = EXPAND_3_8((s
[i
] >> 5) & 0x7);
1882 dst
[i
][GCOMP
] = EXPAND_3_8((s
[i
] >> 2) & 0x7);
1883 dst
[i
][BCOMP
] = EXPAND_2_8((s
[i
] ) & 0x3);
1884 dst
[i
][ACOMP
] = 0xff;
1889 unpack_ubyte_A8(const void *src
, GLubyte dst
[][4], GLuint n
)
1891 const GLubyte
*s
= ((const GLubyte
*) src
);
1893 for (i
= 0; i
< n
; i
++) {
1897 dst
[i
][ACOMP
] = s
[i
];
1902 unpack_ubyte_L8(const void *src
, GLubyte dst
[][4], GLuint n
)
1904 const GLubyte
*s
= ((const GLubyte
*) src
);
1906 for (i
= 0; i
< n
; i
++) {
1909 dst
[i
][BCOMP
] = s
[i
];
1910 dst
[i
][ACOMP
] = 0xff;
1916 unpack_ubyte_I8(const void *src
, GLubyte dst
[][4], GLuint n
)
1918 const GLubyte
*s
= ((const GLubyte
*) src
);
1920 for (i
= 0; i
< n
; i
++) {
1924 dst
[i
][ACOMP
] = s
[i
];
1929 unpack_ubyte_R8(const void *src
, GLubyte dst
[][4], GLuint n
)
1931 const GLubyte
*s
= ((const GLubyte
*) src
);
1933 for (i
= 0; i
< n
; i
++) {
1942 unpack_ubyte_GR88(const void *src
, GLubyte dst
[][4], GLuint n
)
1944 const GLushort
*s
= ((const GLushort
*) src
);
1946 for (i
= 0; i
< n
; i
++) {
1947 dst
[i
][RCOMP
] = s
[i
] & 0xff;
1948 dst
[i
][GCOMP
] = s
[i
] >> 8;
1950 dst
[i
][ACOMP
] = 0xff;
1955 unpack_ubyte_RG88(const void *src
, GLubyte dst
[][4], GLuint n
)
1957 const GLushort
*s
= ((const GLushort
*) src
);
1959 for (i
= 0; i
< n
; i
++) {
1960 dst
[i
][RCOMP
] = s
[i
] >> 8;
1961 dst
[i
][GCOMP
] = s
[i
] & 0xff;
1963 dst
[i
][ACOMP
] = 0xff;
1969 * Unpack rgba colors, returning as GLubyte values. This should usually
1970 * only be used for unpacking formats that use 8 bits or less per channel.
1973 _mesa_unpack_ubyte_rgba_row(gl_format format
, GLuint n
,
1974 const void *src
, GLubyte dst
[][4])
1977 case MESA_FORMAT_RGBA8888
:
1978 unpack_ubyte_RGBA8888(src
, dst
, n
);
1980 case MESA_FORMAT_RGBA8888_REV
:
1981 unpack_ubyte_RGBA8888_REV(src
, dst
, n
);
1983 case MESA_FORMAT_ARGB8888
:
1984 unpack_ubyte_ARGB8888(src
, dst
, n
);
1986 case MESA_FORMAT_ARGB8888_REV
:
1987 unpack_ubyte_ARGB8888_REV(src
, dst
, n
);
1989 case MESA_FORMAT_RGBX8888
:
1990 unpack_ubyte_RGBX8888(src
, dst
, n
);
1992 case MESA_FORMAT_RGBX8888_REV
:
1993 unpack_ubyte_RGBX8888_REV(src
, dst
, n
);
1995 case MESA_FORMAT_XRGB8888
:
1996 unpack_ubyte_XRGB8888(src
, dst
, n
);
1998 case MESA_FORMAT_XRGB8888_REV
:
1999 unpack_ubyte_XRGB8888_REV(src
, dst
, n
);
2001 case MESA_FORMAT_RGB888
:
2002 unpack_ubyte_RGB888(src
, dst
, n
);
2004 case MESA_FORMAT_BGR888
:
2005 unpack_ubyte_BGR888(src
, dst
, n
);
2007 case MESA_FORMAT_RGB565
:
2008 unpack_ubyte_RGB565(src
, dst
, n
);
2010 case MESA_FORMAT_RGB565_REV
:
2011 unpack_ubyte_RGB565_REV(src
, dst
, n
);
2013 case MESA_FORMAT_ARGB4444
:
2014 unpack_ubyte_ARGB4444(src
, dst
, n
);
2016 case MESA_FORMAT_ARGB4444_REV
:
2017 unpack_ubyte_ARGB4444_REV(src
, dst
, n
);
2019 case MESA_FORMAT_RGBA5551
:
2020 unpack_ubyte_RGBA5551(src
, dst
, n
);
2022 case MESA_FORMAT_ARGB1555
:
2023 unpack_ubyte_ARGB1555(src
, dst
, n
);
2025 case MESA_FORMAT_ARGB1555_REV
:
2026 unpack_ubyte_ARGB1555_REV(src
, dst
, n
);
2028 case MESA_FORMAT_AL44
:
2029 unpack_ubyte_AL44(src
, dst
, n
);
2031 case MESA_FORMAT_AL88
:
2032 unpack_ubyte_AL88(src
, dst
, n
);
2034 case MESA_FORMAT_AL88_REV
:
2035 unpack_ubyte_AL88_REV(src
, dst
, n
);
2037 case MESA_FORMAT_RGB332
:
2038 unpack_ubyte_RGB332(src
, dst
, n
);
2040 case MESA_FORMAT_A8
:
2041 unpack_ubyte_A8(src
, dst
, n
);
2043 case MESA_FORMAT_L8
:
2044 unpack_ubyte_L8(src
, dst
, n
);
2046 case MESA_FORMAT_I8
:
2047 unpack_ubyte_I8(src
, dst
, n
);
2049 case MESA_FORMAT_R8
:
2050 unpack_ubyte_R8(src
, dst
, n
);
2052 case MESA_FORMAT_GR88
:
2053 unpack_ubyte_GR88(src
, dst
, n
);
2055 case MESA_FORMAT_RG88
:
2056 unpack_ubyte_RG88(src
, dst
, n
);
2059 /* get float values, convert to ubyte */
2061 GLfloat
*tmp
= (GLfloat
*) malloc(n
* 4 * sizeof(GLfloat
));
2064 _mesa_unpack_rgba_row(format
, n
, src
, (GLfloat (*)[4]) tmp
);
2065 for (i
= 0; i
< n
; i
++) {
2066 UNCLAMPED_FLOAT_TO_UBYTE(dst
[i
][0], tmp
[i
*4+0]);
2067 UNCLAMPED_FLOAT_TO_UBYTE(dst
[i
][1], tmp
[i
*4+1]);
2068 UNCLAMPED_FLOAT_TO_UBYTE(dst
[i
][2], tmp
[i
*4+2]);
2069 UNCLAMPED_FLOAT_TO_UBYTE(dst
[i
][3], tmp
[i
*4+3]);
2079 /**********************************************************************/
2080 /* Unpack, returning GLuint colors */
2081 /**********************************************************************/
2084 unpack_int_rgba_RGBA_UINT32(const GLuint
*src
, GLuint dst
[][4], GLuint n
)
2086 memcpy(dst
, src
, n
* 4 * sizeof(GLuint
));
2090 unpack_int_rgba_RGBA_UINT16(const GLushort
*src
, GLuint dst
[][4], GLuint n
)
2094 for (i
= 0; i
< n
; i
++) {
2095 dst
[i
][0] = src
[i
* 4 + 0];
2096 dst
[i
][1] = src
[i
* 4 + 1];
2097 dst
[i
][2] = src
[i
* 4 + 2];
2098 dst
[i
][3] = src
[i
* 4 + 3];
2103 unpack_int_rgba_RGBA_INT16(const GLshort
*src
, GLuint dst
[][4], GLuint n
)
2107 for (i
= 0; i
< n
; i
++) {
2108 dst
[i
][0] = src
[i
* 4 + 0];
2109 dst
[i
][1] = src
[i
* 4 + 1];
2110 dst
[i
][2] = src
[i
* 4 + 2];
2111 dst
[i
][3] = src
[i
* 4 + 3];
2116 unpack_int_rgba_RGBA_UINT8(const GLubyte
*src
, GLuint dst
[][4], GLuint n
)
2120 for (i
= 0; i
< n
; i
++) {
2121 dst
[i
][0] = src
[i
* 4 + 0];
2122 dst
[i
][1] = src
[i
* 4 + 1];
2123 dst
[i
][2] = src
[i
* 4 + 2];
2124 dst
[i
][3] = src
[i
* 4 + 3];
2129 unpack_int_rgba_RGBA_INT8(const GLbyte
*src
, GLuint dst
[][4], GLuint n
)
2133 for (i
= 0; i
< n
; i
++) {
2134 dst
[i
][0] = src
[i
* 4 + 0];
2135 dst
[i
][1] = src
[i
* 4 + 1];
2136 dst
[i
][2] = src
[i
* 4 + 2];
2137 dst
[i
][3] = src
[i
* 4 + 3];
2142 unpack_int_rgba_RGB_UINT32(const GLuint
*src
, GLuint dst
[][4], GLuint n
)
2146 for (i
= 0; i
< n
; i
++) {
2147 dst
[i
][0] = src
[i
* 3 + 0];
2148 dst
[i
][1] = src
[i
* 3 + 1];
2149 dst
[i
][2] = src
[i
* 3 + 2];
2155 unpack_int_rgba_RGB_UINT16(const GLushort
*src
, GLuint dst
[][4], GLuint n
)
2159 for (i
= 0; i
< n
; i
++) {
2160 dst
[i
][0] = src
[i
* 3 + 0];
2161 dst
[i
][1] = src
[i
* 3 + 1];
2162 dst
[i
][2] = src
[i
* 3 + 2];
2168 unpack_int_rgba_RGB_INT16(const GLshort
*src
, GLuint dst
[][4], GLuint n
)
2172 for (i
= 0; i
< n
; i
++) {
2173 dst
[i
][0] = src
[i
* 3 + 0];
2174 dst
[i
][1] = src
[i
* 3 + 1];
2175 dst
[i
][2] = src
[i
* 3 + 2];
2181 unpack_int_rgba_RGB_UINT8(const GLubyte
*src
, GLuint dst
[][4], GLuint n
)
2185 for (i
= 0; i
< n
; i
++) {
2186 dst
[i
][0] = src
[i
* 3 + 0];
2187 dst
[i
][1] = src
[i
* 3 + 1];
2188 dst
[i
][2] = src
[i
* 3 + 2];
2194 unpack_int_rgba_RGB_INT8(const GLbyte
*src
, GLuint dst
[][4], GLuint n
)
2198 for (i
= 0; i
< n
; i
++) {
2199 dst
[i
][0] = src
[i
* 3 + 0];
2200 dst
[i
][1] = src
[i
* 3 + 1];
2201 dst
[i
][2] = src
[i
* 3 + 2];
2207 unpack_int_rgba_RG_UINT32(const GLuint
*src
, GLuint dst
[][4], GLuint n
)
2211 for (i
= 0; i
< n
; i
++) {
2212 dst
[i
][0] = src
[i
* 2 + 0];
2213 dst
[i
][1] = src
[i
* 2 + 1];
2220 unpack_int_rgba_RG_UINT16(const GLushort
*src
, GLuint dst
[][4], GLuint n
)
2224 for (i
= 0; i
< n
; i
++) {
2225 dst
[i
][0] = src
[i
* 2 + 0];
2226 dst
[i
][1] = src
[i
* 2 + 1];
2233 unpack_int_rgba_RG_INT16(const GLshort
*src
, GLuint dst
[][4], GLuint n
)
2237 for (i
= 0; i
< n
; i
++) {
2238 dst
[i
][0] = src
[i
* 2 + 0];
2239 dst
[i
][1] = src
[i
* 2 + 1];
2246 unpack_int_rgba_RG_UINT8(const GLubyte
*src
, GLuint dst
[][4], GLuint n
)
2250 for (i
= 0; i
< n
; i
++) {
2251 dst
[i
][0] = src
[i
* 2 + 0];
2252 dst
[i
][1] = src
[i
* 2 + 1];
2259 unpack_int_rgba_RG_INT8(const GLbyte
*src
, GLuint dst
[][4], GLuint n
)
2263 for (i
= 0; i
< n
; i
++) {
2264 dst
[i
][0] = src
[i
* 2 + 0];
2265 dst
[i
][1] = src
[i
* 2 + 1];
2272 unpack_int_rgba_R_UINT32(const GLuint
*src
, GLuint dst
[][4], GLuint n
)
2276 for (i
= 0; i
< n
; i
++) {
2285 unpack_int_rgba_R_UINT16(const GLushort
*src
, GLuint dst
[][4], GLuint n
)
2289 for (i
= 0; i
< n
; i
++) {
2298 unpack_int_rgba_R_INT16(const GLshort
*src
, GLuint dst
[][4], GLuint n
)
2302 for (i
= 0; i
< n
; i
++) {
2311 unpack_int_rgba_R_UINT8(const GLubyte
*src
, GLuint dst
[][4], GLuint n
)
2315 for (i
= 0; i
< n
; i
++) {
2324 unpack_int_rgba_R_INT8(const GLbyte
*src
, GLuint dst
[][4], GLuint n
)
2328 for (i
= 0; i
< n
; i
++) {
2337 unpack_int_rgba_ALPHA_UINT32(const GLuint
*src
, GLuint dst
[][4], GLuint n
)
2341 for (i
= 0; i
< n
; i
++) {
2342 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = 0;
2348 unpack_int_rgba_ALPHA_UINT16(const GLushort
*src
, GLuint dst
[][4], GLuint n
)
2352 for (i
= 0; i
< n
; i
++) {
2353 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = 0;
2359 unpack_int_rgba_ALPHA_INT16(const GLshort
*src
, GLuint dst
[][4], GLuint n
)
2363 for (i
= 0; i
< n
; i
++) {
2364 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = 0;
2370 unpack_int_rgba_ALPHA_UINT8(const GLubyte
*src
, GLuint dst
[][4], GLuint n
)
2374 for (i
= 0; i
< n
; i
++) {
2375 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = 0;
2381 unpack_int_rgba_ALPHA_INT8(const GLbyte
*src
, GLuint dst
[][4], GLuint n
)
2385 for (i
= 0; i
< n
; i
++) {
2386 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = 0;
2392 unpack_int_rgba_LUMINANCE_UINT32(const GLuint
*src
, GLuint dst
[][4], GLuint n
)
2396 for (i
= 0; i
< n
; i
++) {
2397 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = src
[i
];
2403 unpack_int_rgba_LUMINANCE_UINT16(const GLushort
*src
, GLuint dst
[][4], GLuint n
)
2407 for (i
= 0; i
< n
; i
++) {
2408 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = src
[i
];
2414 unpack_int_rgba_LUMINANCE_INT16(const GLshort
*src
, GLuint dst
[][4], GLuint n
)
2418 for (i
= 0; i
< n
; i
++) {
2419 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = src
[i
];
2425 unpack_int_rgba_LUMINANCE_UINT8(const GLubyte
*src
, GLuint dst
[][4], GLuint n
)
2429 for (i
= 0; i
< n
; i
++) {
2430 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = src
[i
];
2436 unpack_int_rgba_LUMINANCE_INT8(const GLbyte
*src
, GLuint dst
[][4], GLuint n
)
2440 for (i
= 0; i
< n
; i
++) {
2441 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = src
[i
];
2448 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(const GLuint
*src
, GLuint dst
[][4], GLuint n
)
2452 for (i
= 0; i
< n
; i
++) {
2453 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = src
[i
* 2 + 0];
2454 dst
[i
][3] = src
[i
* 2 + 1];
2459 unpack_int_rgba_LUMINANCE_ALPHA_UINT16(const GLushort
*src
, GLuint dst
[][4], GLuint n
)
2463 for (i
= 0; i
< n
; i
++) {
2464 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = src
[i
* 2 + 0];
2465 dst
[i
][3] = src
[i
* 2 + 1];
2470 unpack_int_rgba_LUMINANCE_ALPHA_INT16(const GLshort
*src
, GLuint dst
[][4], GLuint n
)
2474 for (i
= 0; i
< n
; i
++) {
2475 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = src
[i
* 2 + 0];
2476 dst
[i
][3] = src
[i
* 2 + 1];
2481 unpack_int_rgba_LUMINANCE_ALPHA_UINT8(const GLubyte
*src
, GLuint dst
[][4], GLuint n
)
2485 for (i
= 0; i
< n
; i
++) {
2486 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = src
[i
* 2 + 0];
2487 dst
[i
][3] = src
[i
* 2 + 1];
2492 unpack_int_rgba_LUMINANCE_ALPHA_INT8(const GLbyte
*src
, GLuint dst
[][4], GLuint n
)
2496 for (i
= 0; i
< n
; i
++) {
2497 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = src
[i
* 2 + 0];
2498 dst
[i
][3] = src
[i
* 2 + 1];
2503 unpack_int_rgba_INTENSITY_UINT32(const GLuint
*src
, GLuint dst
[][4], GLuint n
)
2507 for (i
= 0; i
< n
; i
++) {
2508 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = dst
[i
][3] = src
[i
];
2513 unpack_int_rgba_INTENSITY_UINT16(const GLushort
*src
, GLuint dst
[][4], GLuint n
)
2517 for (i
= 0; i
< n
; i
++) {
2518 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = dst
[i
][3] = src
[i
];
2523 unpack_int_rgba_INTENSITY_INT16(const GLshort
*src
, GLuint dst
[][4], GLuint n
)
2527 for (i
= 0; i
< n
; i
++) {
2528 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = dst
[i
][3] = src
[i
];
2533 unpack_int_rgba_INTENSITY_UINT8(const GLubyte
*src
, GLuint dst
[][4], GLuint n
)
2537 for (i
= 0; i
< n
; i
++) {
2538 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = dst
[i
][3] = src
[i
];
2543 unpack_int_rgba_INTENSITY_INT8(const GLbyte
*src
, GLuint dst
[][4], GLuint n
)
2547 for (i
= 0; i
< n
; i
++) {
2548 dst
[i
][0] = dst
[i
][1] = dst
[i
][2] = dst
[i
][3] = src
[i
];
2553 unpack_int_rgba_ARGB2101010_UINT(const GLuint
*src
, GLuint dst
[][4], GLuint n
)
2557 for (i
= 0; i
< n
; i
++) {
2558 GLuint tmp
= src
[i
];
2559 dst
[i
][0] = (tmp
>> 20) & 0x3ff;
2560 dst
[i
][1] = (tmp
>> 10) & 0x3ff;
2561 dst
[i
][2] = (tmp
>> 0) & 0x3ff;
2562 dst
[i
][3] = (tmp
>> 30) & 0x3;
2567 _mesa_unpack_uint_rgba_row(gl_format format
, GLuint n
,
2568 const void *src
, GLuint dst
[][4])
2571 /* Since there won't be any sign extension happening, there's no need to
2572 * make separate paths for 32-bit-to-32-bit integer unpack.
2574 case MESA_FORMAT_RGBA_UINT32
:
2575 case MESA_FORMAT_RGBA_INT32
:
2576 unpack_int_rgba_RGBA_UINT32(src
, dst
, n
);
2579 case MESA_FORMAT_RGBA_UINT16
:
2580 unpack_int_rgba_RGBA_UINT16(src
, dst
, n
);
2582 case MESA_FORMAT_RGBA_INT16
:
2583 unpack_int_rgba_RGBA_INT16(src
, dst
, n
);
2586 case MESA_FORMAT_RGBA_UINT8
:
2587 unpack_int_rgba_RGBA_UINT8(src
, dst
, n
);
2589 case MESA_FORMAT_RGBA_INT8
:
2590 unpack_int_rgba_RGBA_INT8(src
, dst
, n
);
2593 case MESA_FORMAT_RGB_UINT32
:
2594 case MESA_FORMAT_RGB_INT32
:
2595 unpack_int_rgba_RGB_UINT32(src
, dst
, n
);
2598 case MESA_FORMAT_RGB_UINT16
:
2599 unpack_int_rgba_RGB_UINT16(src
, dst
, n
);
2601 case MESA_FORMAT_RGB_INT16
:
2602 unpack_int_rgba_RGB_INT16(src
, dst
, n
);
2605 case MESA_FORMAT_RGB_UINT8
:
2606 unpack_int_rgba_RGB_UINT8(src
, dst
, n
);
2608 case MESA_FORMAT_RGB_INT8
:
2609 unpack_int_rgba_RGB_INT8(src
, dst
, n
);
2612 case MESA_FORMAT_RG_UINT32
:
2613 case MESA_FORMAT_RG_INT32
:
2614 unpack_int_rgba_RG_UINT32(src
, dst
, n
);
2617 case MESA_FORMAT_RG_UINT16
:
2618 unpack_int_rgba_RG_UINT16(src
, dst
, n
);
2620 case MESA_FORMAT_RG_INT16
:
2621 unpack_int_rgba_RG_INT16(src
, dst
, n
);
2624 case MESA_FORMAT_RG_UINT8
:
2625 unpack_int_rgba_RG_UINT8(src
, dst
, n
);
2627 case MESA_FORMAT_RG_INT8
:
2628 unpack_int_rgba_RG_INT8(src
, dst
, n
);
2631 case MESA_FORMAT_R_UINT32
:
2632 case MESA_FORMAT_R_INT32
:
2633 unpack_int_rgba_R_UINT32(src
, dst
, n
);
2636 case MESA_FORMAT_R_UINT16
:
2637 unpack_int_rgba_R_UINT16(src
, dst
, n
);
2639 case MESA_FORMAT_R_INT16
:
2640 unpack_int_rgba_R_INT16(src
, dst
, n
);
2643 case MESA_FORMAT_R_UINT8
:
2644 unpack_int_rgba_R_UINT8(src
, dst
, n
);
2646 case MESA_FORMAT_R_INT8
:
2647 unpack_int_rgba_R_INT8(src
, dst
, n
);
2650 case MESA_FORMAT_ALPHA_UINT32
:
2651 case MESA_FORMAT_ALPHA_INT32
:
2652 unpack_int_rgba_ALPHA_UINT32(src
, dst
, n
);
2655 case MESA_FORMAT_ALPHA_UINT16
:
2656 unpack_int_rgba_ALPHA_UINT16(src
, dst
, n
);
2658 case MESA_FORMAT_ALPHA_INT16
:
2659 unpack_int_rgba_ALPHA_INT16(src
, dst
, n
);
2662 case MESA_FORMAT_ALPHA_UINT8
:
2663 unpack_int_rgba_ALPHA_UINT8(src
, dst
, n
);
2665 case MESA_FORMAT_ALPHA_INT8
:
2666 unpack_int_rgba_ALPHA_INT8(src
, dst
, n
);
2669 case MESA_FORMAT_LUMINANCE_UINT32
:
2670 case MESA_FORMAT_LUMINANCE_INT32
:
2671 unpack_int_rgba_LUMINANCE_UINT32(src
, dst
, n
);
2673 case MESA_FORMAT_LUMINANCE_UINT16
:
2674 unpack_int_rgba_LUMINANCE_UINT16(src
, dst
, n
);
2676 case MESA_FORMAT_LUMINANCE_INT16
:
2677 unpack_int_rgba_LUMINANCE_INT16(src
, dst
, n
);
2680 case MESA_FORMAT_LUMINANCE_UINT8
:
2681 unpack_int_rgba_LUMINANCE_UINT8(src
, dst
, n
);
2683 case MESA_FORMAT_LUMINANCE_INT8
:
2684 unpack_int_rgba_LUMINANCE_INT8(src
, dst
, n
);
2687 case MESA_FORMAT_LUMINANCE_ALPHA_UINT32
:
2688 case MESA_FORMAT_LUMINANCE_ALPHA_INT32
:
2689 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(src
, dst
, n
);
2692 case MESA_FORMAT_LUMINANCE_ALPHA_UINT16
:
2693 unpack_int_rgba_LUMINANCE_ALPHA_UINT16(src
, dst
, n
);
2695 case MESA_FORMAT_LUMINANCE_ALPHA_INT16
:
2696 unpack_int_rgba_LUMINANCE_ALPHA_INT16(src
, dst
, n
);
2699 case MESA_FORMAT_LUMINANCE_ALPHA_UINT8
:
2700 unpack_int_rgba_LUMINANCE_ALPHA_UINT8(src
, dst
, n
);
2702 case MESA_FORMAT_LUMINANCE_ALPHA_INT8
:
2703 unpack_int_rgba_LUMINANCE_ALPHA_INT8(src
, dst
, n
);
2706 case MESA_FORMAT_INTENSITY_UINT32
:
2707 case MESA_FORMAT_INTENSITY_INT32
:
2708 unpack_int_rgba_INTENSITY_UINT32(src
, dst
, n
);
2711 case MESA_FORMAT_INTENSITY_UINT16
:
2712 unpack_int_rgba_INTENSITY_UINT16(src
, dst
, n
);
2714 case MESA_FORMAT_INTENSITY_INT16
:
2715 unpack_int_rgba_INTENSITY_INT16(src
, dst
, n
);
2718 case MESA_FORMAT_INTENSITY_UINT8
:
2719 unpack_int_rgba_INTENSITY_UINT8(src
, dst
, n
);
2721 case MESA_FORMAT_INTENSITY_INT8
:
2722 unpack_int_rgba_INTENSITY_INT8(src
, dst
, n
);
2725 case MESA_FORMAT_ARGB2101010_UINT
:
2726 unpack_int_rgba_ARGB2101010_UINT(src
, dst
, n
);
2729 _mesa_problem(NULL
, "%s: bad format %s", __FUNCTION__
,
2730 _mesa_get_format_name(format
));
2736 * Unpack a 2D rect of pixels returning float RGBA colors.
2737 * \param format the source image format
2738 * \param src start address of the source image
2739 * \param srcRowStride source image row stride in bytes
2740 * \param dst start address of the dest image
2741 * \param dstRowStride dest image row stride in bytes
2742 * \param x source image start X pos
2743 * \param y source image start Y pos
2744 * \param width width of rect region to convert
2745 * \param height height of rect region to convert
2748 _mesa_unpack_rgba_block(gl_format format
,
2749 const void *src
, GLint srcRowStride
,
2750 GLfloat dst
[][4], GLint dstRowStride
,
2751 GLuint x
, GLuint y
, GLuint width
, GLuint height
)
2753 unpack_rgba_func unpack
= get_unpack_rgba_function(format
);
2754 const GLuint srcPixStride
= _mesa_get_format_bytes(format
);
2755 const GLuint dstPixStride
= 4 * sizeof(GLfloat
);
2756 const GLubyte
*srcRow
;
2760 /* XXX needs to be fixed for compressed formats */
2762 srcRow
= ((const GLubyte
*) src
) + srcRowStride
* y
+ srcPixStride
* x
;
2763 dstRow
= ((GLubyte
*) dst
) + dstRowStride
* y
+ dstPixStride
* x
;
2765 for (i
= 0; i
< height
; i
++) {
2766 unpack(srcRow
, (GLfloat (*)[4]) dstRow
, width
);
2768 dstRow
+= dstRowStride
;
2769 srcRow
+= srcRowStride
;
2776 typedef void (*unpack_float_z_func
)(GLuint n
, const void *src
, GLfloat
*dst
);
2779 unpack_float_z_Z24_X8(GLuint n
, const void *src
, GLfloat
*dst
)
2781 /* only return Z, not stencil data */
2782 const GLuint
*s
= ((const GLuint
*) src
);
2783 const GLdouble scale
= 1.0 / (GLdouble
) 0xffffff;
2785 for (i
= 0; i
< n
; i
++) {
2786 dst
[i
] = (s
[i
] >> 8) * scale
;
2787 ASSERT(dst
[i
] >= 0.0F
);
2788 ASSERT(dst
[i
] <= 1.0F
);
2793 unpack_float_z_X8_Z24(GLuint n
, const void *src
, GLfloat
*dst
)
2795 /* only return Z, not stencil data */
2796 const GLuint
*s
= ((const GLuint
*) src
);
2797 const GLdouble scale
= 1.0 / (GLdouble
) 0xffffff;
2799 for (i
= 0; i
< n
; i
++) {
2800 dst
[i
] = (s
[i
] & 0x00ffffff) * scale
;
2801 ASSERT(dst
[i
] >= 0.0F
);
2802 ASSERT(dst
[i
] <= 1.0F
);
2807 unpack_float_z_Z16(GLuint n
, const void *src
, GLfloat
*dst
)
2809 const GLushort
*s
= ((const GLushort
*) src
);
2811 for (i
= 0; i
< n
; i
++) {
2812 dst
[i
] = s
[i
] * (1.0F
/ 65535.0F
);
2817 unpack_float_z_Z32(GLuint n
, const void *src
, GLfloat
*dst
)
2819 const GLuint
*s
= ((const GLuint
*) src
);
2821 for (i
= 0; i
< n
; i
++) {
2822 dst
[i
] = s
[i
] * (1.0F
/ 0xffffffff);
2827 unpack_float_z_Z32F(GLuint n
, const void *src
, GLfloat
*dst
)
2829 memcpy(dst
, src
, n
* sizeof(float));
2833 unpack_float_z_Z32X24S8(GLuint n
, const void *src
, GLfloat
*dst
)
2835 const struct z32f_x24s8
*s
= (const struct z32f_x24s8
*) src
;
2837 for (i
= 0; i
< n
; i
++) {
2846 * The returned values will always be in the range [0.0, 1.0].
2849 _mesa_unpack_float_z_row(gl_format format
, GLuint n
,
2850 const void *src
, GLfloat
*dst
)
2852 unpack_float_z_func unpack
;
2855 case MESA_FORMAT_Z24_S8
:
2856 case MESA_FORMAT_Z24_X8
:
2857 unpack
= unpack_float_z_Z24_X8
;
2859 case MESA_FORMAT_S8_Z24
:
2860 case MESA_FORMAT_X8_Z24
:
2861 unpack
= unpack_float_z_X8_Z24
;
2863 case MESA_FORMAT_Z16
:
2864 unpack
= unpack_float_z_Z16
;
2866 case MESA_FORMAT_Z32
:
2867 unpack
= unpack_float_z_Z32
;
2869 case MESA_FORMAT_Z32_FLOAT
:
2870 unpack
= unpack_float_z_Z32F
;
2872 case MESA_FORMAT_Z32_FLOAT_X24S8
:
2873 unpack
= unpack_float_z_Z32X24S8
;
2876 _mesa_problem(NULL
, "bad format %s in _mesa_unpack_float_z_row",
2877 _mesa_get_format_name(format
));
2881 unpack(n
, src
, dst
);
2886 typedef void (*unpack_uint_z_func
)(const void *src
, GLuint
*dst
, GLuint n
);
2889 unpack_uint_z_Z24_X8(const void *src
, GLuint
*dst
, GLuint n
)
2891 /* only return Z, not stencil data */
2892 const GLuint
*s
= ((const GLuint
*) src
);
2894 for (i
= 0; i
< n
; i
++) {
2895 dst
[i
] = (s
[i
] & 0xffffff00) | (s
[i
] >> 24);
2900 unpack_uint_z_X8_Z24(const void *src
, GLuint
*dst
, GLuint n
)
2902 /* only return Z, not stencil data */
2903 const GLuint
*s
= ((const GLuint
*) src
);
2905 for (i
= 0; i
< n
; i
++) {
2906 dst
[i
] = (s
[i
] << 8) | ((s
[i
] >> 16) & 0xff);
2911 unpack_uint_z_Z16(const void *src
, GLuint
*dst
, GLuint n
)
2913 const GLushort
*s
= ((const GLushort
*)src
);
2915 for (i
= 0; i
< n
; i
++) {
2916 dst
[i
] = (s
[i
] << 16) | s
[i
];
2921 unpack_uint_z_Z32(const void *src
, GLuint
*dst
, GLuint n
)
2923 memcpy(dst
, src
, n
* sizeof(GLuint
));
2927 unpack_uint_z_Z32_FLOAT(const void *src
, GLuint
*dst
, GLuint n
)
2929 const float *s
= (const float *)src
;
2931 for (i
= 0; i
< n
; i
++) {
2932 dst
[i
] = FLOAT_TO_UINT(IROUND(CLAMP((s
[i
]), 0.0F
, 1.0F
)));
2937 unpack_uint_z_Z32_FLOAT_X24S8(const void *src
, GLuint
*dst
, GLuint n
)
2939 const struct z32f_x24s8
*s
= (const struct z32f_x24s8
*) src
;
2942 for (i
= 0; i
< n
; i
++) {
2943 dst
[i
] = FLOAT_TO_UINT(IROUND(CLAMP((s
[i
].z
), 0.0F
, 1.0F
)));
2950 * The returned values will always be in the range [0, 0xffffffff].
2953 _mesa_unpack_uint_z_row(gl_format format
, GLuint n
,
2954 const void *src
, GLuint
*dst
)
2956 unpack_uint_z_func unpack
;
2957 const GLubyte
*srcPtr
= (GLubyte
*) src
;
2960 case MESA_FORMAT_Z24_S8
:
2961 case MESA_FORMAT_Z24_X8
:
2962 unpack
= unpack_uint_z_Z24_X8
;
2964 case MESA_FORMAT_S8_Z24
:
2965 case MESA_FORMAT_X8_Z24
:
2966 unpack
= unpack_uint_z_X8_Z24
;
2968 case MESA_FORMAT_Z16
:
2969 unpack
= unpack_uint_z_Z16
;
2971 case MESA_FORMAT_Z32
:
2972 unpack
= unpack_uint_z_Z32
;
2974 case MESA_FORMAT_Z32_FLOAT
:
2975 unpack
= unpack_uint_z_Z32_FLOAT
;
2977 case MESA_FORMAT_Z32_FLOAT_X24S8
:
2978 unpack
= unpack_uint_z_Z32_FLOAT_X24S8
;
2981 _mesa_problem(NULL
, "bad format %s in _mesa_unpack_uint_z_row",
2982 _mesa_get_format_name(format
));
2986 unpack(srcPtr
, dst
, n
);
2991 unpack_ubyte_s_S8(const void *src
, GLubyte
*dst
, GLuint n
)
2993 memcpy(dst
, src
, n
);
2997 unpack_ubyte_s_Z24_S8(const void *src
, GLubyte
*dst
, GLuint n
)
3000 const GLuint
*src32
= src
;
3002 for (i
= 0; i
< n
; i
++)
3003 dst
[i
] = src32
[i
] & 0xff;
3007 unpack_ubyte_s_S8_Z24(const void *src
, GLubyte
*dst
, GLuint n
)
3010 const GLuint
*src32
= src
;
3012 for (i
= 0; i
< n
; i
++)
3013 dst
[i
] = src32
[i
] >> 24;
3017 unpack_ubyte_s_Z32_FLOAT_X24S8(const void *src
, GLubyte
*dst
, GLuint n
)
3020 const struct z32f_x24s8
*s
= (const struct z32f_x24s8
*) src
;
3022 for (i
= 0; i
< n
; i
++)
3023 dst
[i
] = s
[i
].x24s8
& 0xff;
3027 _mesa_unpack_ubyte_stencil_row(gl_format format
, GLuint n
,
3028 const void *src
, GLubyte
*dst
)
3031 case MESA_FORMAT_S8
:
3032 unpack_ubyte_s_S8(src
, dst
, n
);
3034 case MESA_FORMAT_Z24_S8
:
3035 unpack_ubyte_s_Z24_S8(src
, dst
, n
);
3037 case MESA_FORMAT_S8_Z24
:
3038 unpack_ubyte_s_S8_Z24(src
, dst
, n
);
3040 case MESA_FORMAT_Z32_FLOAT_X24S8
:
3041 unpack_ubyte_s_Z32_FLOAT_X24S8(src
, dst
, n
);
3044 _mesa_problem(NULL
, "bad format %s in _mesa_unpack_ubyte_s_row",
3045 _mesa_get_format_name(format
));
3051 unpack_uint_24_8_depth_stencil_S8_Z24(const GLuint
*src
, GLuint
*dst
, GLuint n
)
3055 for (i
= 0; i
< n
; i
++) {
3056 GLuint val
= src
[i
];
3057 dst
[i
] = val
>> 24 | val
<< 8;
3062 unpack_uint_24_8_depth_stencil_Z24_S8(const GLuint
*src
, GLuint
*dst
, GLuint n
)
3064 memcpy(dst
, src
, n
* 4);
3068 _mesa_unpack_uint_24_8_depth_stencil_row(gl_format format
, GLuint n
,
3069 const void *src
, GLuint
*dst
)
3072 case MESA_FORMAT_Z24_S8
:
3073 unpack_uint_24_8_depth_stencil_Z24_S8(src
, dst
, n
);
3075 case MESA_FORMAT_S8_Z24
:
3076 unpack_uint_24_8_depth_stencil_S8_Z24(src
, dst
, n
);
3080 "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row",
3081 _mesa_get_format_name(format
));