Fix gcc version checks for _mesa_bitcount
[mesa.git] / src / mesa / main / format_unpack.c
1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (c) 2011 VMware, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23
24
25 #include "colormac.h"
26 #include "format_unpack.h"
27 #include "macros.h"
28 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
29 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
30
31
32 /**
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.
36 */
37 static inline GLfloat
38 nonlinear_to_linear(GLubyte cs8)
39 {
40 static GLfloat table[256];
41 static GLboolean tableReady = GL_FALSE;
42 if (!tableReady) {
43 /* compute lookup table now */
44 GLuint i;
45 for (i = 0; i < 256; i++) {
46 const GLfloat cs = UBYTE_TO_FLOAT(i);
47 if (cs <= 0.04045) {
48 table[i] = cs / 12.92f;
49 }
50 else {
51 table[i] = (GLfloat) pow((cs + 0.055) / 1.055, 2.4);
52 }
53 }
54 tableReady = GL_TRUE;
55 }
56 return table[cs8];
57 }
58
59
60 typedef void (*unpack_rgba_func)(const void *src, GLfloat dst[4]);
61
62
63 static void
64 unpack_RGBA8888(const void *src, GLfloat dst[4])
65 {
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 );
71 }
72
73 static void
74 unpack_RGBA8888_REV(const void *src, GLfloat dst[4])
75 {
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) );
81 }
82
83 static void
84 unpack_ARGB8888(const void *src, GLfloat dst[4])
85 {
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) );
91 }
92
93 static void
94 unpack_ARGB8888_REV(const void *src, GLfloat dst[4])
95 {
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 );
101 }
102
103 static void
104 unpack_XRGB8888(const void *src, GLfloat dst[4])
105 {
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 );
110 dst[ACOMP] = 1.0f;
111 }
112
113 static void
114 unpack_XRGB8888_REV(const void *src, GLfloat dst[4])
115 {
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) );
120 dst[ACOMP] = 1.0f;
121 }
122
123 static void
124 unpack_RGB888(const void *src, GLfloat dst[4])
125 {
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] );
130 dst[ACOMP] = 1.0F;
131 }
132
133 static void
134 unpack_BGR888(const void *src, GLfloat dst[4])
135 {
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] );
140 dst[ACOMP] = 1.0F;
141 }
142
143 static void
144 unpack_RGB565(const void *src, GLfloat dst[4])
145 {
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);
150 dst[ACOMP] = 1.0F;
151 }
152
153 static void
154 unpack_RGB565_REV(const void *src, GLfloat dst[4])
155 {
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) );
161 dst[ACOMP] = 1.0F;
162 }
163
164 static void
165 unpack_ARGB4444(const void *src, GLfloat dst[4])
166 {
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);
172 }
173
174 static void
175 unpack_ARGB4444_REV(const void *src, GLfloat dst[4])
176 {
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);
182 }
183
184 static void
185 unpack_RGBA5551(const void *src, GLfloat dst[4])
186 {
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;
192 }
193
194 static void
195 unpack_ARGB1555(const void *src, GLfloat dst[4])
196 {
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;
202 }
203
204 static void
205 unpack_ARGB1555_REV(const void *src, GLfloat dst[4])
206 {
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 );
212 }
213
214 static void
215 unpack_AL44(const void *src, GLfloat dst[4])
216 {
217 const GLubyte s = *((const GLubyte *) src);
218 dst[RCOMP] =
219 dst[GCOMP] =
220 dst[BCOMP] = (s & 0xf) * (1.0F / 15.0F);
221 dst[ACOMP] = ((s >> 4) & 0xf) * (1.0F / 15.0F);
222 }
223
224 static void
225 unpack_AL88(const void *src, GLfloat dst[4])
226 {
227 const GLushort s = *((const GLushort *) src);
228 dst[RCOMP] =
229 dst[GCOMP] =
230 dst[BCOMP] = UBYTE_TO_FLOAT( s & 0xff );
231 dst[ACOMP] = UBYTE_TO_FLOAT( s >> 8 );
232 }
233
234 static void
235 unpack_AL88_REV(const void *src, GLfloat dst[4])
236 {
237 const GLushort s = *((const GLushort *) src);
238 dst[RCOMP] =
239 dst[GCOMP] =
240 dst[BCOMP] = UBYTE_TO_FLOAT( s >> 8 );
241 dst[ACOMP] = UBYTE_TO_FLOAT( s & 0xff );
242 }
243
244 static void
245 unpack_AL1616(const void *src, GLfloat dst[4])
246 {
247 const GLuint s = *((const GLuint *) src);
248 dst[RCOMP] =
249 dst[GCOMP] =
250 dst[BCOMP] = USHORT_TO_FLOAT( s & 0xffff );
251 dst[ACOMP] = USHORT_TO_FLOAT( s >> 16 );
252 }
253
254 static void
255 unpack_AL1616_REV(const void *src, GLfloat dst[4])
256 {
257 const GLuint s = *((const GLuint *) src);
258 dst[RCOMP] =
259 dst[GCOMP] =
260 dst[BCOMP] = USHORT_TO_FLOAT( s >> 16 );
261 dst[ACOMP] = USHORT_TO_FLOAT( s & 0xffff );
262 }
263
264 static void
265 unpack_RGB332(const void *src, GLfloat dst[4])
266 {
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);
271 dst[ACOMP] = 1.0F;
272 }
273
274
275 static void
276 unpack_A8(const void *src, GLfloat dst[4])
277 {
278 const GLubyte s = *((const GLubyte *) src);
279 dst[RCOMP] =
280 dst[GCOMP] =
281 dst[BCOMP] = 0.0F;
282 dst[ACOMP] = UBYTE_TO_FLOAT(s);
283 }
284
285 static void
286 unpack_A16(const void *src, GLfloat dst[4])
287 {
288 const GLushort s = *((const GLushort *) src);
289 dst[RCOMP] =
290 dst[GCOMP] =
291 dst[BCOMP] = 0.0F;
292 dst[ACOMP] = USHORT_TO_FLOAT(s);
293 }
294
295 static void
296 unpack_L8(const void *src, GLfloat dst[4])
297 {
298 const GLubyte s = *((const GLubyte *) src);
299 dst[RCOMP] =
300 dst[GCOMP] =
301 dst[BCOMP] = UBYTE_TO_FLOAT(s);
302 dst[ACOMP] = 1.0F;
303 }
304
305 static void
306 unpack_L16(const void *src, GLfloat dst[4])
307 {
308 const GLushort s = *((const GLushort *) src);
309 dst[RCOMP] =
310 dst[GCOMP] =
311 dst[BCOMP] = USHORT_TO_FLOAT(s);
312 dst[ACOMP] = 1.0F;
313 }
314
315 static void
316 unpack_I8(const void *src, GLfloat dst[4])
317 {
318 const GLubyte s = *((const GLubyte *) src);
319 dst[RCOMP] =
320 dst[GCOMP] =
321 dst[BCOMP] =
322 dst[ACOMP] = UBYTE_TO_FLOAT(s);
323 }
324
325 static void
326 unpack_I16(const void *src, GLfloat dst[4])
327 {
328 const GLushort s = *((const GLushort *) src);
329 dst[RCOMP] =
330 dst[GCOMP] =
331 dst[BCOMP] =
332 dst[ACOMP] = USHORT_TO_FLOAT(s);
333 }
334
335 static void
336 unpack_YCBCR(const void *src, GLfloat dst[4])
337 {
338 const GLuint i = 0;
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);
355 dst[ACOMP] = 1.0F;
356 }
357
358 static void
359 unpack_YCBCR_REV(const void *src, GLfloat dst[4])
360 {
361 const GLuint i = 0;
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);
378 dst[ACOMP] = 1.0F;
379 }
380
381 static void
382 unpack_R8(const void *src, GLfloat dst[4])
383 {
384 const GLubyte s = *((const GLubyte *) src);
385 dst[0] = UBYTE_TO_FLOAT(s);
386 dst[1] = dst[2] = 0.0F;
387 dst[3] = 1.0F;
388 }
389
390 static void
391 unpack_RG88(const void *src, GLfloat dst[4])
392 {
393 const GLushort s = *((const GLushort *) src);
394 dst[RCOMP] = UBYTE_TO_FLOAT( s & 0xff );
395 dst[GCOMP] = UBYTE_TO_FLOAT( s >> 8 );
396 dst[BCOMP] = 0.0;
397 dst[ACOMP] = 1.0;
398 }
399
400 static void
401 unpack_RG88_REV(const void *src, GLfloat dst[4])
402 {
403 const GLushort s = *((const GLushort *) src);
404 dst[RCOMP] = UBYTE_TO_FLOAT( s & 0xff );
405 dst[GCOMP] = UBYTE_TO_FLOAT( s >> 8 );
406 dst[BCOMP] = 0.0;
407 dst[ACOMP] = 1.0;
408 }
409
410 static void
411 unpack_R16(const void *src, GLfloat dst[4])
412 {
413 const GLushort s = *((const GLushort *) src);
414 dst[RCOMP] = USHORT_TO_FLOAT(s);
415 dst[GCOMP] = 0.0;
416 dst[BCOMP] = 0.0;
417 dst[ACOMP] = 1.0;
418 }
419
420 static void
421 unpack_RG1616(const void *src, GLfloat dst[4])
422 {
423 const GLuint s = *((const GLuint *) src);
424 dst[RCOMP] = USHORT_TO_FLOAT( s & 0xffff );
425 dst[GCOMP] = USHORT_TO_FLOAT( s >> 16 );
426 dst[BCOMP] = 0.0;
427 dst[ACOMP] = 1.0;
428 }
429
430 static void
431 unpack_RG1616_REV(const void *src, GLfloat dst[4])
432 {
433 const GLuint s = *((const GLuint *) src);
434 dst[RCOMP] = USHORT_TO_FLOAT( s >> 16 );
435 dst[GCOMP] = USHORT_TO_FLOAT( s & 0xffff );
436 dst[BCOMP] = 0.0;
437 dst[ACOMP] = 1.0;
438 }
439
440 static void
441 unpack_ARGB2101010(const void *src, GLfloat dst[4])
442 {
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);
448 }
449
450
451 static void
452 unpack_Z24_S8(const void *src, GLfloat dst[4])
453 {
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;
458 dst[3] = 1.0F;
459 ASSERT(dst[0] >= 0.0F);
460 ASSERT(dst[0] <= 1.0F);
461 }
462
463 static void
464 unpack_S8_Z24(const void *src, GLfloat dst[4])
465 {
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;
470 dst[3] = 1.0F;
471 ASSERT(dst[0] >= 0.0F);
472 ASSERT(dst[0] <= 1.0F);
473 }
474
475 static void
476 unpack_Z16(const void *src, GLfloat dst[4])
477 {
478 const GLushort s = *((const GLushort *) src);
479 dst[0] = dst[1] = dst[2] = s * (1.0F / 65535.0F);
480 dst[3] = 1.0F;
481 }
482
483 static void
484 unpack_X8_Z24(const void *src, GLfloat dst[4])
485 {
486 unpack_S8_Z24(src, dst);
487 }
488
489 static void
490 unpack_Z24_X8(const void *src, GLfloat dst[4])
491 {
492 unpack_Z24_S8(src, dst);
493 }
494
495 static void
496 unpack_Z32(const void *src, GLfloat dst[4])
497 {
498 const GLuint s = *((const GLuint *) src);
499 dst[0] = dst[1] = dst[2] = s * (1.0F / 0xffffffff);
500 dst[3] = 1.0F;
501 }
502
503 static void
504 unpack_Z32_FLOAT(const void *src, GLfloat dst[4])
505 {
506 const GLfloat s = *((const GLfloat *) src);
507 dst[0] = dst[1] = dst[2] = s;
508 dst[3] = 1.0F;
509 }
510
511 static void
512 unpack_Z32_FLOAT_X24S8(const void *src, GLfloat dst[4])
513 {
514 const GLfloat s = *((const GLfloat *) src);
515 dst[0] = dst[1] = dst[2] = s;
516 dst[3] = 1.0F;
517 }
518
519
520 static void
521 unpack_S8(const void *src, GLfloat dst[4])
522 {
523 /* should never be used */
524 dst[0] = dst[1] = dst[2] = 0.0F;
525 dst[3] = 1.0F;
526 }
527
528
529 static void
530 unpack_SRGB8(const void *src, GLfloat dst[4])
531 {
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]);
536 dst[ACOMP] = 1.0F;
537 }
538
539 static void
540 unpack_SRGBA8(const void *src, GLfloat dst[4])
541 {
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! */
547 }
548
549 static void
550 unpack_SARGB8(const void *src, GLfloat dst[4])
551 {
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! */
557 }
558
559 static void
560 unpack_SL8(const void *src, GLfloat dst[4])
561 {
562 const GLubyte s = *((const GLubyte *) src);
563 dst[RCOMP] =
564 dst[GCOMP] =
565 dst[BCOMP] = nonlinear_to_linear(s);
566 dst[ACOMP] = 1.0F;
567 }
568
569 static void
570 unpack_SLA8(const void *src, GLfloat dst[4])
571 {
572 const GLubyte *s = (const GLubyte *) src;
573 dst[RCOMP] =
574 dst[GCOMP] =
575 dst[BCOMP] = nonlinear_to_linear(s[0]);
576 dst[ACOMP] = UBYTE_TO_FLOAT(s[1]); /* linear */
577 }
578
579 static void
580 unpack_SRGB_DXT1(const void *src, GLfloat dst[4])
581 {
582 }
583
584 static void
585 unpack_SRGBA_DXT1(const void *src, GLfloat dst[4])
586 {
587 }
588
589 static void
590 unpack_SRGBA_DXT3(const void *src, GLfloat dst[4])
591 {
592 }
593
594 static void
595 unpack_SRGBA_DXT5(const void *src, GLfloat dst[4])
596 {
597 }
598
599 static void
600 unpack_RGB_FXT1(const void *src, GLfloat dst[4])
601 {
602 }
603
604 static void
605 unpack_RGBA_FXT1(const void *src, GLfloat dst[4])
606 {
607 }
608
609 static void
610 unpack_RGB_DXT1(const void *src, GLfloat dst[4])
611 {
612 }
613
614 static void
615 unpack_RGBA_DXT1(const void *src, GLfloat dst[4])
616 {
617 }
618
619 static void
620 unpack_RGBA_DXT3(const void *src, GLfloat dst[4])
621 {
622 }
623
624 static void
625 unpack_RGBA_DXT5(const void *src, GLfloat dst[4])
626 {
627 }
628
629
630 static void
631 unpack_RGBA_FLOAT32(const void *src, GLfloat dst[4])
632 {
633 const GLfloat *s = (const GLfloat *) src;
634 dst[RCOMP] = s[0];
635 dst[GCOMP] = s[1];
636 dst[BCOMP] = s[2];
637 dst[ACOMP] = s[3];
638 }
639
640 static void
641 unpack_RGBA_FLOAT16(const void *src, GLfloat dst[4])
642 {
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]);
648 }
649
650 static void
651 unpack_RGB_FLOAT32(const void *src, GLfloat dst[4])
652 {
653 const GLfloat *s = (const GLfloat *) src;
654 dst[RCOMP] = s[0];
655 dst[GCOMP] = s[1];
656 dst[BCOMP] = s[2];
657 dst[ACOMP] = 1.0F;
658 }
659
660 static void
661 unpack_RGB_FLOAT16(const void *src, GLfloat dst[4])
662 {
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]);
667 dst[ACOMP] = 1.0F;
668 }
669
670 static void
671 unpack_ALPHA_FLOAT32(const void *src, GLfloat dst[4])
672 {
673 const GLfloat *s = (const GLfloat *) src;
674 dst[RCOMP] =
675 dst[GCOMP] =
676 dst[BCOMP] = 0.0F;
677 dst[ACOMP] = s[0];
678 }
679
680 static void
681 unpack_ALPHA_FLOAT16(const void *src, GLfloat dst[4])
682 {
683 const GLhalfARB *s = (const GLhalfARB *) src;
684 dst[RCOMP] =
685 dst[GCOMP] =
686 dst[BCOMP] = 0.0F;
687 dst[ACOMP] = _mesa_half_to_float(s[0]);
688 }
689
690 static void
691 unpack_LUMINANCE_FLOAT32(const void *src, GLfloat dst[4])
692 {
693 const GLfloat *s = (const GLfloat *) src;
694 dst[RCOMP] =
695 dst[GCOMP] =
696 dst[BCOMP] = s[0];
697 dst[ACOMP] = 1.0F;
698 }
699
700 static void
701 unpack_LUMINANCE_FLOAT16(const void *src, GLfloat dst[4])
702 {
703 const GLhalfARB *s = (const GLhalfARB *) src;
704 dst[RCOMP] =
705 dst[GCOMP] =
706 dst[BCOMP] = _mesa_half_to_float(s[0]);
707 dst[ACOMP] = 1.0F;
708 }
709
710 static void
711 unpack_LUMINANCE_ALPHA_FLOAT32(const void *src, GLfloat dst[4])
712 {
713 const GLfloat *s = (const GLfloat *) src;
714 dst[RCOMP] =
715 dst[GCOMP] =
716 dst[BCOMP] = s[0];
717 dst[ACOMP] = s[1];
718 }
719
720 static void
721 unpack_LUMINANCE_ALPHA_FLOAT16(const void *src, GLfloat dst[4])
722 {
723 const GLhalfARB *s = (const GLhalfARB *) src;
724 dst[RCOMP] =
725 dst[GCOMP] =
726 dst[BCOMP] = _mesa_half_to_float(s[0]);
727 dst[ACOMP] = _mesa_half_to_float(s[1]);
728 }
729
730 static void
731 unpack_INTENSITY_FLOAT32(const void *src, GLfloat dst[4])
732 {
733 const GLfloat *s = (const GLfloat *) src;
734 dst[RCOMP] =
735 dst[GCOMP] =
736 dst[BCOMP] =
737 dst[ACOMP] = s[0];
738 }
739
740 static void
741 unpack_INTENSITY_FLOAT16(const void *src, GLfloat dst[4])
742 {
743 const GLhalfARB *s = (const GLhalfARB *) src;
744 dst[RCOMP] =
745 dst[GCOMP] =
746 dst[BCOMP] =
747 dst[ACOMP] = s[0];
748 }
749
750 static void
751 unpack_R_FLOAT32(const void *src, GLfloat dst[4])
752 {
753 const GLfloat *s = (const GLfloat *) src;
754 dst[RCOMP] = s[0];
755 dst[GCOMP] = 0.0F;
756 dst[BCOMP] = 0.0F;
757 dst[ACOMP] = 1.0F;
758 }
759
760 static void
761 unpack_R_FLOAT16(const void *src, GLfloat dst[4])
762 {
763 const GLhalfARB *s = (const GLhalfARB *) src;
764 dst[RCOMP] = _mesa_half_to_float(s[0]);
765 dst[GCOMP] = 0.0F;
766 dst[BCOMP] = 0.0F;
767 dst[ACOMP] = 1.0F;
768 }
769
770 static void
771 unpack_RG_FLOAT32(const void *src, GLfloat dst[4])
772 {
773 const GLfloat *s = (const GLfloat *) src;
774 dst[RCOMP] = s[0];
775 dst[GCOMP] = s[1];
776 dst[BCOMP] = 0.0F;
777 dst[ACOMP] = 1.0F;
778 }
779
780 static void
781 unpack_RG_FLOAT16(const void *src, GLfloat dst[4])
782 {
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]);
786 dst[BCOMP] = 0.0F;
787 dst[ACOMP] = 1.0F;
788 }
789
790
791 static void
792 unpack_RGBA_INT8(const void *src, GLfloat dst[4])
793 {
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];
799 }
800
801 static void
802 unpack_RGBA_INT16(const void *src, GLfloat dst[4])
803 {
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];
809 }
810
811 static void
812 unpack_RGBA_INT32(const void *src, GLfloat dst[4])
813 {
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];
819 }
820
821 static void
822 unpack_RGBA_UINT8(const void *src, GLfloat dst[4])
823 {
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];
829 }
830
831 static void
832 unpack_RGBA_UINT16(const void *src, GLfloat dst[4])
833 {
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];
839 }
840
841 static void
842 unpack_RGBA_UINT32(const void *src, GLfloat dst[4])
843 {
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];
849 }
850
851 static void
852 unpack_DUDV8(const void *src, GLfloat dst[4])
853 {
854 const GLbyte *s = (const GLbyte *) src;
855 dst[RCOMP] = BYTE_TO_FLOAT(s[0]);
856 dst[GCOMP] = BYTE_TO_FLOAT(s[1]);
857 dst[BCOMP] = 0;
858 dst[ACOMP] = 0;
859 }
860
861 static void
862 unpack_SIGNED_R8(const void *src, GLfloat dst[4])
863 {
864 const GLbyte s = *((const GLbyte *) src);
865 dst[RCOMP] = BYTE_TO_FLOAT_TEX( s );
866 dst[GCOMP] = 0.0F;
867 dst[BCOMP] = 0.0F;
868 dst[ACOMP] = 1.0F;
869 }
870
871 static void
872 unpack_SIGNED_RG88_REV(const void *src, GLfloat dst[4])
873 {
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) );
877 dst[BCOMP] = 0.0F;
878 dst[ACOMP] = 1.0F;
879 }
880
881 static void
882 unpack_SIGNED_RGBX8888(const void *src, GLfloat dst[4])
883 {
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) );
888 dst[ACOMP] = 1.0f;
889 }
890
891 static void
892 unpack_SIGNED_RGBA8888(const void *src, GLfloat dst[4])
893 {
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 ) );
899 }
900
901 static void
902 unpack_SIGNED_RGBA8888_REV(const void *src, GLfloat dst[4])
903 {
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) );
909 }
910
911 static void
912 unpack_SIGNED_R16(const void *src, GLfloat dst[4])
913 {
914 const GLshort s = *((const GLshort *) src);
915 dst[RCOMP] = SHORT_TO_FLOAT_TEX( s );
916 dst[GCOMP] = 0.0F;
917 dst[BCOMP] = 0.0F;
918 dst[ACOMP] = 1.0F;
919 }
920
921 static void
922 unpack_SIGNED_GR1616(const void *src, GLfloat dst[4])
923 {
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 );
927 dst[BCOMP] = 0.0F;
928 dst[ACOMP] = 1.0F;
929 }
930
931 static void
932 unpack_SIGNED_RGB_16(const void *src, GLfloat dst[4])
933 {
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] );
938 dst[ACOMP] = 1.0F;
939 }
940
941 static void
942 unpack_SIGNED_RGBA_16(const void *src, GLfloat dst[4])
943 {
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] );
949 }
950
951 static void
952 unpack_RGBA_16(const void *src, GLfloat dst[4])
953 {
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] );
959 }
960
961 static void
962 unpack_RED_RGTC1(const void *src, GLfloat dst[4])
963 {
964 /* XXX to do */
965 }
966
967 static void
968 unpack_SIGNED_RED_RGTC1(const void *src, GLfloat dst[4])
969 {
970 /* XXX to do */
971 }
972
973 static void
974 unpack_RG_RGTC2(const void *src, GLfloat dst[4])
975 {
976 /* XXX to do */
977 }
978
979 static void
980 unpack_SIGNED_RG_RGTC2(const void *src, GLfloat dst[4])
981 {
982 /* XXX to do */
983 }
984
985 static void
986 unpack_L_LATC1(const void *src, GLfloat dst[4])
987 {
988 /* XXX to do */
989 }
990
991 static void
992 unpack_SIGNED_L_LATC1(const void *src, GLfloat dst[4])
993 {
994 /* XXX to do */
995 }
996
997 static void
998 unpack_LA_LATC2(const void *src, GLfloat dst[4])
999 {
1000 /* XXX to do */
1001 }
1002
1003 static void
1004 unpack_SIGNED_LA_LATC2(const void *src, GLfloat dst[4])
1005 {
1006 /* XXX to do */
1007 }
1008
1009 static void
1010 unpack_SIGNED_A8(const void *src, GLfloat dst[4])
1011 {
1012 const GLbyte s = *((const GLbyte *) src);
1013 dst[RCOMP] = 0.0F;
1014 dst[GCOMP] = 0.0F;
1015 dst[BCOMP] = 0.0F;
1016 dst[ACOMP] = BYTE_TO_FLOAT_TEX( s );
1017 }
1018
1019 static void
1020 unpack_SIGNED_L8(const void *src, GLfloat dst[4])
1021 {
1022 const GLbyte s = *((const GLbyte *) src);
1023 dst[RCOMP] =
1024 dst[GCOMP] =
1025 dst[BCOMP] = BYTE_TO_FLOAT_TEX( s );
1026 dst[ACOMP] = 1.0F;
1027 }
1028
1029 static void
1030 unpack_SIGNED_AL88(const void *src, GLfloat dst[4])
1031 {
1032 const GLushort s = *((const GLshort *) src);
1033 dst[RCOMP] =
1034 dst[GCOMP] =
1035 dst[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) );
1036 dst[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
1037 }
1038
1039 static void
1040 unpack_SIGNED_I8(const void *src, GLfloat dst[4])
1041 {
1042 const GLbyte s = *((const GLbyte *) src);
1043 dst[RCOMP] =
1044 dst[GCOMP] =
1045 dst[BCOMP] =
1046 dst[ACOMP] = BYTE_TO_FLOAT_TEX( s );
1047 }
1048
1049 static void
1050 unpack_SIGNED_A16(const void *src, GLfloat dst[4])
1051 {
1052 const GLshort s = *((const GLshort *) src);
1053 dst[RCOMP] = 0.0F;
1054 dst[GCOMP] = 0.0F;
1055 dst[BCOMP] = 0.0F;
1056 dst[ACOMP] = SHORT_TO_FLOAT_TEX( s );
1057 }
1058
1059 static void
1060 unpack_SIGNED_L16(const void *src, GLfloat dst[4])
1061 {
1062 const GLshort s = *((const GLshort *) src);
1063 dst[RCOMP] =
1064 dst[GCOMP] =
1065 dst[BCOMP] = SHORT_TO_FLOAT_TEX( s );
1066 dst[ACOMP] = 1.0F;
1067 }
1068
1069 static void
1070 unpack_SIGNED_AL1616(const void *src, GLfloat dst[4])
1071 {
1072 const GLshort *s = (const GLshort *) src;
1073 dst[RCOMP] =
1074 dst[GCOMP] =
1075 dst[BCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
1076 dst[ACOMP] = SHORT_TO_FLOAT_TEX( s[1] );
1077 }
1078
1079 static void
1080 unpack_SIGNED_I16(const void *src, GLfloat dst[4])
1081 {
1082 const GLshort s = *((const GLshort *) src);
1083 dst[RCOMP] =
1084 dst[GCOMP] =
1085 dst[BCOMP] =
1086 dst[ACOMP] = SHORT_TO_FLOAT_TEX( s );
1087 }
1088
1089 static void
1090 unpack_RGB9_E5_FLOAT(const void *src, GLfloat dst[4])
1091 {
1092 const GLuint *s = (const GLuint *) src;
1093 rgb9e5_to_float3(*s, dst);
1094 dst[ACOMP] = 1.0F;
1095 }
1096
1097 static void
1098 unpack_R11_G11_B10_FLOAT(const void *src, GLfloat dst[4])
1099 {
1100 const GLuint *s = (const GLuint *) src;
1101 r11g11b10f_to_float3(*s, dst);
1102 dst[ACOMP] = 1.0F;
1103 }
1104
1105
1106 /**
1107 * Return the unpacker function for the given format.
1108 */
1109 static unpack_rgba_func
1110 get_unpack_rgba_function(gl_format format)
1111 {
1112 static unpack_rgba_func table[MESA_FORMAT_COUNT];
1113 static GLboolean initialized = GL_FALSE;
1114
1115 if (!initialized) {
1116 table[MESA_FORMAT_NONE] = NULL;
1117
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;
1170
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;
1177
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;
1194
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;
1201
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;
1213
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;
1218
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;
1223
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;
1232
1233 table[MESA_FORMAT_RGB9_E5_FLOAT] = unpack_RGB9_E5_FLOAT;
1234 table[MESA_FORMAT_R11_G11_B10_FLOAT] = unpack_R11_G11_B10_FLOAT;
1235
1236 table[MESA_FORMAT_Z32_FLOAT] = unpack_Z32_FLOAT;
1237 table[MESA_FORMAT_Z32_FLOAT_X24S8] = unpack_Z32_FLOAT_X24S8;
1238
1239 initialized = GL_TRUE;
1240 }
1241
1242 return table[format];
1243 }
1244
1245
1246 void
1247 _mesa_unpack_rgba_row(gl_format format, GLuint n,
1248 const void *src, GLfloat dst[][4])
1249 {
1250 unpack_rgba_func unpack = get_unpack_rgba_function(format);
1251 GLuint srcStride = _mesa_get_format_bytes(format);
1252 const GLubyte *srcPtr = (GLubyte *) src;
1253 GLuint i;
1254
1255 for (i = 0; i < n; i++) {
1256 unpack(srcPtr, dst[i]);
1257 srcPtr += srcStride;
1258 }
1259 }
1260
1261
1262
1263 /**
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
1274 */
1275 void
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)
1280 {
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;
1285 GLubyte *dstRow;
1286 GLfloat *dstPix;
1287 GLuint i, j;
1288
1289 /* XXX needs to be fixed for compressed formats */
1290
1291 srcRow = ((const GLubyte *) src) + srcRowStride * y + srcPixStride * x;
1292 dstRow = ((GLubyte *) dst) + dstRowStride * y + dstPixStride * x;
1293
1294 for (i = 0; i < height; i++) {
1295 srcPix = srcRow;
1296 dstPix = (GLfloat *) dstRow;
1297
1298 for (j = 0; j < width; j++) {
1299 unpack(srcPix, dstPix);
1300 srcPix += srcPixStride;
1301 dstPix += dstPixStride;
1302 }
1303
1304 dstRow += dstRowStride;
1305 srcRow += srcRowStride;
1306 }
1307 }
1308
1309
1310
1311
1312 typedef void (*unpack_float_z_func)(const void *src, GLfloat *dst);
1313
1314 static void
1315 unpack_float_z_Z24_S8(const void *src, GLfloat *dst)
1316 {
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);
1323 }
1324
1325 static void
1326 unpack_float_z_S8_Z24(const void *src, GLfloat *dst)
1327 {
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);
1334 }
1335
1336 static void
1337 unpack_float_z_Z16(const void *src, GLfloat *dst)
1338 {
1339 const GLushort s = *((const GLushort *) src);
1340 *dst = s * (1.0F / 65535.0F);
1341 }
1342
1343 static void
1344 unpack_float_z_X8_Z24(const void *src, GLfloat *dst)
1345 {
1346 unpack_float_z_S8_Z24(src, dst);
1347 }
1348
1349 static void
1350 unpack_float_z_Z24_X8(const void *src, GLfloat *dst)
1351 {
1352 unpack_float_z_Z24_S8(src, dst);
1353 }
1354
1355 static void
1356 unpack_float_z_Z32(const void *src, GLfloat *dst)
1357 {
1358 const GLuint s = *((const GLuint *) src);
1359 *dst = s * (1.0F / 0xffffffff);
1360 }
1361
1362 static void
1363 unpack_float_z_Z32X24S8(const void *src, GLfloat *dst)
1364 {
1365 *dst = *((const GLfloat *) src);
1366 }
1367
1368
1369
1370 void
1371 _mesa_unpack_float_z_row(gl_format format, GLuint n,
1372 const void *src, GLfloat *dst)
1373 {
1374 unpack_float_z_func unpack;
1375 GLuint srcStride = _mesa_get_format_bytes(format);
1376 const GLubyte *srcPtr = (GLubyte *) src;
1377 GLuint i;
1378
1379 switch (format) {
1380 case MESA_FORMAT_Z24_S8:
1381 unpack = unpack_float_z_Z24_S8;
1382 break;
1383 case MESA_FORMAT_S8_Z24:
1384 unpack = unpack_float_z_S8_Z24;
1385 break;
1386 case MESA_FORMAT_Z16:
1387 unpack = unpack_float_z_Z16;
1388 break;
1389 case MESA_FORMAT_X8_Z24:
1390 unpack = unpack_float_z_X8_Z24;
1391 break;
1392 case MESA_FORMAT_Z24_X8:
1393 unpack = unpack_float_z_Z24_X8;
1394 break;
1395 case MESA_FORMAT_Z32:
1396 unpack = unpack_float_z_Z32;
1397 break;
1398 case MESA_FORMAT_Z32_FLOAT_X24S8:
1399 unpack = unpack_float_z_Z32X24S8;
1400 break;
1401 default:
1402 _mesa_problem(NULL, "bad format %s in _mesa_unpack_float_z_row",
1403 _mesa_get_format_name(format));
1404 return;
1405 }
1406
1407 for (i = 0; i < n; i++) {
1408 unpack(srcPtr, &dst[i]);
1409 srcPtr += srcStride;
1410 }
1411 }
1412
1413
1414
1415 typedef void (*unpack_uint_z_func)(const void *src, GLuint *dst);
1416
1417 static void
1418 unpack_uint_z_Z24_S8(const void *src, GLuint *dst)
1419 {
1420 /* only return Z, not stencil data */
1421 const GLuint s = *((const GLuint *) src);
1422 *dst = (s >> 8);
1423 }
1424
1425 static void
1426 unpack_uint_z_S8_Z24(const void *src, GLuint *dst)
1427 {
1428 /* only return Z, not stencil data */
1429 const GLuint s = *((const GLuint *) src);
1430 *dst = s & 0x00ffffff;
1431 }
1432
1433 static void
1434 unpack_uint_z_Z16(const void *src, GLuint *dst)
1435 {
1436 *dst = *((const GLushort *) src);
1437 }
1438
1439 static void
1440 unpack_uint_z_X8_Z24(const void *src, GLuint *dst)
1441 {
1442 unpack_uint_z_S8_Z24(src, dst);
1443 }
1444
1445 static void
1446 unpack_uint_z_Z24_X8(const void *src, GLuint *dst)
1447 {
1448 unpack_uint_z_Z24_S8(src, dst);
1449 }
1450
1451 static void
1452 unpack_uint_z_Z32(const void *src, GLuint *dst)
1453 {
1454 *dst = *((const GLuint *) src);
1455 }
1456
1457
1458 void
1459 _mesa_unpack_uint_z_row(gl_format format, GLuint n,
1460 const void *src, GLuint *dst)
1461 {
1462 unpack_uint_z_func unpack;
1463 GLuint srcStride = _mesa_get_format_bytes(format);
1464 const GLubyte *srcPtr = (GLubyte *) src;
1465 GLuint i;
1466
1467 switch (format) {
1468 case MESA_FORMAT_Z24_S8:
1469 unpack = unpack_uint_z_Z24_S8;
1470 break;
1471 case MESA_FORMAT_S8_Z24:
1472 unpack = unpack_uint_z_S8_Z24;
1473 break;
1474 case MESA_FORMAT_Z16:
1475 unpack = unpack_uint_z_Z16;
1476 break;
1477 case MESA_FORMAT_X8_Z24:
1478 unpack = unpack_uint_z_X8_Z24;
1479 break;
1480 case MESA_FORMAT_Z24_X8:
1481 unpack = unpack_uint_z_Z24_X8;
1482 break;
1483 case MESA_FORMAT_Z32:
1484 unpack = unpack_uint_z_Z32;
1485 break;
1486 default:
1487 _mesa_problem(NULL, "bad format %s in _mesa_unpack_uint_z_row",
1488 _mesa_get_format_name(format));
1489 return;
1490 }
1491
1492 for (i = 0; i < n; i++) {
1493 unpack(srcPtr, &dst[i]);
1494 srcPtr += srcStride;
1495 }
1496 }
1497
1498