mesa: Add MESA_FORMAT_{A8R8G8B8, X8R8G8B8, X8B8G8R8}_SRGB (v2)
[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 OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25
26 #include "colormac.h"
27 #include "format_unpack.h"
28 #include "macros.h"
29 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
30 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
31 #include "util/format_srgb.h"
32
33
34 /** Helper struct for MESA_FORMAT_Z32_FLOAT_S8X24_UINT */
35 struct z32f_x24s8
36 {
37 float z;
38 uint32_t x24s8;
39 };
40
41
42 /* Expand 1, 2, 3, 4, 5, 6-bit values to fill 8 bits */
43
44 #define EXPAND_1_8(X) ( (X) ? 0xff : 0x0 )
45
46 #define EXPAND_2_8(X) ( ((X) << 6) | ((X) << 4) | ((X) << 2) | (X) )
47
48 #define EXPAND_3_8(X) ( ((X) << 5) | ((X) << 2) | ((X) >> 1) )
49
50 #define EXPAND_4_8(X) ( ((X) << 4) | (X) )
51
52 #define EXPAND_5_8(X) ( ((X) << 3) | ((X) >> 2) )
53
54 #define EXPAND_6_8(X) ( ((X) << 2) | ((X) >> 4) )
55
56
57 /**********************************************************************/
58 /* Unpack, returning GLfloat colors */
59 /**********************************************************************/
60
61 typedef void (*unpack_rgba_func)(const void *src, GLfloat dst[][4], GLuint n);
62
63
64 static void
65 unpack_A8B8G8R8_UNORM(const void *src, GLfloat dst[][4], GLuint n)
66 {
67 const GLuint *s = ((const GLuint *) src);
68 GLuint i;
69 for (i = 0; i < n; i++) {
70 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
71 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
72 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
73 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
74 }
75 }
76
77 static void
78 unpack_R8G8B8A8_UNORM(const void *src, GLfloat dst[][4], GLuint n)
79 {
80 const GLuint *s = ((const GLuint *) src);
81 GLuint i;
82 for (i = 0; i < n; i++) {
83 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
84 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
85 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
86 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
87 }
88 }
89
90 static void
91 unpack_B8G8R8A8_UNORM(const void *src, GLfloat dst[][4], GLuint n)
92 {
93 const GLuint *s = ((const GLuint *) src);
94 GLuint i;
95 for (i = 0; i < n; i++) {
96 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
97 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
98 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
99 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
100 }
101 }
102
103 static void
104 unpack_A8R8G8B8_UNORM(const void *src, GLfloat dst[][4], GLuint n)
105 {
106 const GLuint *s = ((const GLuint *) src);
107 GLuint i;
108 for (i = 0; i < n; i++) {
109 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
110 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
111 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
112 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
113 }
114 }
115
116 static void
117 unpack_RGBX8888(const void *src, GLfloat dst[][4], GLuint n)
118 {
119 const GLuint *s = ((const GLuint *) src);
120 GLuint i;
121 for (i = 0; i < n; i++) {
122 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
123 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
124 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
125 dst[i][ACOMP] = 1.0f;
126 }
127 }
128
129 static void
130 unpack_RGBX8888_REV(const void *src, GLfloat dst[][4], GLuint n)
131 {
132 const GLuint *s = ((const GLuint *) src);
133 GLuint i;
134 for (i = 0; i < n; i++) {
135 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
136 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
137 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
138 dst[i][ACOMP] = 1.0f;
139 }
140 }
141
142 static void
143 unpack_B8G8R8X8_UNORM(const void *src, GLfloat dst[][4], GLuint n)
144 {
145 const GLuint *s = ((const GLuint *) src);
146 GLuint i;
147 for (i = 0; i < n; i++) {
148 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
149 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
150 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff );
151 dst[i][ACOMP] = 1.0f;
152 }
153 }
154
155 static void
156 unpack_X8R8G8B8_UNORM(const void *src, GLfloat dst[][4], GLuint n)
157 {
158 const GLuint *s = ((const GLuint *) src);
159 GLuint i;
160 for (i = 0; i < n; i++) {
161 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff );
162 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
163 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) );
164 dst[i][ACOMP] = 1.0f;
165 }
166 }
167
168 static void
169 unpack_BGR_UNORM8(const void *src, GLfloat dst[][4], GLuint n)
170 {
171 const GLubyte *s = (const GLubyte *) src;
172 GLuint i;
173 for (i = 0; i < n; i++) {
174 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i*3+2] );
175 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i*3+1] );
176 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i*3+0] );
177 dst[i][ACOMP] = 1.0F;
178 }
179 }
180
181 static void
182 unpack_RGB_UNORM8(const void *src, GLfloat dst[][4], GLuint n)
183 {
184 const GLubyte *s = (const GLubyte *) src;
185 GLuint i;
186 for (i = 0; i < n; i++) {
187 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i*3+0] );
188 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i*3+1] );
189 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i*3+2] );
190 dst[i][ACOMP] = 1.0F;
191 }
192 }
193
194 static void
195 unpack_B5G6R5_UNORM(const void *src, GLfloat dst[][4], GLuint n)
196 {
197 const GLushort *s = ((const GLushort *) src);
198 GLuint i;
199 for (i = 0; i < n; i++) {
200 dst[i][RCOMP] = ((s[i] >> 11) & 0x1f) * (1.0F / 31.0F);
201 dst[i][GCOMP] = ((s[i] >> 5 ) & 0x3f) * (1.0F / 63.0F);
202 dst[i][BCOMP] = ((s[i] ) & 0x1f) * (1.0F / 31.0F);
203 dst[i][ACOMP] = 1.0F;
204 }
205 }
206
207 static void
208 unpack_R5G6B5_UNORM(const void *src, GLfloat dst[][4], GLuint n)
209 {
210 /* Warning: this function does not match the current Mesa definition
211 * of MESA_FORMAT_R5G6B5_UNORM.
212 */
213 const GLushort *s = ((const GLushort *) src);
214 GLuint i;
215 for (i = 0; i < n; i++) {
216 GLuint t = (s[i] >> 8) | (s[i] << 8); /* byte swap */
217 dst[i][RCOMP] = UBYTE_TO_FLOAT( ((t >> 8) & 0xf8) | ((t >> 13) & 0x7) );
218 dst[i][GCOMP] = UBYTE_TO_FLOAT( ((t >> 3) & 0xfc) | ((t >> 9) & 0x3) );
219 dst[i][BCOMP] = UBYTE_TO_FLOAT( ((t << 3) & 0xf8) | ((t >> 2) & 0x7) );
220 dst[i][ACOMP] = 1.0F;
221 }
222 }
223
224 static void
225 unpack_B4G4R4A4_UNORM(const void *src, GLfloat dst[][4], GLuint n)
226 {
227 const GLushort *s = ((const GLushort *) src);
228 GLuint i;
229 for (i = 0; i < n; i++) {
230 dst[i][RCOMP] = ((s[i] >> 8) & 0xf) * (1.0F / 15.0F);
231 dst[i][GCOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
232 dst[i][BCOMP] = ((s[i] ) & 0xf) * (1.0F / 15.0F);
233 dst[i][ACOMP] = ((s[i] >> 12) & 0xf) * (1.0F / 15.0F);
234 }
235 }
236
237 static void
238 unpack_A4R4G4B4_UNORM(const void *src, GLfloat dst[][4], GLuint n)
239 {
240 const GLushort *s = ((const GLushort *) src);
241 GLuint i;
242 for (i = 0; i < n; i++) {
243 dst[i][RCOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
244 dst[i][GCOMP] = ((s[i] >> 8) & 0xf) * (1.0F / 15.0F);
245 dst[i][BCOMP] = ((s[i] >> 12) & 0xf) * (1.0F / 15.0F);
246 dst[i][ACOMP] = ((s[i] ) & 0xf) * (1.0F / 15.0F);
247 }
248 }
249
250 static void
251 unpack_A1B5G5R5_UNORM(const void *src, GLfloat dst[][4], GLuint n)
252 {
253 const GLushort *s = ((const GLushort *) src);
254 GLuint i;
255 for (i = 0; i < n; i++) {
256 dst[i][RCOMP] = ((s[i] >> 11) & 0x1f) * (1.0F / 31.0F);
257 dst[i][GCOMP] = ((s[i] >> 6) & 0x1f) * (1.0F / 31.0F);
258 dst[i][BCOMP] = ((s[i] >> 1) & 0x1f) * (1.0F / 31.0F);
259 dst[i][ACOMP] = ((s[i] ) & 0x01) * 1.0F;
260 }
261 }
262
263 static void
264 unpack_B5G5R5A1_UNORM(const void *src, GLfloat dst[][4], GLuint n)
265 {
266 const GLushort *s = ((const GLushort *) src);
267 GLuint i;
268 for (i = 0; i < n; i++) {
269 dst[i][RCOMP] = ((s[i] >> 10) & 0x1f) * (1.0F / 31.0F);
270 dst[i][GCOMP] = ((s[i] >> 5) & 0x1f) * (1.0F / 31.0F);
271 dst[i][BCOMP] = ((s[i] >> 0) & 0x1f) * (1.0F / 31.0F);
272 dst[i][ACOMP] = ((s[i] >> 15) & 0x01) * 1.0F;
273 }
274 }
275
276 static void
277 unpack_A1R5G5B5_UNORM(const void *src, GLfloat dst[][4], GLuint n)
278 {
279 /* Warning: this function does not match the current Mesa definition
280 * of MESA_FORMAT_A1R5G5B5_UNORM.
281 */
282 const GLushort *s = ((const GLushort *) src);
283 GLuint i;
284 for (i = 0; i < n; i++) {
285 GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */
286 dst[i][RCOMP] = ((tmp >> 10) & 0x1f) * (1.0F / 31.0F);
287 dst[i][GCOMP] = ((tmp >> 5) & 0x1f) * (1.0F / 31.0F);
288 dst[i][BCOMP] = ((tmp >> 0) & 0x1f) * (1.0F / 31.0F);
289 dst[i][ACOMP] = ((tmp >> 15) & 0x01) * 1.0F;
290 }
291 }
292
293 static void
294 unpack_L4A4_UNORM(const void *src, GLfloat dst[][4], GLuint n)
295 {
296 const GLubyte *s = ((const GLubyte *) src);
297 GLuint i;
298 for (i = 0; i < n; i++) {
299 dst[i][RCOMP] =
300 dst[i][GCOMP] =
301 dst[i][BCOMP] = (s[i] & 0xf) * (1.0F / 15.0F);
302 dst[i][ACOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
303 }
304 }
305
306 static void
307 unpack_L8A8_UNORM(const void *src, GLfloat dst[][4], GLuint n)
308 {
309 const GLushort *s = ((const GLushort *) src);
310 GLuint i;
311 for (i = 0; i < n; i++) {
312 dst[i][RCOMP] =
313 dst[i][GCOMP] =
314 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
315 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
316 }
317 }
318
319 static void
320 unpack_A8L8_UNORM(const void *src, GLfloat dst[][4], GLuint n)
321 {
322 const GLushort *s = ((const GLushort *) src);
323 GLuint i;
324 for (i = 0; i < n; i++) {
325 dst[i][RCOMP] =
326 dst[i][GCOMP] =
327 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
328 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
329 }
330 }
331
332 static void
333 unpack_L16A16_UNORM(const void *src, GLfloat dst[][4], GLuint n)
334 {
335 const GLuint *s = ((const GLuint *) src);
336 GLuint i;
337 for (i = 0; i < n; i++) {
338 dst[i][RCOMP] =
339 dst[i][GCOMP] =
340 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
341 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
342 }
343 }
344
345 static void
346 unpack_A16L16_UNORM(const void *src, GLfloat dst[][4], GLuint n)
347 {
348 const GLuint *s = ((const GLuint *) src);
349 GLuint i;
350 for (i = 0; i < n; i++) {
351 dst[i][RCOMP] =
352 dst[i][GCOMP] =
353 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
354 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
355 }
356 }
357
358 static void
359 unpack_B2G3R3_UNORM(const void *src, GLfloat dst[][4], GLuint n)
360 {
361 const GLubyte *s = ((const GLubyte *) src);
362 GLuint i;
363 for (i = 0; i < n; i++) {
364 dst[i][RCOMP] = ((s[i] >> 5) & 0x7) * (1.0F / 7.0F);
365 dst[i][GCOMP] = ((s[i] >> 2) & 0x7) * (1.0F / 7.0F);
366 dst[i][BCOMP] = ((s[i] ) & 0x3) * (1.0F / 3.0F);
367 dst[i][ACOMP] = 1.0F;
368 }
369 }
370
371
372 static void
373 unpack_A_UNORM8(const void *src, GLfloat dst[][4], GLuint n)
374 {
375 const GLubyte *s = ((const GLubyte *) src);
376 GLuint i;
377 for (i = 0; i < n; i++) {
378 dst[i][RCOMP] =
379 dst[i][GCOMP] =
380 dst[i][BCOMP] = 0.0F;
381 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i]);
382 }
383 }
384
385 static void
386 unpack_A_UNORM16(const void *src, GLfloat dst[][4], GLuint n)
387 {
388 const GLushort *s = ((const GLushort *) src);
389 GLuint i;
390 for (i = 0; i < n; i++) {
391 dst[i][RCOMP] =
392 dst[i][GCOMP] =
393 dst[i][BCOMP] = 0.0F;
394 dst[i][ACOMP] = USHORT_TO_FLOAT(s[i]);
395 }
396 }
397
398 static void
399 unpack_L_UNORM8(const void *src, GLfloat dst[][4], GLuint n)
400 {
401 const GLubyte *s = ((const GLubyte *) src);
402 GLuint i;
403 for (i = 0; i < n; i++) {
404 dst[i][RCOMP] =
405 dst[i][GCOMP] =
406 dst[i][BCOMP] = UBYTE_TO_FLOAT(s[i]);
407 dst[i][ACOMP] = 1.0F;
408 }
409 }
410
411 static void
412 unpack_L_UNORM16(const void *src, GLfloat dst[][4], GLuint n)
413 {
414 const GLushort *s = ((const GLushort *) src);
415 GLuint i;
416 for (i = 0; i < n; i++) {
417 dst[i][RCOMP] =
418 dst[i][GCOMP] =
419 dst[i][BCOMP] = USHORT_TO_FLOAT(s[i]);
420 dst[i][ACOMP] = 1.0F;
421 }
422 }
423
424 static void
425 unpack_I_UNORM8(const void *src, GLfloat dst[][4], GLuint n)
426 {
427 const GLubyte *s = ((const GLubyte *) src);
428 GLuint i;
429 for (i = 0; i < n; i++) {
430 dst[i][RCOMP] =
431 dst[i][GCOMP] =
432 dst[i][BCOMP] =
433 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i]);
434 }
435 }
436
437 static void
438 unpack_I_UNORM16(const void *src, GLfloat dst[][4], GLuint n)
439 {
440 const GLushort *s = ((const GLushort *) src);
441 GLuint i;
442 for (i = 0; i < n; i++) {
443 dst[i][RCOMP] =
444 dst[i][GCOMP] =
445 dst[i][BCOMP] =
446 dst[i][ACOMP] = USHORT_TO_FLOAT(s[i]);
447 }
448 }
449
450 static void
451 unpack_YCBCR(const void *src, GLfloat dst[][4], GLuint n)
452 {
453 GLuint i;
454 for (i = 0; i < n; i++) {
455 const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
456 const GLushort *src1 = src0 + 1; /* odd */
457 const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */
458 const GLubyte cb = *src0 & 0xff; /* chroma U */
459 const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */
460 const GLubyte cr = *src1 & 0xff; /* chroma V */
461 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
462 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
463 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
464 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
465 r *= (1.0F / 255.0F);
466 g *= (1.0F / 255.0F);
467 b *= (1.0F / 255.0F);
468 dst[i][RCOMP] = CLAMP(r, 0.0F, 1.0F);
469 dst[i][GCOMP] = CLAMP(g, 0.0F, 1.0F);
470 dst[i][BCOMP] = CLAMP(b, 0.0F, 1.0F);
471 dst[i][ACOMP] = 1.0F;
472 }
473 }
474
475 static void
476 unpack_YCBCR_REV(const void *src, GLfloat dst[][4], GLuint n)
477 {
478 GLuint i;
479 for (i = 0; i < n; i++) {
480 const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
481 const GLushort *src1 = src0 + 1; /* odd */
482 const GLubyte y0 = *src0 & 0xff; /* luminance */
483 const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */
484 const GLubyte y1 = *src1 & 0xff; /* luminance */
485 const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */
486 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
487 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
488 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
489 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
490 r *= (1.0F / 255.0F);
491 g *= (1.0F / 255.0F);
492 b *= (1.0F / 255.0F);
493 dst[i][RCOMP] = CLAMP(r, 0.0F, 1.0F);
494 dst[i][GCOMP] = CLAMP(g, 0.0F, 1.0F);
495 dst[i][BCOMP] = CLAMP(b, 0.0F, 1.0F);
496 dst[i][ACOMP] = 1.0F;
497 }
498 }
499
500 static void
501 unpack_R_UNORM8(const void *src, GLfloat dst[][4], GLuint n)
502 {
503 const GLubyte *s = ((const GLubyte *) src);
504 GLuint i;
505 for (i = 0; i < n; i++) {
506 dst[i][0] = UBYTE_TO_FLOAT(s[i]);
507 dst[i][1] =
508 dst[i][2] = 0.0F;
509 dst[i][3] = 1.0F;
510 }
511 }
512
513 static void
514 unpack_R8G8_UNORM(const void *src, GLfloat dst[][4], GLuint n)
515 {
516 const GLushort *s = ((const GLushort *) src);
517 GLuint i;
518 for (i = 0; i < n; i++) {
519 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
520 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
521 dst[i][BCOMP] = 0.0;
522 dst[i][ACOMP] = 1.0;
523 }
524 }
525
526 static void
527 unpack_G8R8_UNORM(const void *src, GLfloat dst[][4], GLuint n)
528 {
529 const GLushort *s = ((const GLushort *) src);
530 GLuint i;
531 for (i = 0; i < n; i++) {
532 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 );
533 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff );
534 dst[i][BCOMP] = 0.0;
535 dst[i][ACOMP] = 1.0;
536 }
537 }
538
539 static void
540 unpack_R_UNORM16(const void *src, GLfloat dst[][4], GLuint n)
541 {
542 const GLushort *s = ((const GLushort *) src);
543 GLuint i;
544 for (i = 0; i < n; i++) {
545 dst[i][RCOMP] = USHORT_TO_FLOAT(s[i]);
546 dst[i][GCOMP] = 0.0;
547 dst[i][BCOMP] = 0.0;
548 dst[i][ACOMP] = 1.0;
549 }
550 }
551
552 static void
553 unpack_R16G16_UNORM(const void *src, GLfloat dst[][4], GLuint n)
554 {
555 const GLuint *s = ((const GLuint *) src);
556 GLuint i;
557 for (i = 0; i < n; i++) {
558 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
559 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
560 dst[i][BCOMP] = 0.0;
561 dst[i][ACOMP] = 1.0;
562 }
563 }
564
565 static void
566 unpack_G16R16_UNORM(const void *src, GLfloat dst[][4], GLuint n)
567 {
568 const GLuint *s = ((const GLuint *) src);
569 GLuint i;
570 for (i = 0; i < n; i++) {
571 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i] >> 16 );
572 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff );
573 dst[i][BCOMP] = 0.0;
574 dst[i][ACOMP] = 1.0;
575 }
576 }
577
578 static void
579 unpack_B10G10R10A2_UNORM(const void *src, GLfloat dst[][4], GLuint n)
580 {
581 const GLuint *s = ((const GLuint *) src);
582 GLuint i;
583 for (i = 0; i < n; i++) {
584 dst[i][RCOMP] = ((s[i] >> 20) & 0x3ff) * (1.0F / 1023.0F);
585 dst[i][GCOMP] = ((s[i] >> 10) & 0x3ff) * (1.0F / 1023.0F);
586 dst[i][BCOMP] = ((s[i] >> 0) & 0x3ff) * (1.0F / 1023.0F);
587 dst[i][ACOMP] = ((s[i] >> 30) & 0x03) * (1.0F / 3.0F);
588 }
589 }
590
591
592 static void
593 unpack_B10G10R10A2_UINT(const void *src, GLfloat dst[][4], GLuint n)
594 {
595 const GLuint *s = (const GLuint *) src;
596 GLuint i;
597 for (i = 0; i < n; i++) {
598 dst[i][RCOMP] = (GLfloat)((s[i] >> 20) & 0x3ff);
599 dst[i][GCOMP] = (GLfloat)((s[i] >> 10) & 0x3ff);
600 dst[i][BCOMP] = (GLfloat)((s[i] >> 0) & 0x3ff);
601 dst[i][ACOMP] = (GLfloat)((s[i] >> 30) & 0x03);
602 }
603 }
604
605
606 static void
607 unpack_R10G10B10A2_UINT(const void *src, GLfloat dst[][4], GLuint n)
608 {
609 const GLuint *s = ((const GLuint *) src);
610 GLuint i;
611 for (i = 0; i < n; i++) {
612 dst[i][RCOMP] = (GLfloat)((s[i] >> 0) & 0x3ff);
613 dst[i][GCOMP] = (GLfloat)((s[i] >> 10) & 0x3ff);
614 dst[i][BCOMP] = (GLfloat)((s[i] >> 20) & 0x3ff);
615 dst[i][ACOMP] = (GLfloat)((s[i] >> 30) & 0x03);
616 }
617 }
618
619
620 static void
621 unpack_S8_UINT_Z24_UNORM(const void *src, GLfloat dst[][4], GLuint n)
622 {
623 /* only return Z, not stencil data */
624 const GLuint *s = ((const GLuint *) src);
625 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
626 GLuint i;
627 for (i = 0; i < n; i++) {
628 dst[i][0] =
629 dst[i][1] =
630 dst[i][2] = (GLfloat) ((s[i] >> 8) * scale);
631 dst[i][3] = 1.0F;
632 ASSERT(dst[i][0] >= 0.0F);
633 ASSERT(dst[i][0] <= 1.0F);
634 }
635 }
636
637 static void
638 unpack_Z24_UNORM_S8_UINT(const void *src, GLfloat dst[][4], GLuint n)
639 {
640 /* only return Z, not stencil data */
641 const GLuint *s = ((const GLuint *) src);
642 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
643 GLuint i;
644 for (i = 0; i < n; i++) {
645 dst[i][0] =
646 dst[i][1] =
647 dst[i][2] = (float) ((s[i] & 0x00ffffff) * scale);
648 dst[i][3] = 1.0F;
649 ASSERT(dst[i][0] >= 0.0F);
650 ASSERT(dst[i][0] <= 1.0F);
651 }
652 }
653
654 static void
655 unpack_Z_UNORM16(const void *src, GLfloat dst[][4], GLuint n)
656 {
657 const GLushort *s = ((const GLushort *) src);
658 GLuint i;
659 for (i = 0; i < n; i++) {
660 dst[i][0] =
661 dst[i][1] =
662 dst[i][2] = s[i] * (1.0F / 65535.0F);
663 dst[i][3] = 1.0F;
664 }
665 }
666
667 static void
668 unpack_Z24_UNORM_X8_UINT(const void *src, GLfloat dst[][4], GLuint n)
669 {
670 unpack_Z24_UNORM_S8_UINT(src, dst, n);
671 }
672
673 static void
674 unpack_X8_UINT_Z24_UNORM(const void *src, GLfloat dst[][4], GLuint n)
675 {
676 unpack_S8_UINT_Z24_UNORM(src, dst, n);
677 }
678
679 static void
680 unpack_Z_UNORM32(const void *src, GLfloat dst[][4], GLuint n)
681 {
682 const GLuint *s = ((const GLuint *) src);
683 GLuint i;
684 for (i = 0; i < n; i++) {
685 dst[i][0] =
686 dst[i][1] =
687 dst[i][2] = s[i] * (1.0F / 0xffffffff);
688 dst[i][3] = 1.0F;
689 }
690 }
691
692 static void
693 unpack_Z32_FLOAT_S8X24_UINT(const void *src, GLfloat dst[][4], GLuint n)
694 {
695 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
696 GLuint i;
697 for (i = 0; i < n; i++) {
698 dst[i][0] =
699 dst[i][1] =
700 dst[i][2] = s[i].z;
701 dst[i][3] = 1.0F;
702 }
703 }
704
705 static void
706 unpack_Z_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
707 {
708 const GLfloat *s = ((const GLfloat *) src);
709 GLuint i;
710 for (i = 0; i < n; i++) {
711 dst[i][0] =
712 dst[i][1] =
713 dst[i][2] = s[i];
714 dst[i][3] = 1.0F;
715 }
716 }
717
718
719 static void
720 unpack_S8(const void *src, GLfloat dst[][4], GLuint n)
721 {
722 /* should never be used */
723 GLuint i;
724 for (i = 0; i < n; i++) {
725 dst[i][0] =
726 dst[i][1] =
727 dst[i][2] = 0.0F;
728 dst[i][3] = 1.0F;
729 }
730 }
731
732
733 static void
734 unpack_BGR_SRGB8(const void *src, GLfloat dst[][4], GLuint n)
735 {
736 const GLubyte *s = (const GLubyte *) src;
737 GLuint i;
738 for (i = 0; i < n; i++) {
739 dst[i][RCOMP] = util_format_srgb_8unorm_to_linear_float(s[i*3+2]);
740 dst[i][GCOMP] = util_format_srgb_8unorm_to_linear_float(s[i*3+1]);
741 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float(s[i*3+0]);
742 dst[i][ACOMP] = 1.0F;
743 }
744 }
745
746 static void
747 unpack_A8B8G8R8_SRGB(const void *src, GLfloat dst[][4], GLuint n)
748 {
749 const GLuint *s = ((const GLuint *) src);
750 GLuint i;
751 for (i = 0; i < n; i++) {
752 dst[i][RCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 24) );
753 dst[i][GCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 16) & 0xff );
754 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 8) & 0xff );
755 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] & 0xff ); /* linear! */
756 }
757 }
758
759 static void
760 unpack_B8G8R8A8_SRGB(const void *src, GLfloat dst[][4], GLuint n)
761 {
762 const GLuint *s = ((const GLuint *) src);
763 GLuint i;
764 for (i = 0; i < n; i++) {
765 dst[i][RCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 16) & 0xff );
766 dst[i][GCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 8) & 0xff );
767 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] ) & 0xff );
768 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 24 ); /* linear! */
769 }
770 }
771
772 static void
773 unpack_A8R8G8B8_SRGB(const void *src, GLfloat dst[][4], GLuint n)
774 {
775 const GLuint *s = ((const GLuint *) src);
776 GLuint i;
777 for (i = 0; i < n; i++) {
778 dst[i][RCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 8) & 0xff );
779 dst[i][GCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 16) & 0xff );
780 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 24) );
781 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] & 0xff ); /* linear! */
782 }
783 }
784
785 static void
786 unpack_R8G8B8A8_SRGB(const void *src, GLfloat dst[][4], GLuint n)
787 {
788 const GLuint *s = ((const GLuint *) src);
789 GLuint i;
790 for (i = 0; i < n; i++) {
791 dst[i][RCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] ) & 0xff );
792 dst[i][GCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 8) & 0xff );
793 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 16) & 0xff );
794 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 24 ); /* linear! */
795 }
796 }
797
798 static void
799 unpack_L_SRGB8(const void *src, GLfloat dst[][4], GLuint n)
800 {
801 const GLubyte *s = ((const GLubyte *) src);
802 GLuint i;
803 for (i = 0; i < n; i++) {
804 dst[i][RCOMP] =
805 dst[i][GCOMP] =
806 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float(s[i]);
807 dst[i][ACOMP] = 1.0F;
808 }
809 }
810
811 static void
812 unpack_L8A8_SRGB(const void *src, GLfloat dst[][4], GLuint n)
813 {
814 const GLushort *s = (const GLushort *) src;
815 GLuint i;
816 for (i = 0; i < n; i++) {
817 dst[i][RCOMP] =
818 dst[i][GCOMP] =
819 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float(s[i] & 0xff);
820 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i] >> 8); /* linear! */
821 }
822 }
823
824 static void
825 unpack_A8L8_SRGB(const void *src, GLfloat dst[][4], GLuint n)
826 {
827 const GLushort *s = (const GLushort *) src;
828 GLuint i;
829 for (i = 0; i < n; i++) {
830 dst[i][RCOMP] =
831 dst[i][GCOMP] =
832 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float(s[i] >> 8);
833 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i] & 0xff); /* linear! */
834 }
835 }
836
837 static void
838 unpack_SRGB_DXT1(const void *src, GLfloat dst[][4], GLuint n)
839 {
840 }
841
842 static void
843 unpack_SRGBA_DXT1(const void *src, GLfloat dst[][4], GLuint n)
844 {
845 }
846
847 static void
848 unpack_SRGBA_DXT3(const void *src, GLfloat dst[][4], GLuint n)
849 {
850 }
851
852 static void
853 unpack_SRGBA_DXT5(const void *src, GLfloat dst[][4], GLuint n)
854 {
855 }
856
857 static void
858 unpack_RGB_FXT1(const void *src, GLfloat dst[][4], GLuint n)
859 {
860 }
861
862 static void
863 unpack_RGBA_FXT1(const void *src, GLfloat dst[][4], GLuint n)
864 {
865 }
866
867 static void
868 unpack_RGB_DXT1(const void *src, GLfloat dst[][4], GLuint n)
869 {
870 }
871
872 static void
873 unpack_RGBA_DXT1(const void *src, GLfloat dst[][4], GLuint n)
874 {
875 }
876
877 static void
878 unpack_RGBA_DXT3(const void *src, GLfloat dst[][4], GLuint n)
879 {
880 }
881
882 static void
883 unpack_RGBA_DXT5(const void *src, GLfloat dst[][4], GLuint n)
884 {
885 }
886
887
888 static void
889 unpack_RGBA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
890 {
891 const GLfloat *s = (const GLfloat *) src;
892 GLuint i;
893 for (i = 0; i < n; i++) {
894 dst[i][RCOMP] = s[i*4+0];
895 dst[i][GCOMP] = s[i*4+1];
896 dst[i][BCOMP] = s[i*4+2];
897 dst[i][ACOMP] = s[i*4+3];
898 }
899 }
900
901 static void
902 unpack_RGBA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
903 {
904 const GLhalfARB *s = (const GLhalfARB *) src;
905 GLuint i;
906 for (i = 0; i < n; i++) {
907 dst[i][RCOMP] = _mesa_half_to_float(s[i*4+0]);
908 dst[i][GCOMP] = _mesa_half_to_float(s[i*4+1]);
909 dst[i][BCOMP] = _mesa_half_to_float(s[i*4+2]);
910 dst[i][ACOMP] = _mesa_half_to_float(s[i*4+3]);
911 }
912 }
913
914 static void
915 unpack_RGB_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
916 {
917 const GLfloat *s = (const GLfloat *) src;
918 GLuint i;
919 for (i = 0; i < n; i++) {
920 dst[i][RCOMP] = s[i*3+0];
921 dst[i][GCOMP] = s[i*3+1];
922 dst[i][BCOMP] = s[i*3+2];
923 dst[i][ACOMP] = 1.0F;
924 }
925 }
926
927 static void
928 unpack_RGB_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
929 {
930 const GLhalfARB *s = (const GLhalfARB *) src;
931 GLuint i;
932 for (i = 0; i < n; i++) {
933 dst[i][RCOMP] = _mesa_half_to_float(s[i*3+0]);
934 dst[i][GCOMP] = _mesa_half_to_float(s[i*3+1]);
935 dst[i][BCOMP] = _mesa_half_to_float(s[i*3+2]);
936 dst[i][ACOMP] = 1.0F;
937 }
938 }
939
940 static void
941 unpack_A_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
942 {
943 const GLfloat *s = (const GLfloat *) src;
944 GLuint i;
945 for (i = 0; i < n; i++) {
946 dst[i][RCOMP] =
947 dst[i][GCOMP] =
948 dst[i][BCOMP] = 0.0F;
949 dst[i][ACOMP] = s[i];
950 }
951 }
952
953 static void
954 unpack_A_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
955 {
956 const GLhalfARB *s = (const GLhalfARB *) src;
957 GLuint i;
958 for (i = 0; i < n; i++) {
959 dst[i][RCOMP] =
960 dst[i][GCOMP] =
961 dst[i][BCOMP] = 0.0F;
962 dst[i][ACOMP] = _mesa_half_to_float(s[i]);
963 }
964 }
965
966 static void
967 unpack_L_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
968 {
969 const GLfloat *s = (const GLfloat *) src;
970 GLuint i;
971 for (i = 0; i < n; i++) {
972 dst[i][RCOMP] =
973 dst[i][GCOMP] =
974 dst[i][BCOMP] = s[i];
975 dst[i][ACOMP] = 1.0F;
976 }
977 }
978
979 static void
980 unpack_L_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
981 {
982 const GLhalfARB *s = (const GLhalfARB *) src;
983 GLuint i;
984 for (i = 0; i < n; i++) {
985 dst[i][RCOMP] =
986 dst[i][GCOMP] =
987 dst[i][BCOMP] = _mesa_half_to_float(s[i]);
988 dst[i][ACOMP] = 1.0F;
989 }
990 }
991
992 static void
993 unpack_LA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
994 {
995 const GLfloat *s = (const GLfloat *) src;
996 GLuint i;
997 for (i = 0; i < n; i++) {
998 dst[i][RCOMP] =
999 dst[i][GCOMP] =
1000 dst[i][BCOMP] = s[i*2+0];
1001 dst[i][ACOMP] = s[i*2+1];
1002 }
1003 }
1004
1005 static void
1006 unpack_LA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
1007 {
1008 const GLhalfARB *s = (const GLhalfARB *) src;
1009 GLuint i;
1010 for (i = 0; i < n; i++) {
1011 dst[i][RCOMP] =
1012 dst[i][GCOMP] =
1013 dst[i][BCOMP] = _mesa_half_to_float(s[i*2+0]);
1014 dst[i][ACOMP] = _mesa_half_to_float(s[i*2+1]);
1015 }
1016 }
1017
1018 static void
1019 unpack_I_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
1020 {
1021 const GLfloat *s = (const GLfloat *) src;
1022 GLuint i;
1023 for (i = 0; i < n; i++) {
1024 dst[i][RCOMP] =
1025 dst[i][GCOMP] =
1026 dst[i][BCOMP] =
1027 dst[i][ACOMP] = s[i];
1028 }
1029 }
1030
1031 static void
1032 unpack_I_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
1033 {
1034 const GLhalfARB *s = (const GLhalfARB *) src;
1035 GLuint i;
1036 for (i = 0; i < n; i++) {
1037 dst[i][RCOMP] =
1038 dst[i][GCOMP] =
1039 dst[i][BCOMP] =
1040 dst[i][ACOMP] = _mesa_half_to_float(s[i]);
1041 }
1042 }
1043
1044 static void
1045 unpack_R_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
1046 {
1047 const GLfloat *s = (const GLfloat *) src;
1048 GLuint i;
1049 for (i = 0; i < n; i++) {
1050 dst[i][RCOMP] = s[i];
1051 dst[i][GCOMP] = 0.0F;
1052 dst[i][BCOMP] = 0.0F;
1053 dst[i][ACOMP] = 1.0F;
1054 }
1055 }
1056
1057 static void
1058 unpack_R_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
1059 {
1060 const GLhalfARB *s = (const GLhalfARB *) src;
1061 GLuint i;
1062 for (i = 0; i < n; i++) {
1063 dst[i][RCOMP] = _mesa_half_to_float(s[i]);
1064 dst[i][GCOMP] = 0.0F;
1065 dst[i][BCOMP] = 0.0F;
1066 dst[i][ACOMP] = 1.0F;
1067 }
1068 }
1069
1070 static void
1071 unpack_RG_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
1072 {
1073 const GLfloat *s = (const GLfloat *) src;
1074 GLuint i;
1075 for (i = 0; i < n; i++) {
1076 dst[i][RCOMP] = s[i*2+0];
1077 dst[i][GCOMP] = s[i*2+1];
1078 dst[i][BCOMP] = 0.0F;
1079 dst[i][ACOMP] = 1.0F;
1080 }
1081 }
1082
1083 static void
1084 unpack_RG_FLOAT16(const void *src, GLfloat dst[][4], GLuint n)
1085 {
1086 const GLhalfARB *s = (const GLhalfARB *) src;
1087 GLuint i;
1088 for (i = 0; i < n; i++) {
1089 dst[i][RCOMP] = _mesa_half_to_float(s[i*2+0]);
1090 dst[i][GCOMP] = _mesa_half_to_float(s[i*2+1]);
1091 dst[i][BCOMP] = 0.0F;
1092 dst[i][ACOMP] = 1.0F;
1093 }
1094 }
1095
1096 static void
1097 unpack_ALPHA_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1098 {
1099 const GLubyte *s = (const GLubyte *) src;
1100 GLuint i;
1101 for (i = 0; i < n; i++) {
1102 dst[i][RCOMP] =
1103 dst[i][GCOMP] =
1104 dst[i][BCOMP] = 0.0;
1105 dst[i][ACOMP] = (GLfloat) s[i];
1106 }
1107 }
1108
1109 static void
1110 unpack_ALPHA_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1111 {
1112 const GLushort *s = (const GLushort *) src;
1113 GLuint i;
1114 for (i = 0; i < n; i++) {
1115 dst[i][RCOMP] =
1116 dst[i][GCOMP] =
1117 dst[i][BCOMP] = 0.0;
1118 dst[i][ACOMP] = (GLfloat) s[i];
1119 }
1120 }
1121
1122 static void
1123 unpack_ALPHA_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1124 {
1125 const GLuint *s = (const GLuint *) src;
1126 GLuint i;
1127 for (i = 0; i < n; i++) {
1128 dst[i][RCOMP] =
1129 dst[i][GCOMP] =
1130 dst[i][BCOMP] = 0.0;
1131 dst[i][ACOMP] = (GLfloat) s[i];
1132 }
1133 }
1134
1135 static void
1136 unpack_ALPHA_INT8(const void *src, GLfloat dst[][4], GLuint n)
1137 {
1138 const GLbyte *s = (const GLbyte *) src;
1139 GLuint i;
1140 for (i = 0; i < n; i++) {
1141 dst[i][RCOMP] =
1142 dst[i][GCOMP] =
1143 dst[i][BCOMP] = 0.0;
1144 dst[i][ACOMP] = (GLfloat) s[i];
1145 }
1146 }
1147
1148 static void
1149 unpack_ALPHA_INT16(const void *src, GLfloat dst[][4], GLuint n)
1150 {
1151 const GLshort *s = (const GLshort *) src;
1152 GLuint i;
1153 for (i = 0; i < n; i++) {
1154 dst[i][RCOMP] =
1155 dst[i][GCOMP] =
1156 dst[i][BCOMP] = 0.0;
1157 dst[i][ACOMP] = (GLfloat) s[i];
1158 }
1159 }
1160
1161 static void
1162 unpack_ALPHA_INT32(const void *src, GLfloat dst[][4], GLuint n)
1163 {
1164 const GLint *s = (const GLint *) src;
1165 GLuint i;
1166 for (i = 0; i < n; i++) {
1167 dst[i][RCOMP] =
1168 dst[i][GCOMP] =
1169 dst[i][BCOMP] = 0.0;
1170 dst[i][ACOMP] = (GLfloat) s[i];
1171 }
1172 }
1173
1174 static void
1175 unpack_INTENSITY_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1176 {
1177 const GLubyte *s = (const GLubyte *) src;
1178 GLuint i;
1179 for (i = 0; i < n; i++) {
1180 dst[i][RCOMP] =
1181 dst[i][GCOMP] =
1182 dst[i][BCOMP] =
1183 dst[i][ACOMP] = (GLfloat) s[i];
1184 }
1185 }
1186
1187 static void
1188 unpack_INTENSITY_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1189 {
1190 const GLushort *s = (const GLushort *) src;
1191 GLuint i;
1192 for (i = 0; i < n; i++) {
1193 dst[i][RCOMP] =
1194 dst[i][GCOMP] =
1195 dst[i][BCOMP] =
1196 dst[i][ACOMP] = (GLfloat) s[i];
1197 }
1198 }
1199
1200 static void
1201 unpack_INTENSITY_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1202 {
1203 const GLuint *s = (const GLuint *) src;
1204 GLuint i;
1205 for (i = 0; i < n; i++) {
1206 dst[i][RCOMP] =
1207 dst[i][GCOMP] =
1208 dst[i][BCOMP] =
1209 dst[i][ACOMP] = (GLfloat) s[i];
1210 }
1211 }
1212
1213 static void
1214 unpack_INTENSITY_INT8(const void *src, GLfloat dst[][4], GLuint n)
1215 {
1216 const GLbyte *s = (const GLbyte *) src;
1217 GLuint i;
1218 for (i = 0; i < n; i++) {
1219 dst[i][RCOMP] =
1220 dst[i][GCOMP] =
1221 dst[i][BCOMP] =
1222 dst[i][ACOMP] = (GLfloat) s[i];
1223 }
1224 }
1225
1226 static void
1227 unpack_INTENSITY_INT16(const void *src, GLfloat dst[][4], GLuint n)
1228 {
1229 const GLshort *s = (const GLshort *) src;
1230 GLuint i;
1231 for (i = 0; i < n; i++) {
1232 dst[i][RCOMP] =
1233 dst[i][GCOMP] =
1234 dst[i][BCOMP] =
1235 dst[i][ACOMP] = (GLfloat) s[i];
1236 }
1237 }
1238
1239 static void
1240 unpack_INTENSITY_INT32(const void *src, GLfloat dst[][4], GLuint n)
1241 {
1242 const GLint *s = (const GLint *) src;
1243 GLuint i;
1244 for (i = 0; i < n; i++) {
1245 dst[i][RCOMP] =
1246 dst[i][GCOMP] =
1247 dst[i][BCOMP] =
1248 dst[i][ACOMP] = (GLfloat) s[i];
1249 }
1250 }
1251
1252 static void
1253 unpack_LUMINANCE_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1254 {
1255 const GLubyte *s = (const GLubyte *) src;
1256 GLuint i;
1257 for (i = 0; i < n; i++) {
1258 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1259 dst[i][ACOMP] = 1.0;
1260 }
1261 }
1262
1263 static void
1264 unpack_LUMINANCE_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1265 {
1266 const GLushort *s = (const GLushort *) src;
1267 GLuint i;
1268 for (i = 0; i < n; i++) {
1269 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1270 dst[i][ACOMP] = 1.0;
1271 }
1272 }
1273
1274 static void
1275 unpack_LUMINANCE_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1276 {
1277 const GLuint *s = (const GLuint *) src;
1278 GLuint i;
1279 for (i = 0; i < n; i++) {
1280 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1281 dst[i][ACOMP] = 1.0;
1282 }
1283 }
1284
1285 static void
1286 unpack_LUMINANCE_INT8(const void *src, GLfloat dst[][4], GLuint n)
1287 {
1288 const GLbyte *s = (const GLbyte *) src;
1289 GLuint i;
1290 for (i = 0; i < n; i++) {
1291 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1292 dst[i][ACOMP] = 1.0;
1293 }
1294 }
1295
1296 static void
1297 unpack_LUMINANCE_INT16(const void *src, GLfloat dst[][4], GLuint n)
1298 {
1299 const GLshort *s = (const GLshort *) src;
1300 GLuint i;
1301 for (i = 0; i < n; i++) {
1302 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1303 dst[i][ACOMP] = 1.0;
1304 }
1305 }
1306
1307 static void
1308 unpack_LUMINANCE_INT32(const void *src, GLfloat dst[][4], GLuint n)
1309 {
1310 const GLint *s = (const GLint *) src;
1311 GLuint i;
1312 for (i = 0; i < n; i++) {
1313 dst[i][RCOMP] = dst[i][GCOMP] = dst[i][BCOMP] = (GLfloat) s[i];
1314 dst[i][ACOMP] = 1.0;
1315 }
1316 }
1317
1318 static void
1319 unpack_LUMINANCE_ALPHA_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1320 {
1321 const GLubyte *s = (const GLubyte *) src;
1322 GLuint i;
1323 for (i = 0; i < n; i++) {
1324 dst[i][RCOMP] =
1325 dst[i][GCOMP] =
1326 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1327 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1328 }
1329 }
1330
1331 static void
1332 unpack_LUMINANCE_ALPHA_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1333 {
1334 const GLushort *s = (const GLushort *) src;
1335 GLuint i;
1336 for (i = 0; i < n; i++) {
1337 dst[i][RCOMP] =
1338 dst[i][GCOMP] =
1339 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1340 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1341 }
1342 }
1343
1344 static void
1345 unpack_LUMINANCE_ALPHA_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1346 {
1347 const GLuint *s = (const GLuint *) src;
1348 GLuint i;
1349 for (i = 0; i < n; i++) {
1350 dst[i][RCOMP] =
1351 dst[i][GCOMP] =
1352 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1353 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1354 }
1355 }
1356
1357 static void
1358 unpack_LUMINANCE_ALPHA_INT8(const void *src, GLfloat dst[][4], GLuint n)
1359 {
1360 const GLbyte *s = (const GLbyte *) src;
1361 GLuint i;
1362 for (i = 0; i < n; i++) {
1363 dst[i][RCOMP] =
1364 dst[i][GCOMP] =
1365 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1366 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1367 }
1368 }
1369
1370 static void
1371 unpack_LUMINANCE_ALPHA_INT16(const void *src, GLfloat dst[][4], GLuint n)
1372 {
1373 const GLshort *s = (const GLshort *) src;
1374 GLuint i;
1375 for (i = 0; i < n; i++) {
1376 dst[i][RCOMP] =
1377 dst[i][GCOMP] =
1378 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1379 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1380 }
1381 }
1382
1383 static void
1384 unpack_LUMINANCE_ALPHA_INT32(const void *src, GLfloat dst[][4], GLuint n)
1385 {
1386 const GLint *s = (const GLint *) src;
1387 GLuint i;
1388 for (i = 0; i < n; i++) {
1389 dst[i][RCOMP] =
1390 dst[i][GCOMP] =
1391 dst[i][BCOMP] = (GLfloat) s[2*i+0];
1392 dst[i][ACOMP] = (GLfloat) s[2*i+1];
1393 }
1394 }
1395
1396 static void
1397 unpack_R_INT8(const void *src, GLfloat dst[][4], GLuint n)
1398 {
1399 const GLbyte *s = (const GLbyte *) src;
1400 GLuint i;
1401 for (i = 0; i < n; i++) {
1402 dst[i][RCOMP] = (GLfloat) s[i];
1403 dst[i][GCOMP] = 0.0;
1404 dst[i][BCOMP] = 0.0;
1405 dst[i][ACOMP] = 1.0;
1406 }
1407 }
1408
1409 static void
1410 unpack_RG_INT8(const void *src, GLfloat dst[][4], GLuint n)
1411 {
1412 const GLbyte *s = (const GLbyte *) src;
1413 GLuint i;
1414 for (i = 0; i < n; i++) {
1415 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1416 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1417 dst[i][BCOMP] = 0.0;
1418 dst[i][ACOMP] = 1.0;
1419 }
1420 }
1421
1422 static void
1423 unpack_RGB_INT8(const void *src, GLfloat dst[][4], GLuint n)
1424 {
1425 const GLbyte *s = (const GLbyte *) src;
1426 GLuint i;
1427 for (i = 0; i < n; i++) {
1428 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1429 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1430 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1431 dst[i][ACOMP] = 1.0;
1432 }
1433 }
1434
1435 static void
1436 unpack_RGBA_INT8(const void *src, GLfloat dst[][4], GLuint n)
1437 {
1438 const GLbyte *s = (const GLbyte *) src;
1439 GLuint i;
1440 for (i = 0; i < n; i++) {
1441 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1442 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1443 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1444 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1445 }
1446 }
1447
1448 static void
1449 unpack_R_INT16(const void *src, GLfloat dst[][4], GLuint n)
1450 {
1451 const GLshort *s = (const GLshort *) src;
1452 GLuint i;
1453 for (i = 0; i < n; i++) {
1454 dst[i][RCOMP] = (GLfloat) s[i];
1455 dst[i][GCOMP] = 0.0;
1456 dst[i][BCOMP] = 0.0;
1457 dst[i][ACOMP] = 1.0;
1458 }
1459 }
1460
1461 static void
1462 unpack_RG_INT16(const void *src, GLfloat dst[][4], GLuint n)
1463 {
1464 const GLshort *s = (const GLshort *) src;
1465 GLuint i;
1466 for (i = 0; i < n; i++) {
1467 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1468 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1469 dst[i][BCOMP] = 0.0;
1470 dst[i][ACOMP] = 1.0;
1471 }
1472 }
1473
1474 static void
1475 unpack_RGB_INT16(const void *src, GLfloat dst[][4], GLuint n)
1476 {
1477 const GLshort *s = (const GLshort *) src;
1478 GLuint i;
1479 for (i = 0; i < n; i++) {
1480 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1481 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1482 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1483 dst[i][ACOMP] = 1.0;
1484 }
1485 }
1486
1487 static void
1488 unpack_RGBA_INT16(const void *src, GLfloat dst[][4], GLuint n)
1489 {
1490 const GLshort *s = (const GLshort *) src;
1491 GLuint i;
1492 for (i = 0; i < n; i++) {
1493 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1494 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1495 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1496 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1497 }
1498 }
1499
1500 static void
1501 unpack_R_INT32(const void *src, GLfloat dst[][4], GLuint n)
1502 {
1503 const GLint *s = (const GLint *) src;
1504 GLuint i;
1505 for (i = 0; i < n; i++) {
1506 dst[i][RCOMP] = (GLfloat) s[i];
1507 dst[i][GCOMP] = 0.0;
1508 dst[i][BCOMP] = 0.0;
1509 dst[i][ACOMP] = 1.0;
1510 }
1511 }
1512
1513 static void
1514 unpack_RG_INT32(const void *src, GLfloat dst[][4], GLuint n)
1515 {
1516 const GLint *s = (const GLint *) src;
1517 GLuint i;
1518 for (i = 0; i < n; i++) {
1519 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1520 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1521 dst[i][BCOMP] = 0.0;
1522 dst[i][ACOMP] = 1.0;
1523 }
1524 }
1525
1526 static void
1527 unpack_RGB_INT32(const void *src, GLfloat dst[][4], GLuint n)
1528 {
1529 const GLint *s = (const GLint *) src;
1530 GLuint i;
1531 for (i = 0; i < n; i++) {
1532 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1533 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1534 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1535 dst[i][ACOMP] = 1.0;
1536 }
1537 }
1538
1539
1540 static void
1541 unpack_RGBA_INT32(const void *src, GLfloat dst[][4], GLuint n)
1542 {
1543 const GLint *s = (const GLint *) src;
1544 GLuint i;
1545 for (i = 0; i < n; i++) {
1546 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1547 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1548 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1549 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1550 }
1551 }
1552
1553 static void
1554 unpack_R_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1555 {
1556 const GLubyte *s = (const GLubyte *) src;
1557 GLuint i;
1558 for (i = 0; i < n; i++) {
1559 dst[i][RCOMP] = (GLfloat) s[i];
1560 dst[i][GCOMP] = 0.0;
1561 dst[i][BCOMP] = 0.0;
1562 dst[i][ACOMP] = 1.0;
1563 }
1564 }
1565
1566 static void
1567 unpack_RG_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1568 {
1569 const GLubyte *s = (const GLubyte *) src;
1570 GLuint i;
1571 for (i = 0; i < n; i++) {
1572 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1573 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1574 dst[i][BCOMP] = 0.0;
1575 dst[i][ACOMP] = 1.0;
1576 }
1577 }
1578
1579 static void
1580 unpack_RGB_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1581 {
1582 const GLubyte *s = (const GLubyte *) src;
1583 GLuint i;
1584 for (i = 0; i < n; i++) {
1585 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1586 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1587 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1588 dst[i][ACOMP] = 1.0;
1589 }
1590 }
1591
1592 static void
1593 unpack_RGBA_UINT8(const void *src, GLfloat dst[][4], GLuint n)
1594 {
1595 const GLubyte *s = (const GLubyte *) src;
1596 GLuint i;
1597 for (i = 0; i < n; i++) {
1598 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1599 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1600 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1601 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1602 }
1603 }
1604
1605 static void
1606 unpack_R_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1607 {
1608 const GLushort *s = (const GLushort *) src;
1609 GLuint i;
1610 for (i = 0; i < n; i++) {
1611 dst[i][RCOMP] = (GLfloat) s[i];
1612 dst[i][GCOMP] = 0.0;
1613 dst[i][BCOMP] = 0.0;
1614 dst[i][ACOMP] = 1.0;
1615 }
1616 }
1617
1618 static void
1619 unpack_RG_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1620 {
1621 const GLushort *s = (const GLushort *) src;
1622 GLuint i;
1623 for (i = 0; i < n; i++) {
1624 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1625 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1626 dst[i][BCOMP] = 0.0;
1627 dst[i][ACOMP] = 1.0;
1628 }
1629 }
1630
1631 static void
1632 unpack_RGB_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1633 {
1634 const GLushort *s = (const GLushort *) src;
1635 GLuint i;
1636 for (i = 0; i < n; i++) {
1637 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1638 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1639 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1640 dst[i][ACOMP] = 1.0;
1641 }
1642 }
1643
1644 static void
1645 unpack_RGBA_UINT16(const void *src, GLfloat dst[][4], GLuint n)
1646 {
1647 const GLushort *s = (const GLushort *) src;
1648 GLuint i;
1649 for (i = 0; i < n; i++) {
1650 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1651 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1652 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1653 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1654 }
1655 }
1656
1657 static void
1658 unpack_R_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1659 {
1660 const GLuint *s = (const GLuint *) src;
1661 GLuint i;
1662 for (i = 0; i < n; i++) {
1663 dst[i][RCOMP] = (GLfloat) s[i];
1664 dst[i][GCOMP] = 0.0;
1665 dst[i][BCOMP] = 0.0;
1666 dst[i][ACOMP] = 1.0;
1667 }
1668 }
1669
1670 static void
1671 unpack_RG_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1672 {
1673 const GLuint *s = (const GLuint *) src;
1674 GLuint i;
1675 for (i = 0; i < n; i++) {
1676 dst[i][RCOMP] = (GLfloat) s[i*2+0];
1677 dst[i][GCOMP] = (GLfloat) s[i*2+1];
1678 dst[i][BCOMP] = 0.0;
1679 dst[i][ACOMP] = 1.0;
1680 }
1681 }
1682
1683 static void
1684 unpack_RGB_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1685 {
1686 const GLuint *s = (const GLuint *) src;
1687 GLuint i;
1688 for (i = 0; i < n; i++) {
1689 dst[i][RCOMP] = (GLfloat) s[i*3+0];
1690 dst[i][GCOMP] = (GLfloat) s[i*3+1];
1691 dst[i][BCOMP] = (GLfloat) s[i*3+2];
1692 dst[i][ACOMP] = 1.0;
1693 }
1694 }
1695
1696 static void
1697 unpack_RGBA_UINT32(const void *src, GLfloat dst[][4], GLuint n)
1698 {
1699 const GLuint *s = (const GLuint *) src;
1700 GLuint i;
1701 for (i = 0; i < n; i++) {
1702 dst[i][RCOMP] = (GLfloat) s[i*4+0];
1703 dst[i][GCOMP] = (GLfloat) s[i*4+1];
1704 dst[i][BCOMP] = (GLfloat) s[i*4+2];
1705 dst[i][ACOMP] = (GLfloat) s[i*4+3];
1706 }
1707 }
1708
1709 static void
1710 unpack_R_SNORM8(const void *src, GLfloat dst[][4], GLuint n)
1711 {
1712 const GLbyte *s = ((const GLbyte *) src);
1713 GLuint i;
1714 for (i = 0; i < n; i++) {
1715 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1716 dst[i][GCOMP] = 0.0F;
1717 dst[i][BCOMP] = 0.0F;
1718 dst[i][ACOMP] = 1.0F;
1719 }
1720 }
1721
1722 static void
1723 unpack_R8G8_SNORM(const void *src, GLfloat dst[][4], GLuint n)
1724 {
1725 const GLushort *s = ((const GLushort *) src);
1726 GLuint i;
1727 for (i = 0; i < n; i++) {
1728 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) );
1729 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1730 dst[i][BCOMP] = 0.0F;
1731 dst[i][ACOMP] = 1.0F;
1732 }
1733 }
1734
1735 static void
1736 unpack_X8B8G8R8_SNORM(const void *src, GLfloat dst[][4], GLuint n)
1737 {
1738 const GLuint *s = ((const GLuint *) src);
1739 GLuint i;
1740 for (i = 0; i < n; i++) {
1741 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1742 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1743 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1744 dst[i][ACOMP] = 1.0f;
1745 }
1746 }
1747
1748 static void
1749 unpack_A8B8G8R8_SNORM(const void *src, GLfloat dst[][4], GLuint n)
1750 {
1751 const GLuint *s = ((const GLuint *) src);
1752 GLuint i;
1753 for (i = 0; i < n; i++) {
1754 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1755 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1756 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1757 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] ) );
1758 }
1759 }
1760
1761 static void
1762 unpack_R8G8B8A8_SNORM(const void *src, GLfloat dst[][4], GLuint n)
1763 {
1764 const GLuint *s = ((const GLuint *) src);
1765 GLuint i;
1766 for (i = 0; i < n; i++) {
1767 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] ) );
1768 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1769 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
1770 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) );
1771 }
1772 }
1773
1774 static void
1775 unpack_R_SNORM16(const void *src, GLfloat dst[][4], GLuint n)
1776 {
1777 const GLshort *s = ((const GLshort *) src);
1778 GLuint i;
1779 for (i = 0; i < n; i++) {
1780 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i] );
1781 dst[i][GCOMP] = 0.0F;
1782 dst[i][BCOMP] = 0.0F;
1783 dst[i][ACOMP] = 1.0F;
1784 }
1785 }
1786
1787 static void
1788 unpack_R16G16_SNORM(const void *src, GLfloat dst[][4], GLuint n)
1789 {
1790 const GLuint *s = ((const GLuint *) src);
1791 GLuint i;
1792 for (i = 0; i < n; i++) {
1793 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] & 0xffff) );
1794 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] >> 16) );
1795 dst[i][BCOMP] = 0.0F;
1796 dst[i][ACOMP] = 1.0F;
1797 }
1798 }
1799
1800 static void
1801 unpack_RGB_SNORM16(const void *src, GLfloat dst[][4], GLuint n)
1802 {
1803 const GLshort *s = (const GLshort *) src;
1804 GLuint i;
1805 for (i = 0; i < n; i++) {
1806 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+0] );
1807 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+1] );
1808 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+2] );
1809 dst[i][ACOMP] = 1.0F;
1810 }
1811 }
1812
1813 static void
1814 unpack_RGBA_SNORM16(const void *src, GLfloat dst[][4], GLuint n)
1815 {
1816 const GLshort *s = (const GLshort *) src;
1817 GLuint i;
1818 for (i = 0; i < n; i++) {
1819 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+0] );
1820 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+1] );
1821 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+2] );
1822 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i*4+3] );
1823 }
1824 }
1825
1826 static void
1827 unpack_RGBA_16(const void *src, GLfloat dst[][4], GLuint n)
1828 {
1829 const GLushort *s = (const GLushort *) src;
1830 GLuint i;
1831 for (i = 0; i < n; i++) {
1832 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i*4+0] );
1833 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i*4+1] );
1834 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i*4+2] );
1835 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i*4+3] );
1836 }
1837 }
1838
1839 static void
1840 unpack_RED_RGTC1(const void *src, GLfloat dst[][4], GLuint n)
1841 {
1842 /* XXX to do */
1843 }
1844
1845 static void
1846 unpack_SIGNED_RED_RGTC1(const void *src, GLfloat dst[][4], GLuint n)
1847 {
1848 /* XXX to do */
1849 }
1850
1851 static void
1852 unpack_RG_RGTC2(const void *src, GLfloat dst[][4], GLuint n)
1853 {
1854 /* XXX to do */
1855 }
1856
1857 static void
1858 unpack_SIGNED_RG_RGTC2(const void *src, GLfloat dst[][4], GLuint n)
1859 {
1860 /* XXX to do */
1861 }
1862
1863 static void
1864 unpack_L_LATC1(const void *src, GLfloat dst[][4], GLuint n)
1865 {
1866 /* XXX to do */
1867 }
1868
1869 static void
1870 unpack_SIGNED_L_LATC1(const void *src, GLfloat dst[][4], GLuint n)
1871 {
1872 /* XXX to do */
1873 }
1874
1875 static void
1876 unpack_LA_LATC2(const void *src, GLfloat dst[][4], GLuint n)
1877 {
1878 /* XXX to do */
1879 }
1880
1881 static void
1882 unpack_SIGNED_LA_LATC2(const void *src, GLfloat dst[][4], GLuint n)
1883 {
1884 /* XXX to do */
1885 }
1886
1887 static void
1888 unpack_ETC1_RGB8(const void *src, GLfloat dst[][4], GLuint n)
1889 {
1890 /* XXX to do */
1891 }
1892
1893 static void
1894 unpack_ETC2_RGB8(const void *src, GLfloat dst[][4], GLuint n)
1895 {
1896 /* XXX to do */
1897 }
1898
1899 static void
1900 unpack_ETC2_SRGB8(const void *src, GLfloat dst[][4], GLuint n)
1901 {
1902 /* XXX to do */
1903 }
1904
1905 static void
1906 unpack_ETC2_RGBA8_EAC(const void *src, GLfloat dst[][4], GLuint n)
1907 {
1908 /* XXX to do */
1909 }
1910
1911 static void
1912 unpack_ETC2_SRGB8_ALPHA8_EAC(const void *src, GLfloat dst[][4], GLuint n)
1913 {
1914 /* XXX to do */
1915 }
1916
1917 static void
1918 unpack_ETC2_R11_EAC(const void *src, GLfloat dst[][4], GLuint n)
1919 {
1920 /* XXX to do */
1921 }
1922
1923 static void
1924 unpack_ETC2_RG11_EAC(const void *src, GLfloat dst[][4], GLuint n)
1925 {
1926 /* XXX to do */
1927 }
1928
1929 static void
1930 unpack_ETC2_SIGNED_R11_EAC(const void *src, GLfloat dst[][4], GLuint n)
1931 {
1932 /* XXX to do */
1933 }
1934
1935 static void
1936 unpack_ETC2_SIGNED_RG11_EAC(const void *src, GLfloat dst[][4], GLuint n)
1937 {
1938 /* XXX to do */
1939 }
1940
1941 static void
1942 unpack_ETC2_RGB8_PUNCHTHROUGH_ALPHA1(const void *src, GLfloat dst[][4],
1943 GLuint n)
1944 {
1945 /* XXX to do */
1946 }
1947
1948 static void
1949 unpack_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1(const void *src, GLfloat dst[][4],
1950 GLuint n)
1951 {
1952 /* XXX to do */
1953 }
1954
1955 static void
1956 unpack_A_SNORM8(const void *src, GLfloat dst[][4], GLuint n)
1957 {
1958 const GLbyte *s = ((const GLbyte *) src);
1959 GLuint i;
1960 for (i = 0; i < n; i++) {
1961 dst[i][RCOMP] = 0.0F;
1962 dst[i][GCOMP] = 0.0F;
1963 dst[i][BCOMP] = 0.0F;
1964 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1965 }
1966 }
1967
1968 static void
1969 unpack_L_SNORM8(const void *src, GLfloat dst[][4], GLuint n)
1970 {
1971 const GLbyte *s = ((const GLbyte *) src);
1972 GLuint i;
1973 for (i = 0; i < n; i++) {
1974 dst[i][RCOMP] =
1975 dst[i][GCOMP] =
1976 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( s[i] );
1977 dst[i][ACOMP] = 1.0F;
1978 }
1979 }
1980
1981 static void
1982 unpack_L8A8_SNORM(const void *src, GLfloat dst[][4], GLuint n)
1983 {
1984 const GLshort *s = ((const GLshort *) src);
1985 GLuint i;
1986 for (i = 0; i < n; i++) {
1987 dst[i][RCOMP] =
1988 dst[i][GCOMP] =
1989 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) );
1990 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
1991 }
1992 }
1993
1994
1995 static void
1996 unpack_A8L8_SNORM(const void *src, GLfloat dst[][4], GLuint n)
1997 {
1998 const GLshort *s = ((const GLshort *) src);
1999 GLuint i;
2000 for (i = 0; i < n; i++) {
2001 dst[i][RCOMP] =
2002 dst[i][GCOMP] =
2003 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
2004 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) );
2005 }
2006 }
2007
2008 static void
2009 unpack_I_SNORM8(const void *src, GLfloat dst[][4], GLuint n)
2010 {
2011 const GLbyte *s = ((const GLbyte *) src);
2012 GLuint i;
2013 for (i = 0; i < n; i++) {
2014 dst[i][RCOMP] =
2015 dst[i][GCOMP] =
2016 dst[i][BCOMP] =
2017 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( s[i] );
2018 }
2019 }
2020
2021 static void
2022 unpack_A_SNORM16(const void *src, GLfloat dst[][4], GLuint n)
2023 {
2024 const GLshort *s = ((const GLshort *) src);
2025 GLuint i;
2026 for (i = 0; i < n; i++) {
2027 dst[i][RCOMP] = 0.0F;
2028 dst[i][GCOMP] = 0.0F;
2029 dst[i][BCOMP] = 0.0F;
2030 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i] );
2031 }
2032 }
2033
2034 static void
2035 unpack_L_SNORM16(const void *src, GLfloat dst[][4], GLuint n)
2036 {
2037 const GLshort *s = ((const GLshort *) src);
2038 GLuint i;
2039 for (i = 0; i < n; i++) {
2040 dst[i][RCOMP] =
2041 dst[i][GCOMP] =
2042 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i] );
2043 dst[i][ACOMP] = 1.0F;
2044 }
2045 }
2046
2047 static void
2048 unpack_LA_SNORM16(const void *src, GLfloat dst[][4], GLuint n)
2049 {
2050 const GLshort *s = (const GLshort *) src;
2051 GLuint i;
2052 for (i = 0; i < n; i++) {
2053 dst[i][RCOMP] =
2054 dst[i][GCOMP] =
2055 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*2+0] );
2056 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i*2+1] );
2057 }
2058 }
2059
2060 static void
2061 unpack_I_SNORM16(const void *src, GLfloat dst[][4], GLuint n)
2062 {
2063 const GLshort *s = ((const GLshort *) src);
2064 GLuint i;
2065 for (i = 0; i < n; i++) {
2066 dst[i][RCOMP] =
2067 dst[i][GCOMP] =
2068 dst[i][BCOMP] =
2069 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i] );
2070 }
2071 }
2072
2073 static void
2074 unpack_R9G9B9E5_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
2075 {
2076 const GLuint *s = (const GLuint *) src;
2077 GLuint i;
2078 for (i = 0; i < n; i++) {
2079 rgb9e5_to_float3(s[i], dst[i]);
2080 dst[i][ACOMP] = 1.0F;
2081 }
2082 }
2083
2084 static void
2085 unpack_R11G11B10_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
2086 {
2087 const GLuint *s = (const GLuint *) src;
2088 GLuint i;
2089 for (i = 0; i < n; i++) {
2090 r11g11b10f_to_float3(s[i], dst[i]);
2091 dst[i][ACOMP] = 1.0F;
2092 }
2093 }
2094
2095 static void
2096 unpack_XRGB4444_UNORM(const void *src, GLfloat dst[][4], GLuint n)
2097 {
2098 const GLushort *s = ((const GLushort *) src);
2099 GLuint i;
2100 for (i = 0; i < n; i++) {
2101 dst[i][RCOMP] = ((s[i] >> 8) & 0xf) * (1.0F / 15.0F);
2102 dst[i][GCOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F);
2103 dst[i][BCOMP] = ((s[i] ) & 0xf) * (1.0F / 15.0F);
2104 dst[i][ACOMP] = 1.0;
2105 }
2106 }
2107
2108 static void
2109 unpack_XRGB1555_UNORM(const void *src, GLfloat dst[][4], GLuint n)
2110 {
2111 const GLushort *s = ((const GLushort *) src);
2112 GLuint i;
2113 for (i = 0; i < n; i++) {
2114 dst[i][RCOMP] = ((s[i] >> 10) & 0x1f) * (1.0F / 31.0F);
2115 dst[i][GCOMP] = ((s[i] >> 5) & 0x1f) * (1.0F / 31.0F);
2116 dst[i][BCOMP] = ((s[i] >> 0) & 0x1f) * (1.0F / 31.0F);
2117 dst[i][ACOMP] = 1.0;
2118 }
2119 }
2120
2121 static void
2122 unpack_R8G8B8X8_SNORM(const void *src, GLfloat dst[][4], GLuint n)
2123 {
2124 const GLuint *s = ((const GLuint *) src);
2125 GLuint i;
2126 for (i = 0; i < n; i++) {
2127 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] ) );
2128 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
2129 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) );
2130 dst[i][ACOMP] = 1.0;
2131 }
2132 }
2133
2134 static void
2135 unpack_R8G8B8X8_SRGB(const void *src, GLfloat dst[][4], GLuint n)
2136 {
2137 const GLuint *s = ((const GLuint *) src);
2138 GLuint i;
2139 for (i = 0; i < n; i++) {
2140 dst[i][RCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] ) & 0xff );
2141 dst[i][GCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 8) & 0xff );
2142 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 16) & 0xff );
2143 dst[i][ACOMP] = 1.0f;
2144 }
2145 }
2146
2147 static void
2148 unpack_X8B8G8R8_SRGB(const void *src, GLfloat dst[][4], GLuint n)
2149 {
2150 const GLuint *s = ((const GLuint *) src);
2151 GLuint i;
2152 for (i = 0; i < n; i++) {
2153 dst[i][RCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 24) );
2154 dst[i][GCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 16) & 0xff );
2155 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 8) & 0xff );
2156 dst[i][ACOMP] = 1.0f;
2157 }
2158 }
2159
2160 static void
2161 unpack_XBGR8888_UINT(const void *src, GLfloat dst[][4], GLuint n)
2162 {
2163 const GLbyte *s = (const GLbyte *) src;
2164 GLuint i;
2165 for (i = 0; i < n; i++) {
2166 dst[i][RCOMP] = s[i*4+0];
2167 dst[i][GCOMP] = s[i*4+1];
2168 dst[i][BCOMP] = s[i*4+2];
2169 dst[i][ACOMP] = 1.0;
2170 }
2171 }
2172
2173 static void
2174 unpack_XBGR8888_SINT(const void *src, GLfloat dst[][4], GLuint n)
2175 {
2176 const GLbyte *s = (const GLbyte *) src;
2177 GLuint i;
2178 for (i = 0; i < n; i++) {
2179 dst[i][RCOMP] = s[i*4+0];
2180 dst[i][GCOMP] = s[i*4+1];
2181 dst[i][BCOMP] = s[i*4+2];
2182 dst[i][ACOMP] = 1.0;
2183 }
2184 }
2185
2186 static void
2187 unpack_B10G10R10X2_UNORM(const void *src, GLfloat dst[][4], GLuint n)
2188 {
2189 const GLuint *s = ((const GLuint *) src);
2190 GLuint i;
2191 for (i = 0; i < n; i++) {
2192 dst[i][RCOMP] = ((s[i] >> 20) & 0x3ff) * (1.0F / 1023.0F);
2193 dst[i][GCOMP] = ((s[i] >> 10) & 0x3ff) * (1.0F / 1023.0F);
2194 dst[i][BCOMP] = ((s[i] >> 0) & 0x3ff) * (1.0F / 1023.0F);
2195 dst[i][ACOMP] = 1.0;
2196 }
2197 }
2198
2199 static void
2200 unpack_RGBX_UNORM16(const void *src, GLfloat dst[][4], GLuint n)
2201 {
2202 const GLushort *s = (const GLushort *) src;
2203 GLuint i;
2204 for (i = 0; i < n; i++) {
2205 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i*4+0] );
2206 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i*4+1] );
2207 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i*4+2] );
2208 dst[i][ACOMP] = 1.0;
2209 }
2210 }
2211
2212 static void
2213 unpack_RGBX_SNORM16(const void *src, GLfloat dst[][4], GLuint n)
2214 {
2215 const GLshort *s = (const GLshort *) src;
2216 GLuint i;
2217 for (i = 0; i < n; i++) {
2218 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+0] );
2219 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+1] );
2220 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+2] );
2221 dst[i][ACOMP] = 1.0;
2222 }
2223 }
2224
2225 static void
2226 unpack_XBGR16161616_FLOAT(const void *src, GLfloat dst[][4], GLuint n)
2227 {
2228 const GLshort *s = (const GLshort *) src;
2229 GLuint i;
2230 for (i = 0; i < n; i++) {
2231 dst[i][RCOMP] = _mesa_half_to_float(s[i*4+0]);
2232 dst[i][GCOMP] = _mesa_half_to_float(s[i*4+1]);
2233 dst[i][BCOMP] = _mesa_half_to_float(s[i*4+2]);
2234 dst[i][ACOMP] = 1.0;
2235 }
2236 }
2237
2238 static void
2239 unpack_XBGR16161616_UINT(const void *src, GLfloat dst[][4], GLuint n)
2240 {
2241 const GLushort *s = (const GLushort *) src;
2242 GLuint i;
2243 for (i = 0; i < n; i++) {
2244 dst[i][RCOMP] = (GLfloat) s[i*4+0];
2245 dst[i][GCOMP] = (GLfloat) s[i*4+1];
2246 dst[i][BCOMP] = (GLfloat) s[i*4+2];
2247 dst[i][ACOMP] = 1.0;
2248 }
2249 }
2250
2251 static void
2252 unpack_XBGR16161616_SINT(const void *src, GLfloat dst[][4], GLuint n)
2253 {
2254 const GLshort *s = (const GLshort *) src;
2255 GLuint i;
2256 for (i = 0; i < n; i++) {
2257 dst[i][RCOMP] = (GLfloat) s[i*4+0];
2258 dst[i][GCOMP] = (GLfloat) s[i*4+1];
2259 dst[i][BCOMP] = (GLfloat) s[i*4+2];
2260 dst[i][ACOMP] = 1.0;
2261 }
2262 }
2263
2264 static void
2265 unpack_RGBX_FLOAT32(const void *src, GLfloat dst[][4], GLuint n)
2266 {
2267 const GLfloat *s = (const GLfloat *) src;
2268 GLuint i;
2269 for (i = 0; i < n; i++) {
2270 dst[i][RCOMP] = s[i*4+0];
2271 dst[i][GCOMP] = s[i*4+1];
2272 dst[i][BCOMP] = s[i*4+2];
2273 dst[i][ACOMP] = 1.0;
2274 }
2275 }
2276
2277 static void
2278 unpack_XBGR32323232_UINT(const void *src, GLfloat dst[][4], GLuint n)
2279 {
2280 const GLuint *s = (const GLuint *) src;
2281 GLuint i;
2282 for (i = 0; i < n; i++) {
2283 dst[i][RCOMP] = (GLfloat) s[i*4+0];
2284 dst[i][GCOMP] = (GLfloat) s[i*4+1];
2285 dst[i][BCOMP] = (GLfloat) s[i*4+2];
2286 dst[i][ACOMP] = 1.0;
2287 }
2288 }
2289
2290 static void
2291 unpack_XBGR32323232_SINT(const void *src, GLfloat dst[][4], GLuint n)
2292 {
2293 const GLint *s = (const GLint *) src;
2294 GLuint i;
2295 for (i = 0; i < n; i++) {
2296 dst[i][RCOMP] = (GLfloat) s[i*4+0];
2297 dst[i][GCOMP] = (GLfloat) s[i*4+1];
2298 dst[i][BCOMP] = (GLfloat) s[i*4+2];
2299 dst[i][ACOMP] = 1.0;
2300 }
2301 }
2302
2303 static void
2304 unpack_R10G10B10A2_UNORM(const void *src, GLfloat dst[][4], GLuint n)
2305 {
2306 const GLuint *s = ((const GLuint *) src);
2307 GLuint i;
2308 for (i = 0; i < n; i++) {
2309 dst[i][RCOMP] = ((s[i] >> 0) & 0x3ff) * (1.0F / 1023.0F);
2310 dst[i][GCOMP] = ((s[i] >> 10) & 0x3ff) * (1.0F / 1023.0F);
2311 dst[i][BCOMP] = ((s[i] >> 20) & 0x3ff) * (1.0F / 1023.0F);
2312 dst[i][ACOMP] = ((s[i] >> 30) & 0x03) * (1.0F / 3.0F);
2313 }
2314 }
2315
2316 static void
2317 unpack_G8R8_SNORM(const void *src, GLfloat dst[][4], GLuint n)
2318 {
2319 const GLushort *s = ((const GLushort *) src);
2320 GLuint i;
2321 for (i = 0; i < n; i++) {
2322 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) );
2323 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) );
2324 dst[i][BCOMP] = 0.0F;
2325 dst[i][ACOMP] = 1.0F;
2326 }
2327 }
2328
2329 static void
2330 unpack_G16R16_SNORM(const void *src, GLfloat dst[][4], GLuint n)
2331 {
2332 const GLuint *s = ((const GLuint *) src);
2333 GLuint i;
2334 for (i = 0; i < n; i++) {
2335 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] >> 16) );
2336 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] & 0xffff) );
2337 dst[i][BCOMP] = 0.0F;
2338 dst[i][ACOMP] = 1.0F;
2339 }
2340 }
2341
2342 static void
2343 unpack_B8G8R8X8_SRGB(const void *src, GLfloat dst[][4], GLuint n)
2344 {
2345 const GLuint *s = ((const GLuint *) src);
2346 GLuint i;
2347 for (i = 0; i < n; i++) {
2348 dst[i][RCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 16) & 0xff );
2349 dst[i][GCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 8) & 0xff );
2350 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] ) & 0xff );
2351 dst[i][ACOMP] = 1.0F;
2352 }
2353 }
2354
2355 static void
2356 unpack_X8R8G8B8_SRGB(const void *src, GLfloat dst[][4], GLuint n)
2357 {
2358 const GLuint *s = ((const GLuint *) src);
2359 GLuint i;
2360 for (i = 0; i < n; i++) {
2361 dst[i][RCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 8) & 0xff );
2362 dst[i][GCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 16) & 0xff );
2363 dst[i][BCOMP] = util_format_srgb_8unorm_to_linear_float( (s[i] >> 24) );
2364 dst[i][ACOMP] = 1.0F;
2365 }
2366 }
2367
2368 /**
2369 * Return the unpacker function for the given format.
2370 */
2371 static unpack_rgba_func
2372 get_unpack_rgba_function(mesa_format format)
2373 {
2374 static unpack_rgba_func table[MESA_FORMAT_COUNT];
2375 static GLboolean initialized = GL_FALSE;
2376
2377 if (!initialized) {
2378 table[MESA_FORMAT_NONE] = NULL;
2379
2380 table[MESA_FORMAT_A8B8G8R8_UNORM] = unpack_A8B8G8R8_UNORM;
2381 table[MESA_FORMAT_R8G8B8A8_UNORM] = unpack_R8G8B8A8_UNORM;
2382 table[MESA_FORMAT_B8G8R8A8_UNORM] = unpack_B8G8R8A8_UNORM;
2383 table[MESA_FORMAT_A8R8G8B8_UNORM] = unpack_A8R8G8B8_UNORM;
2384 table[MESA_FORMAT_X8B8G8R8_UNORM] = unpack_RGBX8888;
2385 table[MESA_FORMAT_R8G8B8X8_UNORM] = unpack_RGBX8888_REV;
2386 table[MESA_FORMAT_B8G8R8X8_UNORM] = unpack_B8G8R8X8_UNORM;
2387 table[MESA_FORMAT_X8R8G8B8_UNORM] = unpack_X8R8G8B8_UNORM;
2388 table[MESA_FORMAT_BGR_UNORM8] = unpack_BGR_UNORM8;
2389 table[MESA_FORMAT_RGB_UNORM8] = unpack_RGB_UNORM8;
2390 table[MESA_FORMAT_B5G6R5_UNORM] = unpack_B5G6R5_UNORM;
2391 table[MESA_FORMAT_R5G6B5_UNORM] = unpack_R5G6B5_UNORM;
2392 table[MESA_FORMAT_B4G4R4A4_UNORM] = unpack_B4G4R4A4_UNORM;
2393 table[MESA_FORMAT_A4R4G4B4_UNORM] = unpack_A4R4G4B4_UNORM;
2394 table[MESA_FORMAT_A1B5G5R5_UNORM] = unpack_A1B5G5R5_UNORM;
2395 table[MESA_FORMAT_B5G5R5A1_UNORM] = unpack_B5G5R5A1_UNORM;
2396 table[MESA_FORMAT_A1R5G5B5_UNORM] = unpack_A1R5G5B5_UNORM;
2397 table[MESA_FORMAT_L4A4_UNORM] = unpack_L4A4_UNORM;
2398 table[MESA_FORMAT_L8A8_UNORM] = unpack_L8A8_UNORM;
2399 table[MESA_FORMAT_A8L8_UNORM] = unpack_A8L8_UNORM;
2400 table[MESA_FORMAT_L16A16_UNORM] = unpack_L16A16_UNORM;
2401 table[MESA_FORMAT_A16L16_UNORM] = unpack_A16L16_UNORM;
2402 table[MESA_FORMAT_B2G3R3_UNORM] = unpack_B2G3R3_UNORM;
2403 table[MESA_FORMAT_A_UNORM8] = unpack_A_UNORM8;
2404 table[MESA_FORMAT_A_UNORM16] = unpack_A_UNORM16;
2405 table[MESA_FORMAT_L_UNORM8] = unpack_L_UNORM8;
2406 table[MESA_FORMAT_L_UNORM16] = unpack_L_UNORM16;
2407 table[MESA_FORMAT_I_UNORM8] = unpack_I_UNORM8;
2408 table[MESA_FORMAT_I_UNORM16] = unpack_I_UNORM16;
2409 table[MESA_FORMAT_YCBCR] = unpack_YCBCR;
2410 table[MESA_FORMAT_YCBCR_REV] = unpack_YCBCR_REV;
2411 table[MESA_FORMAT_R_UNORM8] = unpack_R_UNORM8;
2412 table[MESA_FORMAT_R8G8_UNORM] = unpack_R8G8_UNORM;
2413 table[MESA_FORMAT_G8R8_UNORM] = unpack_G8R8_UNORM;
2414 table[MESA_FORMAT_R_UNORM16] = unpack_R_UNORM16;
2415 table[MESA_FORMAT_R16G16_UNORM] = unpack_R16G16_UNORM;
2416 table[MESA_FORMAT_G16R16_UNORM] = unpack_G16R16_UNORM;
2417 table[MESA_FORMAT_B10G10R10A2_UNORM] = unpack_B10G10R10A2_UNORM;
2418 table[MESA_FORMAT_B10G10R10A2_UINT] = unpack_B10G10R10A2_UINT;
2419 table[MESA_FORMAT_R10G10B10A2_UINT] = unpack_R10G10B10A2_UINT;
2420 table[MESA_FORMAT_S8_UINT_Z24_UNORM] = unpack_S8_UINT_Z24_UNORM;
2421 table[MESA_FORMAT_Z24_UNORM_S8_UINT] = unpack_Z24_UNORM_S8_UINT;
2422 table[MESA_FORMAT_Z_UNORM16] = unpack_Z_UNORM16;
2423 table[MESA_FORMAT_Z24_UNORM_X8_UINT] = unpack_Z24_UNORM_X8_UINT;
2424 table[MESA_FORMAT_X8_UINT_Z24_UNORM] = unpack_X8_UINT_Z24_UNORM;
2425 table[MESA_FORMAT_Z_UNORM32] = unpack_Z_UNORM32;
2426 table[MESA_FORMAT_S_UINT8] = unpack_S8;
2427 table[MESA_FORMAT_BGR_SRGB8] = unpack_BGR_SRGB8;
2428 table[MESA_FORMAT_A8B8G8R8_SRGB] = unpack_A8B8G8R8_SRGB;
2429 table[MESA_FORMAT_B8G8R8A8_SRGB] = unpack_B8G8R8A8_SRGB;
2430 table[MESA_FORMAT_A8R8G8B8_SRGB] = unpack_A8R8G8B8_SRGB;
2431 table[MESA_FORMAT_R8G8B8A8_SRGB] = unpack_R8G8B8A8_SRGB;
2432 table[MESA_FORMAT_L_SRGB8] = unpack_L_SRGB8;
2433 table[MESA_FORMAT_L8A8_SRGB] = unpack_L8A8_SRGB;
2434 table[MESA_FORMAT_A8L8_SRGB] = unpack_A8L8_SRGB;
2435 table[MESA_FORMAT_SRGB_DXT1] = unpack_SRGB_DXT1;
2436 table[MESA_FORMAT_SRGBA_DXT1] = unpack_SRGBA_DXT1;
2437 table[MESA_FORMAT_SRGBA_DXT3] = unpack_SRGBA_DXT3;
2438 table[MESA_FORMAT_SRGBA_DXT5] = unpack_SRGBA_DXT5;
2439
2440 table[MESA_FORMAT_RGB_FXT1] = unpack_RGB_FXT1;
2441 table[MESA_FORMAT_RGBA_FXT1] = unpack_RGBA_FXT1;
2442 table[MESA_FORMAT_RGB_DXT1] = unpack_RGB_DXT1;
2443 table[MESA_FORMAT_RGBA_DXT1] = unpack_RGBA_DXT1;
2444 table[MESA_FORMAT_RGBA_DXT3] = unpack_RGBA_DXT3;
2445 table[MESA_FORMAT_RGBA_DXT5] = unpack_RGBA_DXT5;
2446
2447 table[MESA_FORMAT_RGBA_FLOAT32] = unpack_RGBA_FLOAT32;
2448 table[MESA_FORMAT_RGBA_FLOAT16] = unpack_RGBA_FLOAT16;
2449 table[MESA_FORMAT_RGB_FLOAT32] = unpack_RGB_FLOAT32;
2450 table[MESA_FORMAT_RGB_FLOAT16] = unpack_RGB_FLOAT16;
2451 table[MESA_FORMAT_A_FLOAT32] = unpack_A_FLOAT32;
2452 table[MESA_FORMAT_A_FLOAT16] = unpack_A_FLOAT16;
2453 table[MESA_FORMAT_L_FLOAT32] = unpack_L_FLOAT32;
2454 table[MESA_FORMAT_L_FLOAT16] = unpack_L_FLOAT16;
2455 table[MESA_FORMAT_LA_FLOAT32] = unpack_LA_FLOAT32;
2456 table[MESA_FORMAT_LA_FLOAT16] = unpack_LA_FLOAT16;
2457 table[MESA_FORMAT_I_FLOAT32] = unpack_I_FLOAT32;
2458 table[MESA_FORMAT_I_FLOAT16] = unpack_I_FLOAT16;
2459 table[MESA_FORMAT_R_FLOAT32] = unpack_R_FLOAT32;
2460 table[MESA_FORMAT_R_FLOAT16] = unpack_R_FLOAT16;
2461 table[MESA_FORMAT_RG_FLOAT32] = unpack_RG_FLOAT32;
2462 table[MESA_FORMAT_RG_FLOAT16] = unpack_RG_FLOAT16;
2463
2464 table[MESA_FORMAT_A_UINT8] = unpack_ALPHA_UINT8;
2465 table[MESA_FORMAT_A_UINT16] = unpack_ALPHA_UINT16;
2466 table[MESA_FORMAT_A_UINT32] = unpack_ALPHA_UINT32;
2467 table[MESA_FORMAT_A_SINT8] = unpack_ALPHA_INT8;
2468 table[MESA_FORMAT_A_SINT16] = unpack_ALPHA_INT16;
2469 table[MESA_FORMAT_A_SINT32] = unpack_ALPHA_INT32;
2470
2471 table[MESA_FORMAT_I_UINT8] = unpack_INTENSITY_UINT8;
2472 table[MESA_FORMAT_I_UINT16] = unpack_INTENSITY_UINT16;
2473 table[MESA_FORMAT_I_UINT32] = unpack_INTENSITY_UINT32;
2474 table[MESA_FORMAT_I_SINT8] = unpack_INTENSITY_INT8;
2475 table[MESA_FORMAT_I_SINT16] = unpack_INTENSITY_INT16;
2476 table[MESA_FORMAT_I_SINT32] = unpack_INTENSITY_INT32;
2477
2478 table[MESA_FORMAT_L_UINT8] = unpack_LUMINANCE_UINT8;
2479 table[MESA_FORMAT_L_UINT16] = unpack_LUMINANCE_UINT16;
2480 table[MESA_FORMAT_L_UINT32] = unpack_LUMINANCE_UINT32;
2481 table[MESA_FORMAT_L_SINT8] = unpack_LUMINANCE_INT8;
2482 table[MESA_FORMAT_L_SINT16] = unpack_LUMINANCE_INT16;
2483 table[MESA_FORMAT_L_SINT32] = unpack_LUMINANCE_INT32;
2484
2485 table[MESA_FORMAT_LA_UINT8] = unpack_LUMINANCE_ALPHA_UINT8;
2486 table[MESA_FORMAT_LA_UINT16] = unpack_LUMINANCE_ALPHA_UINT16;
2487 table[MESA_FORMAT_LA_UINT32] = unpack_LUMINANCE_ALPHA_UINT32;
2488 table[MESA_FORMAT_LA_SINT8] = unpack_LUMINANCE_ALPHA_INT8;
2489 table[MESA_FORMAT_LA_SINT16] = unpack_LUMINANCE_ALPHA_INT16;
2490 table[MESA_FORMAT_LA_SINT32] = unpack_LUMINANCE_ALPHA_INT32;
2491
2492 table[MESA_FORMAT_R_SINT8] = unpack_R_INT8;
2493 table[MESA_FORMAT_RG_SINT8] = unpack_RG_INT8;
2494 table[MESA_FORMAT_RGB_SINT8] = unpack_RGB_INT8;
2495 table[MESA_FORMAT_RGBA_SINT8] = unpack_RGBA_INT8;
2496 table[MESA_FORMAT_R_SINT16] = unpack_R_INT16;
2497 table[MESA_FORMAT_RG_SINT16] = unpack_RG_INT16;
2498 table[MESA_FORMAT_RGB_SINT16] = unpack_RGB_INT16;
2499 table[MESA_FORMAT_RGBA_SINT16] = unpack_RGBA_INT16;
2500 table[MESA_FORMAT_R_SINT32] = unpack_R_INT32;
2501 table[MESA_FORMAT_RG_SINT32] = unpack_RG_INT32;
2502 table[MESA_FORMAT_RGB_SINT32] = unpack_RGB_INT32;
2503 table[MESA_FORMAT_RGBA_SINT32] = unpack_RGBA_INT32;
2504 table[MESA_FORMAT_R_UINT8] = unpack_R_UINT8;
2505 table[MESA_FORMAT_RG_UINT8] = unpack_RG_UINT8;
2506 table[MESA_FORMAT_RGB_UINT8] = unpack_RGB_UINT8;
2507 table[MESA_FORMAT_RGBA_UINT8] = unpack_RGBA_UINT8;
2508 table[MESA_FORMAT_R_UINT16] = unpack_R_UINT16;
2509 table[MESA_FORMAT_RG_UINT16] = unpack_RG_UINT16;
2510 table[MESA_FORMAT_RGB_UINT16] = unpack_RGB_UINT16;
2511 table[MESA_FORMAT_RGBA_UINT16] = unpack_RGBA_UINT16;
2512 table[MESA_FORMAT_R_UINT32] = unpack_R_UINT32;
2513 table[MESA_FORMAT_RG_UINT32] = unpack_RG_UINT32;
2514 table[MESA_FORMAT_RGB_UINT32] = unpack_RGB_UINT32;
2515 table[MESA_FORMAT_RGBA_UINT32] = unpack_RGBA_UINT32;
2516
2517 table[MESA_FORMAT_R_SNORM8] = unpack_R_SNORM8;
2518 table[MESA_FORMAT_R8G8_SNORM] = unpack_R8G8_SNORM;
2519 table[MESA_FORMAT_X8B8G8R8_SNORM] = unpack_X8B8G8R8_SNORM;
2520 table[MESA_FORMAT_A8B8G8R8_SNORM] = unpack_A8B8G8R8_SNORM;
2521 table[MESA_FORMAT_R8G8B8A8_SNORM] = unpack_R8G8B8A8_SNORM;
2522 table[MESA_FORMAT_R_SNORM16] = unpack_R_SNORM16;
2523 table[MESA_FORMAT_R16G16_SNORM] = unpack_R16G16_SNORM;
2524 table[MESA_FORMAT_RGB_SNORM16] = unpack_RGB_SNORM16;
2525 table[MESA_FORMAT_RGBA_SNORM16] = unpack_RGBA_SNORM16;
2526 table[MESA_FORMAT_RGBA_UNORM16] = unpack_RGBA_16;
2527
2528 table[MESA_FORMAT_R_RGTC1_UNORM] = unpack_RED_RGTC1;
2529 table[MESA_FORMAT_R_RGTC1_SNORM] = unpack_SIGNED_RED_RGTC1;
2530 table[MESA_FORMAT_RG_RGTC2_UNORM] = unpack_RG_RGTC2;
2531 table[MESA_FORMAT_RG_RGTC2_SNORM] = unpack_SIGNED_RG_RGTC2;
2532
2533 table[MESA_FORMAT_L_LATC1_UNORM] = unpack_L_LATC1;
2534 table[MESA_FORMAT_L_LATC1_SNORM] = unpack_SIGNED_L_LATC1;
2535 table[MESA_FORMAT_LA_LATC2_UNORM] = unpack_LA_LATC2;
2536 table[MESA_FORMAT_LA_LATC2_SNORM] = unpack_SIGNED_LA_LATC2;
2537
2538 table[MESA_FORMAT_ETC1_RGB8] = unpack_ETC1_RGB8;
2539 table[MESA_FORMAT_ETC2_RGB8] = unpack_ETC2_RGB8;
2540 table[MESA_FORMAT_ETC2_SRGB8] = unpack_ETC2_SRGB8;
2541 table[MESA_FORMAT_ETC2_RGBA8_EAC] = unpack_ETC2_RGBA8_EAC;
2542 table[MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC] = unpack_ETC2_SRGB8_ALPHA8_EAC;
2543 table[MESA_FORMAT_ETC2_R11_EAC] = unpack_ETC2_R11_EAC;
2544 table[MESA_FORMAT_ETC2_RG11_EAC] = unpack_ETC2_RG11_EAC;
2545 table[MESA_FORMAT_ETC2_SIGNED_R11_EAC] = unpack_ETC2_SIGNED_R11_EAC;
2546 table[MESA_FORMAT_ETC2_SIGNED_RG11_EAC] = unpack_ETC2_SIGNED_RG11_EAC;
2547 table[MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1] =
2548 unpack_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
2549 table[MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1] =
2550 unpack_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
2551 table[MESA_FORMAT_A_SNORM8] = unpack_A_SNORM8;
2552 table[MESA_FORMAT_L_SNORM8] = unpack_L_SNORM8;
2553 table[MESA_FORMAT_L8A8_SNORM] = unpack_L8A8_SNORM;
2554 table[MESA_FORMAT_A8L8_SNORM] = unpack_A8L8_SNORM;
2555 table[MESA_FORMAT_I_SNORM8] = unpack_I_SNORM8;
2556 table[MESA_FORMAT_A_SNORM16] = unpack_A_SNORM16;
2557 table[MESA_FORMAT_L_SNORM16] = unpack_L_SNORM16;
2558 table[MESA_FORMAT_LA_SNORM16] = unpack_LA_SNORM16;
2559 table[MESA_FORMAT_I_SNORM16] = unpack_I_SNORM16;
2560
2561 table[MESA_FORMAT_R9G9B9E5_FLOAT] = unpack_R9G9B9E5_FLOAT;
2562 table[MESA_FORMAT_R11G11B10_FLOAT] = unpack_R11G11B10_FLOAT;
2563
2564 table[MESA_FORMAT_Z_FLOAT32] = unpack_Z_FLOAT32;
2565 table[MESA_FORMAT_Z32_FLOAT_S8X24_UINT] = unpack_Z32_FLOAT_S8X24_UINT;
2566
2567 table[MESA_FORMAT_B4G4R4X4_UNORM] = unpack_XRGB4444_UNORM;
2568 table[MESA_FORMAT_B5G5R5X1_UNORM] = unpack_XRGB1555_UNORM;
2569 table[MESA_FORMAT_R8G8B8X8_SNORM] = unpack_R8G8B8X8_SNORM;
2570 table[MESA_FORMAT_R8G8B8X8_SRGB] = unpack_R8G8B8X8_SRGB;
2571 table[MESA_FORMAT_X8B8G8R8_SRGB] = unpack_X8B8G8R8_SRGB;
2572 table[MESA_FORMAT_RGBX_UINT8] = unpack_XBGR8888_UINT;
2573 table[MESA_FORMAT_RGBX_SINT8] = unpack_XBGR8888_SINT;
2574 table[MESA_FORMAT_B10G10R10X2_UNORM] = unpack_B10G10R10X2_UNORM;
2575 table[MESA_FORMAT_RGBX_UNORM16] = unpack_RGBX_UNORM16;
2576 table[MESA_FORMAT_RGBX_SNORM16] = unpack_RGBX_SNORM16;
2577 table[MESA_FORMAT_RGBX_FLOAT16] = unpack_XBGR16161616_FLOAT;
2578 table[MESA_FORMAT_RGBX_UINT16] = unpack_XBGR16161616_UINT;
2579 table[MESA_FORMAT_RGBX_SINT16] = unpack_XBGR16161616_SINT;
2580 table[MESA_FORMAT_RGBX_FLOAT32] = unpack_RGBX_FLOAT32;
2581 table[MESA_FORMAT_RGBX_UINT32] = unpack_XBGR32323232_UINT;
2582 table[MESA_FORMAT_RGBX_SINT32] = unpack_XBGR32323232_SINT;
2583
2584 table[MESA_FORMAT_R10G10B10A2_UNORM] = unpack_R10G10B10A2_UNORM;
2585
2586 table[MESA_FORMAT_G8R8_SNORM] = unpack_G8R8_SNORM;
2587 table[MESA_FORMAT_G16R16_SNORM] = unpack_G16R16_SNORM;
2588
2589 table[MESA_FORMAT_B8G8R8X8_SRGB] = unpack_B8G8R8X8_SRGB;
2590 table[MESA_FORMAT_X8R8G8B8_SRGB] = unpack_X8R8G8B8_SRGB;
2591
2592 initialized = GL_TRUE;
2593 }
2594
2595 if (table[format] == NULL) {
2596 _mesa_problem(NULL, "unsupported unpack for format %s",
2597 _mesa_get_format_name(format));
2598 }
2599
2600 return table[format];
2601 }
2602
2603
2604 /**
2605 * Unpack rgba colors, returning as GLfloat values.
2606 */
2607 void
2608 _mesa_unpack_rgba_row(mesa_format format, GLuint n,
2609 const void *src, GLfloat dst[][4])
2610 {
2611 unpack_rgba_func unpack = get_unpack_rgba_function(format);
2612 unpack(src, dst, n);
2613 }
2614
2615
2616 /**********************************************************************/
2617 /* Unpack, returning GLubyte colors */
2618 /**********************************************************************/
2619
2620
2621 static void
2622 unpack_ubyte_A8B8G8R8_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2623 {
2624 const GLuint *s = ((const GLuint *) src);
2625 GLuint i;
2626 for (i = 0; i < n; i++) {
2627 dst[i][RCOMP] = (s[i] >> 24);
2628 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2629 dst[i][BCOMP] = (s[i] >> 8) & 0xff;
2630 dst[i][ACOMP] = (s[i] ) & 0xff;
2631 }
2632 }
2633
2634 static void
2635 unpack_ubyte_R8G8B8A8_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2636 {
2637 const GLuint *s = ((const GLuint *) src);
2638 GLuint i;
2639 for (i = 0; i < n; i++) {
2640 dst[i][RCOMP] = (s[i] ) & 0xff;
2641 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2642 dst[i][BCOMP] = (s[i] >> 16) & 0xff;
2643 dst[i][ACOMP] = (s[i] >> 24);
2644 }
2645 }
2646
2647 static void
2648 unpack_ubyte_B8G8R8A8_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2649 {
2650 const GLuint *s = ((const GLuint *) src);
2651 GLuint i;
2652 for (i = 0; i < n; i++) {
2653 dst[i][RCOMP] = (s[i] >> 16) & 0xff;
2654 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2655 dst[i][BCOMP] = (s[i] ) & 0xff;
2656 dst[i][ACOMP] = (s[i] >> 24);
2657 }
2658 }
2659
2660 static void
2661 unpack_ubyte_A8R8G8B8_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2662 {
2663 const GLuint *s = ((const GLuint *) src);
2664 GLuint i;
2665 for (i = 0; i < n; i++) {
2666 dst[i][RCOMP] = (s[i] >> 8) & 0xff;
2667 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2668 dst[i][BCOMP] = (s[i] >> 24);
2669 dst[i][ACOMP] = (s[i] ) & 0xff;
2670 }
2671 }
2672
2673 static void
2674 unpack_ubyte_RGBX8888(const void *src, GLubyte dst[][4], GLuint n)
2675 {
2676 const GLuint *s = ((const GLuint *) src);
2677 GLuint i;
2678 for (i = 0; i < n; i++) {
2679 dst[i][RCOMP] = (s[i] >> 24);
2680 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2681 dst[i][BCOMP] = (s[i] >> 8) & 0xff;
2682 dst[i][ACOMP] = 0xff;
2683 }
2684 }
2685
2686 static void
2687 unpack_ubyte_RGBX8888_REV(const void *src, GLubyte dst[][4], GLuint n)
2688 {
2689 const GLuint *s = ((const GLuint *) src);
2690 GLuint i;
2691 for (i = 0; i < n; i++) {
2692 dst[i][RCOMP] = (s[i] ) & 0xff;
2693 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2694 dst[i][BCOMP] = (s[i] >> 16) & 0xff;
2695 dst[i][ACOMP] = 0xff;
2696 }
2697 }
2698
2699 static void
2700 unpack_ubyte_B8G8R8X8_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2701 {
2702 const GLuint *s = ((const GLuint *) src);
2703 GLuint i;
2704 for (i = 0; i < n; i++) {
2705 dst[i][RCOMP] = (s[i] >> 16) & 0xff;
2706 dst[i][GCOMP] = (s[i] >> 8) & 0xff;
2707 dst[i][BCOMP] = (s[i] ) & 0xff;
2708 dst[i][ACOMP] = 0xff;
2709 }
2710 }
2711
2712 static void
2713 unpack_ubyte_X8R8G8B8_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2714 {
2715 const GLuint *s = ((const GLuint *) src);
2716 GLuint i;
2717 for (i = 0; i < n; i++) {
2718 dst[i][RCOMP] = (s[i] >> 8) & 0xff;
2719 dst[i][GCOMP] = (s[i] >> 16) & 0xff;
2720 dst[i][BCOMP] = (s[i] >> 24);
2721 dst[i][ACOMP] = 0xff;
2722 }
2723 }
2724
2725 static void
2726 unpack_ubyte_BGR_UNORM8(const void *src, GLubyte dst[][4], GLuint n)
2727 {
2728 const GLubyte *s = (const GLubyte *) src;
2729 GLuint i;
2730 for (i = 0; i < n; i++) {
2731 dst[i][RCOMP] = s[i*3+2];
2732 dst[i][GCOMP] = s[i*3+1];
2733 dst[i][BCOMP] = s[i*3+0];
2734 dst[i][ACOMP] = 0xff;
2735 }
2736 }
2737
2738 static void
2739 unpack_ubyte_RGB_UNORM8(const void *src, GLubyte dst[][4], GLuint n)
2740 {
2741 const GLubyte *s = (const GLubyte *) src;
2742 GLuint i;
2743 for (i = 0; i < n; i++) {
2744 dst[i][RCOMP] = s[i*3+0];
2745 dst[i][GCOMP] = s[i*3+1];
2746 dst[i][BCOMP] = s[i*3+2];
2747 dst[i][ACOMP] = 0xff;
2748 }
2749 }
2750
2751 static void
2752 unpack_ubyte_B5G6R5_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2753 {
2754 const GLushort *s = ((const GLushort *) src);
2755 GLuint i;
2756 for (i = 0; i < n; i++) {
2757 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f);
2758 dst[i][GCOMP] = EXPAND_6_8((s[i] >> 5 ) & 0x3f);
2759 dst[i][BCOMP] = EXPAND_5_8( s[i] & 0x1f);
2760 dst[i][ACOMP] = 0xff;
2761 }
2762 }
2763
2764 static void
2765 unpack_ubyte_R5G6B5_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2766 {
2767 /* Warning: this function does not match the current Mesa definition
2768 * of MESA_FORMAT_R5G6B5_UNORM.
2769 */
2770 const GLushort *s = ((const GLushort *) src);
2771 GLuint i;
2772 for (i = 0; i < n; i++) {
2773 GLuint t = (s[i] >> 8) | (s[i] << 8); /* byte swap */
2774 dst[i][RCOMP] = EXPAND_5_8((t >> 11) & 0x1f);
2775 dst[i][GCOMP] = EXPAND_6_8((t >> 5 ) & 0x3f);
2776 dst[i][BCOMP] = EXPAND_5_8( t & 0x1f);
2777 dst[i][ACOMP] = 0xff;
2778 }
2779 }
2780
2781 static void
2782 unpack_ubyte_B4G4R4A4_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2783 {
2784 const GLushort *s = ((const GLushort *) src);
2785 GLuint i;
2786 for (i = 0; i < n; i++) {
2787 dst[i][RCOMP] = EXPAND_4_8((s[i] >> 8) & 0xf);
2788 dst[i][GCOMP] = EXPAND_4_8((s[i] >> 4) & 0xf);
2789 dst[i][BCOMP] = EXPAND_4_8((s[i] ) & 0xf);
2790 dst[i][ACOMP] = EXPAND_4_8((s[i] >> 12) & 0xf);
2791 }
2792 }
2793
2794 static void
2795 unpack_ubyte_A4R4G4B4_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2796 {
2797 const GLushort *s = ((const GLushort *) src);
2798 GLuint i;
2799 for (i = 0; i < n; i++) {
2800 dst[i][RCOMP] = EXPAND_4_8((s[i] >> 4) & 0xf);
2801 dst[i][GCOMP] = EXPAND_4_8((s[i] >> 8) & 0xf);
2802 dst[i][BCOMP] = EXPAND_4_8((s[i] >> 12) & 0xf);
2803 dst[i][ACOMP] = EXPAND_4_8((s[i] ) & 0xf);
2804 }
2805 }
2806
2807 static void
2808 unpack_ubyte_A1B5G5R5_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2809 {
2810 const GLushort *s = ((const GLushort *) src);
2811 GLuint i;
2812 for (i = 0; i < n; i++) {
2813 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f);
2814 dst[i][GCOMP] = EXPAND_5_8((s[i] >> 6) & 0x1f);
2815 dst[i][BCOMP] = EXPAND_5_8((s[i] >> 1) & 0x1f);
2816 dst[i][ACOMP] = EXPAND_1_8((s[i] ) & 0x01);
2817 }
2818 }
2819
2820 static void
2821 unpack_ubyte_B5G5R5A1_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2822 {
2823 const GLushort *s = ((const GLushort *) src);
2824 GLuint i;
2825 for (i = 0; i < n; i++) {
2826 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 10) & 0x1f);
2827 dst[i][GCOMP] = EXPAND_5_8((s[i] >> 5) & 0x1f);
2828 dst[i][BCOMP] = EXPAND_5_8((s[i] >> 0) & 0x1f);
2829 dst[i][ACOMP] = EXPAND_1_8((s[i] >> 15) & 0x01);
2830 }
2831 }
2832
2833 static void
2834 unpack_ubyte_A1R5G5B5_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2835 {
2836 /* Warning: this function does not match the current Mesa definition
2837 * of MESA_FORMAT_A1R5G5B5_UNORM.
2838 */
2839 const GLushort *s = ((const GLushort *) src);
2840 GLuint i;
2841 for (i = 0; i < n; i++) {
2842 GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */
2843 dst[i][RCOMP] = EXPAND_5_8((tmp >> 10) & 0x1f);
2844 dst[i][GCOMP] = EXPAND_5_8((tmp >> 5) & 0x1f);
2845 dst[i][BCOMP] = EXPAND_5_8((tmp >> 0) & 0x1f);
2846 dst[i][ACOMP] = EXPAND_1_8((tmp >> 15) & 0x01);
2847 }
2848 }
2849
2850 static void
2851 unpack_ubyte_L4A4_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2852 {
2853 const GLubyte *s = ((const GLubyte *) src);
2854 GLuint i;
2855 for (i = 0; i < n; i++) {
2856 dst[i][RCOMP] =
2857 dst[i][GCOMP] =
2858 dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xf);
2859 dst[i][ACOMP] = EXPAND_4_8(s[i] >> 4);
2860 }
2861 }
2862
2863 static void
2864 unpack_ubyte_L8A8_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2865 {
2866 const GLushort *s = ((const GLushort *) src);
2867 GLuint i;
2868 for (i = 0; i < n; i++) {
2869 dst[i][RCOMP] =
2870 dst[i][GCOMP] =
2871 dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xff);
2872 dst[i][ACOMP] = EXPAND_4_8(s[i] >> 8);
2873 }
2874 }
2875
2876 static void
2877 unpack_ubyte_A8L8_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2878 {
2879 const GLushort *s = ((const GLushort *) src);
2880 GLuint i;
2881 for (i = 0; i < n; i++) {
2882 dst[i][RCOMP] =
2883 dst[i][GCOMP] =
2884 dst[i][BCOMP] = EXPAND_4_8(s[i] >> 8);
2885 dst[i][ACOMP] = EXPAND_4_8(s[i] & 0xff);
2886 }
2887 }
2888
2889 static void
2890 unpack_ubyte_B2G3R3_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2891 {
2892 const GLubyte *s = ((const GLubyte *) src);
2893 GLuint i;
2894 for (i = 0; i < n; i++) {
2895 dst[i][RCOMP] = EXPAND_3_8((s[i] >> 5) & 0x7);
2896 dst[i][GCOMP] = EXPAND_3_8((s[i] >> 2) & 0x7);
2897 dst[i][BCOMP] = EXPAND_2_8((s[i] ) & 0x3);
2898 dst[i][ACOMP] = 0xff;
2899 }
2900 }
2901
2902 static void
2903 unpack_ubyte_A_UNORM8(const void *src, GLubyte dst[][4], GLuint n)
2904 {
2905 const GLubyte *s = ((const GLubyte *) src);
2906 GLuint i;
2907 for (i = 0; i < n; i++) {
2908 dst[i][RCOMP] =
2909 dst[i][GCOMP] =
2910 dst[i][BCOMP] = 0;
2911 dst[i][ACOMP] = s[i];
2912 }
2913 }
2914
2915 static void
2916 unpack_ubyte_L_UNORM8(const void *src, GLubyte dst[][4], GLuint n)
2917 {
2918 const GLubyte *s = ((const GLubyte *) src);
2919 GLuint i;
2920 for (i = 0; i < n; i++) {
2921 dst[i][RCOMP] =
2922 dst[i][GCOMP] =
2923 dst[i][BCOMP] = s[i];
2924 dst[i][ACOMP] = 0xff;
2925 }
2926 }
2927
2928
2929 static void
2930 unpack_ubyte_I_UNORM8(const void *src, GLubyte dst[][4], GLuint n)
2931 {
2932 const GLubyte *s = ((const GLubyte *) src);
2933 GLuint i;
2934 for (i = 0; i < n; i++) {
2935 dst[i][RCOMP] =
2936 dst[i][GCOMP] =
2937 dst[i][BCOMP] =
2938 dst[i][ACOMP] = s[i];
2939 }
2940 }
2941
2942 static void
2943 unpack_ubyte_R_UNORM8(const void *src, GLubyte dst[][4], GLuint n)
2944 {
2945 const GLubyte *s = ((const GLubyte *) src);
2946 GLuint i;
2947 for (i = 0; i < n; i++) {
2948 dst[i][0] = s[i];
2949 dst[i][1] =
2950 dst[i][2] = 0;
2951 dst[i][3] = 0xff;
2952 }
2953 }
2954
2955 static void
2956 unpack_ubyte_R8G8_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2957 {
2958 const GLushort *s = ((const GLushort *) src);
2959 GLuint i;
2960 for (i = 0; i < n; i++) {
2961 dst[i][RCOMP] = s[i] & 0xff;
2962 dst[i][GCOMP] = s[i] >> 8;
2963 dst[i][BCOMP] = 0;
2964 dst[i][ACOMP] = 0xff;
2965 }
2966 }
2967
2968 static void
2969 unpack_ubyte_G8R8_UNORM(const void *src, GLubyte dst[][4], GLuint n)
2970 {
2971 const GLushort *s = ((const GLushort *) src);
2972 GLuint i;
2973 for (i = 0; i < n; i++) {
2974 dst[i][RCOMP] = s[i] >> 8;
2975 dst[i][GCOMP] = s[i] & 0xff;
2976 dst[i][BCOMP] = 0;
2977 dst[i][ACOMP] = 0xff;
2978 }
2979 }
2980
2981
2982 /**
2983 * Unpack rgba colors, returning as GLubyte values. This should usually
2984 * only be used for unpacking formats that use 8 bits or less per channel.
2985 */
2986 void
2987 _mesa_unpack_ubyte_rgba_row(mesa_format format, GLuint n,
2988 const void *src, GLubyte dst[][4])
2989 {
2990 switch (format) {
2991 case MESA_FORMAT_A8B8G8R8_UNORM:
2992 unpack_ubyte_A8B8G8R8_UNORM(src, dst, n);
2993 break;
2994 case MESA_FORMAT_R8G8B8A8_UNORM:
2995 unpack_ubyte_R8G8B8A8_UNORM(src, dst, n);
2996 break;
2997 case MESA_FORMAT_B8G8R8A8_UNORM:
2998 unpack_ubyte_B8G8R8A8_UNORM(src, dst, n);
2999 break;
3000 case MESA_FORMAT_A8R8G8B8_UNORM:
3001 unpack_ubyte_A8R8G8B8_UNORM(src, dst, n);
3002 break;
3003 case MESA_FORMAT_X8B8G8R8_UNORM:
3004 unpack_ubyte_RGBX8888(src, dst, n);
3005 break;
3006 case MESA_FORMAT_R8G8B8X8_UNORM:
3007 unpack_ubyte_RGBX8888_REV(src, dst, n);
3008 break;
3009 case MESA_FORMAT_B8G8R8X8_UNORM:
3010 unpack_ubyte_B8G8R8X8_UNORM(src, dst, n);
3011 break;
3012 case MESA_FORMAT_X8R8G8B8_UNORM:
3013 unpack_ubyte_X8R8G8B8_UNORM(src, dst, n);
3014 break;
3015 case MESA_FORMAT_BGR_UNORM8:
3016 unpack_ubyte_BGR_UNORM8(src, dst, n);
3017 break;
3018 case MESA_FORMAT_RGB_UNORM8:
3019 unpack_ubyte_RGB_UNORM8(src, dst, n);
3020 break;
3021 case MESA_FORMAT_B5G6R5_UNORM:
3022 unpack_ubyte_B5G6R5_UNORM(src, dst, n);
3023 break;
3024 case MESA_FORMAT_R5G6B5_UNORM:
3025 unpack_ubyte_R5G6B5_UNORM(src, dst, n);
3026 break;
3027 case MESA_FORMAT_B4G4R4A4_UNORM:
3028 unpack_ubyte_B4G4R4A4_UNORM(src, dst, n);
3029 break;
3030 case MESA_FORMAT_A4R4G4B4_UNORM:
3031 unpack_ubyte_A4R4G4B4_UNORM(src, dst, n);
3032 break;
3033 case MESA_FORMAT_A1B5G5R5_UNORM:
3034 unpack_ubyte_A1B5G5R5_UNORM(src, dst, n);
3035 break;
3036 case MESA_FORMAT_B5G5R5A1_UNORM:
3037 unpack_ubyte_B5G5R5A1_UNORM(src, dst, n);
3038 break;
3039 case MESA_FORMAT_A1R5G5B5_UNORM:
3040 unpack_ubyte_A1R5G5B5_UNORM(src, dst, n);
3041 break;
3042 case MESA_FORMAT_L4A4_UNORM:
3043 unpack_ubyte_L4A4_UNORM(src, dst, n);
3044 break;
3045 case MESA_FORMAT_L8A8_UNORM:
3046 unpack_ubyte_L8A8_UNORM(src, dst, n);
3047 break;
3048 case MESA_FORMAT_A8L8_UNORM:
3049 unpack_ubyte_A8L8_UNORM(src, dst, n);
3050 break;
3051 case MESA_FORMAT_B2G3R3_UNORM:
3052 unpack_ubyte_B2G3R3_UNORM(src, dst, n);
3053 break;
3054 case MESA_FORMAT_A_UNORM8:
3055 unpack_ubyte_A_UNORM8(src, dst, n);
3056 break;
3057 case MESA_FORMAT_L_UNORM8:
3058 unpack_ubyte_L_UNORM8(src, dst, n);
3059 break;
3060 case MESA_FORMAT_I_UNORM8:
3061 unpack_ubyte_I_UNORM8(src, dst, n);
3062 break;
3063 case MESA_FORMAT_R_UNORM8:
3064 unpack_ubyte_R_UNORM8(src, dst, n);
3065 break;
3066 case MESA_FORMAT_R8G8_UNORM:
3067 unpack_ubyte_R8G8_UNORM(src, dst, n);
3068 break;
3069 case MESA_FORMAT_G8R8_UNORM:
3070 unpack_ubyte_G8R8_UNORM(src, dst, n);
3071 break;
3072 default:
3073 /* get float values, convert to ubyte */
3074 {
3075 GLfloat *tmp = malloc(n * 4 * sizeof(GLfloat));
3076 if (tmp) {
3077 GLuint i;
3078 _mesa_unpack_rgba_row(format, n, src, (GLfloat (*)[4]) tmp);
3079 for (i = 0; i < n; i++) {
3080 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][0], tmp[i*4+0]);
3081 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][1], tmp[i*4+1]);
3082 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][2], tmp[i*4+2]);
3083 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][3], tmp[i*4+3]);
3084 }
3085 free(tmp);
3086 }
3087 }
3088 break;
3089 }
3090 }
3091
3092
3093 /**********************************************************************/
3094 /* Unpack, returning GLuint colors */
3095 /**********************************************************************/
3096
3097 static void
3098 unpack_int_rgba_RGBA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3099 {
3100 memcpy(dst, src, n * 4 * sizeof(GLuint));
3101 }
3102
3103 static void
3104 unpack_int_rgba_RGBA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3105 {
3106 unsigned int i;
3107
3108 for (i = 0; i < n; i++) {
3109 dst[i][0] = src[i * 4 + 0];
3110 dst[i][1] = src[i * 4 + 1];
3111 dst[i][2] = src[i * 4 + 2];
3112 dst[i][3] = src[i * 4 + 3];
3113 }
3114 }
3115
3116 static void
3117 unpack_int_rgba_RGBA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3118 {
3119 unsigned int i;
3120
3121 for (i = 0; i < n; i++) {
3122 dst[i][0] = src[i * 4 + 0];
3123 dst[i][1] = src[i * 4 + 1];
3124 dst[i][2] = src[i * 4 + 2];
3125 dst[i][3] = src[i * 4 + 3];
3126 }
3127 }
3128
3129 static void
3130 unpack_int_rgba_RGBA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3131 {
3132 unsigned int i;
3133
3134 for (i = 0; i < n; i++) {
3135 dst[i][0] = src[i * 4 + 0];
3136 dst[i][1] = src[i * 4 + 1];
3137 dst[i][2] = src[i * 4 + 2];
3138 dst[i][3] = src[i * 4 + 3];
3139 }
3140 }
3141
3142 static void
3143 unpack_int_rgba_RGBA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3144 {
3145 unsigned int i;
3146
3147 for (i = 0; i < n; i++) {
3148 dst[i][0] = src[i * 4 + 0];
3149 dst[i][1] = src[i * 4 + 1];
3150 dst[i][2] = src[i * 4 + 2];
3151 dst[i][3] = src[i * 4 + 3];
3152 }
3153 }
3154
3155 static void
3156 unpack_int_rgba_B8G8R8A8_UNORM(const GLbyte *src, GLuint dst[][4], GLuint n)
3157 {
3158 unsigned int i;
3159
3160 for (i = 0; i < n; i++) {
3161 dst[i][RCOMP] = (GLubyte) src[i * 4 + 2];
3162 dst[i][GCOMP] = (GLubyte) src[i * 4 + 1];
3163 dst[i][BCOMP] = (GLubyte) src[i * 4 + 0];
3164 dst[i][ACOMP] = (GLubyte) src[i * 4 + 3];
3165 }
3166 }
3167
3168 static void
3169 unpack_int_rgba_B8G8R8X8_UNORM(const GLbyte *src, GLuint dst[][4], GLuint n)
3170 {
3171 unsigned int i;
3172
3173 for (i = 0; i < n; i++) {
3174 dst[i][RCOMP] = (GLubyte) src[i * 4 + 2];
3175 dst[i][GCOMP] = (GLubyte) src[i * 4 + 1];
3176 dst[i][BCOMP] = (GLubyte) src[i * 4 + 0];
3177 dst[i][ACOMP] = (GLubyte) 0xff;
3178 }
3179 }
3180
3181 static void
3182 unpack_int_rgba_RGB_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3183 {
3184 unsigned int i;
3185
3186 for (i = 0; i < n; i++) {
3187 dst[i][0] = src[i * 3 + 0];
3188 dst[i][1] = src[i * 3 + 1];
3189 dst[i][2] = src[i * 3 + 2];
3190 dst[i][3] = 1;
3191 }
3192 }
3193
3194 static void
3195 unpack_int_rgba_RGB_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3196 {
3197 unsigned int i;
3198
3199 for (i = 0; i < n; i++) {
3200 dst[i][0] = src[i * 3 + 0];
3201 dst[i][1] = src[i * 3 + 1];
3202 dst[i][2] = src[i * 3 + 2];
3203 dst[i][3] = 1;
3204 }
3205 }
3206
3207 static void
3208 unpack_int_rgba_RGB_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3209 {
3210 unsigned int i;
3211
3212 for (i = 0; i < n; i++) {
3213 dst[i][0] = src[i * 3 + 0];
3214 dst[i][1] = src[i * 3 + 1];
3215 dst[i][2] = src[i * 3 + 2];
3216 dst[i][3] = 1;
3217 }
3218 }
3219
3220 static void
3221 unpack_int_rgba_RGB_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3222 {
3223 unsigned int i;
3224
3225 for (i = 0; i < n; i++) {
3226 dst[i][0] = src[i * 3 + 0];
3227 dst[i][1] = src[i * 3 + 1];
3228 dst[i][2] = src[i * 3 + 2];
3229 dst[i][3] = 1;
3230 }
3231 }
3232
3233 static void
3234 unpack_int_rgba_RGB_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3235 {
3236 unsigned int i;
3237
3238 for (i = 0; i < n; i++) {
3239 dst[i][0] = src[i * 3 + 0];
3240 dst[i][1] = src[i * 3 + 1];
3241 dst[i][2] = src[i * 3 + 2];
3242 dst[i][3] = 1;
3243 }
3244 }
3245
3246 static void
3247 unpack_int_rgba_RG_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3248 {
3249 unsigned int i;
3250
3251 for (i = 0; i < n; i++) {
3252 dst[i][0] = src[i * 2 + 0];
3253 dst[i][1] = src[i * 2 + 1];
3254 dst[i][2] = 0;
3255 dst[i][3] = 1;
3256 }
3257 }
3258
3259 static void
3260 unpack_int_rgba_RG_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3261 {
3262 unsigned int i;
3263
3264 for (i = 0; i < n; i++) {
3265 dst[i][0] = src[i * 2 + 0];
3266 dst[i][1] = src[i * 2 + 1];
3267 dst[i][2] = 0;
3268 dst[i][3] = 1;
3269 }
3270 }
3271
3272 static void
3273 unpack_int_rgba_RG_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3274 {
3275 unsigned int i;
3276
3277 for (i = 0; i < n; i++) {
3278 dst[i][0] = src[i * 2 + 0];
3279 dst[i][1] = src[i * 2 + 1];
3280 dst[i][2] = 0;
3281 dst[i][3] = 1;
3282 }
3283 }
3284
3285 static void
3286 unpack_int_rgba_RG_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3287 {
3288 unsigned int i;
3289
3290 for (i = 0; i < n; i++) {
3291 dst[i][0] = src[i * 2 + 0];
3292 dst[i][1] = src[i * 2 + 1];
3293 dst[i][2] = 0;
3294 dst[i][3] = 1;
3295 }
3296 }
3297
3298 static void
3299 unpack_int_rgba_RG_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3300 {
3301 unsigned int i;
3302
3303 for (i = 0; i < n; i++) {
3304 dst[i][0] = src[i * 2 + 0];
3305 dst[i][1] = src[i * 2 + 1];
3306 dst[i][2] = 0;
3307 dst[i][3] = 1;
3308 }
3309 }
3310
3311 static void
3312 unpack_int_rgba_R_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3313 {
3314 unsigned int i;
3315
3316 for (i = 0; i < n; i++) {
3317 dst[i][0] = src[i];
3318 dst[i][1] = 0;
3319 dst[i][2] = 0;
3320 dst[i][3] = 1;
3321 }
3322 }
3323
3324 static void
3325 unpack_int_rgba_R_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3326 {
3327 unsigned int i;
3328
3329 for (i = 0; i < n; i++) {
3330 dst[i][0] = src[i];
3331 dst[i][1] = 0;
3332 dst[i][2] = 0;
3333 dst[i][3] = 1;
3334 }
3335 }
3336
3337 static void
3338 unpack_int_rgba_R_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3339 {
3340 unsigned int i;
3341
3342 for (i = 0; i < n; i++) {
3343 dst[i][0] = src[i];
3344 dst[i][1] = 0;
3345 dst[i][2] = 0;
3346 dst[i][3] = 1;
3347 }
3348 }
3349
3350 static void
3351 unpack_int_rgba_R_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3352 {
3353 unsigned int i;
3354
3355 for (i = 0; i < n; i++) {
3356 dst[i][0] = src[i];
3357 dst[i][1] = 0;
3358 dst[i][2] = 0;
3359 dst[i][3] = 1;
3360 }
3361 }
3362
3363 static void
3364 unpack_int_rgba_R_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3365 {
3366 unsigned int i;
3367
3368 for (i = 0; i < n; i++) {
3369 dst[i][0] = src[i];
3370 dst[i][1] = 0;
3371 dst[i][2] = 0;
3372 dst[i][3] = 1;
3373 }
3374 }
3375
3376 static void
3377 unpack_int_rgba_ALPHA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3378 {
3379 unsigned int i;
3380
3381 for (i = 0; i < n; i++) {
3382 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3383 dst[i][3] = src[i];
3384 }
3385 }
3386
3387 static void
3388 unpack_int_rgba_ALPHA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3389 {
3390 unsigned int i;
3391
3392 for (i = 0; i < n; i++) {
3393 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3394 dst[i][3] = src[i];
3395 }
3396 }
3397
3398 static void
3399 unpack_int_rgba_ALPHA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3400 {
3401 unsigned int i;
3402
3403 for (i = 0; i < n; i++) {
3404 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3405 dst[i][3] = src[i];
3406 }
3407 }
3408
3409 static void
3410 unpack_int_rgba_ALPHA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3411 {
3412 unsigned int i;
3413
3414 for (i = 0; i < n; i++) {
3415 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3416 dst[i][3] = src[i];
3417 }
3418 }
3419
3420 static void
3421 unpack_int_rgba_ALPHA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3422 {
3423 unsigned int i;
3424
3425 for (i = 0; i < n; i++) {
3426 dst[i][0] = dst[i][1] = dst[i][2] = 0;
3427 dst[i][3] = src[i];
3428 }
3429 }
3430
3431 static void
3432 unpack_int_rgba_LUMINANCE_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3433 {
3434 unsigned int i;
3435
3436 for (i = 0; i < n; i++) {
3437 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3438 dst[i][3] = 1;
3439 }
3440 }
3441
3442 static void
3443 unpack_int_rgba_LUMINANCE_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3444 {
3445 unsigned int i;
3446
3447 for (i = 0; i < n; i++) {
3448 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3449 dst[i][3] = 1;
3450 }
3451 }
3452
3453 static void
3454 unpack_int_rgba_LUMINANCE_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3455 {
3456 unsigned int i;
3457
3458 for (i = 0; i < n; i++) {
3459 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3460 dst[i][3] = 1;
3461 }
3462 }
3463
3464 static void
3465 unpack_int_rgba_LUMINANCE_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3466 {
3467 unsigned int i;
3468
3469 for (i = 0; i < n; i++) {
3470 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3471 dst[i][3] = 1;
3472 }
3473 }
3474
3475 static void
3476 unpack_int_rgba_LUMINANCE_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3477 {
3478 unsigned int i;
3479
3480 for (i = 0; i < n; i++) {
3481 dst[i][0] = dst[i][1] = dst[i][2] = src[i];
3482 dst[i][3] = 1;
3483 }
3484 }
3485
3486
3487 static void
3488 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3489 {
3490 unsigned int i;
3491
3492 for (i = 0; i < n; i++) {
3493 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3494 dst[i][3] = src[i * 2 + 1];
3495 }
3496 }
3497
3498 static void
3499 unpack_int_rgba_LUMINANCE_ALPHA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3500 {
3501 unsigned int i;
3502
3503 for (i = 0; i < n; i++) {
3504 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3505 dst[i][3] = src[i * 2 + 1];
3506 }
3507 }
3508
3509 static void
3510 unpack_int_rgba_LUMINANCE_ALPHA_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3511 {
3512 unsigned int i;
3513
3514 for (i = 0; i < n; i++) {
3515 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3516 dst[i][3] = src[i * 2 + 1];
3517 }
3518 }
3519
3520 static void
3521 unpack_int_rgba_LUMINANCE_ALPHA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3522 {
3523 unsigned int i;
3524
3525 for (i = 0; i < n; i++) {
3526 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3527 dst[i][3] = src[i * 2 + 1];
3528 }
3529 }
3530
3531 static void
3532 unpack_int_rgba_LUMINANCE_ALPHA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3533 {
3534 unsigned int i;
3535
3536 for (i = 0; i < n; i++) {
3537 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0];
3538 dst[i][3] = src[i * 2 + 1];
3539 }
3540 }
3541
3542 static void
3543 unpack_int_rgba_INTENSITY_UINT32(const GLuint *src, GLuint dst[][4], GLuint n)
3544 {
3545 unsigned int i;
3546
3547 for (i = 0; i < n; i++) {
3548 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3549 }
3550 }
3551
3552 static void
3553 unpack_int_rgba_INTENSITY_UINT16(const GLushort *src, GLuint dst[][4], GLuint n)
3554 {
3555 unsigned int i;
3556
3557 for (i = 0; i < n; i++) {
3558 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3559 }
3560 }
3561
3562 static void
3563 unpack_int_rgba_INTENSITY_INT16(const GLshort *src, GLuint dst[][4], GLuint n)
3564 {
3565 unsigned int i;
3566
3567 for (i = 0; i < n; i++) {
3568 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3569 }
3570 }
3571
3572 static void
3573 unpack_int_rgba_INTENSITY_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n)
3574 {
3575 unsigned int i;
3576
3577 for (i = 0; i < n; i++) {
3578 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3579 }
3580 }
3581
3582 static void
3583 unpack_int_rgba_INTENSITY_INT8(const GLbyte *src, GLuint dst[][4], GLuint n)
3584 {
3585 unsigned int i;
3586
3587 for (i = 0; i < n; i++) {
3588 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i];
3589 }
3590 }
3591
3592 static void
3593 unpack_int_rgba_B10G10R10A2_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
3594 {
3595 unsigned int i;
3596
3597 for (i = 0; i < n; i++) {
3598 GLuint tmp = src[i];
3599 dst[i][0] = (tmp >> 20) & 0x3ff;
3600 dst[i][1] = (tmp >> 10) & 0x3ff;
3601 dst[i][2] = (tmp >> 0) & 0x3ff;
3602 dst[i][3] = (tmp >> 30) & 0x3;
3603 }
3604 }
3605
3606 static void
3607 unpack_int_rgba_R10G10B10A2_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
3608 {
3609 unsigned int i;
3610
3611 for (i = 0; i < n; i++) {
3612 GLuint tmp = src[i];
3613 dst[i][0] = (tmp >> 0) & 0x3ff;
3614 dst[i][1] = (tmp >> 10) & 0x3ff;
3615 dst[i][2] = (tmp >> 20) & 0x3ff;
3616 dst[i][3] = (tmp >> 30) & 0x3;
3617 }
3618 }
3619
3620 static void
3621 unpack_int_rgba_B10G10R10A2_UNORM(const GLuint *src, GLuint dst[][4], GLuint n)
3622 {
3623 unsigned int i;
3624
3625 for (i = 0; i < n; i++) {
3626 GLuint tmp = src[i];
3627 dst[i][0] = (tmp >> 20) & 0x3ff;
3628 dst[i][1] = (tmp >> 10) & 0x3ff;
3629 dst[i][2] = (tmp >> 0) & 0x3ff;
3630 dst[i][3] = (tmp >> 30) & 0x3;
3631 }
3632 }
3633
3634 static void
3635 unpack_int_rgba_XBGR8888_UINT(const GLubyte *src, GLuint dst[][4], GLuint n)
3636 {
3637 unsigned int i;
3638
3639 for (i = 0; i < n; i++) {
3640 dst[i][0] = src[i * 4 + 0];
3641 dst[i][1] = src[i * 4 + 1];
3642 dst[i][2] = src[i * 4 + 2];
3643 dst[i][3] = 1;
3644 }
3645 }
3646
3647 static void
3648 unpack_int_rgba_XBGR8888_SINT(const GLbyte *src, GLuint dst[][4], GLuint n)
3649 {
3650 unsigned int i;
3651
3652 for (i = 0; i < n; i++) {
3653 dst[i][0] = src[i * 4 + 0];
3654 dst[i][1] = src[i * 4 + 1];
3655 dst[i][2] = src[i * 4 + 2];
3656 dst[i][3] = 1;
3657 }
3658 }
3659
3660 static void
3661 unpack_int_rgba_XBGR16161616_UINT(const GLushort *src, GLuint dst[][4], GLuint n)
3662 {
3663 unsigned int i;
3664
3665 for (i = 0; i < n; i++) {
3666 dst[i][0] = src[i * 4 + 0];
3667 dst[i][1] = src[i * 4 + 1];
3668 dst[i][2] = src[i * 4 + 2];
3669 dst[i][3] = 1;
3670 }
3671 }
3672
3673 static void
3674 unpack_int_rgba_XBGR16161616_SINT(const GLshort *src, GLuint dst[][4], GLuint n)
3675 {
3676 unsigned int i;
3677
3678 for (i = 0; i < n; i++) {
3679 dst[i][0] = src[i * 4 + 0];
3680 dst[i][1] = src[i * 4 + 1];
3681 dst[i][2] = src[i * 4 + 2];
3682 dst[i][3] = 1;
3683 }
3684 }
3685
3686 static void
3687 unpack_int_rgba_XBGR32323232_UINT(const GLuint *src, GLuint dst[][4], GLuint n)
3688 {
3689 unsigned int i;
3690
3691 for (i = 0; i < n; i++) {
3692 dst[i][0] = src[i * 4 + 0];
3693 dst[i][1] = src[i * 4 + 1];
3694 dst[i][2] = src[i * 4 + 2];
3695 dst[i][3] = 1;
3696 }
3697 }
3698
3699 static void
3700 unpack_int_rgba_R10G10B10A2_UNORM(const GLuint *src, GLuint dst[][4], GLuint n)
3701 {
3702 unsigned int i;
3703
3704 for (i = 0; i < n; i++) {
3705 GLuint tmp = src[i];
3706 dst[i][0] = (tmp >> 0) & 0x3ff;
3707 dst[i][1] = (tmp >> 10) & 0x3ff;
3708 dst[i][2] = (tmp >> 20) & 0x3ff;
3709 dst[i][3] = (tmp >> 30) & 0x3;
3710 }
3711 }
3712
3713 void
3714 _mesa_unpack_uint_rgba_row(mesa_format format, GLuint n,
3715 const void *src, GLuint dst[][4])
3716 {
3717 switch (format) {
3718 /* Since there won't be any sign extension happening, there's no need to
3719 * make separate paths for 32-bit-to-32-bit integer unpack.
3720 */
3721 case MESA_FORMAT_RGBA_UINT32:
3722 case MESA_FORMAT_RGBA_SINT32:
3723 unpack_int_rgba_RGBA_UINT32(src, dst, n);
3724 break;
3725
3726 case MESA_FORMAT_RGBA_UINT16:
3727 unpack_int_rgba_RGBA_UINT16(src, dst, n);
3728 break;
3729 case MESA_FORMAT_RGBA_SINT16:
3730 unpack_int_rgba_RGBA_INT16(src, dst, n);
3731 break;
3732
3733 case MESA_FORMAT_RGBA_UINT8:
3734 unpack_int_rgba_RGBA_UINT8(src, dst, n);
3735 break;
3736 case MESA_FORMAT_RGBA_SINT8:
3737 unpack_int_rgba_RGBA_INT8(src, dst, n);
3738 break;
3739
3740 case MESA_FORMAT_B8G8R8A8_UNORM:
3741 unpack_int_rgba_B8G8R8A8_UNORM(src, dst, n);
3742 break;
3743
3744 case MESA_FORMAT_B8G8R8X8_UNORM:
3745 unpack_int_rgba_B8G8R8X8_UNORM(src, dst, n);
3746 break;
3747
3748 case MESA_FORMAT_RGB_UINT32:
3749 case MESA_FORMAT_RGB_SINT32:
3750 unpack_int_rgba_RGB_UINT32(src, dst, n);
3751 break;
3752
3753 case MESA_FORMAT_RGB_UINT16:
3754 unpack_int_rgba_RGB_UINT16(src, dst, n);
3755 break;
3756 case MESA_FORMAT_RGB_SINT16:
3757 unpack_int_rgba_RGB_INT16(src, dst, n);
3758 break;
3759
3760 case MESA_FORMAT_RGB_UINT8:
3761 unpack_int_rgba_RGB_UINT8(src, dst, n);
3762 break;
3763 case MESA_FORMAT_RGB_SINT8:
3764 unpack_int_rgba_RGB_INT8(src, dst, n);
3765 break;
3766
3767 case MESA_FORMAT_RG_UINT32:
3768 case MESA_FORMAT_RG_SINT32:
3769 unpack_int_rgba_RG_UINT32(src, dst, n);
3770 break;
3771
3772 case MESA_FORMAT_RG_UINT16:
3773 unpack_int_rgba_RG_UINT16(src, dst, n);
3774 break;
3775 case MESA_FORMAT_RG_SINT16:
3776 unpack_int_rgba_RG_INT16(src, dst, n);
3777 break;
3778
3779 case MESA_FORMAT_RG_UINT8:
3780 unpack_int_rgba_RG_UINT8(src, dst, n);
3781 break;
3782 case MESA_FORMAT_RG_SINT8:
3783 unpack_int_rgba_RG_INT8(src, dst, n);
3784 break;
3785
3786 case MESA_FORMAT_R_UINT32:
3787 case MESA_FORMAT_R_SINT32:
3788 unpack_int_rgba_R_UINT32(src, dst, n);
3789 break;
3790
3791 case MESA_FORMAT_R_UINT16:
3792 unpack_int_rgba_R_UINT16(src, dst, n);
3793 break;
3794 case MESA_FORMAT_R_SINT16:
3795 unpack_int_rgba_R_INT16(src, dst, n);
3796 break;
3797
3798 case MESA_FORMAT_R_UINT8:
3799 unpack_int_rgba_R_UINT8(src, dst, n);
3800 break;
3801 case MESA_FORMAT_R_SINT8:
3802 unpack_int_rgba_R_INT8(src, dst, n);
3803 break;
3804
3805 case MESA_FORMAT_A_UINT32:
3806 case MESA_FORMAT_A_SINT32:
3807 unpack_int_rgba_ALPHA_UINT32(src, dst, n);
3808 break;
3809
3810 case MESA_FORMAT_A_UINT16:
3811 unpack_int_rgba_ALPHA_UINT16(src, dst, n);
3812 break;
3813 case MESA_FORMAT_A_SINT16:
3814 unpack_int_rgba_ALPHA_INT16(src, dst, n);
3815 break;
3816
3817 case MESA_FORMAT_A_UINT8:
3818 unpack_int_rgba_ALPHA_UINT8(src, dst, n);
3819 break;
3820 case MESA_FORMAT_A_SINT8:
3821 unpack_int_rgba_ALPHA_INT8(src, dst, n);
3822 break;
3823
3824 case MESA_FORMAT_L_UINT32:
3825 case MESA_FORMAT_L_SINT32:
3826 unpack_int_rgba_LUMINANCE_UINT32(src, dst, n);
3827 break;
3828 case MESA_FORMAT_L_UINT16:
3829 unpack_int_rgba_LUMINANCE_UINT16(src, dst, n);
3830 break;
3831 case MESA_FORMAT_L_SINT16:
3832 unpack_int_rgba_LUMINANCE_INT16(src, dst, n);
3833 break;
3834
3835 case MESA_FORMAT_L_UINT8:
3836 unpack_int_rgba_LUMINANCE_UINT8(src, dst, n);
3837 break;
3838 case MESA_FORMAT_L_SINT8:
3839 unpack_int_rgba_LUMINANCE_INT8(src, dst, n);
3840 break;
3841
3842 case MESA_FORMAT_LA_UINT32:
3843 case MESA_FORMAT_LA_SINT32:
3844 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(src, dst, n);
3845 break;
3846
3847 case MESA_FORMAT_LA_UINT16:
3848 unpack_int_rgba_LUMINANCE_ALPHA_UINT16(src, dst, n);
3849 break;
3850 case MESA_FORMAT_LA_SINT16:
3851 unpack_int_rgba_LUMINANCE_ALPHA_INT16(src, dst, n);
3852 break;
3853
3854 case MESA_FORMAT_LA_UINT8:
3855 unpack_int_rgba_LUMINANCE_ALPHA_UINT8(src, dst, n);
3856 break;
3857 case MESA_FORMAT_LA_SINT8:
3858 unpack_int_rgba_LUMINANCE_ALPHA_INT8(src, dst, n);
3859 break;
3860
3861 case MESA_FORMAT_I_UINT32:
3862 case MESA_FORMAT_I_SINT32:
3863 unpack_int_rgba_INTENSITY_UINT32(src, dst, n);
3864 break;
3865
3866 case MESA_FORMAT_I_UINT16:
3867 unpack_int_rgba_INTENSITY_UINT16(src, dst, n);
3868 break;
3869 case MESA_FORMAT_I_SINT16:
3870 unpack_int_rgba_INTENSITY_INT16(src, dst, n);
3871 break;
3872
3873 case MESA_FORMAT_I_UINT8:
3874 unpack_int_rgba_INTENSITY_UINT8(src, dst, n);
3875 break;
3876 case MESA_FORMAT_I_SINT8:
3877 unpack_int_rgba_INTENSITY_INT8(src, dst, n);
3878 break;
3879
3880 case MESA_FORMAT_B10G10R10A2_UINT:
3881 unpack_int_rgba_B10G10R10A2_UINT(src, dst, n);
3882 break;
3883
3884 case MESA_FORMAT_R10G10B10A2_UINT:
3885 unpack_int_rgba_R10G10B10A2_UINT(src, dst, n);
3886 break;
3887
3888 case MESA_FORMAT_B10G10R10A2_UNORM:
3889 unpack_int_rgba_B10G10R10A2_UNORM(src, dst, n);
3890 break;
3891
3892 case MESA_FORMAT_RGBX_UINT8:
3893 unpack_int_rgba_XBGR8888_UINT(src, dst, n);
3894 break;
3895
3896 case MESA_FORMAT_RGBX_SINT8:
3897 unpack_int_rgba_XBGR8888_SINT(src, dst, n);
3898 break;
3899
3900 case MESA_FORMAT_RGBX_UINT16:
3901 unpack_int_rgba_XBGR16161616_UINT(src, dst, n);
3902 break;
3903
3904 case MESA_FORMAT_RGBX_SINT16:
3905 unpack_int_rgba_XBGR16161616_SINT(src, dst, n);
3906 break;
3907
3908 case MESA_FORMAT_RGBX_UINT32:
3909 case MESA_FORMAT_RGBX_SINT32:
3910 unpack_int_rgba_XBGR32323232_UINT(src, dst, n);
3911 break;
3912
3913 case MESA_FORMAT_R10G10B10A2_UNORM:
3914 unpack_int_rgba_R10G10B10A2_UNORM(src, dst, n);
3915 break;
3916
3917 default:
3918 _mesa_problem(NULL, "%s: bad format %s", __FUNCTION__,
3919 _mesa_get_format_name(format));
3920 return;
3921 }
3922 }
3923
3924 /**
3925 * Unpack a 2D rect of pixels returning float RGBA colors.
3926 * \param format the source image format
3927 * \param src start address of the source image
3928 * \param srcRowStride source image row stride in bytes
3929 * \param dst start address of the dest image
3930 * \param dstRowStride dest image row stride in bytes
3931 * \param x source image start X pos
3932 * \param y source image start Y pos
3933 * \param width width of rect region to convert
3934 * \param height height of rect region to convert
3935 */
3936 void
3937 _mesa_unpack_rgba_block(mesa_format format,
3938 const void *src, GLint srcRowStride,
3939 GLfloat dst[][4], GLint dstRowStride,
3940 GLuint x, GLuint y, GLuint width, GLuint height)
3941 {
3942 unpack_rgba_func unpack = get_unpack_rgba_function(format);
3943 const GLuint srcPixStride = _mesa_get_format_bytes(format);
3944 const GLuint dstPixStride = 4 * sizeof(GLfloat);
3945 const GLubyte *srcRow;
3946 GLubyte *dstRow;
3947 GLuint i;
3948
3949 /* XXX needs to be fixed for compressed formats */
3950
3951 srcRow = ((const GLubyte *) src) + srcRowStride * y + srcPixStride * x;
3952 dstRow = ((GLubyte *) dst) + dstRowStride * y + dstPixStride * x;
3953
3954 for (i = 0; i < height; i++) {
3955 unpack(srcRow, (GLfloat (*)[4]) dstRow, width);
3956
3957 dstRow += dstRowStride;
3958 srcRow += srcRowStride;
3959 }
3960 }
3961
3962
3963
3964
3965 typedef void (*unpack_float_z_func)(GLuint n, const void *src, GLfloat *dst);
3966
3967 static void
3968 unpack_float_z_X8_UINT_Z24_UNORM(GLuint n, const void *src, GLfloat *dst)
3969 {
3970 /* only return Z, not stencil data */
3971 const GLuint *s = ((const GLuint *) src);
3972 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
3973 GLuint i;
3974 for (i = 0; i < n; i++) {
3975 dst[i] = (GLfloat) ((s[i] >> 8) * scale);
3976 ASSERT(dst[i] >= 0.0F);
3977 ASSERT(dst[i] <= 1.0F);
3978 }
3979 }
3980
3981 static void
3982 unpack_float_z_Z24_UNORM_X8_UINT(GLuint n, const void *src, GLfloat *dst)
3983 {
3984 /* only return Z, not stencil data */
3985 const GLuint *s = ((const GLuint *) src);
3986 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
3987 GLuint i;
3988 for (i = 0; i < n; i++) {
3989 dst[i] = (GLfloat) ((s[i] & 0x00ffffff) * scale);
3990 ASSERT(dst[i] >= 0.0F);
3991 ASSERT(dst[i] <= 1.0F);
3992 }
3993 }
3994
3995 static void
3996 unpack_float_Z_UNORM16(GLuint n, const void *src, GLfloat *dst)
3997 {
3998 const GLushort *s = ((const GLushort *) src);
3999 GLuint i;
4000 for (i = 0; i < n; i++) {
4001 dst[i] = s[i] * (1.0F / 65535.0F);
4002 }
4003 }
4004
4005 static void
4006 unpack_float_Z_UNORM32(GLuint n, const void *src, GLfloat *dst)
4007 {
4008 const GLuint *s = ((const GLuint *) src);
4009 GLuint i;
4010 for (i = 0; i < n; i++) {
4011 dst[i] = s[i] * (1.0F / 0xffffffff);
4012 }
4013 }
4014
4015 static void
4016 unpack_float_Z_FLOAT32(GLuint n, const void *src, GLfloat *dst)
4017 {
4018 memcpy(dst, src, n * sizeof(float));
4019 }
4020
4021 static void
4022 unpack_float_z_Z32X24S8(GLuint n, const void *src, GLfloat *dst)
4023 {
4024 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
4025 GLuint i;
4026 for (i = 0; i < n; i++) {
4027 dst[i] = s[i].z;
4028 }
4029 }
4030
4031
4032
4033 /**
4034 * Unpack Z values.
4035 * The returned values will always be in the range [0.0, 1.0].
4036 */
4037 void
4038 _mesa_unpack_float_z_row(mesa_format format, GLuint n,
4039 const void *src, GLfloat *dst)
4040 {
4041 unpack_float_z_func unpack;
4042
4043 switch (format) {
4044 case MESA_FORMAT_S8_UINT_Z24_UNORM:
4045 case MESA_FORMAT_X8_UINT_Z24_UNORM:
4046 unpack = unpack_float_z_X8_UINT_Z24_UNORM;
4047 break;
4048 case MESA_FORMAT_Z24_UNORM_S8_UINT:
4049 case MESA_FORMAT_Z24_UNORM_X8_UINT:
4050 unpack = unpack_float_z_Z24_UNORM_X8_UINT;
4051 break;
4052 case MESA_FORMAT_Z_UNORM16:
4053 unpack = unpack_float_Z_UNORM16;
4054 break;
4055 case MESA_FORMAT_Z_UNORM32:
4056 unpack = unpack_float_Z_UNORM32;
4057 break;
4058 case MESA_FORMAT_Z_FLOAT32:
4059 unpack = unpack_float_Z_FLOAT32;
4060 break;
4061 case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
4062 unpack = unpack_float_z_Z32X24S8;
4063 break;
4064 default:
4065 _mesa_problem(NULL, "bad format %s in _mesa_unpack_float_z_row",
4066 _mesa_get_format_name(format));
4067 return;
4068 }
4069
4070 unpack(n, src, dst);
4071 }
4072
4073
4074
4075 typedef void (*unpack_uint_z_func)(const void *src, GLuint *dst, GLuint n);
4076
4077 static void
4078 unpack_uint_z_X8_UINT_Z24_UNORM(const void *src, GLuint *dst, GLuint n)
4079 {
4080 /* only return Z, not stencil data */
4081 const GLuint *s = ((const GLuint *) src);
4082 GLuint i;
4083 for (i = 0; i < n; i++) {
4084 dst[i] = (s[i] & 0xffffff00) | (s[i] >> 24);
4085 }
4086 }
4087
4088 static void
4089 unpack_uint_z_Z24_UNORM_X8_UINT(const void *src, GLuint *dst, GLuint n)
4090 {
4091 /* only return Z, not stencil data */
4092 const GLuint *s = ((const GLuint *) src);
4093 GLuint i;
4094 for (i = 0; i < n; i++) {
4095 dst[i] = (s[i] << 8) | ((s[i] >> 16) & 0xff);
4096 }
4097 }
4098
4099 static void
4100 unpack_uint_Z_UNORM16(const void *src, GLuint *dst, GLuint n)
4101 {
4102 const GLushort *s = ((const GLushort *)src);
4103 GLuint i;
4104 for (i = 0; i < n; i++) {
4105 dst[i] = (s[i] << 16) | s[i];
4106 }
4107 }
4108
4109 static void
4110 unpack_uint_Z_UNORM32(const void *src, GLuint *dst, GLuint n)
4111 {
4112 memcpy(dst, src, n * sizeof(GLuint));
4113 }
4114
4115 static void
4116 unpack_uint_Z_FLOAT32(const void *src, GLuint *dst, GLuint n)
4117 {
4118 const float *s = (const float *)src;
4119 GLuint i;
4120 for (i = 0; i < n; i++) {
4121 dst[i] = FLOAT_TO_UINT(CLAMP(s[i], 0.0F, 1.0F));
4122 }
4123 }
4124
4125 static void
4126 unpack_uint_Z_FLOAT32_X24S8(const void *src, GLuint *dst, GLuint n)
4127 {
4128 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
4129 GLuint i;
4130
4131 for (i = 0; i < n; i++) {
4132 dst[i] = FLOAT_TO_UINT(CLAMP(s[i].z, 0.0F, 1.0F));
4133 }
4134 }
4135
4136
4137 /**
4138 * Unpack Z values.
4139 * The returned values will always be in the range [0, 0xffffffff].
4140 */
4141 void
4142 _mesa_unpack_uint_z_row(mesa_format format, GLuint n,
4143 const void *src, GLuint *dst)
4144 {
4145 unpack_uint_z_func unpack;
4146 const GLubyte *srcPtr = (GLubyte *) src;
4147
4148 switch (format) {
4149 case MESA_FORMAT_S8_UINT_Z24_UNORM:
4150 case MESA_FORMAT_X8_UINT_Z24_UNORM:
4151 unpack = unpack_uint_z_X8_UINT_Z24_UNORM;
4152 break;
4153 case MESA_FORMAT_Z24_UNORM_S8_UINT:
4154 case MESA_FORMAT_Z24_UNORM_X8_UINT:
4155 unpack = unpack_uint_z_Z24_UNORM_X8_UINT;
4156 break;
4157 case MESA_FORMAT_Z_UNORM16:
4158 unpack = unpack_uint_Z_UNORM16;
4159 break;
4160 case MESA_FORMAT_Z_UNORM32:
4161 unpack = unpack_uint_Z_UNORM32;
4162 break;
4163 case MESA_FORMAT_Z_FLOAT32:
4164 unpack = unpack_uint_Z_FLOAT32;
4165 break;
4166 case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
4167 unpack = unpack_uint_Z_FLOAT32_X24S8;
4168 break;
4169 default:
4170 _mesa_problem(NULL, "bad format %s in _mesa_unpack_uint_z_row",
4171 _mesa_get_format_name(format));
4172 return;
4173 }
4174
4175 unpack(srcPtr, dst, n);
4176 }
4177
4178
4179 static void
4180 unpack_ubyte_s_S_UINT8(const void *src, GLubyte *dst, GLuint n)
4181 {
4182 memcpy(dst, src, n);
4183 }
4184
4185 static void
4186 unpack_ubyte_s_S8_UINT_Z24_UNORM(const void *src, GLubyte *dst, GLuint n)
4187 {
4188 GLuint i;
4189 const GLuint *src32 = src;
4190
4191 for (i = 0; i < n; i++)
4192 dst[i] = src32[i] & 0xff;
4193 }
4194
4195 static void
4196 unpack_ubyte_s_Z24_UNORM_S8_UINT(const void *src, GLubyte *dst, GLuint n)
4197 {
4198 GLuint i;
4199 const GLuint *src32 = src;
4200
4201 for (i = 0; i < n; i++)
4202 dst[i] = src32[i] >> 24;
4203 }
4204
4205 static void
4206 unpack_ubyte_s_Z32_FLOAT_S8X24_UINT(const void *src, GLubyte *dst, GLuint n)
4207 {
4208 GLuint i;
4209 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
4210
4211 for (i = 0; i < n; i++)
4212 dst[i] = s[i].x24s8 & 0xff;
4213 }
4214
4215 void
4216 _mesa_unpack_ubyte_stencil_row(mesa_format format, GLuint n,
4217 const void *src, GLubyte *dst)
4218 {
4219 switch (format) {
4220 case MESA_FORMAT_S_UINT8:
4221 unpack_ubyte_s_S_UINT8(src, dst, n);
4222 break;
4223 case MESA_FORMAT_S8_UINT_Z24_UNORM:
4224 unpack_ubyte_s_S8_UINT_Z24_UNORM(src, dst, n);
4225 break;
4226 case MESA_FORMAT_Z24_UNORM_S8_UINT:
4227 unpack_ubyte_s_Z24_UNORM_S8_UINT(src, dst, n);
4228 break;
4229 case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
4230 unpack_ubyte_s_Z32_FLOAT_S8X24_UINT(src, dst, n);
4231 break;
4232 default:
4233 _mesa_problem(NULL, "bad format %s in _mesa_unpack_ubyte_s_row",
4234 _mesa_get_format_name(format));
4235 return;
4236 }
4237 }
4238
4239 static void
4240 unpack_uint_24_8_depth_stencil_Z24_UNORM_S8_UINT(const GLuint *src, GLuint *dst, GLuint n)
4241 {
4242 GLuint i;
4243
4244 for (i = 0; i < n; i++) {
4245 GLuint val = src[i];
4246 dst[i] = val >> 24 | val << 8;
4247 }
4248 }
4249
4250 static void
4251 unpack_uint_24_8_depth_stencil_Z32_S8X24(const GLuint *src,
4252 GLuint *dst, GLuint n)
4253 {
4254 GLuint i;
4255
4256 for (i = 0; i < n; i++) {
4257 /* 8 bytes per pixel (float + uint32) */
4258 GLfloat zf = ((GLfloat *) src)[i * 2 + 0];
4259 GLuint z24 = (GLuint) (zf * (GLfloat) 0xffffff);
4260 GLuint s = src[i * 2 + 1] & 0xff;
4261 dst[i] = (z24 << 8) | s;
4262 }
4263 }
4264
4265 static void
4266 unpack_uint_24_8_depth_stencil_S8_UINT_Z24_UNORM(const GLuint *src, GLuint *dst, GLuint n)
4267 {
4268 memcpy(dst, src, n * 4);
4269 }
4270
4271 /**
4272 * Unpack depth/stencil returning as GL_UNSIGNED_INT_24_8.
4273 * \param format the source data format
4274 */
4275 void
4276 _mesa_unpack_uint_24_8_depth_stencil_row(mesa_format format, GLuint n,
4277 const void *src, GLuint *dst)
4278 {
4279 switch (format) {
4280 case MESA_FORMAT_S8_UINT_Z24_UNORM:
4281 unpack_uint_24_8_depth_stencil_S8_UINT_Z24_UNORM(src, dst, n);
4282 break;
4283 case MESA_FORMAT_Z24_UNORM_S8_UINT:
4284 unpack_uint_24_8_depth_stencil_Z24_UNORM_S8_UINT(src, dst, n);
4285 break;
4286 case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
4287 unpack_uint_24_8_depth_stencil_Z32_S8X24(src, dst, n);
4288 break;
4289 default:
4290 _mesa_problem(NULL,
4291 "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row",
4292 _mesa_get_format_name(format));
4293 return;
4294 }
4295 }
4296
4297 static void
4298 unpack_float_32_uint_24_8_Z24_UNORM_S8_UINT(const GLuint *src,
4299 GLuint *dst, GLuint n)
4300 {
4301 GLuint i;
4302 struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
4303 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
4304
4305 for (i = 0; i < n; i++) {
4306 const GLuint z24 = src[i] & 0xffffff;
4307 d[i].z = z24 * scale;
4308 d[i].x24s8 = src[i] >> 24;
4309 assert(d[i].z >= 0.0f);
4310 assert(d[i].z <= 1.0f);
4311 }
4312 }
4313
4314 static void
4315 unpack_float_32_uint_24_8_Z32_FLOAT_S8X24_UINT(const GLuint *src,
4316 GLuint *dst, GLuint n)
4317 {
4318 memcpy(dst, src, n * sizeof(struct z32f_x24s8));
4319 }
4320
4321 static void
4322 unpack_float_32_uint_24_8_S8_UINT_Z24_UNORM(const GLuint *src,
4323 GLuint *dst, GLuint n)
4324 {
4325 GLuint i;
4326 struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
4327 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
4328
4329 for (i = 0; i < n; i++) {
4330 const GLuint z24 = src[i] >> 8;
4331 d[i].z = z24 * scale;
4332 d[i].x24s8 = src[i] & 0xff;
4333 assert(d[i].z >= 0.0f);
4334 assert(d[i].z <= 1.0f);
4335 }
4336 }
4337
4338 /**
4339 * Unpack depth/stencil returning as GL_FLOAT_32_UNSIGNED_INT_24_8_REV.
4340 * \param format the source data format
4341 *
4342 * In GL_FLOAT_32_UNSIGNED_INT_24_8_REV lower 4 bytes contain float
4343 * component and higher 4 bytes contain packed 24-bit and 8-bit
4344 * components.
4345 *
4346 * 31 30 29 28 ... 4 3 2 1 0 31 30 29 ... 9 8 7 6 5 ... 2 1 0
4347 * +-------------------------+ +--------------------------------+
4348 * | Float Component | | Unused | 8 bit stencil |
4349 * +-------------------------+ +--------------------------------+
4350 * lower 4 bytes higher 4 bytes
4351 */
4352 void
4353 _mesa_unpack_float_32_uint_24_8_depth_stencil_row(mesa_format format, GLuint n,
4354 const void *src, GLuint *dst)
4355 {
4356 switch (format) {
4357 case MESA_FORMAT_S8_UINT_Z24_UNORM:
4358 unpack_float_32_uint_24_8_S8_UINT_Z24_UNORM(src, dst, n);
4359 break;
4360 case MESA_FORMAT_Z24_UNORM_S8_UINT:
4361 unpack_float_32_uint_24_8_Z24_UNORM_S8_UINT(src, dst, n);
4362 break;
4363 case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
4364 unpack_float_32_uint_24_8_Z32_FLOAT_S8X24_UINT(src, dst, n);
4365 break;
4366 default:
4367 _mesa_problem(NULL,
4368 "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row",
4369 _mesa_get_format_name(format));
4370 return;
4371 }
4372 }
4373
4374 /**
4375 * Unpack depth/stencil
4376 * \param format the source data format
4377 * \param type the destination data type
4378 */
4379 void
4380 _mesa_unpack_depth_stencil_row(mesa_format format, GLuint n,
4381 const void *src, GLenum type,
4382 GLuint *dst)
4383 {
4384 assert(type == GL_UNSIGNED_INT_24_8 ||
4385 type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
4386
4387 switch (type) {
4388 case GL_UNSIGNED_INT_24_8:
4389 _mesa_unpack_uint_24_8_depth_stencil_row(format, n, src, dst);
4390 break;
4391 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
4392 _mesa_unpack_float_32_uint_24_8_depth_stencil_row(format, n, src, dst);
4393 break;
4394 default:
4395 _mesa_problem(NULL,
4396 "bad type 0x%x in _mesa_unpack_depth_stencil_row",
4397 type);
4398 return;
4399 }
4400 }