nvprogram: Silence "warning: unused parameter ‘ctx’"
[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 /* XXX TODO */
925 }
926
927 static void
928 unpack_SIGNED_RGB_16(const void *src, GLfloat dst[4])
929 {
930 const GLshort *s = (const GLshort *) src;
931 dst[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
932 dst[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] );
933 dst[BCOMP] = SHORT_TO_FLOAT_TEX( s[2] );
934 dst[ACOMP] = 1.0F;
935 }
936
937 static void
938 unpack_SIGNED_RGBA_16(const void *src, GLfloat dst[4])
939 {
940 const GLshort *s = (const GLshort *) src;
941 dst[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
942 dst[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] );
943 dst[BCOMP] = SHORT_TO_FLOAT_TEX( s[2] );
944 dst[ACOMP] = SHORT_TO_FLOAT_TEX( s[3] );
945 }
946
947 static void
948 unpack_RGBA_16(const void *src, GLfloat dst[4])
949 {
950 const GLshort *s = (const GLshort *) src;
951 dst[RCOMP] = USHORT_TO_FLOAT( s[0] );
952 dst[GCOMP] = USHORT_TO_FLOAT( s[1] );
953 dst[BCOMP] = USHORT_TO_FLOAT( s[2] );
954 dst[ACOMP] = USHORT_TO_FLOAT( s[3] );
955 }
956
957 static void
958 unpack_RED_RGTC1(const void *src, GLfloat dst[4])
959 {
960 /* XXX to do */
961 }
962
963 static void
964 unpack_SIGNED_RED_RGTC1(const void *src, GLfloat dst[4])
965 {
966 /* XXX to do */
967 }
968
969 static void
970 unpack_RG_RGTC2(const void *src, GLfloat dst[4])
971 {
972 /* XXX to do */
973 }
974
975 static void
976 unpack_SIGNED_RG_RGTC2(const void *src, GLfloat dst[4])
977 {
978 /* XXX to do */
979 }
980
981 static void
982 unpack_L_LATC1(const void *src, GLfloat dst[4])
983 {
984 /* XXX to do */
985 }
986
987 static void
988 unpack_SIGNED_L_LATC1(const void *src, GLfloat dst[4])
989 {
990 /* XXX to do */
991 }
992
993 static void
994 unpack_LA_LATC2(const void *src, GLfloat dst[4])
995 {
996 /* XXX to do */
997 }
998
999 static void
1000 unpack_SIGNED_LA_LATC2(const void *src, GLfloat dst[4])
1001 {
1002 /* XXX to do */
1003 }
1004
1005 static void
1006 unpack_SIGNED_A8(const void *src, GLfloat dst[4])
1007 {
1008 const GLbyte s = *((const GLbyte *) src);
1009 dst[RCOMP] = 0.0F;
1010 dst[GCOMP] = 0.0F;
1011 dst[BCOMP] = 0.0F;
1012 dst[ACOMP] = BYTE_TO_FLOAT_TEX( s );
1013 }
1014
1015 static void
1016 unpack_SIGNED_L8(const void *src, GLfloat dst[4])
1017 {
1018 const GLbyte s = *((const GLbyte *) src);
1019 dst[RCOMP] =
1020 dst[GCOMP] =
1021 dst[BCOMP] = BYTE_TO_FLOAT_TEX( s );
1022 dst[ACOMP] = 1.0F;
1023 }
1024
1025 static void
1026 unpack_SIGNED_AL88(const void *src, GLfloat dst[4])
1027 {
1028 const GLushort s = *((const GLshort *) src);
1029 dst[RCOMP] =
1030 dst[GCOMP] =
1031 dst[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) );
1032 dst[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
1033 }
1034
1035 static void
1036 unpack_SIGNED_I8(const void *src, GLfloat dst[4])
1037 {
1038 const GLbyte s = *((const GLbyte *) src);
1039 dst[RCOMP] =
1040 dst[GCOMP] =
1041 dst[BCOMP] =
1042 dst[ACOMP] = BYTE_TO_FLOAT_TEX( s );
1043 }
1044
1045 static void
1046 unpack_SIGNED_A16(const void *src, GLfloat dst[4])
1047 {
1048 const GLshort s = *((const GLshort *) src);
1049 dst[RCOMP] = 0.0F;
1050 dst[GCOMP] = 0.0F;
1051 dst[BCOMP] = 0.0F;
1052 dst[ACOMP] = SHORT_TO_FLOAT_TEX( s );
1053 }
1054
1055 static void
1056 unpack_SIGNED_L16(const void *src, GLfloat dst[4])
1057 {
1058 const GLshort s = *((const GLshort *) src);
1059 dst[RCOMP] =
1060 dst[GCOMP] =
1061 dst[BCOMP] = SHORT_TO_FLOAT_TEX( s );
1062 dst[ACOMP] = 1.0F;
1063 }
1064
1065 static void
1066 unpack_SIGNED_AL1616(const void *src, GLfloat dst[4])
1067 {
1068 const GLshort *s = (const GLshort *) src;
1069 dst[RCOMP] =
1070 dst[GCOMP] =
1071 dst[BCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
1072 dst[ACOMP] = SHORT_TO_FLOAT_TEX( s[1] );
1073 }
1074
1075 static void
1076 unpack_SIGNED_I16(const void *src, GLfloat dst[4])
1077 {
1078 const GLshort s = *((const GLshort *) src);
1079 dst[RCOMP] =
1080 dst[GCOMP] =
1081 dst[BCOMP] =
1082 dst[ACOMP] = SHORT_TO_FLOAT_TEX( s );
1083 }
1084
1085 static void
1086 unpack_RGB9_E5_FLOAT(const void *src, GLfloat dst[4])
1087 {
1088 const GLuint *s = (const GLuint *) src;
1089 rgb9e5_to_float3(*s, dst);
1090 dst[ACOMP] = 1.0F;
1091 }
1092
1093 static void
1094 unpack_R11_G11_B10_FLOAT(const void *src, GLfloat dst[4])
1095 {
1096 const GLuint *s = (const GLuint *) src;
1097 r11g11b10f_to_float3(*s, dst);
1098 dst[ACOMP] = 1.0F;
1099 }
1100
1101
1102 /**
1103 * Return the unpacker function for the given format.
1104 */
1105 static unpack_rgba_func
1106 get_unpack_rgba_function(gl_format format)
1107 {
1108 static unpack_rgba_func table[MESA_FORMAT_COUNT];
1109 static GLboolean initialized = GL_FALSE;
1110
1111 if (!initialized) {
1112 table[MESA_FORMAT_NONE] = NULL;
1113
1114 table[MESA_FORMAT_RGBA8888] = unpack_RGBA8888;
1115 table[MESA_FORMAT_RGBA8888_REV] = unpack_RGBA8888_REV;
1116 table[MESA_FORMAT_ARGB8888] = unpack_ARGB8888;
1117 table[MESA_FORMAT_ARGB8888_REV] = unpack_ARGB8888_REV;
1118 table[MESA_FORMAT_XRGB8888] = unpack_XRGB8888;
1119 table[MESA_FORMAT_XRGB8888_REV] = unpack_XRGB8888_REV;
1120 table[MESA_FORMAT_RGB888] = unpack_RGB888;
1121 table[MESA_FORMAT_BGR888] = unpack_BGR888;
1122 table[MESA_FORMAT_RGB565] = unpack_RGB565;
1123 table[MESA_FORMAT_RGB565_REV] = unpack_RGB565_REV;
1124 table[MESA_FORMAT_ARGB4444] = unpack_ARGB4444;
1125 table[MESA_FORMAT_ARGB4444_REV] = unpack_ARGB4444_REV;
1126 table[MESA_FORMAT_RGBA5551] = unpack_RGBA5551;
1127 table[MESA_FORMAT_ARGB1555] = unpack_ARGB1555;
1128 table[MESA_FORMAT_ARGB1555_REV] = unpack_ARGB1555_REV;
1129 table[MESA_FORMAT_AL44] = unpack_AL44;
1130 table[MESA_FORMAT_AL88] = unpack_AL88;
1131 table[MESA_FORMAT_AL88_REV] = unpack_AL88_REV;
1132 table[MESA_FORMAT_AL1616] = unpack_AL1616;
1133 table[MESA_FORMAT_AL1616_REV] = unpack_AL1616_REV;
1134 table[MESA_FORMAT_RGB332] = unpack_RGB332;
1135 table[MESA_FORMAT_A8] = unpack_A8;
1136 table[MESA_FORMAT_A16] = unpack_A16;
1137 table[MESA_FORMAT_L8] = unpack_L8;
1138 table[MESA_FORMAT_L16] = unpack_L16;
1139 table[MESA_FORMAT_I8] = unpack_I8;
1140 table[MESA_FORMAT_I16] = unpack_I16;
1141 table[MESA_FORMAT_YCBCR] = unpack_YCBCR;
1142 table[MESA_FORMAT_YCBCR_REV] = unpack_YCBCR_REV;
1143 table[MESA_FORMAT_R8] = unpack_R8;
1144 table[MESA_FORMAT_RG88] = unpack_RG88;
1145 table[MESA_FORMAT_RG88_REV] = unpack_RG88_REV;
1146 table[MESA_FORMAT_R16] = unpack_R16;
1147 table[MESA_FORMAT_RG1616] = unpack_RG1616;
1148 table[MESA_FORMAT_RG1616_REV] = unpack_RG1616_REV;
1149 table[MESA_FORMAT_ARGB2101010] = unpack_ARGB2101010;
1150 table[MESA_FORMAT_Z24_S8] = unpack_Z24_S8;
1151 table[MESA_FORMAT_S8_Z24] = unpack_S8_Z24;
1152 table[MESA_FORMAT_Z16] = unpack_Z16;
1153 table[MESA_FORMAT_X8_Z24] = unpack_X8_Z24;
1154 table[MESA_FORMAT_Z24_X8] = unpack_Z24_X8;
1155 table[MESA_FORMAT_Z32] = unpack_Z32;
1156 table[MESA_FORMAT_S8] = unpack_S8;
1157 table[MESA_FORMAT_SRGB8] = unpack_SRGB8;
1158 table[MESA_FORMAT_SRGBA8] = unpack_SRGBA8;
1159 table[MESA_FORMAT_SARGB8] = unpack_SARGB8;
1160 table[MESA_FORMAT_SL8] = unpack_SL8;
1161 table[MESA_FORMAT_SLA8] = unpack_SLA8;
1162 table[MESA_FORMAT_SRGB_DXT1] = unpack_SRGB_DXT1;
1163 table[MESA_FORMAT_SRGBA_DXT1] = unpack_SRGBA_DXT1;
1164 table[MESA_FORMAT_SRGBA_DXT3] = unpack_SRGBA_DXT3;
1165 table[MESA_FORMAT_SRGBA_DXT5] = unpack_SRGBA_DXT5;
1166
1167 table[MESA_FORMAT_RGB_FXT1] = unpack_RGB_FXT1;
1168 table[MESA_FORMAT_RGBA_FXT1] = unpack_RGBA_FXT1;
1169 table[MESA_FORMAT_RGB_DXT1] = unpack_RGB_DXT1;
1170 table[MESA_FORMAT_RGBA_DXT1] = unpack_RGBA_DXT1;
1171 table[MESA_FORMAT_RGBA_DXT3] = unpack_RGBA_DXT3;
1172 table[MESA_FORMAT_RGBA_DXT5] = unpack_RGBA_DXT5;
1173
1174 table[MESA_FORMAT_RGBA_FLOAT32] = unpack_RGBA_FLOAT32;
1175 table[MESA_FORMAT_RGBA_FLOAT16] = unpack_RGBA_FLOAT16;
1176 table[MESA_FORMAT_RGB_FLOAT32] = unpack_RGB_FLOAT32;
1177 table[MESA_FORMAT_RGB_FLOAT16] = unpack_RGB_FLOAT16;
1178 table[MESA_FORMAT_ALPHA_FLOAT32] = unpack_ALPHA_FLOAT32;
1179 table[MESA_FORMAT_ALPHA_FLOAT16] = unpack_ALPHA_FLOAT16;
1180 table[MESA_FORMAT_LUMINANCE_FLOAT32] = unpack_LUMINANCE_FLOAT32;
1181 table[MESA_FORMAT_LUMINANCE_FLOAT16] = unpack_LUMINANCE_FLOAT16;
1182 table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = unpack_LUMINANCE_ALPHA_FLOAT32;
1183 table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = unpack_LUMINANCE_ALPHA_FLOAT16;
1184 table[MESA_FORMAT_INTENSITY_FLOAT32] = unpack_INTENSITY_FLOAT32;
1185 table[MESA_FORMAT_INTENSITY_FLOAT16] = unpack_INTENSITY_FLOAT16;
1186 table[MESA_FORMAT_R_FLOAT32] = unpack_R_FLOAT32;
1187 table[MESA_FORMAT_R_FLOAT16] = unpack_R_FLOAT16;
1188 table[MESA_FORMAT_RG_FLOAT32] = unpack_RG_FLOAT32;
1189 table[MESA_FORMAT_RG_FLOAT16] = unpack_RG_FLOAT16;
1190
1191 table[MESA_FORMAT_RGBA_INT8] = unpack_RGBA_INT8;
1192 table[MESA_FORMAT_RGBA_INT16] = unpack_RGBA_INT16;
1193 table[MESA_FORMAT_RGBA_INT32] = unpack_RGBA_INT32;
1194 table[MESA_FORMAT_RGBA_UINT8] = unpack_RGBA_UINT8;
1195 table[MESA_FORMAT_RGBA_UINT16] = unpack_RGBA_UINT16;
1196 table[MESA_FORMAT_RGBA_UINT32] = unpack_RGBA_UINT32;
1197
1198 table[MESA_FORMAT_DUDV8] = unpack_DUDV8;
1199 table[MESA_FORMAT_SIGNED_R8] = unpack_SIGNED_R8;
1200 table[MESA_FORMAT_SIGNED_RG88_REV] = unpack_SIGNED_RG88_REV;
1201 table[MESA_FORMAT_SIGNED_RGBX8888] = unpack_SIGNED_RGBX8888;
1202 table[MESA_FORMAT_SIGNED_RGBA8888] = unpack_SIGNED_RGBA8888;
1203 table[MESA_FORMAT_SIGNED_RGBA8888_REV] = unpack_SIGNED_RGBA8888_REV;
1204 table[MESA_FORMAT_SIGNED_R16] = unpack_SIGNED_R16;
1205 table[MESA_FORMAT_SIGNED_GR1616] = unpack_SIGNED_GR1616;
1206 table[MESA_FORMAT_SIGNED_RGB_16] = unpack_SIGNED_RGB_16;
1207 table[MESA_FORMAT_SIGNED_RGBA_16] = unpack_SIGNED_RGBA_16;
1208 table[MESA_FORMAT_RGBA_16] = unpack_RGBA_16;
1209
1210 table[MESA_FORMAT_RED_RGTC1] = unpack_RED_RGTC1;
1211 table[MESA_FORMAT_SIGNED_RED_RGTC1] = unpack_SIGNED_RED_RGTC1;
1212 table[MESA_FORMAT_RG_RGTC2] = unpack_RG_RGTC2;
1213 table[MESA_FORMAT_SIGNED_RG_RGTC2] = unpack_SIGNED_RG_RGTC2;
1214
1215 table[MESA_FORMAT_L_LATC1] = unpack_L_LATC1;
1216 table[MESA_FORMAT_SIGNED_L_LATC1] = unpack_SIGNED_L_LATC1;
1217 table[MESA_FORMAT_LA_LATC2] = unpack_LA_LATC2;
1218 table[MESA_FORMAT_SIGNED_LA_LATC2] = unpack_SIGNED_LA_LATC2;
1219
1220 table[MESA_FORMAT_SIGNED_A8] = unpack_SIGNED_A8;
1221 table[MESA_FORMAT_SIGNED_L8] = unpack_SIGNED_L8;
1222 table[MESA_FORMAT_SIGNED_AL88] = unpack_SIGNED_AL88;
1223 table[MESA_FORMAT_SIGNED_I8] = unpack_SIGNED_I8;
1224 table[MESA_FORMAT_SIGNED_A16] = unpack_SIGNED_A16;
1225 table[MESA_FORMAT_SIGNED_L16] = unpack_SIGNED_L16;
1226 table[MESA_FORMAT_SIGNED_AL1616] = unpack_SIGNED_AL1616;
1227 table[MESA_FORMAT_SIGNED_I16] = unpack_SIGNED_I16;
1228
1229 table[MESA_FORMAT_RGB9_E5_FLOAT] = unpack_RGB9_E5_FLOAT;
1230 table[MESA_FORMAT_R11_G11_B10_FLOAT] = unpack_R11_G11_B10_FLOAT;
1231
1232 table[MESA_FORMAT_Z32_FLOAT] = unpack_Z32_FLOAT;
1233 table[MESA_FORMAT_Z32_FLOAT_X24S8] = unpack_Z32_FLOAT_X24S8;
1234
1235 initialized = GL_TRUE;
1236 }
1237
1238 return table[format];
1239 }
1240
1241
1242 void
1243 _mesa_unpack_rgba_row(gl_format format, GLuint n,
1244 const void *src, GLfloat dst[][4])
1245 {
1246 unpack_rgba_func unpack = get_unpack_rgba_function(format);
1247 GLuint srcStride = _mesa_get_format_bytes(format);
1248 const GLubyte *srcPtr = (GLubyte *) src;
1249 GLuint i;
1250
1251 for (i = 0; i < n; i++) {
1252 unpack(srcPtr, dst[i]);
1253 srcPtr += srcStride;
1254 }
1255 }
1256
1257
1258
1259 /**
1260 * Unpack a 2D rect of pixels returning float RGBA colors.
1261 * \param format the source image format
1262 * \param src start address of the source image
1263 * \param srcRowStride source image row stride in bytes
1264 * \param dst start address of the dest image
1265 * \param dstRowStride dest image row stride in bytes
1266 * \param x source image start X pos
1267 * \param y source image start Y pos
1268 * \param width width of rect region to convert
1269 * \param height height of rect region to convert
1270 */
1271 void
1272 _mesa_unpack_rgba_block(gl_format format,
1273 const void *src, GLint srcRowStride,
1274 GLfloat dst[][4], GLint dstRowStride,
1275 GLuint x, GLuint y, GLuint width, GLuint height)
1276 {
1277 unpack_rgba_func unpack = get_unpack_rgba_function(format);
1278 const GLuint srcPixStride = _mesa_get_format_bytes(format);
1279 const GLuint dstPixStride = 4 * sizeof(GLfloat);
1280 const GLubyte *srcRow, *srcPix;
1281 GLubyte *dstRow;
1282 GLfloat *dstPix;
1283 GLuint i, j;
1284
1285 /* XXX needs to be fixed for compressed formats */
1286
1287 srcRow = ((const GLubyte *) src) + srcRowStride * y + srcPixStride * x;
1288 dstRow = ((GLubyte *) dst) + dstRowStride * y + dstPixStride * x;
1289
1290 for (i = 0; i < height; i++) {
1291 srcPix = srcRow;
1292 dstPix = (GLfloat *) dstRow;
1293
1294 for (j = 0; j < width; j++) {
1295 unpack(srcPix, dstPix);
1296 srcPix += srcPixStride;
1297 dstPix += dstPixStride;
1298 }
1299
1300 dstRow += dstRowStride;
1301 srcRow += srcRowStride;
1302 }
1303 }
1304
1305
1306
1307
1308 typedef void (*unpack_float_z_func)(const void *src, GLfloat *dst);
1309
1310 static void
1311 unpack_float_z_Z24_S8(const void *src, GLfloat *dst)
1312 {
1313 /* only return Z, not stencil data */
1314 const GLuint s = *((const GLuint *) src);
1315 const GLfloat scale = 1.0F / (GLfloat) 0xffffff;
1316 *dst = (s >> 8) * scale;
1317 ASSERT(*dst >= 0.0F);
1318 ASSERT(*dst <= 1.0F);
1319 }
1320
1321 static void
1322 unpack_float_z_S8_Z24(const void *src, GLfloat *dst)
1323 {
1324 /* only return Z, not stencil data */
1325 const GLuint s = *((const GLuint *) src);
1326 const GLfloat scale = 1.0F / (GLfloat) 0xffffff;
1327 *dst = (s & 0x00ffffff) * scale;
1328 ASSERT(*dst >= 0.0F);
1329 ASSERT(*dst <= 1.0F);
1330 }
1331
1332 static void
1333 unpack_float_z_Z16(const void *src, GLfloat *dst)
1334 {
1335 const GLushort s = *((const GLushort *) src);
1336 *dst = s * (1.0F / 65535.0F);
1337 }
1338
1339 static void
1340 unpack_float_z_X8_Z24(const void *src, GLfloat *dst)
1341 {
1342 unpack_float_z_S8_Z24(src, dst);
1343 }
1344
1345 static void
1346 unpack_float_z_Z24_X8(const void *src, GLfloat *dst)
1347 {
1348 unpack_float_z_Z24_S8(src, dst);
1349 }
1350
1351 static void
1352 unpack_float_z_Z32(const void *src, GLfloat *dst)
1353 {
1354 const GLuint s = *((const GLuint *) src);
1355 *dst = s * (1.0F / 0xffffffff);
1356 }
1357
1358 static void
1359 unpack_float_z_Z32X24S8(const void *src, GLfloat *dst)
1360 {
1361 *dst = *((const GLfloat *) src);
1362 }
1363
1364
1365
1366 void
1367 _mesa_unpack_float_z_row(gl_format format, GLuint n,
1368 const void *src, GLfloat *dst)
1369 {
1370 unpack_float_z_func unpack;
1371 GLuint srcStride = _mesa_get_format_bytes(format);
1372 const GLubyte *srcPtr = (GLubyte *) src;
1373 GLuint i;
1374
1375 switch (format) {
1376 case MESA_FORMAT_Z24_S8:
1377 unpack = unpack_float_z_Z24_S8;
1378 break;
1379 case MESA_FORMAT_S8_Z24:
1380 unpack = unpack_float_z_S8_Z24;
1381 break;
1382 case MESA_FORMAT_Z16:
1383 unpack = unpack_float_z_Z16;
1384 break;
1385 case MESA_FORMAT_X8_Z24:
1386 unpack = unpack_float_z_X8_Z24;
1387 break;
1388 case MESA_FORMAT_Z24_X8:
1389 unpack = unpack_float_z_Z24_X8;
1390 break;
1391 case MESA_FORMAT_Z32:
1392 unpack = unpack_float_z_Z32;
1393 break;
1394 case MESA_FORMAT_Z32_FLOAT_X24S8:
1395 unpack = unpack_float_z_Z32X24S8;
1396 break;
1397 default:
1398 _mesa_problem(NULL, "bad format %s in _mesa_unpack_float_z_row",
1399 _mesa_get_format_name(format));
1400 return;
1401 }
1402
1403 for (i = 0; i < n; i++) {
1404 unpack(srcPtr, &dst[i]);
1405 srcPtr += srcStride;
1406 }
1407 }
1408
1409
1410
1411 typedef void (*unpack_uint_z_func)(const void *src, GLuint *dst);
1412
1413 static void
1414 unpack_uint_z_Z24_S8(const void *src, GLuint *dst)
1415 {
1416 /* only return Z, not stencil data */
1417 const GLuint s = *((const GLuint *) src);
1418 *dst = (s >> 8);
1419 }
1420
1421 static void
1422 unpack_uint_z_S8_Z24(const void *src, GLuint *dst)
1423 {
1424 /* only return Z, not stencil data */
1425 const GLuint s = *((const GLuint *) src);
1426 *dst = s & 0x00ffffff;
1427 }
1428
1429 static void
1430 unpack_uint_z_Z16(const void *src, GLuint *dst)
1431 {
1432 *dst = *((const GLushort *) src);
1433 }
1434
1435 static void
1436 unpack_uint_z_X8_Z24(const void *src, GLuint *dst)
1437 {
1438 unpack_uint_z_S8_Z24(src, dst);
1439 }
1440
1441 static void
1442 unpack_uint_z_Z24_X8(const void *src, GLuint *dst)
1443 {
1444 unpack_uint_z_Z24_S8(src, dst);
1445 }
1446
1447 static void
1448 unpack_uint_z_Z32(const void *src, GLuint *dst)
1449 {
1450 *dst = *((const GLuint *) src);
1451 }
1452
1453
1454 void
1455 _mesa_unpack_uint_z_row(gl_format format, GLuint n,
1456 const void *src, GLuint *dst)
1457 {
1458 unpack_uint_z_func unpack;
1459 GLuint srcStride = _mesa_get_format_bytes(format);
1460 const GLubyte *srcPtr = (GLubyte *) src;
1461 GLuint i;
1462
1463 switch (format) {
1464 case MESA_FORMAT_Z24_S8:
1465 unpack = unpack_uint_z_Z24_S8;
1466 break;
1467 case MESA_FORMAT_S8_Z24:
1468 unpack = unpack_uint_z_S8_Z24;
1469 break;
1470 case MESA_FORMAT_Z16:
1471 unpack = unpack_uint_z_Z16;
1472 break;
1473 case MESA_FORMAT_X8_Z24:
1474 unpack = unpack_uint_z_X8_Z24;
1475 break;
1476 case MESA_FORMAT_Z24_X8:
1477 unpack = unpack_uint_z_Z24_X8;
1478 break;
1479 case MESA_FORMAT_Z32:
1480 unpack = unpack_uint_z_Z32;
1481 break;
1482 default:
1483 _mesa_problem(NULL, "bad format %s in _mesa_unpack_uint_z_row",
1484 _mesa_get_format_name(format));
1485 return;
1486 }
1487
1488 for (i = 0; i < n; i++) {
1489 unpack(srcPtr, &dst[i]);
1490 srcPtr += srcStride;
1491 }
1492 }
1493
1494