0ab6940144b5ae05ead7d263533fcf5c542ba308
[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], GLuint n);
61
62
63 static void
64 unpack_RGBA8888(const void *src, GLfloat dst[][4], GLuint n)
65 {
66 const GLuint *s = ((const GLuint *) src);
67 GLuint i;
68 for (i = 0; i < n; i++) {
69 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
70 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
71 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
72 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
73 }
74 }
75
76 static void
77 unpack_RGBA8888_REV(const void *src, GLfloat dst[][4], GLuint n)
78 {
79 const GLuint *s = ((const GLuint *) src);
80 GLuint i;
81 for (i = 0; i < n; i++) {
82 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
83 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
84 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
85 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
86 }
87 }
88
89 static void
90 unpack_ARGB8888(const void *src, GLfloat dst[][4], GLuint n)
91 {
92 const GLuint *s = ((const GLuint *) src);
93 GLuint i;
94 for (i = 0; i < n; i++) {
95 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
96 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
97 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
98 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
99 }
100 }
101
102 static void
103 unpack_ARGB8888_REV(const void *src, GLfloat dst[][4], GLuint n)
104 {
105 const GLuint *s = ((const GLuint *) src);
106 GLuint i;
107 for (i = 0; i < n; i++) {
108 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
109 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
110 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
111 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
112 }
113 }
114
115 static void
116 unpack_RGBX8888(const void *src, GLfloat dst[][4], GLuint n)
117 {
118 const GLuint *s = ((const GLuint *) src);
119 GLuint i;
120 for (i = 0; i < n; i++) {
121 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
122 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
123 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
124 dst[i][ACOMP] = 1.0f;
125 }
126 }
127
128 static void
129 unpack_RGBX8888_REV(const void *src, GLfloat dst[][4], GLuint n)
130 {
131 const GLuint *s = ((const GLuint *) src);
132 GLuint i;
133 for (i = 0; i < n; i++) {
134 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
135 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
136 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
137 dst[i][ACOMP] = 1.0f;
138 }
139 }
140
141 static void
142 unpack_XRGB8888(const void *src, GLfloat dst[][4], GLuint n)
143 {
144 const GLuint *s = ((const GLuint *) src);
145 GLuint i;
146 for (i = 0; i < n; i++) {
147 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
148 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
149 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
150 dst[i][ACOMP] = 1.0f;
151 }
152 }
153
154 static void
155 unpack_XRGB8888_REV(const void *src, GLfloat dst[][4], GLuint n)
156 {
157 const GLuint *s = ((const GLuint *) src);
158 GLuint i;
159 for (i = 0; i < n; i++) {
160 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
161 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
162 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
163 dst[i][ACOMP] = 1.0f;
164 }
165 }
166
167 static void
168 unpack_RGB888(const void *src, GLfloat dst[][4], GLuint n)
169 {
170 const GLubyte *s = (const GLubyte *) src;
171 GLuint i;
172 for (i = 0; i < n; i++) {
173 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i*3+2] );
174 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i*3+1] );
175 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i*3+0] );
176 dst[i][ACOMP] = 1.0F;
177 }
178 }
179
180 static void
181 unpack_BGR888(const void *src, GLfloat dst[][4], GLuint n)
182 {
183 const GLubyte *s = (const GLubyte *) src;
184 GLuint i;
185 for (i = 0; i < n; i++) {
186 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i*3+0] );
187 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i*3+1] );
188 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i*3+2] );
189 dst[i][ACOMP] = 1.0F;
190 }
191 }
192
193 static void
194 unpack_RGB565(const void *src, GLfloat dst[][4], GLuint n)
195 {
196 const GLushort *s = ((const GLushort *) src);
197 GLuint i;
198 for (i = 0; i < n; i++) {
199 dst[i][RCOMP] = ((s[i] >> 11) & 0x1f) * (1.0F / 31.0F);
200 dst[i][GCOMP] = ((s[i] >> 5 ) & 0x3f) * (1.0F / 63.0F);
201 dst[i][BCOMP] = ((s[i] ) & 0x1f) * (1.0F / 31.0F);
202 dst[i][ACOMP] = 1.0F;
203 }
204 }
205
206 static void
207 unpack_RGB565_REV(const void *src, GLfloat dst[][4], GLuint n)
208 {
209 const GLushort *s = ((const GLushort *) src);
210 GLuint i;
211 for (i = 0; i < n; i++) {
212 GLuint t = (s[i] >> 8) | (s[i] << 8); /* byte swap */
213 dst[i][RCOMP] = UBYTE_TO_FLOAT( ((t >> 8) & 0xf8) | ((t >> 13) & 0x7) );
214 dst[i][GCOMP] = UBYTE_TO_FLOAT( ((t >> 3) & 0xfc) | ((t >> 9) & 0x3) );
215 dst[i][BCOMP] = UBYTE_TO_FLOAT( ((t << 3) & 0xf8) | ((t >> 2) & 0x7) );
216 dst[i][ACOMP] = 1.0F;
217 }
218 }
219
220 static void
221 unpack_ARGB4444(const void *src, GLfloat dst[][4], GLuint n)
222 {
223 const GLushort *s = ((const GLushort *) src);
224 GLuint i;
225 for (i = 0; i < n; i++) {
226 dst[i][RCOMP] = ((s[i] >> 8) & 0xf) * (1.0F / 15.0F);
227 dst[i][GCOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
228 dst[i][BCOMP] = ((s[i] ) & 0xf) * (1.0F / 15.0F);
229 dst[i][ACOMP] = ((s[i] >> 12) & 0xf) * (1.0F / 15.0F);
230 }
231 }
232
233 static void
234 unpack_ARGB4444_REV(const void *src, GLfloat dst[][4], GLuint n)
235 {
236 const GLushort *s = ((const GLushort *) src);
237 GLuint i;
238 for (i = 0; i < n; i++) {
239 dst[i][RCOMP] = ((s[i] ) & 0xf) * (1.0F / 15.0F);
240 dst[i][GCOMP] = ((s[i] >> 12) & 0xf) * (1.0F / 15.0F);
241 dst[i][BCOMP] = ((s[i] >> 8) & 0xf) * (1.0F / 15.0F);
242 dst[i][ACOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
243 }
244 }
245
246 static void
247 unpack_RGBA5551(const void *src, GLfloat dst[][4], GLuint n)
248 {
249 const GLushort *s = ((const GLushort *) src);
250 GLuint i;
251 for (i = 0; i < n; i++) {
252 dst[i][RCOMP] = ((s[i] >> 11) & 0x1f) * (1.0F / 31.0F);
253 dst[i][GCOMP] = ((s[i] >> 6) & 0x1f) * (1.0F / 31.0F);
254 dst[i][BCOMP] = ((s[i] >> 1) & 0x1f) * (1.0F / 31.0F);
255 dst[i][ACOMP] = ((s[i] ) & 0x01) * 1.0F;
256 }
257 }
258
259 static void
260 unpack_ARGB1555(const void *src, GLfloat dst[][4], GLuint n)
261 {
262 const GLushort *s = ((const GLushort *) src);
263 GLuint i;
264 for (i = 0; i < n; i++) {
265 dst[i][RCOMP] = ((s[i] >> 10) & 0x1f) * (1.0F / 31.0F);
266 dst[i][GCOMP] = ((s[i] >> 5) & 0x1f) * (1.0F / 31.0F);
267 dst[i][BCOMP] = ((s[i] >> 0) & 0x1f) * (1.0F / 31.0F);
268 dst[i][ACOMP] = ((s[i] >> 15) & 0x01) * 1.0F;
269 }
270 }
271
272 static void
273 unpack_ARGB1555_REV(const void *src, GLfloat dst[][4], GLuint n)
274 {
275 const GLushort *s = ((const GLushort *) src);
276 GLuint i;
277 for (i = 0; i < n; i++) {
278 dst[i][RCOMP] = UBYTE_TO_FLOAT( ((s[i] >> 7) & 0xf8) | ((s[i] >> 12) & 0x7) );
279 dst[i][GCOMP] = UBYTE_TO_FLOAT( ((s[i] >> 2) & 0xf8) | ((s[i] >> 7) & 0x7) );
280 dst[i][BCOMP] = UBYTE_TO_FLOAT( ((s[i] << 3) & 0xf8) | ((s[i] >> 2) & 0x7) );
281 dst[i][ACOMP] = UBYTE_TO_FLOAT( ((s[i] >> 15) & 0x01) * 255 );
282 }
283 }
284
285 static void
286 unpack_AL44(const void *src, GLfloat dst[][4], GLuint n)
287 {
288 const GLubyte *s = ((const GLubyte *) src);
289 GLuint i;
290 for (i = 0; i < n; i++) {
291 dst[i][RCOMP] =
292 dst[i][GCOMP] =
293 dst[i][BCOMP] = (s[i] & 0xf) * (1.0F / 15.0F);
294 dst[i][ACOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
295 }
296 }
297
298 static void
299 unpack_AL88(const void *src, GLfloat dst[][4], GLuint n)
300 {
301 const GLushort *s = ((const GLushort *) src);
302 GLuint i;
303 for (i = 0; i < n; i++) {
304 dst[i][RCOMP] =
305 dst[i][GCOMP] =
306 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
307 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
308 }
309 }
310
311 static void
312 unpack_AL88_REV(const void *src, GLfloat dst[][4], GLuint n)
313 {
314 const GLushort *s = ((const GLushort *) src);
315 GLuint i;
316 for (i = 0; i < n; i++) {
317 dst[i][RCOMP] =
318 dst[i][GCOMP] =
319 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
320 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
321 }
322 }
323
324 static void
325 unpack_AL1616(const void *src, GLfloat dst[][4], GLuint n)
326 {
327 const GLuint *s = ((const GLuint *) src);
328 GLuint i;
329 for (i = 0; i < n; i++) {
330 dst[i][RCOMP] =
331 dst[i][GCOMP] =
332 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
333 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
334 }
335 }
336
337 static void
338 unpack_AL1616_REV(const void *src, GLfloat dst[][4], GLuint n)
339 {
340 const GLuint *s = ((const GLuint *) src);
341 GLuint i;
342 for (i = 0; i < n; i++) {
343 dst[i][RCOMP] =
344 dst[i][GCOMP] =
345 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
346 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
347 }
348 }
349
350 static void
351 unpack_RGB332(const void *src, GLfloat dst[][4], GLuint n)
352 {
353 const GLubyte *s = ((const GLubyte *) src);
354 GLuint i;
355 for (i = 0; i < n; i++) {
356 dst[i][RCOMP] = ((s[i] >> 5) & 0x7) * (1.0F / 7.0F);
357 dst[i][GCOMP] = ((s[i] >> 2) & 0x7) * (1.0F / 7.0F);
358 dst[i][BCOMP] = ((s[i] ) & 0x3) * (1.0F / 3.0F);
359 dst[i][ACOMP] = 1.0F;
360 }
361 }
362
363
364 static void
365 unpack_A8(const void *src, GLfloat dst[][4], GLuint n)
366 {
367 const GLubyte *s = ((const GLubyte *) src);
368 GLuint i;
369 for (i = 0; i < n; i++) {
370 dst[i][RCOMP] =
371 dst[i][GCOMP] =
372 dst[i][BCOMP] = 0.0F;
373 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i]);
374 }
375 }
376
377 static void
378 unpack_A16(const void *src, GLfloat dst[][4], GLuint n)
379 {
380 const GLushort *s = ((const GLushort *) src);
381 GLuint i;
382 for (i = 0; i < n; i++) {
383 dst[i][RCOMP] =
384 dst[i][GCOMP] =
385 dst[i][BCOMP] = 0.0F;
386 dst[i][ACOMP] = USHORT_TO_FLOAT(s[i]);
387 }
388 }
389
390 static void
391 unpack_L8(const void *src, GLfloat dst[][4], GLuint n)
392 {
393 const GLubyte *s = ((const GLubyte *) src);
394 GLuint i;
395 for (i = 0; i < n; i++) {
396 dst[i][RCOMP] =
397 dst[i][GCOMP] =
398 dst[i][BCOMP] = UBYTE_TO_FLOAT(s[i]);
399 dst[i][ACOMP] = 1.0F;
400 }
401 }
402
403 static void
404 unpack_L16(const void *src, GLfloat dst[][4], GLuint n)
405 {
406 const GLushort *s = ((const GLushort *) src);
407 GLuint i;
408 for (i = 0; i < n; i++) {
409 dst[i][RCOMP] =
410 dst[i][GCOMP] =
411 dst[i][BCOMP] = USHORT_TO_FLOAT(s[i]);
412 dst[i][ACOMP] = 1.0F;
413 }
414 }
415
416 static void
417 unpack_I8(const void *src, GLfloat dst[][4], GLuint n)
418 {
419 const GLubyte *s = ((const GLubyte *) src);
420 GLuint i;
421 for (i = 0; i < n; i++) {
422 dst[i][RCOMP] =
423 dst[i][GCOMP] =
424 dst[i][BCOMP] =
425 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i]);
426 }
427 }
428
429 static void
430 unpack_I16(const void *src, GLfloat dst[][4], GLuint n)
431 {
432 const GLushort *s = ((const GLushort *) src);
433 GLuint i;
434 for (i = 0; i < n; i++) {
435 dst[i][RCOMP] =
436 dst[i][GCOMP] =
437 dst[i][BCOMP] =
438 dst[i][ACOMP] = USHORT_TO_FLOAT(s[i]);
439 }
440 }
441
442 static void
443 unpack_YCBCR(const void *src, GLfloat dst[][4], GLuint n)
444 {
445 GLuint i;
446 for (i = 0; i < n; i++) {
447 const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
448 const GLushort *src1 = src0 + 1; /* odd */
449 const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */
450 const GLubyte cb = *src0 & 0xff; /* chroma U */
451 const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */
452 const GLubyte cr = *src1 & 0xff; /* chroma V */
453 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
454 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
455 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
456 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
457 r *= (1.0F / 255.0F);
458 g *= (1.0F / 255.0F);
459 b *= (1.0F / 255.0F);
460 dst[i][RCOMP] = CLAMP(r, 0.0F, 1.0F);
461 dst[i][GCOMP] = CLAMP(g, 0.0F, 1.0F);
462 dst[i][BCOMP] = CLAMP(b, 0.0F, 1.0F);
463 dst[i][ACOMP] = 1.0F;
464 }
465 }
466
467 static void
468 unpack_YCBCR_REV(const void *src, GLfloat dst[][4], GLuint n)
469 {
470 GLuint i;
471 for (i = 0; i < n; i++) {
472 const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
473 const GLushort *src1 = src0 + 1; /* odd */
474 const GLubyte y0 = *src0 & 0xff; /* luminance */
475 const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */
476 const GLubyte y1 = *src1 & 0xff; /* luminance */
477 const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */
478 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
479 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
480 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
481 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
482 r *= (1.0F / 255.0F);
483 g *= (1.0F / 255.0F);
484 b *= (1.0F / 255.0F);
485 dst[i][RCOMP] = CLAMP(r, 0.0F, 1.0F);
486 dst[i][GCOMP] = CLAMP(g, 0.0F, 1.0F);
487 dst[i][BCOMP] = CLAMP(b, 0.0F, 1.0F);
488 dst[i][ACOMP] = 1.0F;
489 }
490 }
491
492 static void
493 unpack_R8(const void *src, GLfloat dst[][4], GLuint n)
494 {
495 const GLubyte *s = ((const GLubyte *) src);
496 GLuint i;
497 for (i = 0; i < n; i++) {
498 dst[i][0] = UBYTE_TO_FLOAT(s[i]);
499 dst[i][1] =
500 dst[i][2] = 0.0F;
501 dst[i][3] = 1.0F;
502 }
503 }
504
505 static void
506 unpack_RG88(const void *src, GLfloat dst[][4], GLuint n)
507 {
508 const GLushort *s = ((const GLushort *) src);
509 GLuint i;
510 for (i = 0; i < n; i++) {
511 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
512 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
513 dst[i][BCOMP] = 0.0;
514 dst[i][ACOMP] = 1.0;
515 }
516 }
517
518 static void
519 unpack_RG88_REV(const void *src, GLfloat dst[][4], GLuint n)
520 {
521 const GLushort *s = ((const GLushort *) src);
522 GLuint i;
523 for (i = 0; i < n; i++) {
524 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
525 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
526 dst[i][BCOMP] = 0.0;
527 dst[i][ACOMP] = 1.0;
528 }
529 }
530
531 static void
532 unpack_R16(const void *src, GLfloat dst[][4], GLuint n)
533 {
534 const GLushort *s = ((const GLushort *) src);
535 GLuint i;
536 for (i = 0; i < n; i++) {
537 dst[i][RCOMP] = USHORT_TO_FLOAT(s[i]);
538 dst[i][GCOMP] = 0.0;
539 dst[i][BCOMP] = 0.0;
540 dst[i][ACOMP] = 1.0;
541 }
542 }
543
544 static void
545 unpack_RG1616(const void *src, GLfloat dst[][4], GLuint n)
546 {
547 const GLuint *s = ((const GLuint *) src);
548 GLuint i;
549 for (i = 0; i < n; i++) {
550 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
551 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
552 dst[i][BCOMP] = 0.0;
553 dst[i][ACOMP] = 1.0;
554 }
555 }
556
557 static void
558 unpack_RG1616_REV(const void *src, GLfloat dst[][4], GLuint n)
559 {
560 const GLuint *s = ((const GLuint *) src);
561 GLuint i;
562 for (i = 0; i < n; i++) {
563 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
564 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
565 dst[i][BCOMP] = 0.0;
566 dst[i][ACOMP] = 1.0;
567 }
568 }
569
570 static void
571 unpack_ARGB2101010(const void *src, GLfloat dst[][4], GLuint n)
572 {
573 const GLuint *s = ((const GLuint *) src);
574 GLuint i;
575 for (i = 0; i < n; i++) {
576 dst[i][RCOMP] = ((s[i] >> 20) & 0x3ff) * (1.0F / 1023.0F);
577 dst[i][GCOMP] = ((s[i] >> 10) & 0x3ff) * (1.0F / 1023.0F);
578 dst[i][BCOMP] = ((s[i] >> 0) & 0x3ff) * (1.0F / 1023.0F);
579 dst[i][ACOMP] = ((s[i] >> 30) & 0x03) * (1.0F / 3.0F);
580 }
581 }
582
583
584 static void
585 unpack_Z24_S8(const void *src, GLfloat dst[][4], GLuint n)
586 {
587 /* only return Z, not stencil data */
588 const GLuint *s = ((const GLuint *) src);
589 const GLfloat scale = 1.0F / (GLfloat) 0xffffff;
590 GLuint i;
591 for (i = 0; i < n; i++) {
592 dst[i][0] =
593 dst[i][1] =
594 dst[i][2] = (s[i] >> 8) * scale;
595 dst[i][3] = 1.0F;
596 ASSERT(dst[i][0] >= 0.0F);
597 ASSERT(dst[i][0] <= 1.0F);
598 }
599 }
600
601 static void
602 unpack_S8_Z24(const void *src, GLfloat dst[][4], GLuint n)
603 {
604 /* only return Z, not stencil data */
605 const GLuint *s = ((const GLuint *) src);
606 const GLfloat scale = 1.0F / (GLfloat) 0xffffff;
607 GLuint i;
608 for (i = 0; i < n; i++) {
609 dst[i][0] =
610 dst[i][1] =
611 dst[i][2] = (s[i] & 0x00ffffff) * scale;
612 dst[i][3] = 1.0F;
613 ASSERT(dst[i][0] >= 0.0F);
614 ASSERT(dst[i][0] <= 1.0F);
615 }
616 }
617
618 static void
619 unpack_Z16(const void *src, GLfloat dst[][4], GLuint n)
620 {
621 const GLushort *s = ((const GLushort *) src);
622 GLuint i;
623 for (i = 0; i < n; i++) {
624 dst[i][0] =
625 dst[i][1] =
626 dst[i][2] = s[i] * (1.0F / 65535.0F);
627 dst[i][3] = 1.0F;
628 }
629 }
630
631 static void
632 unpack_X8_Z24(const void *src, GLfloat dst[][4], GLuint n)
633 {
634 unpack_S8_Z24(src, dst, n);
635 }
636
637 static void
638 unpack_Z24_X8(const void *src, GLfloat dst[][4], GLuint n)
639 {
640 unpack_Z24_S8(src, dst, n);
641 }
642
643 static void
644 unpack_Z32(const void *src, GLfloat dst[][4], GLuint n)
645 {
646 const GLuint *s = ((const GLuint *) src);
647 GLuint i;
648 for (i = 0; i < n; i++) {
649 dst[i][0] =
650 dst[i][1] =
651 dst[i][2] = s[i] * (1.0F / 0xffffffff);
652 dst[i][3] = 1.0F;
653 }
654 }
655
656 static void
657 unpack_Z32_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
658 {
659 const GLfloat *s = ((const GLfloat *) src);
660 GLuint i;
661 for (i = 0; i < n; i++) {
662 dst[i][0] =
663 dst[i][1] =
664 dst[i][2] = s[i * 2];
665 dst[i][3] = 1.0F;
666 }
667 }
668
669 static void
670 unpack_Z32_FLOAT_X24S8(const void *src, GLfloat dst[][4], GLuint n)
671 {
672 const GLfloat *s = ((const GLfloat *) src);
673 GLuint i;
674 for (i = 0; i < n; i++) {
675 dst[i][0] =
676 dst[i][1] =
677 dst[i][2] = s[i];
678 dst[i][3] = 1.0F;
679 }
680 }
681
682
683 static void
684 unpack_S8(const void *src, GLfloat dst[][4], GLuint n)
685 {
686 /* should never be used */
687 GLuint i;
688 for (i = 0; i < n; i++) {
689 dst[i][0] =
690 dst[i][1] =
691 dst[i][2] = 0.0F;
692 dst[i][3] = 1.0F;
693 }
694 }
695
696
697 static void
698 unpack_SRGB8(const void *src, GLfloat dst[][4], GLuint n)
699 {
700 const GLubyte *s = (const GLubyte *) src;
701 GLuint i;
702 for (i = 0; i < n; i++) {
703 dst[i][RCOMP] = nonlinear_to_linear(s[i*3+2]);
704 dst[i][GCOMP] = nonlinear_to_linear(s[i*3+1]);
705 dst[i][BCOMP] = nonlinear_to_linear(s[i*3+0]);
706 dst[i][ACOMP] = 1.0F;
707 }
708 }
709
710 static void
711 unpack_SRGBA8(const void *src, GLfloat dst[][4], GLuint n)
712 {
713 const GLuint *s = ((const GLuint *) src);
714 GLuint i;
715 for (i = 0; i < n; i++) {
716 dst[i][RCOMP] = nonlinear_to_linear( (s[i] >> 24) );
717 dst[i][GCOMP] = nonlinear_to_linear( (s[i] >> 16) & 0xff );
718 dst[i][BCOMP] = nonlinear_to_linear( (s[i] >> 8) & 0xff );
719 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] & 0xff ); /* linear! */
720 }
721 }
722
723 static void
724 unpack_SARGB8(const void *src, GLfloat dst[][4], GLuint n)
725 {
726 const GLuint *s = ((const GLuint *) src);
727 GLuint i;
728 for (i = 0; i < n; i++) {
729 dst[i][RCOMP] = nonlinear_to_linear( (s[i] >> 16) & 0xff );
730 dst[i][GCOMP] = nonlinear_to_linear( (s[i] >> 8) & 0xff );
731 dst[i][BCOMP] = nonlinear_to_linear( (s[i] ) & 0xff );
732 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 24 ); /* linear! */
733 }
734 }
735
736 static void
737 unpack_SL8(const void *src, GLfloat dst[][4], GLuint n)
738 {
739 const GLubyte *s = ((const GLubyte *) src);
740 GLuint i;
741 for (i = 0; i < n; i++) {
742 dst[i][RCOMP] =
743 dst[i][GCOMP] =
744 dst[i][BCOMP] = nonlinear_to_linear(s[i]);
745 dst[i][ACOMP] = 1.0F;
746 }
747 }
748
749 static void
750 unpack_SLA8(const void *src, GLfloat dst[][4], GLuint n)
751 {
752 const GLubyte *s = (const GLubyte *) src;
753 GLuint i;
754 for (i = 0; i < n; i++) {
755 dst[i][RCOMP] =
756 dst[i][GCOMP] =
757 dst[i][BCOMP] = nonlinear_to_linear(s[i*2+0]);
758 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i*2+1]); /* linear! */
759 }
760 }
761
762 static void
763 unpack_SRGB_DXT1(const void *src, GLfloat dst[][4], GLuint n)
764 {
765 }
766
767 static void
768 unpack_SRGBA_DXT1(const void *src, GLfloat dst[][4], GLuint n)
769 {
770 }
771
772 static void
773 unpack_SRGBA_DXT3(const void *src, GLfloat dst[][4], GLuint n)
774 {
775 }
776
777 static void
778 unpack_SRGBA_DXT5(const void *src, GLfloat dst[][4], GLuint n)
779 {
780 }
781
782 static void
783 unpack_RGB_FXT1(const void *src, GLfloat dst[][4], GLuint n)
784 {
785 }
786
787 static void
788 unpack_RGBA_FXT1(const void *src, GLfloat dst[][4], GLuint n)
789 {
790 }
791
792 static void
793 unpack_RGB_DXT1(const void *src, GLfloat dst[][4], GLuint n)
794 {
795 }
796
797 static void
798 unpack_RGBA_DXT1(const void *src, GLfloat dst[][4], GLuint n)
799 {
800 }
801
802 static void
803 unpack_RGBA_DXT3(const void *src, GLfloat dst[][4], GLuint n)
804 {
805 }
806
807 static void
808 unpack_RGBA_DXT5(const void *src, GLfloat dst[][4], GLuint n)
809 {
810 }
811
812
813 static void
814 unpack_RGBA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
815 {
816 const GLfloat *s = (const GLfloat *) src;
817 GLuint i;
818 for (i = 0; i < n; i++) {
819 dst[i][RCOMP] = s[i*4+0];
820 dst[i][GCOMP] = s[i*4+1];
821 dst[i][BCOMP] = s[i*4+2];
822 dst[i][ACOMP] = s[i*4+3];
823 }
824 }
825
826 static void
827 unpack_RGBA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
828 {
829 const GLhalfARB *s = (const GLhalfARB *) src;
830 GLuint i;
831 for (i = 0; i < n; i++) {
832 dst[i][RCOMP] = _mesa_half_to_float(s[i*4+0]);
833 dst[i][GCOMP] = _mesa_half_to_float(s[i*4+1]);
834 dst[i][BCOMP] = _mesa_half_to_float(s[i*4+2]);
835 dst[i][ACOMP] = _mesa_half_to_float(s[i*4+3]);
836 }
837 }
838
839 static void
840 unpack_RGB_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
841 {
842 const GLfloat *s = (const GLfloat *) src;
843 GLuint i;
844 for (i = 0; i < n; i++) {
845 dst[i][RCOMP] = s[i*3+0];
846 dst[i][GCOMP] = s[i*3+1];
847 dst[i][BCOMP] = s[i*3+2];
848 dst[i][ACOMP] = 1.0F;
849 }
850 }
851
852 static void
853 unpack_RGB_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
854 {
855 const GLhalfARB *s = (const GLhalfARB *) src;
856 GLuint i;
857 for (i = 0; i < n; i++) {
858 dst[i][RCOMP] = _mesa_half_to_float(s[i*3+0]);
859 dst[i][GCOMP] = _mesa_half_to_float(s[i*3+1]);
860 dst[i][BCOMP] = _mesa_half_to_float(s[i*3+2]);
861 dst[i][ACOMP] = 1.0F;
862 }
863 }
864
865 static void
866 unpack_ALPHA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
867 {
868 const GLfloat *s = (const GLfloat *) src;
869 GLuint i;
870 for (i = 0; i < n; i++) {
871 dst[i][RCOMP] =
872 dst[i][GCOMP] =
873 dst[i][BCOMP] = 0.0F;
874 dst[i][ACOMP] = s[i];
875 }
876 }
877
878 static void
879 unpack_ALPHA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
880 {
881 const GLhalfARB *s = (const GLhalfARB *) src;
882 GLuint i;
883 for (i = 0; i < n; i++) {
884 dst[i][RCOMP] =
885 dst[i][GCOMP] =
886 dst[i][BCOMP] = 0.0F;
887 dst[i][ACOMP] = _mesa_half_to_float(s[i]);
888 }
889 }
890
891 static void
892 unpack_LUMINANCE_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
893 {
894 const GLfloat *s = (const GLfloat *) src;
895 GLuint i;
896 for (i = 0; i < n; i++) {
897 dst[i][RCOMP] =
898 dst[i][GCOMP] =
899 dst[i][BCOMP] = s[i];
900 dst[i][ACOMP] = 1.0F;
901 }
902 }
903
904 static void
905 unpack_LUMINANCE_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
906 {
907 const GLhalfARB *s = (const GLhalfARB *) src;
908 GLuint i;
909 for (i = 0; i < n; i++) {
910 dst[i][RCOMP] =
911 dst[i][GCOMP] =
912 dst[i][BCOMP] = _mesa_half_to_float(s[i]);
913 dst[i][ACOMP] = 1.0F;
914 }
915 }
916
917 static void
918 unpack_LUMINANCE_ALPHA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
919 {
920 const GLfloat *s = (const GLfloat *) src;
921 GLuint i;
922 for (i = 0; i < n; i++) {
923 dst[i][RCOMP] =
924 dst[i][GCOMP] =
925 dst[i][BCOMP] = s[i*2+0];
926 dst[i][ACOMP] = s[i*2+1];
927 }
928 }
929
930 static void
931 unpack_LUMINANCE_ALPHA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
932 {
933 const GLhalfARB *s = (const GLhalfARB *) src;
934 GLuint i;
935 for (i = 0; i < n; i++) {
936 dst[i][RCOMP] =
937 dst[i][GCOMP] =
938 dst[i][BCOMP] = _mesa_half_to_float(s[i*2+0]);
939 dst[i][ACOMP] = _mesa_half_to_float(s[i*2+1]);
940 }
941 }
942
943 static void
944 unpack_INTENSITY_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
945 {
946 const GLfloat *s = (const GLfloat *) src;
947 GLuint i;
948 for (i = 0; i < n; i++) {
949 dst[i][RCOMP] =
950 dst[i][GCOMP] =
951 dst[i][BCOMP] =
952 dst[i][ACOMP] = s[i];
953 }
954 }
955
956 static void
957 unpack_INTENSITY_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
958 {
959 const GLhalfARB *s = (const GLhalfARB *) src;
960 GLuint i;
961 for (i = 0; i < n; i++) {
962 dst[i][RCOMP] =
963 dst[i][GCOMP] =
964 dst[i][BCOMP] =
965 dst[i][ACOMP] = _mesa_half_to_float(s[i]);
966 }
967 }
968
969 static void
970 unpack_R_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
971 {
972 const GLfloat *s = (const GLfloat *) src;
973 GLuint i;
974 for (i = 0; i < n; i++) {
975 dst[i][RCOMP] = s[i];
976 dst[i][GCOMP] = 0.0F;
977 dst[i][BCOMP] = 0.0F;
978 dst[i][ACOMP] = 1.0F;
979 }
980 }
981
982 static void
983 unpack_R_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
984 {
985 const GLhalfARB *s = (const GLhalfARB *) src;
986 GLuint i;
987 for (i = 0; i < n; i++) {
988 dst[i][RCOMP] = _mesa_half_to_float(s[i]);
989 dst[i][GCOMP] = 0.0F;
990 dst[i][BCOMP] = 0.0F;
991 dst[i][ACOMP] = 1.0F;
992 }
993 }
994
995 static void
996 unpack_RG_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
997 {
998 const GLfloat *s = (const GLfloat *) src;
999 GLuint i;
1000 for (i = 0; i < n; i++) {
1001 dst[i][RCOMP] = s[i*2+0];
1002 dst[i][GCOMP] = s[i*2+1];
1003 dst[i][BCOMP] = 0.0F;
1004 dst[i][ACOMP] = 1.0F;
1005 }
1006 }
1007
1008 static void
1009 unpack_RG_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
1010 {
1011 const GLhalfARB *s = (const GLhalfARB *) src;
1012 GLuint i;
1013 for (i = 0; i < n; i++) {
1014 dst[i][RCOMP] = _mesa_half_to_float(s[i*2+0]);
1015 dst[i][GCOMP] = _mesa_half_to_float(s[i*2+1]);
1016 dst[i][BCOMP] = 0.0F;
1017 dst[i][ACOMP] = 1.0F;
1018 }
1019 }
1020
1021
1022 static void
1023 unpack_RGBA_INT8(const void *src, GLfloat dst[][4], GLuint n)
1024 {
1025 const GLbyte *s = (const GLbyte *) src;
1026 GLuint i;
1027 for (i = 0; i < n; i++) {
1028 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1029 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1030 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1031 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1032 }
1033 }
1034
1035 static void
1036 unpack_RGBA_INT16(const void *src, GLfloat dst[][4], GLuint n)
1037 {
1038 const GLshort *s = (const GLshort *) src;
1039 GLuint i;
1040 for (i = 0; i < n; i++) {
1041 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1042 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1043 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1044 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1045 }
1046 }
1047
1048 static void
1049 unpack_RGBA_INT32(const void *src, GLfloat dst[][4], GLuint n)
1050 {
1051 const GLint *s = (const GLint *) src;
1052 GLuint i;
1053 for (i = 0; i < n; i++) {
1054 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1055 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1056 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1057 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1058 }
1059 }
1060
1061 static void
1062 unpack_RGBA_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1063 {
1064 const GLubyte *s = (const GLubyte *) src;
1065 GLuint i;
1066 for (i = 0; i < n; i++) {
1067 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1068 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1069 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1070 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1071 }
1072 }
1073
1074 static void
1075 unpack_RGBA_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1076 {
1077 const GLushort *s = (const GLushort *) src;
1078 GLuint i;
1079 for (i = 0; i < n; i++) {
1080 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1081 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1082 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1083 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1084 }
1085 }
1086
1087 static void
1088 unpack_RGBA_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1089 {
1090 const GLuint *s = (const GLuint *) src;
1091 GLuint i;
1092 for (i = 0; i < n; i++) {
1093 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1094 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1095 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1096 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1097 }
1098 }
1099
1100 static void
1101 unpack_DUDV8(const void *src, GLfloat dst[][4], GLuint n)
1102 {
1103 const GLbyte *s = (const GLbyte *) src;
1104 GLuint i;
1105 for (i = 0; i < n; i++) {
1106 dst[i][RCOMP] = BYTE_TO_FLOAT(s[i*2+0]);
1107 dst[i][GCOMP] = BYTE_TO_FLOAT(s[i*2+1]);
1108 dst[i][BCOMP] = 0;
1109 dst[i][ACOMP] = 0;
1110 }
1111 }
1112
1113 static void
1114 unpack_SIGNED_R8(const void *src, GLfloat dst[][4], GLuint n)
1115 {
1116 const GLbyte *s = ((const GLbyte *) src);
1117 GLuint i;
1118 for (i = 0; i < n; i++) {
1119 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1120 dst[i][GCOMP] = 0.0F;
1121 dst[i][BCOMP] = 0.0F;
1122 dst[i][ACOMP] = 1.0F;
1123 }
1124 }
1125
1126 static void
1127 unpack_SIGNED_RG88_REV(const void *src, GLfloat dst[][4], GLuint n)
1128 {
1129 const GLushort *s = ((const GLushort *) src);
1130 GLuint i;
1131 for (i = 0; i < n; i++) {
1132 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) );
1133 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1134 dst[i][BCOMP] = 0.0F;
1135 dst[i][ACOMP] = 1.0F;
1136 }
1137 }
1138
1139 static void
1140 unpack_SIGNED_RGBX8888(const void *src, GLfloat dst[][4], GLuint n)
1141 {
1142 const GLuint *s = ((const GLuint *) src);
1143 GLuint i;
1144 for (i = 0; i < n; i++) {
1145 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1146 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1147 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1148 dst[i][ACOMP] = 1.0f;
1149 }
1150 }
1151
1152 static void
1153 unpack_SIGNED_RGBA8888(const void *src, GLfloat dst[][4], GLuint n)
1154 {
1155 const GLuint *s = ((const GLuint *) src);
1156 GLuint i;
1157 for (i = 0; i < n; i++) {
1158 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1159 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1160 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1161 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] ) );
1162 }
1163 }
1164
1165 static void
1166 unpack_SIGNED_RGBA8888_REV(const void *src, GLfloat dst[][4], GLuint n)
1167 {
1168 const GLuint *s = ((const GLuint *) src);
1169 GLuint i;
1170 for (i = 0; i < n; i++) {
1171 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] ) );
1172 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1173 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1174 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1175 }
1176 }
1177
1178 static void
1179 unpack_SIGNED_R16(const void *src, GLfloat dst[][4], GLuint n)
1180 {
1181 const GLshort *s = ((const GLshort *) src);
1182 GLuint i;
1183 for (i = 0; i < n; i++) {
1184 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i] );
1185 dst[i][GCOMP] = 0.0F;
1186 dst[i][BCOMP] = 0.0F;
1187 dst[i][ACOMP] = 1.0F;
1188 }
1189 }
1190
1191 static void
1192 unpack_SIGNED_GR1616(const void *src, GLfloat dst[][4], GLuint n)
1193 {
1194 const GLuint *s = ((const GLuint *) src);
1195 GLuint i;
1196 for (i = 0; i < n; i++) {
1197 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i] & 0xffff );
1198 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i] >> 16 );
1199 dst[i][BCOMP] = 0.0F;
1200 dst[i][ACOMP] = 1.0F;
1201 }
1202 }
1203
1204 static void
1205 unpack_SIGNED_RGB_16(const void *src, GLfloat dst[][4], GLuint n)
1206 {
1207 const GLshort *s = (const GLshort *) src;
1208 GLuint i;
1209 for (i = 0; i < n; i++) {
1210 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+0] );
1211 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+1] );
1212 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+2] );
1213 dst[i][ACOMP] = 1.0F;
1214 }
1215 }
1216
1217 static void
1218 unpack_SIGNED_RGBA_16(const void *src, GLfloat dst[][4], GLuint n)
1219 {
1220 const GLshort *s = (const GLshort *) src;
1221 GLuint i;
1222 for (i = 0; i < n; i++) {
1223 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+0] );
1224 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+1] );
1225 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+2] );
1226 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i*4+3] );
1227 }
1228 }
1229
1230 static void
1231 unpack_RGBA_16(const void *src, GLfloat dst[][4], GLuint n)
1232 {
1233 const GLushort *s = (const GLushort *) src;
1234 GLuint i;
1235 for (i = 0; i < n; i++) {
1236 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i*4+0] );
1237 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i*4+1] );
1238 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i*4+2] );
1239 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i*4+3] );
1240 }
1241 }
1242
1243 static void
1244 unpack_RED_RGTC1(const void *src, GLfloat dst[][4], GLuint n)
1245 {
1246 /* XXX to do */
1247 }
1248
1249 static void
1250 unpack_SIGNED_RED_RGTC1(const void *src, GLfloat dst[][4], GLuint n)
1251 {
1252 /* XXX to do */
1253 }
1254
1255 static void
1256 unpack_RG_RGTC2(const void *src, GLfloat dst[][4], GLuint n)
1257 {
1258 /* XXX to do */
1259 }
1260
1261 static void
1262 unpack_SIGNED_RG_RGTC2(const void *src, GLfloat dst[][4], GLuint n)
1263 {
1264 /* XXX to do */
1265 }
1266
1267 static void
1268 unpack_L_LATC1(const void *src, GLfloat dst[][4], GLuint n)
1269 {
1270 /* XXX to do */
1271 }
1272
1273 static void
1274 unpack_SIGNED_L_LATC1(const void *src, GLfloat dst[][4], GLuint n)
1275 {
1276 /* XXX to do */
1277 }
1278
1279 static void
1280 unpack_LA_LATC2(const void *src, GLfloat dst[][4], GLuint n)
1281 {
1282 /* XXX to do */
1283 }
1284
1285 static void
1286 unpack_SIGNED_LA_LATC2(const void *src, GLfloat dst[][4], GLuint n)
1287 {
1288 /* XXX to do */
1289 }
1290
1291 static void
1292 unpack_SIGNED_A8(const void *src, GLfloat dst[][4], GLuint n)
1293 {
1294 const GLbyte *s = ((const GLbyte *) src);
1295 GLuint i;
1296 for (i = 0; i < n; i++) {
1297 dst[i][RCOMP] = 0.0F;
1298 dst[i][GCOMP] = 0.0F;
1299 dst[i][BCOMP] = 0.0F;
1300 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1301 }
1302 }
1303
1304 static void
1305 unpack_SIGNED_L8(const void *src, GLfloat dst[][4], GLuint n)
1306 {
1307 const GLbyte *s = ((const GLbyte *) src);
1308 GLuint i;
1309 for (i = 0; i < n; i++) {
1310 dst[i][RCOMP] =
1311 dst[i][GCOMP] =
1312 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1313 dst[i][ACOMP] = 1.0F;
1314 }
1315 }
1316
1317 static void
1318 unpack_SIGNED_AL88(const void *src, GLfloat dst[][4], GLuint n)
1319 {
1320 const GLshort *s = ((const GLshort *) src);
1321 GLuint i;
1322 for (i = 0; i < n; i++) {
1323 dst[i][RCOMP] =
1324 dst[i][GCOMP] =
1325 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) );
1326 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1327 }
1328 }
1329
1330 static void
1331 unpack_SIGNED_I8(const void *src, GLfloat dst[][4], GLuint n)
1332 {
1333 const GLbyte *s = ((const GLbyte *) src);
1334 GLuint i;
1335 for (i = 0; i < n; i++) {
1336 dst[i][RCOMP] =
1337 dst[i][GCOMP] =
1338 dst[i][BCOMP] =
1339 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1340 }
1341 }
1342
1343 static void
1344 unpack_SIGNED_A16(const void *src, GLfloat dst[][4], GLuint n)
1345 {
1346 const GLshort *s = ((const GLshort *) src);
1347 GLuint i;
1348 for (i = 0; i < n; i++) {
1349 dst[i][RCOMP] = 0.0F;
1350 dst[i][GCOMP] = 0.0F;
1351 dst[i][BCOMP] = 0.0F;
1352 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i] );
1353 }
1354 }
1355
1356 static void
1357 unpack_SIGNED_L16(const void *src, GLfloat dst[][4], GLuint n)
1358 {
1359 const GLshort *s = ((const GLshort *) src);
1360 GLuint i;
1361 for (i = 0; i < n; i++) {
1362 dst[i][RCOMP] =
1363 dst[i][GCOMP] =
1364 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i] );
1365 dst[i][ACOMP] = 1.0F;
1366 }
1367 }
1368
1369 static void
1370 unpack_SIGNED_AL1616(const void *src, GLfloat dst[][4], GLuint n)
1371 {
1372 const GLshort *s = (const GLshort *) src;
1373 GLuint i;
1374 for (i = 0; i < n; i++) {
1375 dst[i][RCOMP] =
1376 dst[i][GCOMP] =
1377 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*2+0] );
1378 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i*2+1] );
1379 }
1380 }
1381
1382 static void
1383 unpack_SIGNED_I16(const void *src, GLfloat dst[][4], GLuint n)
1384 {
1385 const GLshort *s = ((const GLshort *) src);
1386 GLuint i;
1387 for (i = 0; i < n; i++) {
1388 dst[i][RCOMP] =
1389 dst[i][GCOMP] =
1390 dst[i][BCOMP] =
1391 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i] );
1392 }
1393 }
1394
1395 static void
1396 unpack_RGB9_E5_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
1397 {
1398 const GLuint *s = (const GLuint *) src;
1399 GLuint i;
1400 for (i = 0; i < n; i++) {
1401 rgb9e5_to_float3(s[i], dst[i]);
1402 dst[i][ACOMP] = 1.0F;
1403 }
1404 }
1405
1406 static void
1407 unpack_R11_G11_B10_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
1408 {
1409 const GLuint *s = (const GLuint *) src;
1410 GLuint i;
1411 for (i = 0; i < n; i++) {
1412 r11g11b10f_to_float3(s[i], dst[i]);
1413 dst[i][ACOMP] = 1.0F;
1414 }
1415 }
1416
1417
1418 /**
1419 * Return the unpacker function for the given format.
1420 */
1421 static unpack_rgba_func
1422 get_unpack_rgba_function(gl_format format)
1423 {
1424 static unpack_rgba_func table[MESA_FORMAT_COUNT];
1425 static GLboolean initialized = GL_FALSE;
1426
1427 if (!initialized) {
1428 table[MESA_FORMAT_NONE] = NULL;
1429
1430 table[MESA_FORMAT_RGBA8888] = unpack_RGBA8888;
1431 table[MESA_FORMAT_RGBA8888_REV] = unpack_RGBA8888_REV;
1432 table[MESA_FORMAT_ARGB8888] = unpack_ARGB8888;
1433 table[MESA_FORMAT_ARGB8888_REV] = unpack_ARGB8888_REV;
1434 table[MESA_FORMAT_RGBX8888] = unpack_RGBX8888;
1435 table[MESA_FORMAT_RGBX8888_REV] = unpack_RGBX8888_REV;
1436 table[MESA_FORMAT_XRGB8888] = unpack_XRGB8888;
1437 table[MESA_FORMAT_XRGB8888_REV] = unpack_XRGB8888_REV;
1438 table[MESA_FORMAT_RGB888] = unpack_RGB888;
1439 table[MESA_FORMAT_BGR888] = unpack_BGR888;
1440 table[MESA_FORMAT_RGB565] = unpack_RGB565;
1441 table[MESA_FORMAT_RGB565_REV] = unpack_RGB565_REV;
1442 table[MESA_FORMAT_ARGB4444] = unpack_ARGB4444;
1443 table[MESA_FORMAT_ARGB4444_REV] = unpack_ARGB4444_REV;
1444 table[MESA_FORMAT_RGBA5551] = unpack_RGBA5551;
1445 table[MESA_FORMAT_ARGB1555] = unpack_ARGB1555;
1446 table[MESA_FORMAT_ARGB1555_REV] = unpack_ARGB1555_REV;
1447 table[MESA_FORMAT_AL44] = unpack_AL44;
1448 table[MESA_FORMAT_AL88] = unpack_AL88;
1449 table[MESA_FORMAT_AL88_REV] = unpack_AL88_REV;
1450 table[MESA_FORMAT_AL1616] = unpack_AL1616;
1451 table[MESA_FORMAT_AL1616_REV] = unpack_AL1616_REV;
1452 table[MESA_FORMAT_RGB332] = unpack_RGB332;
1453 table[MESA_FORMAT_A8] = unpack_A8;
1454 table[MESA_FORMAT_A16] = unpack_A16;
1455 table[MESA_FORMAT_L8] = unpack_L8;
1456 table[MESA_FORMAT_L16] = unpack_L16;
1457 table[MESA_FORMAT_I8] = unpack_I8;
1458 table[MESA_FORMAT_I16] = unpack_I16;
1459 table[MESA_FORMAT_YCBCR] = unpack_YCBCR;
1460 table[MESA_FORMAT_YCBCR_REV] = unpack_YCBCR_REV;
1461 table[MESA_FORMAT_R8] = unpack_R8;
1462 table[MESA_FORMAT_RG88] = unpack_RG88;
1463 table[MESA_FORMAT_RG88_REV] = unpack_RG88_REV;
1464 table[MESA_FORMAT_R16] = unpack_R16;
1465 table[MESA_FORMAT_RG1616] = unpack_RG1616;
1466 table[MESA_FORMAT_RG1616_REV] = unpack_RG1616_REV;
1467 table[MESA_FORMAT_ARGB2101010] = unpack_ARGB2101010;
1468 table[MESA_FORMAT_Z24_S8] = unpack_Z24_S8;
1469 table[MESA_FORMAT_S8_Z24] = unpack_S8_Z24;
1470 table[MESA_FORMAT_Z16] = unpack_Z16;
1471 table[MESA_FORMAT_X8_Z24] = unpack_X8_Z24;
1472 table[MESA_FORMAT_Z24_X8] = unpack_Z24_X8;
1473 table[MESA_FORMAT_Z32] = unpack_Z32;
1474 table[MESA_FORMAT_S8] = unpack_S8;
1475 table[MESA_FORMAT_SRGB8] = unpack_SRGB8;
1476 table[MESA_FORMAT_SRGBA8] = unpack_SRGBA8;
1477 table[MESA_FORMAT_SARGB8] = unpack_SARGB8;
1478 table[MESA_FORMAT_SL8] = unpack_SL8;
1479 table[MESA_FORMAT_SLA8] = unpack_SLA8;
1480 table[MESA_FORMAT_SRGB_DXT1] = unpack_SRGB_DXT1;
1481 table[MESA_FORMAT_SRGBA_DXT1] = unpack_SRGBA_DXT1;
1482 table[MESA_FORMAT_SRGBA_DXT3] = unpack_SRGBA_DXT3;
1483 table[MESA_FORMAT_SRGBA_DXT5] = unpack_SRGBA_DXT5;
1484
1485 table[MESA_FORMAT_RGB_FXT1] = unpack_RGB_FXT1;
1486 table[MESA_FORMAT_RGBA_FXT1] = unpack_RGBA_FXT1;
1487 table[MESA_FORMAT_RGB_DXT1] = unpack_RGB_DXT1;
1488 table[MESA_FORMAT_RGBA_DXT1] = unpack_RGBA_DXT1;
1489 table[MESA_FORMAT_RGBA_DXT3] = unpack_RGBA_DXT3;
1490 table[MESA_FORMAT_RGBA_DXT5] = unpack_RGBA_DXT5;
1491
1492 table[MESA_FORMAT_RGBA_FLOAT32] = unpack_RGBA_FLOAT32;
1493 table[MESA_FORMAT_RGBA_FLOAT16] = unpack_RGBA_FLOAT16;
1494 table[MESA_FORMAT_RGB_FLOAT32] = unpack_RGB_FLOAT32;
1495 table[MESA_FORMAT_RGB_FLOAT16] = unpack_RGB_FLOAT16;
1496 table[MESA_FORMAT_ALPHA_FLOAT32] = unpack_ALPHA_FLOAT32;
1497 table[MESA_FORMAT_ALPHA_FLOAT16] = unpack_ALPHA_FLOAT16;
1498 table[MESA_FORMAT_LUMINANCE_FLOAT32] = unpack_LUMINANCE_FLOAT32;
1499 table[MESA_FORMAT_LUMINANCE_FLOAT16] = unpack_LUMINANCE_FLOAT16;
1500 table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = unpack_LUMINANCE_ALPHA_FLOAT32;
1501 table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = unpack_LUMINANCE_ALPHA_FLOAT16;
1502 table[MESA_FORMAT_INTENSITY_FLOAT32] = unpack_INTENSITY_FLOAT32;
1503 table[MESA_FORMAT_INTENSITY_FLOAT16] = unpack_INTENSITY_FLOAT16;
1504 table[MESA_FORMAT_R_FLOAT32] = unpack_R_FLOAT32;
1505 table[MESA_FORMAT_R_FLOAT16] = unpack_R_FLOAT16;
1506 table[MESA_FORMAT_RG_FLOAT32] = unpack_RG_FLOAT32;
1507 table[MESA_FORMAT_RG_FLOAT16] = unpack_RG_FLOAT16;
1508
1509 table[MESA_FORMAT_RGBA_INT8] = unpack_RGBA_INT8;
1510 table[MESA_FORMAT_RGBA_INT16] = unpack_RGBA_INT16;
1511 table[MESA_FORMAT_RGBA_INT32] = unpack_RGBA_INT32;
1512 table[MESA_FORMAT_RGBA_UINT8] = unpack_RGBA_UINT8;
1513 table[MESA_FORMAT_RGBA_UINT16] = unpack_RGBA_UINT16;
1514 table[MESA_FORMAT_RGBA_UINT32] = unpack_RGBA_UINT32;
1515
1516 table[MESA_FORMAT_DUDV8] = unpack_DUDV8;
1517 table[MESA_FORMAT_SIGNED_R8] = unpack_SIGNED_R8;
1518 table[MESA_FORMAT_SIGNED_RG88_REV] = unpack_SIGNED_RG88_REV;
1519 table[MESA_FORMAT_SIGNED_RGBX8888] = unpack_SIGNED_RGBX8888;
1520 table[MESA_FORMAT_SIGNED_RGBA8888] = unpack_SIGNED_RGBA8888;
1521 table[MESA_FORMAT_SIGNED_RGBA8888_REV] = unpack_SIGNED_RGBA8888_REV;
1522 table[MESA_FORMAT_SIGNED_R16] = unpack_SIGNED_R16;
1523 table[MESA_FORMAT_SIGNED_GR1616] = unpack_SIGNED_GR1616;
1524 table[MESA_FORMAT_SIGNED_RGB_16] = unpack_SIGNED_RGB_16;
1525 table[MESA_FORMAT_SIGNED_RGBA_16] = unpack_SIGNED_RGBA_16;
1526 table[MESA_FORMAT_RGBA_16] = unpack_RGBA_16;
1527
1528 table[MESA_FORMAT_RED_RGTC1] = unpack_RED_RGTC1;
1529 table[MESA_FORMAT_SIGNED_RED_RGTC1] = unpack_SIGNED_RED_RGTC1;
1530 table[MESA_FORMAT_RG_RGTC2] = unpack_RG_RGTC2;
1531 table[MESA_FORMAT_SIGNED_RG_RGTC2] = unpack_SIGNED_RG_RGTC2;
1532
1533 table[MESA_FORMAT_L_LATC1] = unpack_L_LATC1;
1534 table[MESA_FORMAT_SIGNED_L_LATC1] = unpack_SIGNED_L_LATC1;
1535 table[MESA_FORMAT_LA_LATC2] = unpack_LA_LATC2;
1536 table[MESA_FORMAT_SIGNED_LA_LATC2] = unpack_SIGNED_LA_LATC2;
1537
1538 table[MESA_FORMAT_SIGNED_A8] = unpack_SIGNED_A8;
1539 table[MESA_FORMAT_SIGNED_L8] = unpack_SIGNED_L8;
1540 table[MESA_FORMAT_SIGNED_AL88] = unpack_SIGNED_AL88;
1541 table[MESA_FORMAT_SIGNED_I8] = unpack_SIGNED_I8;
1542 table[MESA_FORMAT_SIGNED_A16] = unpack_SIGNED_A16;
1543 table[MESA_FORMAT_SIGNED_L16] = unpack_SIGNED_L16;
1544 table[MESA_FORMAT_SIGNED_AL1616] = unpack_SIGNED_AL1616;
1545 table[MESA_FORMAT_SIGNED_I16] = unpack_SIGNED_I16;
1546
1547 table[MESA_FORMAT_RGB9_E5_FLOAT] = unpack_RGB9_E5_FLOAT;
1548 table[MESA_FORMAT_R11_G11_B10_FLOAT] = unpack_R11_G11_B10_FLOAT;
1549
1550 table[MESA_FORMAT_Z32_FLOAT] = unpack_Z32_FLOAT;
1551 table[MESA_FORMAT_Z32_FLOAT_X24S8] = unpack_Z32_FLOAT_X24S8;
1552
1553 initialized = GL_TRUE;
1554 }
1555
1556 return table[format];
1557 }
1558
1559
1560 void
1561 _mesa_unpack_rgba_row(gl_format format, GLuint n,
1562 const void *src, GLfloat dst[][4])
1563 {
1564 unpack_rgba_func unpack = get_unpack_rgba_function(format);
1565 unpack(src, dst, n);
1566 }
1567
1568 static void
1569 unpack_int_rgba_RGBA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
1570 {
1571 memcpy(dst, src, n * 4 * sizeof(GLuint));
1572 }
1573
1574 static void
1575 unpack_int_rgba_RGB_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
1576 {
1577 unsigned int i;
1578
1579 for (i = 0; i < n; i++) {
1580 dst[i][0] = src[i * 3 + 0];
1581 dst[i][1] = src[i * 3 + 1];
1582 dst[i][2] = src[i * 3 + 2];
1583 dst[i][3] = 1;
1584 }
1585 }
1586
1587 static void
1588 unpack_int_rgba_RG_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
1589 {
1590 unsigned int i;
1591
1592 for (i = 0; i < n; i++) {
1593 dst[i][0] = src[i * 2 + 0];
1594 dst[i][1] = src[i * 2 + 1];
1595 dst[i][2] = 0;
1596 dst[i][3] = 1;
1597 }
1598 }
1599
1600 static void
1601 unpack_int_rgba_R_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
1602 {
1603 unsigned int i;
1604
1605 for (i = 0; i < n; i++) {
1606 dst[i][0] = src[i];
1607 dst[i][1] = 0;
1608 dst[i][2] = 0;
1609 dst[i][3] = 1;
1610 }
1611 }
1612
1613 static void
1614 unpack_int_rgba_LUMINANCE_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
1615 {
1616 unsigned int i;
1617
1618 for (i = 0; i < n; i++) {
1619 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
1620 dst[i][3] = 1;
1621 }
1622 }
1623
1624 static void
1625 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
1626 {
1627 unsigned int i;
1628
1629 for (i = 0; i < n; i++) {
1630 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
1631 dst[i][3] = src[i * 2 + 1];
1632 }
1633 }
1634
1635 static void
1636 unpack_int_rgba_INTENSITY_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
1637 {
1638 unsigned int i;
1639
1640 for (i = 0; i < n; i++) {
1641 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
1642 }
1643 }
1644
1645 static void
1646 unpack_int_rgba_ARGB2101010_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
1647 {
1648 unsigned int i;
1649
1650 for (i = 0; i < n; i++) {
1651 GLuint tmp = src[i];
1652 dst[i][0] = (tmp >> 20) & 0x3ff;
1653 dst[i][1] = (tmp >> 10) & 0x3ff;
1654 dst[i][2] = (tmp >> 0) & 0x3ff;
1655 dst[i][3] = (tmp >> 30) & 0x3;
1656 }
1657 }
1658
1659 void
1660 _mesa_unpack_int_rgba_row(gl_format format, GLuint n,
1661 const void *src, GLuint dst[][4])
1662 {
1663 switch (format) {
1664 /* Since there won't be any sign extension happening, there's no need to
1665 * make separate paths for 32-bit-to-32-bit integer unpack.
1666 */
1667 case MESA_FORMAT_RGBA_UINT32:
1668 case MESA_FORMAT_RGBA_INT32:
1669 unpack_int_rgba_RGBA_UINT32(src, dst, n);
1670 break;
1671 case MESA_FORMAT_RGB_UINT32:
1672 case MESA_FORMAT_RGB_INT32:
1673 unpack_int_rgba_RGB_UINT32(src, dst, n);
1674 break;
1675 case MESA_FORMAT_RG_UINT32:
1676 case MESA_FORMAT_RG_INT32:
1677 unpack_int_rgba_RG_UINT32(src, dst, n);
1678 break;
1679 case MESA_FORMAT_R_UINT32:
1680 case MESA_FORMAT_R_INT32:
1681 unpack_int_rgba_R_UINT32(src, dst, n);
1682 break;
1683
1684 case MESA_FORMAT_LUMINANCE_UINT32:
1685 case MESA_FORMAT_LUMINANCE_INT32:
1686 unpack_int_rgba_LUMINANCE_UINT32(src, dst, n);
1687 break;
1688 case MESA_FORMAT_LUMINANCE_ALPHA_UINT32:
1689 case MESA_FORMAT_LUMINANCE_ALPHA_INT32:
1690 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(src, dst, n);
1691 break;
1692 case MESA_FORMAT_INTENSITY_UINT32:
1693 case MESA_FORMAT_INTENSITY_INT32:
1694 unpack_int_rgba_INTENSITY_UINT32(src, dst, n);
1695 break;
1696
1697 case MESA_FORMAT_ARGB2101010_UINT:
1698 unpack_int_rgba_ARGB2101010_UINT(src, dst, n);
1699 break;
1700 default:
1701 _mesa_problem(NULL, "%s: bad format %s", __FUNCTION__,
1702 _mesa_get_format_name(format));
1703 return;
1704 }
1705 }
1706
1707 /**
1708 * Unpack a 2D rect of pixels returning float RGBA colors.
1709 * \param format the source image format
1710 * \param src start address of the source image
1711 * \param srcRowStride source image row stride in bytes
1712 * \param dst start address of the dest image
1713 * \param dstRowStride dest image row stride in bytes
1714 * \param x source image start X pos
1715 * \param y source image start Y pos
1716 * \param width width of rect region to convert
1717 * \param height height of rect region to convert
1718 */
1719 void
1720 _mesa_unpack_rgba_block(gl_format format,
1721 const void *src, GLint srcRowStride,
1722 GLfloat dst[][4], GLint dstRowStride,
1723 GLuint x, GLuint y, GLuint width, GLuint height)
1724 {
1725 unpack_rgba_func unpack = get_unpack_rgba_function(format);
1726 const GLuint srcPixStride = _mesa_get_format_bytes(format);
1727 const GLuint dstPixStride = 4 * sizeof(GLfloat);
1728 const GLubyte *srcRow;
1729 GLubyte *dstRow;
1730 GLuint i;
1731
1732 /* XXX needs to be fixed for compressed formats */
1733
1734 srcRow = ((const GLubyte *) src) + srcRowStride * y + srcPixStride * x;
1735 dstRow = ((GLubyte *) dst) + dstRowStride * y + dstPixStride * x;
1736
1737 for (i = 0; i < height; i++) {
1738 unpack(srcRow, (GLfloat (*)[4]) dstRow, width);
1739
1740 dstRow += dstRowStride;
1741 srcRow += srcRowStride;
1742 }
1743 }
1744
1745
1746
1747
1748 typedef void (*unpack_float_z_func)(GLuint n, const void *src, GLfloat *dst);
1749
1750 static void
1751 unpack_float_z_Z24_X8(GLuint n, const void *src, GLfloat *dst)
1752 {
1753 /* only return Z, not stencil data */
1754 const GLuint *s = ((const GLuint *) src);
1755 const GLfloat scale = 1.0F / (GLfloat) 0xffffff;
1756 GLuint i;
1757 for (i = 0; i < n; i++) {
1758 dst[i] = (s[i] >> 8) * scale;
1759 ASSERT(dst[i] >= 0.0F);
1760 ASSERT(dst[i] <= 1.0F);
1761 }
1762 }
1763
1764 static void
1765 unpack_float_z_X8_Z24(GLuint n, const void *src, GLfloat *dst)
1766 {
1767 /* only return Z, not stencil data */
1768 const GLuint *s = ((const GLuint *) src);
1769 const GLfloat scale = 1.0F / (GLfloat) 0xffffff;
1770 GLuint i;
1771 for (i = 0; i < n; i++) {
1772 dst[i] = (s[i] & 0x00ffffff) * scale;
1773 ASSERT(dst[i] >= 0.0F);
1774 ASSERT(dst[i] <= 1.0F);
1775 }
1776 }
1777
1778 static void
1779 unpack_float_z_Z16(GLuint n, const void *src, GLfloat *dst)
1780 {
1781 const GLushort *s = ((const GLushort *) src);
1782 GLuint i;
1783 for (i = 0; i < n; i++) {
1784 dst[i] = s[i] * (1.0F / 65535.0F);
1785 }
1786 }
1787
1788 static void
1789 unpack_float_z_Z32(GLuint n, const void *src, GLfloat *dst)
1790 {
1791 const GLuint *s = ((const GLuint *) src);
1792 GLuint i;
1793 for (i = 0; i < n; i++) {
1794 dst[i] = s[i] * (1.0F / 0xffffffff);
1795 }
1796 }
1797
1798 static void
1799 unpack_float_z_Z32F(GLuint n, const void *src, GLfloat *dst)
1800 {
1801 memcpy(dst, src, n * sizeof(float));
1802 }
1803
1804 static void
1805 unpack_float_z_Z32X24S8(GLuint n, const void *src, GLfloat *dst)
1806 {
1807 const GLfloat *s = ((const GLfloat *) src);
1808 GLuint i;
1809 for (i = 0; i < n; i++) {
1810 dst[i] = s[i * 2];
1811 }
1812 }
1813
1814
1815
1816 void
1817 _mesa_unpack_float_z_row(gl_format format, GLuint n,
1818 const void *src, GLfloat *dst)
1819 {
1820 unpack_float_z_func unpack;
1821
1822 switch (format) {
1823 case MESA_FORMAT_Z24_S8:
1824 case MESA_FORMAT_Z24_X8:
1825 unpack = unpack_float_z_Z24_X8;
1826 break;
1827 case MESA_FORMAT_S8_Z24:
1828 case MESA_FORMAT_X8_Z24:
1829 unpack = unpack_float_z_X8_Z24;
1830 break;
1831 case MESA_FORMAT_Z16:
1832 unpack = unpack_float_z_Z16;
1833 break;
1834 case MESA_FORMAT_Z32:
1835 unpack = unpack_float_z_Z32;
1836 break;
1837 case MESA_FORMAT_Z32_FLOAT:
1838 unpack = unpack_float_z_Z32F;
1839 break;
1840 case MESA_FORMAT_Z32_FLOAT_X24S8:
1841 unpack = unpack_float_z_Z32X24S8;
1842 break;
1843 default:
1844 _mesa_problem(NULL, "bad format %s in _mesa_unpack_float_z_row",
1845 _mesa_get_format_name(format));
1846 return;
1847 }
1848
1849 unpack(n, src, dst);
1850 }
1851
1852
1853
1854 typedef void (*unpack_uint_z_func)(const void *src, GLuint *dst, GLuint n);
1855
1856 static void
1857 unpack_uint_z_Z24_X8(const void *src, GLuint *dst, GLuint n)
1858 {
1859 /* only return Z, not stencil data */
1860 const GLuint *s = ((const GLuint *) src);
1861 GLuint i;
1862 for (i = 0; i < n; i++) {
1863 dst[i] = (s[i] & 0xffffff00) | (s[i] >> 24);
1864 }
1865 }
1866
1867 static void
1868 unpack_uint_z_X8_Z24(const void *src, GLuint *dst, GLuint n)
1869 {
1870 /* only return Z, not stencil data */
1871 const GLuint *s = ((const GLuint *) src);
1872 GLuint i;
1873 for (i = 0; i < n; i++) {
1874 dst[i] = (s[i] << 8) | ((s[i] >> 16) & 0xff);
1875 }
1876 }
1877
1878 static void
1879 unpack_uint_z_Z16(const void *src, GLuint *dst, GLuint n)
1880 {
1881 const GLushort *s = ((const GLushort *)src);
1882 GLuint i;
1883 for (i = 0; i < n; i++) {
1884 dst[i] = (s[i] << 16) | s[i];
1885 }
1886 }
1887
1888 static void
1889 unpack_uint_z_Z32(const void *src, GLuint *dst, GLuint n)
1890 {
1891 memcpy(dst, src, n * sizeof(GLuint));
1892 }
1893
1894
1895 void
1896 _mesa_unpack_uint_z_row(gl_format format, GLuint n,
1897 const void *src, GLuint *dst)
1898 {
1899 unpack_uint_z_func unpack;
1900 const GLubyte *srcPtr = (GLubyte *) src;
1901
1902 switch (format) {
1903 case MESA_FORMAT_Z24_S8:
1904 case MESA_FORMAT_Z24_X8:
1905 unpack = unpack_uint_z_Z24_X8;
1906 break;
1907 case MESA_FORMAT_S8_Z24:
1908 case MESA_FORMAT_X8_Z24:
1909 unpack = unpack_uint_z_X8_Z24;
1910 break;
1911 case MESA_FORMAT_Z16:
1912 unpack = unpack_uint_z_Z16;
1913 break;
1914 case MESA_FORMAT_Z32:
1915 unpack = unpack_uint_z_Z32;
1916 break;
1917 default:
1918 _mesa_problem(NULL, "bad format %s in _mesa_unpack_uint_z_row",
1919 _mesa_get_format_name(format));
1920 return;
1921 }
1922
1923 unpack(srcPtr, dst, n);
1924 }
1925
1926
1927 static void
1928 unpack_ubyte_s_S8(const void *src, GLubyte *dst, GLuint n)
1929 {
1930 memcpy(dst, src, n);
1931 }
1932
1933 static void
1934 unpack_ubyte_s_Z24_S8(const void *src, GLubyte *dst, GLuint n)
1935 {
1936 GLuint i;
1937 const GLuint *src32 = src;
1938
1939 for (i = 0; i < n; i++)
1940 dst[i] = src32[i] & 0xff;
1941 }
1942
1943 static void
1944 unpack_ubyte_s_S8_Z24(const void *src, GLubyte *dst, GLuint n)
1945 {
1946 GLuint i;
1947 const GLuint *src32 = src;
1948
1949 for (i = 0; i < n; i++)
1950 dst[i] = src32[i] >> 24;
1951 }
1952
1953 static void
1954 unpack_ubyte_s_Z32_FLOAT_X24S8(const void *src, GLubyte *dst, GLuint n)
1955 {
1956 GLuint i;
1957 const GLuint *src32 = src;
1958
1959 for (i = 0; i < n; i++)
1960 dst[i] = src32[i * 2 + 1] & 0xff;
1961 }
1962
1963 void
1964 _mesa_unpack_ubyte_stencil_row(gl_format format, GLuint n,
1965 const void *src, GLubyte *dst)
1966 {
1967 switch (format) {
1968 case MESA_FORMAT_S8:
1969 unpack_ubyte_s_S8(src, dst, n);
1970 break;
1971 case MESA_FORMAT_Z24_S8:
1972 unpack_ubyte_s_Z24_S8(src, dst, n);
1973 break;
1974 case MESA_FORMAT_S8_Z24:
1975 unpack_ubyte_s_S8_Z24(src, dst, n);
1976 break;
1977 case MESA_FORMAT_Z32_FLOAT_X24S8:
1978 unpack_ubyte_s_Z32_FLOAT_X24S8(src, dst, n);
1979 break;
1980 default:
1981 _mesa_problem(NULL, "bad format %s in _mesa_unpack_ubyte_s_row",
1982 _mesa_get_format_name(format));
1983 return;
1984 }
1985 }
1986
1987 static void
1988 unpack_uint_24_8_depth_stencil_S8_Z24(const GLuint *src, GLuint *dst, GLuint n)
1989 {
1990 GLuint i;
1991
1992 for (i = 0; i < n; i++) {
1993 GLuint val = src[i];
1994 dst[i] = val >> 24 | val << 8;
1995 }
1996 }
1997
1998 static void
1999 unpack_uint_24_8_depth_stencil_Z24_S8(const GLuint *src, GLuint *dst, GLuint n)
2000 {
2001 memcpy(dst, src, n * 4);
2002 }
2003
2004 void
2005 _mesa_unpack_uint_24_8_depth_stencil_row(gl_format format, GLuint n,
2006 const void *src, GLuint *dst)
2007 {
2008 switch (format) {
2009 case MESA_FORMAT_Z24_S8:
2010 unpack_uint_24_8_depth_stencil_Z24_S8(src, dst, n);
2011 break;
2012 case MESA_FORMAT_S8_Z24:
2013 unpack_uint_24_8_depth_stencil_S8_Z24(src, dst, n);
2014 break;
2015 default:
2016 _mesa_problem(NULL,
2017 "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row",
2018 _mesa_get_format_name(format));
2019 return;
2020 }
2021 }