format_unpack.c revision b8e80941
1/*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (c) 2011 VMware, Inc.
5 * Copyright (c) 2014 Intel Corporation.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 * OTHER DEALINGS IN THE SOFTWARE.
24 */
25
26
27/**
28 * Color, depth, stencil packing functions.
29 * Used to pack basic color, depth and stencil formats to specific
30 * hardware formats.
31 *
32 * There are both per-pixel and per-row packing functions:
33 * - The former will be used by swrast to write values to the color, depth,
34 *   stencil buffers when drawing points, lines and masked spans.
35 * - The later will be used for image-oriented functions like glDrawPixels,
36 *   glAccum, and glTexImage.
37 */
38
39#include <stdint.h>
40
41#include "errors.h"
42#include "format_unpack.h"
43#include "format_utils.h"
44#include "macros.h"
45#include "util/format_rgb9e5.h"
46#include "util/format_r11g11b10f.h"
47#include "util/format_srgb.h"
48
49#define UNPACK(SRC, OFFSET, BITS) (((SRC) >> (OFFSET)) & MAX_UINT(BITS))
50
51
52
53/* float unpacking functions */
54
55
56static inline void
57unpack_float_a8b8g8r8_unorm(const void *void_src, GLfloat dst[4])
58{
59   uint32_t *src = (uint32_t *)void_src;
60            uint8_t a = UNPACK(*src, 0, 8);
61            uint8_t b = UNPACK(*src, 8, 8);
62            uint8_t g = UNPACK(*src, 16, 8);
63            uint8_t r = UNPACK(*src, 24, 8);
64
65
66
67               dst[0] = _mesa_unorm_to_float(r, 8);
68
69
70               dst[1] = _mesa_unorm_to_float(g, 8);
71
72
73               dst[2] = _mesa_unorm_to_float(b, 8);
74
75
76               dst[3] = _mesa_unorm_to_float(a, 8);
77}
78
79static inline void
80unpack_float_x8b8g8r8_unorm(const void *void_src, GLfloat dst[4])
81{
82   uint32_t *src = (uint32_t *)void_src;
83            uint8_t b = UNPACK(*src, 8, 8);
84            uint8_t g = UNPACK(*src, 16, 8);
85            uint8_t r = UNPACK(*src, 24, 8);
86
87
88
89               dst[0] = _mesa_unorm_to_float(r, 8);
90
91
92               dst[1] = _mesa_unorm_to_float(g, 8);
93
94
95               dst[2] = _mesa_unorm_to_float(b, 8);
96
97         dst[3] = 1.0f;
98}
99
100static inline void
101unpack_float_r8g8b8a8_unorm(const void *void_src, GLfloat dst[4])
102{
103   uint32_t *src = (uint32_t *)void_src;
104            uint8_t r = UNPACK(*src, 0, 8);
105            uint8_t g = UNPACK(*src, 8, 8);
106            uint8_t b = UNPACK(*src, 16, 8);
107            uint8_t a = UNPACK(*src, 24, 8);
108
109
110
111               dst[0] = _mesa_unorm_to_float(r, 8);
112
113
114               dst[1] = _mesa_unorm_to_float(g, 8);
115
116
117               dst[2] = _mesa_unorm_to_float(b, 8);
118
119
120               dst[3] = _mesa_unorm_to_float(a, 8);
121}
122
123static inline void
124unpack_float_r8g8b8x8_unorm(const void *void_src, GLfloat dst[4])
125{
126   uint32_t *src = (uint32_t *)void_src;
127            uint8_t r = UNPACK(*src, 0, 8);
128            uint8_t g = UNPACK(*src, 8, 8);
129            uint8_t b = UNPACK(*src, 16, 8);
130
131
132
133               dst[0] = _mesa_unorm_to_float(r, 8);
134
135
136               dst[1] = _mesa_unorm_to_float(g, 8);
137
138
139               dst[2] = _mesa_unorm_to_float(b, 8);
140
141         dst[3] = 1.0f;
142}
143
144static inline void
145unpack_float_b8g8r8a8_unorm(const void *void_src, GLfloat dst[4])
146{
147   uint32_t *src = (uint32_t *)void_src;
148            uint8_t b = UNPACK(*src, 0, 8);
149            uint8_t g = UNPACK(*src, 8, 8);
150            uint8_t r = UNPACK(*src, 16, 8);
151            uint8_t a = UNPACK(*src, 24, 8);
152
153
154
155               dst[0] = _mesa_unorm_to_float(r, 8);
156
157
158               dst[1] = _mesa_unorm_to_float(g, 8);
159
160
161               dst[2] = _mesa_unorm_to_float(b, 8);
162
163
164               dst[3] = _mesa_unorm_to_float(a, 8);
165}
166
167static inline void
168unpack_float_b8g8r8x8_unorm(const void *void_src, GLfloat dst[4])
169{
170   uint32_t *src = (uint32_t *)void_src;
171            uint8_t b = UNPACK(*src, 0, 8);
172            uint8_t g = UNPACK(*src, 8, 8);
173            uint8_t r = UNPACK(*src, 16, 8);
174
175
176
177               dst[0] = _mesa_unorm_to_float(r, 8);
178
179
180               dst[1] = _mesa_unorm_to_float(g, 8);
181
182
183               dst[2] = _mesa_unorm_to_float(b, 8);
184
185         dst[3] = 1.0f;
186}
187
188static inline void
189unpack_float_a8r8g8b8_unorm(const void *void_src, GLfloat dst[4])
190{
191   uint32_t *src = (uint32_t *)void_src;
192            uint8_t a = UNPACK(*src, 0, 8);
193            uint8_t r = UNPACK(*src, 8, 8);
194            uint8_t g = UNPACK(*src, 16, 8);
195            uint8_t b = UNPACK(*src, 24, 8);
196
197
198
199               dst[0] = _mesa_unorm_to_float(r, 8);
200
201
202               dst[1] = _mesa_unorm_to_float(g, 8);
203
204
205               dst[2] = _mesa_unorm_to_float(b, 8);
206
207
208               dst[3] = _mesa_unorm_to_float(a, 8);
209}
210
211static inline void
212unpack_float_x8r8g8b8_unorm(const void *void_src, GLfloat dst[4])
213{
214   uint32_t *src = (uint32_t *)void_src;
215            uint8_t r = UNPACK(*src, 8, 8);
216            uint8_t g = UNPACK(*src, 16, 8);
217            uint8_t b = UNPACK(*src, 24, 8);
218
219
220
221               dst[0] = _mesa_unorm_to_float(r, 8);
222
223
224               dst[1] = _mesa_unorm_to_float(g, 8);
225
226
227               dst[2] = _mesa_unorm_to_float(b, 8);
228
229         dst[3] = 1.0f;
230}
231
232static inline void
233unpack_float_l16a16_unorm(const void *void_src, GLfloat dst[4])
234{
235   uint32_t *src = (uint32_t *)void_src;
236            uint16_t l = UNPACK(*src, 0, 16);
237            uint16_t a = UNPACK(*src, 16, 16);
238
239
240
241               dst[0] = _mesa_unorm_to_float(l, 16);
242
243
244               dst[1] = _mesa_unorm_to_float(l, 16);
245
246
247               dst[2] = _mesa_unorm_to_float(l, 16);
248
249
250               dst[3] = _mesa_unorm_to_float(a, 16);
251}
252
253static inline void
254unpack_float_a16l16_unorm(const void *void_src, GLfloat dst[4])
255{
256   uint32_t *src = (uint32_t *)void_src;
257            uint16_t a = UNPACK(*src, 0, 16);
258            uint16_t l = UNPACK(*src, 16, 16);
259
260
261
262               dst[0] = _mesa_unorm_to_float(l, 16);
263
264
265               dst[1] = _mesa_unorm_to_float(l, 16);
266
267
268               dst[2] = _mesa_unorm_to_float(l, 16);
269
270
271               dst[3] = _mesa_unorm_to_float(a, 16);
272}
273
274static inline void
275unpack_float_b5g6r5_unorm(const void *void_src, GLfloat dst[4])
276{
277   uint16_t *src = (uint16_t *)void_src;
278            uint8_t b = UNPACK(*src, 0, 5);
279            uint8_t g = UNPACK(*src, 5, 6);
280            uint8_t r = UNPACK(*src, 11, 5);
281
282
283
284               dst[0] = _mesa_unorm_to_float(r, 5);
285
286
287               dst[1] = _mesa_unorm_to_float(g, 6);
288
289
290               dst[2] = _mesa_unorm_to_float(b, 5);
291
292         dst[3] = 1.0f;
293}
294
295static inline void
296unpack_float_r5g6b5_unorm(const void *void_src, GLfloat dst[4])
297{
298   uint16_t *src = (uint16_t *)void_src;
299            uint8_t r = UNPACK(*src, 0, 5);
300            uint8_t g = UNPACK(*src, 5, 6);
301            uint8_t b = UNPACK(*src, 11, 5);
302
303
304
305               dst[0] = _mesa_unorm_to_float(r, 5);
306
307
308               dst[1] = _mesa_unorm_to_float(g, 6);
309
310
311               dst[2] = _mesa_unorm_to_float(b, 5);
312
313         dst[3] = 1.0f;
314}
315
316static inline void
317unpack_float_b4g4r4a4_unorm(const void *void_src, GLfloat dst[4])
318{
319   uint16_t *src = (uint16_t *)void_src;
320            uint8_t b = UNPACK(*src, 0, 4);
321            uint8_t g = UNPACK(*src, 4, 4);
322            uint8_t r = UNPACK(*src, 8, 4);
323            uint8_t a = UNPACK(*src, 12, 4);
324
325
326
327               dst[0] = _mesa_unorm_to_float(r, 4);
328
329
330               dst[1] = _mesa_unorm_to_float(g, 4);
331
332
333               dst[2] = _mesa_unorm_to_float(b, 4);
334
335
336               dst[3] = _mesa_unorm_to_float(a, 4);
337}
338
339static inline void
340unpack_float_b4g4r4x4_unorm(const void *void_src, GLfloat dst[4])
341{
342   uint16_t *src = (uint16_t *)void_src;
343            uint8_t b = UNPACK(*src, 0, 4);
344            uint8_t g = UNPACK(*src, 4, 4);
345            uint8_t r = UNPACK(*src, 8, 4);
346
347
348
349               dst[0] = _mesa_unorm_to_float(r, 4);
350
351
352               dst[1] = _mesa_unorm_to_float(g, 4);
353
354
355               dst[2] = _mesa_unorm_to_float(b, 4);
356
357         dst[3] = 1.0f;
358}
359
360static inline void
361unpack_float_a4r4g4b4_unorm(const void *void_src, GLfloat dst[4])
362{
363   uint16_t *src = (uint16_t *)void_src;
364            uint8_t a = UNPACK(*src, 0, 4);
365            uint8_t r = UNPACK(*src, 4, 4);
366            uint8_t g = UNPACK(*src, 8, 4);
367            uint8_t b = UNPACK(*src, 12, 4);
368
369
370
371               dst[0] = _mesa_unorm_to_float(r, 4);
372
373
374               dst[1] = _mesa_unorm_to_float(g, 4);
375
376
377               dst[2] = _mesa_unorm_to_float(b, 4);
378
379
380               dst[3] = _mesa_unorm_to_float(a, 4);
381}
382
383static inline void
384unpack_float_a1b5g5r5_unorm(const void *void_src, GLfloat dst[4])
385{
386   uint16_t *src = (uint16_t *)void_src;
387            uint8_t a = UNPACK(*src, 0, 1);
388            uint8_t b = UNPACK(*src, 1, 5);
389            uint8_t g = UNPACK(*src, 6, 5);
390            uint8_t r = UNPACK(*src, 11, 5);
391
392
393
394               dst[0] = _mesa_unorm_to_float(r, 5);
395
396
397               dst[1] = _mesa_unorm_to_float(g, 5);
398
399
400               dst[2] = _mesa_unorm_to_float(b, 5);
401
402
403               dst[3] = _mesa_unorm_to_float(a, 1);
404}
405
406static inline void
407unpack_float_x1b5g5r5_unorm(const void *void_src, GLfloat dst[4])
408{
409   uint16_t *src = (uint16_t *)void_src;
410            uint8_t b = UNPACK(*src, 1, 5);
411            uint8_t g = UNPACK(*src, 6, 5);
412            uint8_t r = UNPACK(*src, 11, 5);
413
414
415
416               dst[0] = _mesa_unorm_to_float(r, 5);
417
418
419               dst[1] = _mesa_unorm_to_float(g, 5);
420
421
422               dst[2] = _mesa_unorm_to_float(b, 5);
423
424         dst[3] = 1.0f;
425}
426
427static inline void
428unpack_float_b5g5r5a1_unorm(const void *void_src, GLfloat dst[4])
429{
430   uint16_t *src = (uint16_t *)void_src;
431            uint8_t b = UNPACK(*src, 0, 5);
432            uint8_t g = UNPACK(*src, 5, 5);
433            uint8_t r = UNPACK(*src, 10, 5);
434            uint8_t a = UNPACK(*src, 15, 1);
435
436
437
438               dst[0] = _mesa_unorm_to_float(r, 5);
439
440
441               dst[1] = _mesa_unorm_to_float(g, 5);
442
443
444               dst[2] = _mesa_unorm_to_float(b, 5);
445
446
447               dst[3] = _mesa_unorm_to_float(a, 1);
448}
449
450static inline void
451unpack_float_b5g5r5x1_unorm(const void *void_src, GLfloat dst[4])
452{
453   uint16_t *src = (uint16_t *)void_src;
454            uint8_t b = UNPACK(*src, 0, 5);
455            uint8_t g = UNPACK(*src, 5, 5);
456            uint8_t r = UNPACK(*src, 10, 5);
457
458
459
460               dst[0] = _mesa_unorm_to_float(r, 5);
461
462
463               dst[1] = _mesa_unorm_to_float(g, 5);
464
465
466               dst[2] = _mesa_unorm_to_float(b, 5);
467
468         dst[3] = 1.0f;
469}
470
471static inline void
472unpack_float_a1r5g5b5_unorm(const void *void_src, GLfloat dst[4])
473{
474   uint16_t *src = (uint16_t *)void_src;
475            uint8_t a = UNPACK(*src, 0, 1);
476            uint8_t r = UNPACK(*src, 1, 5);
477            uint8_t g = UNPACK(*src, 6, 5);
478            uint8_t b = UNPACK(*src, 11, 5);
479
480
481
482               dst[0] = _mesa_unorm_to_float(r, 5);
483
484
485               dst[1] = _mesa_unorm_to_float(g, 5);
486
487
488               dst[2] = _mesa_unorm_to_float(b, 5);
489
490
491               dst[3] = _mesa_unorm_to_float(a, 1);
492}
493
494static inline void
495unpack_float_l8a8_unorm(const void *void_src, GLfloat dst[4])
496{
497   uint16_t *src = (uint16_t *)void_src;
498            uint8_t l = UNPACK(*src, 0, 8);
499            uint8_t a = UNPACK(*src, 8, 8);
500
501
502
503               dst[0] = _mesa_unorm_to_float(l, 8);
504
505
506               dst[1] = _mesa_unorm_to_float(l, 8);
507
508
509               dst[2] = _mesa_unorm_to_float(l, 8);
510
511
512               dst[3] = _mesa_unorm_to_float(a, 8);
513}
514
515static inline void
516unpack_float_a8l8_unorm(const void *void_src, GLfloat dst[4])
517{
518   uint16_t *src = (uint16_t *)void_src;
519            uint8_t a = UNPACK(*src, 0, 8);
520            uint8_t l = UNPACK(*src, 8, 8);
521
522
523
524               dst[0] = _mesa_unorm_to_float(l, 8);
525
526
527               dst[1] = _mesa_unorm_to_float(l, 8);
528
529
530               dst[2] = _mesa_unorm_to_float(l, 8);
531
532
533               dst[3] = _mesa_unorm_to_float(a, 8);
534}
535
536static inline void
537unpack_float_r8g8_unorm(const void *void_src, GLfloat dst[4])
538{
539   uint16_t *src = (uint16_t *)void_src;
540            uint8_t r = UNPACK(*src, 0, 8);
541            uint8_t g = UNPACK(*src, 8, 8);
542
543
544
545               dst[0] = _mesa_unorm_to_float(r, 8);
546
547
548               dst[1] = _mesa_unorm_to_float(g, 8);
549
550         dst[2] = 0.0f;
551
552         dst[3] = 1.0f;
553}
554
555static inline void
556unpack_float_g8r8_unorm(const void *void_src, GLfloat dst[4])
557{
558   uint16_t *src = (uint16_t *)void_src;
559            uint8_t g = UNPACK(*src, 0, 8);
560            uint8_t r = UNPACK(*src, 8, 8);
561
562
563
564               dst[0] = _mesa_unorm_to_float(r, 8);
565
566
567               dst[1] = _mesa_unorm_to_float(g, 8);
568
569         dst[2] = 0.0f;
570
571         dst[3] = 1.0f;
572}
573
574static inline void
575unpack_float_l4a4_unorm(const void *void_src, GLfloat dst[4])
576{
577   uint8_t *src = (uint8_t *)void_src;
578            uint8_t l = UNPACK(*src, 0, 4);
579            uint8_t a = UNPACK(*src, 4, 4);
580
581
582
583               dst[0] = _mesa_unorm_to_float(l, 4);
584
585
586               dst[1] = _mesa_unorm_to_float(l, 4);
587
588
589               dst[2] = _mesa_unorm_to_float(l, 4);
590
591
592               dst[3] = _mesa_unorm_to_float(a, 4);
593}
594
595static inline void
596unpack_float_b2g3r3_unorm(const void *void_src, GLfloat dst[4])
597{
598   uint8_t *src = (uint8_t *)void_src;
599            uint8_t b = UNPACK(*src, 0, 2);
600            uint8_t g = UNPACK(*src, 2, 3);
601            uint8_t r = UNPACK(*src, 5, 3);
602
603
604
605               dst[0] = _mesa_unorm_to_float(r, 3);
606
607
608               dst[1] = _mesa_unorm_to_float(g, 3);
609
610
611               dst[2] = _mesa_unorm_to_float(b, 2);
612
613         dst[3] = 1.0f;
614}
615
616static inline void
617unpack_float_r16g16_unorm(const void *void_src, GLfloat dst[4])
618{
619   uint32_t *src = (uint32_t *)void_src;
620            uint16_t r = UNPACK(*src, 0, 16);
621            uint16_t g = UNPACK(*src, 16, 16);
622
623
624
625               dst[0] = _mesa_unorm_to_float(r, 16);
626
627
628               dst[1] = _mesa_unorm_to_float(g, 16);
629
630         dst[2] = 0.0f;
631
632         dst[3] = 1.0f;
633}
634
635static inline void
636unpack_float_g16r16_unorm(const void *void_src, GLfloat dst[4])
637{
638   uint32_t *src = (uint32_t *)void_src;
639            uint16_t g = UNPACK(*src, 0, 16);
640            uint16_t r = UNPACK(*src, 16, 16);
641
642
643
644               dst[0] = _mesa_unorm_to_float(r, 16);
645
646
647               dst[1] = _mesa_unorm_to_float(g, 16);
648
649         dst[2] = 0.0f;
650
651         dst[3] = 1.0f;
652}
653
654static inline void
655unpack_float_b10g10r10a2_unorm(const void *void_src, GLfloat dst[4])
656{
657   uint32_t *src = (uint32_t *)void_src;
658            uint16_t b = UNPACK(*src, 0, 10);
659            uint16_t g = UNPACK(*src, 10, 10);
660            uint16_t r = UNPACK(*src, 20, 10);
661            uint8_t a = UNPACK(*src, 30, 2);
662
663
664
665               dst[0] = _mesa_unorm_to_float(r, 10);
666
667
668               dst[1] = _mesa_unorm_to_float(g, 10);
669
670
671               dst[2] = _mesa_unorm_to_float(b, 10);
672
673
674               dst[3] = _mesa_unorm_to_float(a, 2);
675}
676
677static inline void
678unpack_float_b10g10r10x2_unorm(const void *void_src, GLfloat dst[4])
679{
680   uint32_t *src = (uint32_t *)void_src;
681            uint16_t b = UNPACK(*src, 0, 10);
682            uint16_t g = UNPACK(*src, 10, 10);
683            uint16_t r = UNPACK(*src, 20, 10);
684
685
686
687               dst[0] = _mesa_unorm_to_float(r, 10);
688
689
690               dst[1] = _mesa_unorm_to_float(g, 10);
691
692
693               dst[2] = _mesa_unorm_to_float(b, 10);
694
695         dst[3] = 1.0f;
696}
697
698static inline void
699unpack_float_r10g10b10a2_unorm(const void *void_src, GLfloat dst[4])
700{
701   uint32_t *src = (uint32_t *)void_src;
702            uint16_t r = UNPACK(*src, 0, 10);
703            uint16_t g = UNPACK(*src, 10, 10);
704            uint16_t b = UNPACK(*src, 20, 10);
705            uint8_t a = UNPACK(*src, 30, 2);
706
707
708
709               dst[0] = _mesa_unorm_to_float(r, 10);
710
711
712               dst[1] = _mesa_unorm_to_float(g, 10);
713
714
715               dst[2] = _mesa_unorm_to_float(b, 10);
716
717
718               dst[3] = _mesa_unorm_to_float(a, 2);
719}
720
721static inline void
722unpack_float_r10g10b10x2_unorm(const void *void_src, GLfloat dst[4])
723{
724   uint32_t *src = (uint32_t *)void_src;
725            uint16_t r = UNPACK(*src, 0, 10);
726            uint16_t g = UNPACK(*src, 10, 10);
727            uint16_t b = UNPACK(*src, 20, 10);
728
729
730
731               dst[0] = _mesa_unorm_to_float(r, 10);
732
733
734               dst[1] = _mesa_unorm_to_float(g, 10);
735
736
737               dst[2] = _mesa_unorm_to_float(b, 10);
738
739         dst[3] = 1.0f;
740}
741
742static inline void
743unpack_float_r3g3b2_unorm(const void *void_src, GLfloat dst[4])
744{
745   uint8_t *src = (uint8_t *)void_src;
746            uint8_t r = UNPACK(*src, 0, 3);
747            uint8_t g = UNPACK(*src, 3, 3);
748            uint8_t b = UNPACK(*src, 6, 2);
749
750
751
752               dst[0] = _mesa_unorm_to_float(r, 3);
753
754
755               dst[1] = _mesa_unorm_to_float(g, 3);
756
757
758               dst[2] = _mesa_unorm_to_float(b, 2);
759
760         dst[3] = 1.0f;
761}
762
763static inline void
764unpack_float_a4b4g4r4_unorm(const void *void_src, GLfloat dst[4])
765{
766   uint16_t *src = (uint16_t *)void_src;
767            uint8_t a = UNPACK(*src, 0, 4);
768            uint8_t b = UNPACK(*src, 4, 4);
769            uint8_t g = UNPACK(*src, 8, 4);
770            uint8_t r = UNPACK(*src, 12, 4);
771
772
773
774               dst[0] = _mesa_unorm_to_float(r, 4);
775
776
777               dst[1] = _mesa_unorm_to_float(g, 4);
778
779
780               dst[2] = _mesa_unorm_to_float(b, 4);
781
782
783               dst[3] = _mesa_unorm_to_float(a, 4);
784}
785
786static inline void
787unpack_float_r4g4b4a4_unorm(const void *void_src, GLfloat dst[4])
788{
789   uint16_t *src = (uint16_t *)void_src;
790            uint8_t r = UNPACK(*src, 0, 4);
791            uint8_t g = UNPACK(*src, 4, 4);
792            uint8_t b = UNPACK(*src, 8, 4);
793            uint8_t a = UNPACK(*src, 12, 4);
794
795
796
797               dst[0] = _mesa_unorm_to_float(r, 4);
798
799
800               dst[1] = _mesa_unorm_to_float(g, 4);
801
802
803               dst[2] = _mesa_unorm_to_float(b, 4);
804
805
806               dst[3] = _mesa_unorm_to_float(a, 4);
807}
808
809static inline void
810unpack_float_r5g5b5a1_unorm(const void *void_src, GLfloat dst[4])
811{
812   uint16_t *src = (uint16_t *)void_src;
813            uint8_t r = UNPACK(*src, 0, 5);
814            uint8_t g = UNPACK(*src, 5, 5);
815            uint8_t b = UNPACK(*src, 10, 5);
816            uint8_t a = UNPACK(*src, 15, 1);
817
818
819
820               dst[0] = _mesa_unorm_to_float(r, 5);
821
822
823               dst[1] = _mesa_unorm_to_float(g, 5);
824
825
826               dst[2] = _mesa_unorm_to_float(b, 5);
827
828
829               dst[3] = _mesa_unorm_to_float(a, 1);
830}
831
832static inline void
833unpack_float_a2b10g10r10_unorm(const void *void_src, GLfloat dst[4])
834{
835   uint32_t *src = (uint32_t *)void_src;
836            uint8_t a = UNPACK(*src, 0, 2);
837            uint16_t b = UNPACK(*src, 2, 10);
838            uint16_t g = UNPACK(*src, 12, 10);
839            uint16_t r = UNPACK(*src, 22, 10);
840
841
842
843               dst[0] = _mesa_unorm_to_float(r, 10);
844
845
846               dst[1] = _mesa_unorm_to_float(g, 10);
847
848
849               dst[2] = _mesa_unorm_to_float(b, 10);
850
851
852               dst[3] = _mesa_unorm_to_float(a, 2);
853}
854
855static inline void
856unpack_float_a2r10g10b10_unorm(const void *void_src, GLfloat dst[4])
857{
858   uint32_t *src = (uint32_t *)void_src;
859            uint8_t a = UNPACK(*src, 0, 2);
860            uint16_t r = UNPACK(*src, 2, 10);
861            uint16_t g = UNPACK(*src, 12, 10);
862            uint16_t b = UNPACK(*src, 22, 10);
863
864
865
866               dst[0] = _mesa_unorm_to_float(r, 10);
867
868
869               dst[1] = _mesa_unorm_to_float(g, 10);
870
871
872               dst[2] = _mesa_unorm_to_float(b, 10);
873
874
875               dst[3] = _mesa_unorm_to_float(a, 2);
876}
877
878static inline void
879unpack_float_a_unorm8(const void *void_src, GLfloat dst[4])
880{
881   uint8_t *src = (uint8_t *)void_src;
882            uint8_t a = src[0];
883
884
885         dst[0] = 0.0f;
886
887         dst[1] = 0.0f;
888
889         dst[2] = 0.0f;
890
891
892               dst[3] = _mesa_unorm_to_float(a, 8);
893}
894
895static inline void
896unpack_float_a_unorm16(const void *void_src, GLfloat dst[4])
897{
898   uint16_t *src = (uint16_t *)void_src;
899            uint16_t a = src[0];
900
901
902         dst[0] = 0.0f;
903
904         dst[1] = 0.0f;
905
906         dst[2] = 0.0f;
907
908
909               dst[3] = _mesa_unorm_to_float(a, 16);
910}
911
912static inline void
913unpack_float_l_unorm8(const void *void_src, GLfloat dst[4])
914{
915   uint8_t *src = (uint8_t *)void_src;
916            uint8_t l = src[0];
917
918
919
920               dst[0] = _mesa_unorm_to_float(l, 8);
921
922
923               dst[1] = _mesa_unorm_to_float(l, 8);
924
925
926               dst[2] = _mesa_unorm_to_float(l, 8);
927
928         dst[3] = 1.0f;
929}
930
931static inline void
932unpack_float_l_unorm16(const void *void_src, GLfloat dst[4])
933{
934   uint16_t *src = (uint16_t *)void_src;
935            uint16_t l = src[0];
936
937
938
939               dst[0] = _mesa_unorm_to_float(l, 16);
940
941
942               dst[1] = _mesa_unorm_to_float(l, 16);
943
944
945               dst[2] = _mesa_unorm_to_float(l, 16);
946
947         dst[3] = 1.0f;
948}
949
950static inline void
951unpack_float_i_unorm8(const void *void_src, GLfloat dst[4])
952{
953   uint8_t *src = (uint8_t *)void_src;
954            uint8_t i = src[0];
955
956
957
958               dst[0] = _mesa_unorm_to_float(i, 8);
959
960
961               dst[1] = _mesa_unorm_to_float(i, 8);
962
963
964               dst[2] = _mesa_unorm_to_float(i, 8);
965
966
967               dst[3] = _mesa_unorm_to_float(i, 8);
968}
969
970static inline void
971unpack_float_i_unorm16(const void *void_src, GLfloat dst[4])
972{
973   uint16_t *src = (uint16_t *)void_src;
974            uint16_t i = src[0];
975
976
977
978               dst[0] = _mesa_unorm_to_float(i, 16);
979
980
981               dst[1] = _mesa_unorm_to_float(i, 16);
982
983
984               dst[2] = _mesa_unorm_to_float(i, 16);
985
986
987               dst[3] = _mesa_unorm_to_float(i, 16);
988}
989
990static inline void
991unpack_float_r_unorm8(const void *void_src, GLfloat dst[4])
992{
993   uint8_t *src = (uint8_t *)void_src;
994            uint8_t r = src[0];
995
996
997
998               dst[0] = _mesa_unorm_to_float(r, 8);
999
1000         dst[1] = 0.0f;
1001
1002         dst[2] = 0.0f;
1003
1004         dst[3] = 1.0f;
1005}
1006
1007static inline void
1008unpack_float_r_unorm16(const void *void_src, GLfloat dst[4])
1009{
1010   uint16_t *src = (uint16_t *)void_src;
1011            uint16_t r = src[0];
1012
1013
1014
1015               dst[0] = _mesa_unorm_to_float(r, 16);
1016
1017         dst[1] = 0.0f;
1018
1019         dst[2] = 0.0f;
1020
1021         dst[3] = 1.0f;
1022}
1023
1024static inline void
1025unpack_float_bgr_unorm8(const void *void_src, GLfloat dst[4])
1026{
1027   uint8_t *src = (uint8_t *)void_src;
1028            uint8_t b = src[0];
1029            uint8_t g = src[1];
1030            uint8_t r = src[2];
1031
1032
1033
1034               dst[0] = _mesa_unorm_to_float(r, 8);
1035
1036
1037               dst[1] = _mesa_unorm_to_float(g, 8);
1038
1039
1040               dst[2] = _mesa_unorm_to_float(b, 8);
1041
1042         dst[3] = 1.0f;
1043}
1044
1045static inline void
1046unpack_float_rgb_unorm8(const void *void_src, GLfloat dst[4])
1047{
1048   uint8_t *src = (uint8_t *)void_src;
1049            uint8_t r = src[0];
1050            uint8_t g = src[1];
1051            uint8_t b = src[2];
1052
1053
1054
1055               dst[0] = _mesa_unorm_to_float(r, 8);
1056
1057
1058               dst[1] = _mesa_unorm_to_float(g, 8);
1059
1060
1061               dst[2] = _mesa_unorm_to_float(b, 8);
1062
1063         dst[3] = 1.0f;
1064}
1065
1066static inline void
1067unpack_float_rgba_unorm16(const void *void_src, GLfloat dst[4])
1068{
1069   uint16_t *src = (uint16_t *)void_src;
1070            uint16_t r = src[0];
1071            uint16_t g = src[1];
1072            uint16_t b = src[2];
1073            uint16_t a = src[3];
1074
1075
1076
1077               dst[0] = _mesa_unorm_to_float(r, 16);
1078
1079
1080               dst[1] = _mesa_unorm_to_float(g, 16);
1081
1082
1083               dst[2] = _mesa_unorm_to_float(b, 16);
1084
1085
1086               dst[3] = _mesa_unorm_to_float(a, 16);
1087}
1088
1089static inline void
1090unpack_float_rgbx_unorm16(const void *void_src, GLfloat dst[4])
1091{
1092   uint16_t *src = (uint16_t *)void_src;
1093            uint16_t r = src[0];
1094            uint16_t g = src[1];
1095            uint16_t b = src[2];
1096
1097
1098
1099               dst[0] = _mesa_unorm_to_float(r, 16);
1100
1101
1102               dst[1] = _mesa_unorm_to_float(g, 16);
1103
1104
1105               dst[2] = _mesa_unorm_to_float(b, 16);
1106
1107         dst[3] = 1.0f;
1108}
1109
1110static inline void
1111unpack_float_a8b8g8r8_snorm(const void *void_src, GLfloat dst[4])
1112{
1113   uint32_t *src = (uint32_t *)void_src;
1114            int8_t a = UNPACK(*src, 0, 8);
1115            int8_t b = UNPACK(*src, 8, 8);
1116            int8_t g = UNPACK(*src, 16, 8);
1117            int8_t r = UNPACK(*src, 24, 8);
1118
1119
1120
1121            dst[0] = _mesa_snorm_to_float(r, 8);
1122
1123
1124            dst[1] = _mesa_snorm_to_float(g, 8);
1125
1126
1127            dst[2] = _mesa_snorm_to_float(b, 8);
1128
1129
1130            dst[3] = _mesa_snorm_to_float(a, 8);
1131}
1132
1133static inline void
1134unpack_float_x8b8g8r8_snorm(const void *void_src, GLfloat dst[4])
1135{
1136   uint32_t *src = (uint32_t *)void_src;
1137            int8_t b = UNPACK(*src, 8, 8);
1138            int8_t g = UNPACK(*src, 16, 8);
1139            int8_t r = UNPACK(*src, 24, 8);
1140
1141
1142
1143            dst[0] = _mesa_snorm_to_float(r, 8);
1144
1145
1146            dst[1] = _mesa_snorm_to_float(g, 8);
1147
1148
1149            dst[2] = _mesa_snorm_to_float(b, 8);
1150
1151         dst[3] = 1.0f;
1152}
1153
1154static inline void
1155unpack_float_r8g8b8a8_snorm(const void *void_src, GLfloat dst[4])
1156{
1157   uint32_t *src = (uint32_t *)void_src;
1158            int8_t r = UNPACK(*src, 0, 8);
1159            int8_t g = UNPACK(*src, 8, 8);
1160            int8_t b = UNPACK(*src, 16, 8);
1161            int8_t a = UNPACK(*src, 24, 8);
1162
1163
1164
1165            dst[0] = _mesa_snorm_to_float(r, 8);
1166
1167
1168            dst[1] = _mesa_snorm_to_float(g, 8);
1169
1170
1171            dst[2] = _mesa_snorm_to_float(b, 8);
1172
1173
1174            dst[3] = _mesa_snorm_to_float(a, 8);
1175}
1176
1177static inline void
1178unpack_float_r8g8b8x8_snorm(const void *void_src, GLfloat dst[4])
1179{
1180   uint32_t *src = (uint32_t *)void_src;
1181            int8_t r = UNPACK(*src, 0, 8);
1182            int8_t g = UNPACK(*src, 8, 8);
1183            int8_t b = UNPACK(*src, 16, 8);
1184
1185
1186
1187            dst[0] = _mesa_snorm_to_float(r, 8);
1188
1189
1190            dst[1] = _mesa_snorm_to_float(g, 8);
1191
1192
1193            dst[2] = _mesa_snorm_to_float(b, 8);
1194
1195         dst[3] = 1.0f;
1196}
1197
1198static inline void
1199unpack_float_r16g16_snorm(const void *void_src, GLfloat dst[4])
1200{
1201   uint32_t *src = (uint32_t *)void_src;
1202            int16_t r = UNPACK(*src, 0, 16);
1203            int16_t g = UNPACK(*src, 16, 16);
1204
1205
1206
1207            dst[0] = _mesa_snorm_to_float(r, 16);
1208
1209
1210            dst[1] = _mesa_snorm_to_float(g, 16);
1211
1212         dst[2] = 0.0f;
1213
1214         dst[3] = 1.0f;
1215}
1216
1217static inline void
1218unpack_float_g16r16_snorm(const void *void_src, GLfloat dst[4])
1219{
1220   uint32_t *src = (uint32_t *)void_src;
1221            int16_t g = UNPACK(*src, 0, 16);
1222            int16_t r = UNPACK(*src, 16, 16);
1223
1224
1225
1226            dst[0] = _mesa_snorm_to_float(r, 16);
1227
1228
1229            dst[1] = _mesa_snorm_to_float(g, 16);
1230
1231         dst[2] = 0.0f;
1232
1233         dst[3] = 1.0f;
1234}
1235
1236static inline void
1237unpack_float_r8g8_snorm(const void *void_src, GLfloat dst[4])
1238{
1239   uint16_t *src = (uint16_t *)void_src;
1240            int8_t r = UNPACK(*src, 0, 8);
1241            int8_t g = UNPACK(*src, 8, 8);
1242
1243
1244
1245            dst[0] = _mesa_snorm_to_float(r, 8);
1246
1247
1248            dst[1] = _mesa_snorm_to_float(g, 8);
1249
1250         dst[2] = 0.0f;
1251
1252         dst[3] = 1.0f;
1253}
1254
1255static inline void
1256unpack_float_g8r8_snorm(const void *void_src, GLfloat dst[4])
1257{
1258   uint16_t *src = (uint16_t *)void_src;
1259            int8_t g = UNPACK(*src, 0, 8);
1260            int8_t r = UNPACK(*src, 8, 8);
1261
1262
1263
1264            dst[0] = _mesa_snorm_to_float(r, 8);
1265
1266
1267            dst[1] = _mesa_snorm_to_float(g, 8);
1268
1269         dst[2] = 0.0f;
1270
1271         dst[3] = 1.0f;
1272}
1273
1274static inline void
1275unpack_float_l8a8_snorm(const void *void_src, GLfloat dst[4])
1276{
1277   uint16_t *src = (uint16_t *)void_src;
1278            int8_t l = UNPACK(*src, 0, 8);
1279            int8_t a = UNPACK(*src, 8, 8);
1280
1281
1282
1283            dst[0] = _mesa_snorm_to_float(l, 8);
1284
1285
1286            dst[1] = _mesa_snorm_to_float(l, 8);
1287
1288
1289            dst[2] = _mesa_snorm_to_float(l, 8);
1290
1291
1292            dst[3] = _mesa_snorm_to_float(a, 8);
1293}
1294
1295static inline void
1296unpack_float_a8l8_snorm(const void *void_src, GLfloat dst[4])
1297{
1298   uint16_t *src = (uint16_t *)void_src;
1299            int8_t a = UNPACK(*src, 0, 8);
1300            int8_t l = UNPACK(*src, 8, 8);
1301
1302
1303
1304            dst[0] = _mesa_snorm_to_float(l, 8);
1305
1306
1307            dst[1] = _mesa_snorm_to_float(l, 8);
1308
1309
1310            dst[2] = _mesa_snorm_to_float(l, 8);
1311
1312
1313            dst[3] = _mesa_snorm_to_float(a, 8);
1314}
1315
1316static inline void
1317unpack_float_a_snorm8(const void *void_src, GLfloat dst[4])
1318{
1319   int8_t *src = (int8_t *)void_src;
1320            int8_t a = src[0];
1321
1322
1323         dst[0] = 0.0f;
1324
1325         dst[1] = 0.0f;
1326
1327         dst[2] = 0.0f;
1328
1329
1330            dst[3] = _mesa_snorm_to_float(a, 8);
1331}
1332
1333static inline void
1334unpack_float_a_snorm16(const void *void_src, GLfloat dst[4])
1335{
1336   int16_t *src = (int16_t *)void_src;
1337            int16_t a = src[0];
1338
1339
1340         dst[0] = 0.0f;
1341
1342         dst[1] = 0.0f;
1343
1344         dst[2] = 0.0f;
1345
1346
1347            dst[3] = _mesa_snorm_to_float(a, 16);
1348}
1349
1350static inline void
1351unpack_float_l_snorm8(const void *void_src, GLfloat dst[4])
1352{
1353   int8_t *src = (int8_t *)void_src;
1354            int8_t l = src[0];
1355
1356
1357
1358            dst[0] = _mesa_snorm_to_float(l, 8);
1359
1360
1361            dst[1] = _mesa_snorm_to_float(l, 8);
1362
1363
1364            dst[2] = _mesa_snorm_to_float(l, 8);
1365
1366         dst[3] = 1.0f;
1367}
1368
1369static inline void
1370unpack_float_l_snorm16(const void *void_src, GLfloat dst[4])
1371{
1372   int16_t *src = (int16_t *)void_src;
1373            int16_t l = src[0];
1374
1375
1376
1377            dst[0] = _mesa_snorm_to_float(l, 16);
1378
1379
1380            dst[1] = _mesa_snorm_to_float(l, 16);
1381
1382
1383            dst[2] = _mesa_snorm_to_float(l, 16);
1384
1385         dst[3] = 1.0f;
1386}
1387
1388static inline void
1389unpack_float_i_snorm8(const void *void_src, GLfloat dst[4])
1390{
1391   int8_t *src = (int8_t *)void_src;
1392            int8_t i = src[0];
1393
1394
1395
1396            dst[0] = _mesa_snorm_to_float(i, 8);
1397
1398
1399            dst[1] = _mesa_snorm_to_float(i, 8);
1400
1401
1402            dst[2] = _mesa_snorm_to_float(i, 8);
1403
1404
1405            dst[3] = _mesa_snorm_to_float(i, 8);
1406}
1407
1408static inline void
1409unpack_float_i_snorm16(const void *void_src, GLfloat dst[4])
1410{
1411   int16_t *src = (int16_t *)void_src;
1412            int16_t i = src[0];
1413
1414
1415
1416            dst[0] = _mesa_snorm_to_float(i, 16);
1417
1418
1419            dst[1] = _mesa_snorm_to_float(i, 16);
1420
1421
1422            dst[2] = _mesa_snorm_to_float(i, 16);
1423
1424
1425            dst[3] = _mesa_snorm_to_float(i, 16);
1426}
1427
1428static inline void
1429unpack_float_r_snorm8(const void *void_src, GLfloat dst[4])
1430{
1431   int8_t *src = (int8_t *)void_src;
1432            int8_t r = src[0];
1433
1434
1435
1436            dst[0] = _mesa_snorm_to_float(r, 8);
1437
1438         dst[1] = 0.0f;
1439
1440         dst[2] = 0.0f;
1441
1442         dst[3] = 1.0f;
1443}
1444
1445static inline void
1446unpack_float_r_snorm16(const void *void_src, GLfloat dst[4])
1447{
1448   int16_t *src = (int16_t *)void_src;
1449            int16_t r = src[0];
1450
1451
1452
1453            dst[0] = _mesa_snorm_to_float(r, 16);
1454
1455         dst[1] = 0.0f;
1456
1457         dst[2] = 0.0f;
1458
1459         dst[3] = 1.0f;
1460}
1461
1462static inline void
1463unpack_float_la_snorm16(const void *void_src, GLfloat dst[4])
1464{
1465   int16_t *src = (int16_t *)void_src;
1466            int16_t l = src[0];
1467            int16_t a = src[1];
1468
1469
1470
1471            dst[0] = _mesa_snorm_to_float(l, 16);
1472
1473
1474            dst[1] = _mesa_snorm_to_float(l, 16);
1475
1476
1477            dst[2] = _mesa_snorm_to_float(l, 16);
1478
1479
1480            dst[3] = _mesa_snorm_to_float(a, 16);
1481}
1482
1483static inline void
1484unpack_float_rgb_snorm16(const void *void_src, GLfloat dst[4])
1485{
1486   int16_t *src = (int16_t *)void_src;
1487            int16_t r = src[0];
1488            int16_t g = src[1];
1489            int16_t b = src[2];
1490
1491
1492
1493            dst[0] = _mesa_snorm_to_float(r, 16);
1494
1495
1496            dst[1] = _mesa_snorm_to_float(g, 16);
1497
1498
1499            dst[2] = _mesa_snorm_to_float(b, 16);
1500
1501         dst[3] = 1.0f;
1502}
1503
1504static inline void
1505unpack_float_rgba_snorm16(const void *void_src, GLfloat dst[4])
1506{
1507   int16_t *src = (int16_t *)void_src;
1508            int16_t r = src[0];
1509            int16_t g = src[1];
1510            int16_t b = src[2];
1511            int16_t a = src[3];
1512
1513
1514
1515            dst[0] = _mesa_snorm_to_float(r, 16);
1516
1517
1518            dst[1] = _mesa_snorm_to_float(g, 16);
1519
1520
1521            dst[2] = _mesa_snorm_to_float(b, 16);
1522
1523
1524            dst[3] = _mesa_snorm_to_float(a, 16);
1525}
1526
1527static inline void
1528unpack_float_rgbx_snorm16(const void *void_src, GLfloat dst[4])
1529{
1530   int16_t *src = (int16_t *)void_src;
1531            int16_t r = src[0];
1532            int16_t g = src[1];
1533            int16_t b = src[2];
1534
1535
1536
1537            dst[0] = _mesa_snorm_to_float(r, 16);
1538
1539
1540            dst[1] = _mesa_snorm_to_float(g, 16);
1541
1542
1543            dst[2] = _mesa_snorm_to_float(b, 16);
1544
1545         dst[3] = 1.0f;
1546}
1547
1548static inline void
1549unpack_float_a8b8g8r8_srgb(const void *void_src, GLfloat dst[4])
1550{
1551   uint32_t *src = (uint32_t *)void_src;
1552            uint8_t a = UNPACK(*src, 0, 8);
1553            uint8_t b = UNPACK(*src, 8, 8);
1554            uint8_t g = UNPACK(*src, 16, 8);
1555            uint8_t r = UNPACK(*src, 24, 8);
1556
1557
1558
1559
1560               dst[0] = util_format_srgb_8unorm_to_linear_float(r);
1561
1562
1563
1564               dst[1] = util_format_srgb_8unorm_to_linear_float(g);
1565
1566
1567
1568               dst[2] = util_format_srgb_8unorm_to_linear_float(b);
1569
1570
1571               dst[3] = _mesa_unorm_to_float(a, 8);
1572}
1573
1574static inline void
1575unpack_float_b8g8r8a8_srgb(const void *void_src, GLfloat dst[4])
1576{
1577   uint32_t *src = (uint32_t *)void_src;
1578            uint8_t b = UNPACK(*src, 0, 8);
1579            uint8_t g = UNPACK(*src, 8, 8);
1580            uint8_t r = UNPACK(*src, 16, 8);
1581            uint8_t a = UNPACK(*src, 24, 8);
1582
1583
1584
1585
1586               dst[0] = util_format_srgb_8unorm_to_linear_float(r);
1587
1588
1589
1590               dst[1] = util_format_srgb_8unorm_to_linear_float(g);
1591
1592
1593
1594               dst[2] = util_format_srgb_8unorm_to_linear_float(b);
1595
1596
1597               dst[3] = _mesa_unorm_to_float(a, 8);
1598}
1599
1600static inline void
1601unpack_float_a8r8g8b8_srgb(const void *void_src, GLfloat dst[4])
1602{
1603   uint32_t *src = (uint32_t *)void_src;
1604            uint8_t a = UNPACK(*src, 0, 8);
1605            uint8_t r = UNPACK(*src, 8, 8);
1606            uint8_t g = UNPACK(*src, 16, 8);
1607            uint8_t b = UNPACK(*src, 24, 8);
1608
1609
1610
1611
1612               dst[0] = util_format_srgb_8unorm_to_linear_float(r);
1613
1614
1615
1616               dst[1] = util_format_srgb_8unorm_to_linear_float(g);
1617
1618
1619
1620               dst[2] = util_format_srgb_8unorm_to_linear_float(b);
1621
1622
1623               dst[3] = _mesa_unorm_to_float(a, 8);
1624}
1625
1626static inline void
1627unpack_float_b8g8r8x8_srgb(const void *void_src, GLfloat dst[4])
1628{
1629   uint32_t *src = (uint32_t *)void_src;
1630            uint8_t b = UNPACK(*src, 0, 8);
1631            uint8_t g = UNPACK(*src, 8, 8);
1632            uint8_t r = UNPACK(*src, 16, 8);
1633
1634
1635
1636
1637               dst[0] = util_format_srgb_8unorm_to_linear_float(r);
1638
1639
1640
1641               dst[1] = util_format_srgb_8unorm_to_linear_float(g);
1642
1643
1644
1645               dst[2] = util_format_srgb_8unorm_to_linear_float(b);
1646
1647         dst[3] = 1.0f;
1648}
1649
1650static inline void
1651unpack_float_x8r8g8b8_srgb(const void *void_src, GLfloat dst[4])
1652{
1653   uint32_t *src = (uint32_t *)void_src;
1654            uint8_t r = UNPACK(*src, 8, 8);
1655            uint8_t g = UNPACK(*src, 16, 8);
1656            uint8_t b = UNPACK(*src, 24, 8);
1657
1658
1659
1660
1661               dst[0] = util_format_srgb_8unorm_to_linear_float(r);
1662
1663
1664
1665               dst[1] = util_format_srgb_8unorm_to_linear_float(g);
1666
1667
1668
1669               dst[2] = util_format_srgb_8unorm_to_linear_float(b);
1670
1671         dst[3] = 1.0f;
1672}
1673
1674static inline void
1675unpack_float_r8g8b8a8_srgb(const void *void_src, GLfloat dst[4])
1676{
1677   uint32_t *src = (uint32_t *)void_src;
1678            uint8_t r = UNPACK(*src, 0, 8);
1679            uint8_t g = UNPACK(*src, 8, 8);
1680            uint8_t b = UNPACK(*src, 16, 8);
1681            uint8_t a = UNPACK(*src, 24, 8);
1682
1683
1684
1685
1686               dst[0] = util_format_srgb_8unorm_to_linear_float(r);
1687
1688
1689
1690               dst[1] = util_format_srgb_8unorm_to_linear_float(g);
1691
1692
1693
1694               dst[2] = util_format_srgb_8unorm_to_linear_float(b);
1695
1696
1697               dst[3] = _mesa_unorm_to_float(a, 8);
1698}
1699
1700static inline void
1701unpack_float_r8g8b8x8_srgb(const void *void_src, GLfloat dst[4])
1702{
1703   uint32_t *src = (uint32_t *)void_src;
1704            uint8_t r = UNPACK(*src, 0, 8);
1705            uint8_t g = UNPACK(*src, 8, 8);
1706            uint8_t b = UNPACK(*src, 16, 8);
1707
1708
1709
1710
1711               dst[0] = util_format_srgb_8unorm_to_linear_float(r);
1712
1713
1714
1715               dst[1] = util_format_srgb_8unorm_to_linear_float(g);
1716
1717
1718
1719               dst[2] = util_format_srgb_8unorm_to_linear_float(b);
1720
1721         dst[3] = 1.0f;
1722}
1723
1724static inline void
1725unpack_float_x8b8g8r8_srgb(const void *void_src, GLfloat dst[4])
1726{
1727   uint32_t *src = (uint32_t *)void_src;
1728            uint8_t b = UNPACK(*src, 8, 8);
1729            uint8_t g = UNPACK(*src, 16, 8);
1730            uint8_t r = UNPACK(*src, 24, 8);
1731
1732
1733
1734
1735               dst[0] = util_format_srgb_8unorm_to_linear_float(r);
1736
1737
1738
1739               dst[1] = util_format_srgb_8unorm_to_linear_float(g);
1740
1741
1742
1743               dst[2] = util_format_srgb_8unorm_to_linear_float(b);
1744
1745         dst[3] = 1.0f;
1746}
1747
1748static inline void
1749unpack_float_l8a8_srgb(const void *void_src, GLfloat dst[4])
1750{
1751   uint16_t *src = (uint16_t *)void_src;
1752            uint8_t l = UNPACK(*src, 0, 8);
1753            uint8_t a = UNPACK(*src, 8, 8);
1754
1755
1756
1757               dst[0] = _mesa_unorm_to_float(l, 8);
1758
1759
1760               dst[1] = _mesa_unorm_to_float(l, 8);
1761
1762
1763               dst[2] = _mesa_unorm_to_float(l, 8);
1764
1765
1766               dst[3] = _mesa_unorm_to_float(a, 8);
1767}
1768
1769static inline void
1770unpack_float_a8l8_srgb(const void *void_src, GLfloat dst[4])
1771{
1772   uint16_t *src = (uint16_t *)void_src;
1773            uint8_t a = UNPACK(*src, 0, 8);
1774            uint8_t l = UNPACK(*src, 8, 8);
1775
1776
1777
1778               dst[0] = _mesa_unorm_to_float(l, 8);
1779
1780
1781               dst[1] = _mesa_unorm_to_float(l, 8);
1782
1783
1784               dst[2] = _mesa_unorm_to_float(l, 8);
1785
1786
1787               dst[3] = _mesa_unorm_to_float(a, 8);
1788}
1789
1790static inline void
1791unpack_float_r_srgb8(const void *void_src, GLfloat dst[4])
1792{
1793   uint8_t *src = (uint8_t *)void_src;
1794            uint8_t r = src[0];
1795
1796
1797
1798
1799               dst[0] = util_format_srgb_8unorm_to_linear_float(r);
1800
1801         dst[1] = 0.0f;
1802
1803         dst[2] = 0.0f;
1804
1805         dst[3] = 1.0f;
1806}
1807
1808static inline void
1809unpack_float_l_srgb8(const void *void_src, GLfloat dst[4])
1810{
1811   uint8_t *src = (uint8_t *)void_src;
1812            uint8_t l = src[0];
1813
1814
1815
1816               dst[0] = _mesa_unorm_to_float(l, 8);
1817
1818
1819               dst[1] = _mesa_unorm_to_float(l, 8);
1820
1821
1822               dst[2] = _mesa_unorm_to_float(l, 8);
1823
1824         dst[3] = 1.0f;
1825}
1826
1827static inline void
1828unpack_float_bgr_srgb8(const void *void_src, GLfloat dst[4])
1829{
1830   uint8_t *src = (uint8_t *)void_src;
1831            uint8_t b = src[0];
1832            uint8_t g = src[1];
1833            uint8_t r = src[2];
1834
1835
1836
1837
1838               dst[0] = util_format_srgb_8unorm_to_linear_float(r);
1839
1840
1841
1842               dst[1] = util_format_srgb_8unorm_to_linear_float(g);
1843
1844
1845
1846               dst[2] = util_format_srgb_8unorm_to_linear_float(b);
1847
1848         dst[3] = 1.0f;
1849}
1850
1851static inline void
1852unpack_float_a_float16(const void *void_src, GLfloat dst[4])
1853{
1854   uint16_t *src = (uint16_t *)void_src;
1855            uint16_t a = src[0];
1856
1857
1858         dst[0] = 0.0f;
1859
1860         dst[1] = 0.0f;
1861
1862         dst[2] = 0.0f;
1863
1864
1865               dst[3] = _mesa_half_to_float(a);
1866}
1867
1868static inline void
1869unpack_float_a_float32(const void *void_src, GLfloat dst[4])
1870{
1871   float *src = (float *)void_src;
1872            float a = src[0];
1873
1874
1875         dst[0] = 0.0f;
1876
1877         dst[1] = 0.0f;
1878
1879         dst[2] = 0.0f;
1880
1881
1882               dst[3] = a;
1883}
1884
1885static inline void
1886unpack_float_l_float16(const void *void_src, GLfloat dst[4])
1887{
1888   uint16_t *src = (uint16_t *)void_src;
1889            uint16_t l = src[0];
1890
1891
1892
1893               dst[0] = _mesa_half_to_float(l);
1894
1895
1896               dst[1] = _mesa_half_to_float(l);
1897
1898
1899               dst[2] = _mesa_half_to_float(l);
1900
1901         dst[3] = 1.0f;
1902}
1903
1904static inline void
1905unpack_float_l_float32(const void *void_src, GLfloat dst[4])
1906{
1907   float *src = (float *)void_src;
1908            float l = src[0];
1909
1910
1911
1912               dst[0] = l;
1913
1914
1915               dst[1] = l;
1916
1917
1918               dst[2] = l;
1919
1920         dst[3] = 1.0f;
1921}
1922
1923static inline void
1924unpack_float_la_float16(const void *void_src, GLfloat dst[4])
1925{
1926   uint16_t *src = (uint16_t *)void_src;
1927            uint16_t l = src[0];
1928            uint16_t a = src[1];
1929
1930
1931
1932               dst[0] = _mesa_half_to_float(l);
1933
1934
1935               dst[1] = _mesa_half_to_float(l);
1936
1937
1938               dst[2] = _mesa_half_to_float(l);
1939
1940
1941               dst[3] = _mesa_half_to_float(a);
1942}
1943
1944static inline void
1945unpack_float_la_float32(const void *void_src, GLfloat dst[4])
1946{
1947   float *src = (float *)void_src;
1948            float l = src[0];
1949            float a = src[1];
1950
1951
1952
1953               dst[0] = l;
1954
1955
1956               dst[1] = l;
1957
1958
1959               dst[2] = l;
1960
1961
1962               dst[3] = a;
1963}
1964
1965static inline void
1966unpack_float_i_float16(const void *void_src, GLfloat dst[4])
1967{
1968   uint16_t *src = (uint16_t *)void_src;
1969            uint16_t i = src[0];
1970
1971
1972
1973               dst[0] = _mesa_half_to_float(i);
1974
1975
1976               dst[1] = _mesa_half_to_float(i);
1977
1978
1979               dst[2] = _mesa_half_to_float(i);
1980
1981
1982               dst[3] = _mesa_half_to_float(i);
1983}
1984
1985static inline void
1986unpack_float_i_float32(const void *void_src, GLfloat dst[4])
1987{
1988   float *src = (float *)void_src;
1989            float i = src[0];
1990
1991
1992
1993               dst[0] = i;
1994
1995
1996               dst[1] = i;
1997
1998
1999               dst[2] = i;
2000
2001
2002               dst[3] = i;
2003}
2004
2005static inline void
2006unpack_float_r_float16(const void *void_src, GLfloat dst[4])
2007{
2008   uint16_t *src = (uint16_t *)void_src;
2009            uint16_t r = src[0];
2010
2011
2012
2013               dst[0] = _mesa_half_to_float(r);
2014
2015         dst[1] = 0.0f;
2016
2017         dst[2] = 0.0f;
2018
2019         dst[3] = 1.0f;
2020}
2021
2022static inline void
2023unpack_float_r_float32(const void *void_src, GLfloat dst[4])
2024{
2025   float *src = (float *)void_src;
2026            float r = src[0];
2027
2028
2029
2030               dst[0] = r;
2031
2032         dst[1] = 0.0f;
2033
2034         dst[2] = 0.0f;
2035
2036         dst[3] = 1.0f;
2037}
2038
2039static inline void
2040unpack_float_rg_float16(const void *void_src, GLfloat dst[4])
2041{
2042   uint16_t *src = (uint16_t *)void_src;
2043            uint16_t r = src[0];
2044            uint16_t g = src[1];
2045
2046
2047
2048               dst[0] = _mesa_half_to_float(r);
2049
2050
2051               dst[1] = _mesa_half_to_float(g);
2052
2053         dst[2] = 0.0f;
2054
2055         dst[3] = 1.0f;
2056}
2057
2058static inline void
2059unpack_float_rg_float32(const void *void_src, GLfloat dst[4])
2060{
2061   float *src = (float *)void_src;
2062            float r = src[0];
2063            float g = src[1];
2064
2065
2066
2067               dst[0] = r;
2068
2069
2070               dst[1] = g;
2071
2072         dst[2] = 0.0f;
2073
2074         dst[3] = 1.0f;
2075}
2076
2077static inline void
2078unpack_float_rgb_float16(const void *void_src, GLfloat dst[4])
2079{
2080   uint16_t *src = (uint16_t *)void_src;
2081            uint16_t r = src[0];
2082            uint16_t g = src[1];
2083            uint16_t b = src[2];
2084
2085
2086
2087               dst[0] = _mesa_half_to_float(r);
2088
2089
2090               dst[1] = _mesa_half_to_float(g);
2091
2092
2093               dst[2] = _mesa_half_to_float(b);
2094
2095         dst[3] = 1.0f;
2096}
2097
2098static inline void
2099unpack_float_rgb_float32(const void *void_src, GLfloat dst[4])
2100{
2101   float *src = (float *)void_src;
2102            float r = src[0];
2103            float g = src[1];
2104            float b = src[2];
2105
2106
2107
2108               dst[0] = r;
2109
2110
2111               dst[1] = g;
2112
2113
2114               dst[2] = b;
2115
2116         dst[3] = 1.0f;
2117}
2118
2119static inline void
2120unpack_float_rgba_float16(const void *void_src, GLfloat dst[4])
2121{
2122   uint16_t *src = (uint16_t *)void_src;
2123            uint16_t r = src[0];
2124            uint16_t g = src[1];
2125            uint16_t b = src[2];
2126            uint16_t a = src[3];
2127
2128
2129
2130               dst[0] = _mesa_half_to_float(r);
2131
2132
2133               dst[1] = _mesa_half_to_float(g);
2134
2135
2136               dst[2] = _mesa_half_to_float(b);
2137
2138
2139               dst[3] = _mesa_half_to_float(a);
2140}
2141
2142static inline void
2143unpack_float_rgba_float32(const void *void_src, GLfloat dst[4])
2144{
2145   float *src = (float *)void_src;
2146            float r = src[0];
2147            float g = src[1];
2148            float b = src[2];
2149            float a = src[3];
2150
2151
2152
2153               dst[0] = r;
2154
2155
2156               dst[1] = g;
2157
2158
2159               dst[2] = b;
2160
2161
2162               dst[3] = a;
2163}
2164
2165static inline void
2166unpack_float_rgbx_float16(const void *void_src, GLfloat dst[4])
2167{
2168   uint16_t *src = (uint16_t *)void_src;
2169            uint16_t r = src[0];
2170            uint16_t g = src[1];
2171            uint16_t b = src[2];
2172
2173
2174
2175               dst[0] = _mesa_half_to_float(r);
2176
2177
2178               dst[1] = _mesa_half_to_float(g);
2179
2180
2181               dst[2] = _mesa_half_to_float(b);
2182
2183         dst[3] = 1.0f;
2184}
2185
2186static inline void
2187unpack_float_rgbx_float32(const void *void_src, GLfloat dst[4])
2188{
2189   float *src = (float *)void_src;
2190            float r = src[0];
2191            float g = src[1];
2192            float b = src[2];
2193
2194
2195
2196               dst[0] = r;
2197
2198
2199               dst[1] = g;
2200
2201
2202               dst[2] = b;
2203
2204         dst[3] = 1.0f;
2205}
2206
2207static void
2208unpack_float_r9g9b9e5_float(const void *src, GLfloat dst[4])
2209{
2210   rgb9e5_to_float3(*(const GLuint *)src, dst);
2211   dst[3] = 1.0f;
2212}
2213
2214static void
2215unpack_float_r11g11b10_float(const void *src, GLfloat dst[4])
2216{
2217   r11g11b10f_to_float3(*(const GLuint *)src, dst);
2218   dst[3] = 1.0f;
2219}
2220
2221static void
2222unpack_float_ycbcr(const void *src, GLfloat dst[][4], GLuint n)
2223{
2224   GLuint i;
2225   for (i = 0; i < n; i++) {
2226      const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
2227      const GLushort *src1 = src0 + 1;         /* odd */
2228      const GLubyte y0 = (*src0 >> 8) & 0xff;  /* luminance */
2229      const GLubyte cb = *src0 & 0xff;         /* chroma U */
2230      const GLubyte y1 = (*src1 >> 8) & 0xff;  /* luminance */
2231      const GLubyte cr = *src1 & 0xff;         /* chroma V */
2232      const GLubyte y = (i & 1) ? y1 : y0;     /* choose even/odd luminance */
2233      GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
2234      GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
2235      GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
2236      r *= (1.0F / 255.0F);
2237      g *= (1.0F / 255.0F);
2238      b *= (1.0F / 255.0F);
2239      dst[i][0] = CLAMP(r, 0.0F, 1.0F);
2240      dst[i][1] = CLAMP(g, 0.0F, 1.0F);
2241      dst[i][2] = CLAMP(b, 0.0F, 1.0F);
2242      dst[i][3] = 1.0F;
2243   }
2244}
2245
2246static void
2247unpack_float_ycbcr_rev(const void *src, GLfloat dst[][4], GLuint n)
2248{
2249   GLuint i;
2250   for (i = 0; i < n; i++) {
2251      const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
2252      const GLushort *src1 = src0 + 1;         /* odd */
2253      const GLubyte y0 = *src0 & 0xff;         /* luminance */
2254      const GLubyte cr = (*src0 >> 8) & 0xff;  /* chroma V */
2255      const GLubyte y1 = *src1 & 0xff;         /* luminance */
2256      const GLubyte cb = (*src1 >> 8) & 0xff;  /* chroma U */
2257      const GLubyte y = (i & 1) ? y1 : y0;     /* choose even/odd luminance */
2258      GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
2259      GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
2260      GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
2261      r *= (1.0F / 255.0F);
2262      g *= (1.0F / 255.0F);
2263      b *= (1.0F / 255.0F);
2264      dst[i][0] = CLAMP(r, 0.0F, 1.0F);
2265      dst[i][1] = CLAMP(g, 0.0F, 1.0F);
2266      dst[i][2] = CLAMP(b, 0.0F, 1.0F);
2267      dst[i][3] = 1.0F;
2268   }
2269}
2270
2271/* ubyte packing functions */
2272
2273
2274static inline void
2275unpack_ubyte_a8b8g8r8_unorm(const void *void_src, GLubyte dst[4])
2276{
2277   uint32_t *src = (uint32_t *)void_src;
2278            uint8_t a = UNPACK(*src, 0, 8);
2279            uint8_t b = UNPACK(*src, 8, 8);
2280            uint8_t g = UNPACK(*src, 16, 8);
2281            uint8_t r = UNPACK(*src, 24, 8);
2282
2283
2284
2285               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
2286
2287
2288               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
2289
2290
2291               dst[2] = _mesa_unorm_to_unorm(b, 8, 8);
2292
2293
2294               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
2295}
2296
2297static inline void
2298unpack_ubyte_x8b8g8r8_unorm(const void *void_src, GLubyte dst[4])
2299{
2300   uint32_t *src = (uint32_t *)void_src;
2301            uint8_t b = UNPACK(*src, 8, 8);
2302            uint8_t g = UNPACK(*src, 16, 8);
2303            uint8_t r = UNPACK(*src, 24, 8);
2304
2305
2306
2307               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
2308
2309
2310               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
2311
2312
2313               dst[2] = _mesa_unorm_to_unorm(b, 8, 8);
2314
2315         dst[3] = 255;
2316}
2317
2318static inline void
2319unpack_ubyte_r8g8b8a8_unorm(const void *void_src, GLubyte dst[4])
2320{
2321   uint32_t *src = (uint32_t *)void_src;
2322            uint8_t r = UNPACK(*src, 0, 8);
2323            uint8_t g = UNPACK(*src, 8, 8);
2324            uint8_t b = UNPACK(*src, 16, 8);
2325            uint8_t a = UNPACK(*src, 24, 8);
2326
2327
2328
2329               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
2330
2331
2332               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
2333
2334
2335               dst[2] = _mesa_unorm_to_unorm(b, 8, 8);
2336
2337
2338               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
2339}
2340
2341static inline void
2342unpack_ubyte_r8g8b8x8_unorm(const void *void_src, GLubyte dst[4])
2343{
2344   uint32_t *src = (uint32_t *)void_src;
2345            uint8_t r = UNPACK(*src, 0, 8);
2346            uint8_t g = UNPACK(*src, 8, 8);
2347            uint8_t b = UNPACK(*src, 16, 8);
2348
2349
2350
2351               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
2352
2353
2354               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
2355
2356
2357               dst[2] = _mesa_unorm_to_unorm(b, 8, 8);
2358
2359         dst[3] = 255;
2360}
2361
2362static inline void
2363unpack_ubyte_b8g8r8a8_unorm(const void *void_src, GLubyte dst[4])
2364{
2365   uint32_t *src = (uint32_t *)void_src;
2366            uint8_t b = UNPACK(*src, 0, 8);
2367            uint8_t g = UNPACK(*src, 8, 8);
2368            uint8_t r = UNPACK(*src, 16, 8);
2369            uint8_t a = UNPACK(*src, 24, 8);
2370
2371
2372
2373               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
2374
2375
2376               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
2377
2378
2379               dst[2] = _mesa_unorm_to_unorm(b, 8, 8);
2380
2381
2382               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
2383}
2384
2385static inline void
2386unpack_ubyte_b8g8r8x8_unorm(const void *void_src, GLubyte dst[4])
2387{
2388   uint32_t *src = (uint32_t *)void_src;
2389            uint8_t b = UNPACK(*src, 0, 8);
2390            uint8_t g = UNPACK(*src, 8, 8);
2391            uint8_t r = UNPACK(*src, 16, 8);
2392
2393
2394
2395               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
2396
2397
2398               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
2399
2400
2401               dst[2] = _mesa_unorm_to_unorm(b, 8, 8);
2402
2403         dst[3] = 255;
2404}
2405
2406static inline void
2407unpack_ubyte_a8r8g8b8_unorm(const void *void_src, GLubyte dst[4])
2408{
2409   uint32_t *src = (uint32_t *)void_src;
2410            uint8_t a = UNPACK(*src, 0, 8);
2411            uint8_t r = UNPACK(*src, 8, 8);
2412            uint8_t g = UNPACK(*src, 16, 8);
2413            uint8_t b = UNPACK(*src, 24, 8);
2414
2415
2416
2417               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
2418
2419
2420               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
2421
2422
2423               dst[2] = _mesa_unorm_to_unorm(b, 8, 8);
2424
2425
2426               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
2427}
2428
2429static inline void
2430unpack_ubyte_x8r8g8b8_unorm(const void *void_src, GLubyte dst[4])
2431{
2432   uint32_t *src = (uint32_t *)void_src;
2433            uint8_t r = UNPACK(*src, 8, 8);
2434            uint8_t g = UNPACK(*src, 16, 8);
2435            uint8_t b = UNPACK(*src, 24, 8);
2436
2437
2438
2439               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
2440
2441
2442               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
2443
2444
2445               dst[2] = _mesa_unorm_to_unorm(b, 8, 8);
2446
2447         dst[3] = 255;
2448}
2449
2450static inline void
2451unpack_ubyte_l16a16_unorm(const void *void_src, GLubyte dst[4])
2452{
2453   uint32_t *src = (uint32_t *)void_src;
2454            uint16_t l = UNPACK(*src, 0, 16);
2455            uint16_t a = UNPACK(*src, 16, 16);
2456
2457
2458
2459               dst[0] = _mesa_unorm_to_unorm(l, 16, 8);
2460
2461
2462               dst[1] = _mesa_unorm_to_unorm(l, 16, 8);
2463
2464
2465               dst[2] = _mesa_unorm_to_unorm(l, 16, 8);
2466
2467
2468               dst[3] = _mesa_unorm_to_unorm(a, 16, 8);
2469}
2470
2471static inline void
2472unpack_ubyte_a16l16_unorm(const void *void_src, GLubyte dst[4])
2473{
2474   uint32_t *src = (uint32_t *)void_src;
2475            uint16_t a = UNPACK(*src, 0, 16);
2476            uint16_t l = UNPACK(*src, 16, 16);
2477
2478
2479
2480               dst[0] = _mesa_unorm_to_unorm(l, 16, 8);
2481
2482
2483               dst[1] = _mesa_unorm_to_unorm(l, 16, 8);
2484
2485
2486               dst[2] = _mesa_unorm_to_unorm(l, 16, 8);
2487
2488
2489               dst[3] = _mesa_unorm_to_unorm(a, 16, 8);
2490}
2491
2492static inline void
2493unpack_ubyte_b5g6r5_unorm(const void *void_src, GLubyte dst[4])
2494{
2495   uint16_t *src = (uint16_t *)void_src;
2496            uint8_t b = UNPACK(*src, 0, 5);
2497            uint8_t g = UNPACK(*src, 5, 6);
2498            uint8_t r = UNPACK(*src, 11, 5);
2499
2500
2501
2502               dst[0] = _mesa_unorm_to_unorm(r, 5, 8);
2503
2504
2505               dst[1] = _mesa_unorm_to_unorm(g, 6, 8);
2506
2507
2508               dst[2] = _mesa_unorm_to_unorm(b, 5, 8);
2509
2510         dst[3] = 255;
2511}
2512
2513static inline void
2514unpack_ubyte_r5g6b5_unorm(const void *void_src, GLubyte dst[4])
2515{
2516   uint16_t *src = (uint16_t *)void_src;
2517            uint8_t r = UNPACK(*src, 0, 5);
2518            uint8_t g = UNPACK(*src, 5, 6);
2519            uint8_t b = UNPACK(*src, 11, 5);
2520
2521
2522
2523               dst[0] = _mesa_unorm_to_unorm(r, 5, 8);
2524
2525
2526               dst[1] = _mesa_unorm_to_unorm(g, 6, 8);
2527
2528
2529               dst[2] = _mesa_unorm_to_unorm(b, 5, 8);
2530
2531         dst[3] = 255;
2532}
2533
2534static inline void
2535unpack_ubyte_b4g4r4a4_unorm(const void *void_src, GLubyte dst[4])
2536{
2537   uint16_t *src = (uint16_t *)void_src;
2538            uint8_t b = UNPACK(*src, 0, 4);
2539            uint8_t g = UNPACK(*src, 4, 4);
2540            uint8_t r = UNPACK(*src, 8, 4);
2541            uint8_t a = UNPACK(*src, 12, 4);
2542
2543
2544
2545               dst[0] = _mesa_unorm_to_unorm(r, 4, 8);
2546
2547
2548               dst[1] = _mesa_unorm_to_unorm(g, 4, 8);
2549
2550
2551               dst[2] = _mesa_unorm_to_unorm(b, 4, 8);
2552
2553
2554               dst[3] = _mesa_unorm_to_unorm(a, 4, 8);
2555}
2556
2557static inline void
2558unpack_ubyte_b4g4r4x4_unorm(const void *void_src, GLubyte dst[4])
2559{
2560   uint16_t *src = (uint16_t *)void_src;
2561            uint8_t b = UNPACK(*src, 0, 4);
2562            uint8_t g = UNPACK(*src, 4, 4);
2563            uint8_t r = UNPACK(*src, 8, 4);
2564
2565
2566
2567               dst[0] = _mesa_unorm_to_unorm(r, 4, 8);
2568
2569
2570               dst[1] = _mesa_unorm_to_unorm(g, 4, 8);
2571
2572
2573               dst[2] = _mesa_unorm_to_unorm(b, 4, 8);
2574
2575         dst[3] = 255;
2576}
2577
2578static inline void
2579unpack_ubyte_a4r4g4b4_unorm(const void *void_src, GLubyte dst[4])
2580{
2581   uint16_t *src = (uint16_t *)void_src;
2582            uint8_t a = UNPACK(*src, 0, 4);
2583            uint8_t r = UNPACK(*src, 4, 4);
2584            uint8_t g = UNPACK(*src, 8, 4);
2585            uint8_t b = UNPACK(*src, 12, 4);
2586
2587
2588
2589               dst[0] = _mesa_unorm_to_unorm(r, 4, 8);
2590
2591
2592               dst[1] = _mesa_unorm_to_unorm(g, 4, 8);
2593
2594
2595               dst[2] = _mesa_unorm_to_unorm(b, 4, 8);
2596
2597
2598               dst[3] = _mesa_unorm_to_unorm(a, 4, 8);
2599}
2600
2601static inline void
2602unpack_ubyte_a1b5g5r5_unorm(const void *void_src, GLubyte dst[4])
2603{
2604   uint16_t *src = (uint16_t *)void_src;
2605            uint8_t a = UNPACK(*src, 0, 1);
2606            uint8_t b = UNPACK(*src, 1, 5);
2607            uint8_t g = UNPACK(*src, 6, 5);
2608            uint8_t r = UNPACK(*src, 11, 5);
2609
2610
2611
2612               dst[0] = _mesa_unorm_to_unorm(r, 5, 8);
2613
2614
2615               dst[1] = _mesa_unorm_to_unorm(g, 5, 8);
2616
2617
2618               dst[2] = _mesa_unorm_to_unorm(b, 5, 8);
2619
2620
2621               dst[3] = _mesa_unorm_to_unorm(a, 1, 8);
2622}
2623
2624static inline void
2625unpack_ubyte_x1b5g5r5_unorm(const void *void_src, GLubyte dst[4])
2626{
2627   uint16_t *src = (uint16_t *)void_src;
2628            uint8_t b = UNPACK(*src, 1, 5);
2629            uint8_t g = UNPACK(*src, 6, 5);
2630            uint8_t r = UNPACK(*src, 11, 5);
2631
2632
2633
2634               dst[0] = _mesa_unorm_to_unorm(r, 5, 8);
2635
2636
2637               dst[1] = _mesa_unorm_to_unorm(g, 5, 8);
2638
2639
2640               dst[2] = _mesa_unorm_to_unorm(b, 5, 8);
2641
2642         dst[3] = 255;
2643}
2644
2645static inline void
2646unpack_ubyte_b5g5r5a1_unorm(const void *void_src, GLubyte dst[4])
2647{
2648   uint16_t *src = (uint16_t *)void_src;
2649            uint8_t b = UNPACK(*src, 0, 5);
2650            uint8_t g = UNPACK(*src, 5, 5);
2651            uint8_t r = UNPACK(*src, 10, 5);
2652            uint8_t a = UNPACK(*src, 15, 1);
2653
2654
2655
2656               dst[0] = _mesa_unorm_to_unorm(r, 5, 8);
2657
2658
2659               dst[1] = _mesa_unorm_to_unorm(g, 5, 8);
2660
2661
2662               dst[2] = _mesa_unorm_to_unorm(b, 5, 8);
2663
2664
2665               dst[3] = _mesa_unorm_to_unorm(a, 1, 8);
2666}
2667
2668static inline void
2669unpack_ubyte_b5g5r5x1_unorm(const void *void_src, GLubyte dst[4])
2670{
2671   uint16_t *src = (uint16_t *)void_src;
2672            uint8_t b = UNPACK(*src, 0, 5);
2673            uint8_t g = UNPACK(*src, 5, 5);
2674            uint8_t r = UNPACK(*src, 10, 5);
2675
2676
2677
2678               dst[0] = _mesa_unorm_to_unorm(r, 5, 8);
2679
2680
2681               dst[1] = _mesa_unorm_to_unorm(g, 5, 8);
2682
2683
2684               dst[2] = _mesa_unorm_to_unorm(b, 5, 8);
2685
2686         dst[3] = 255;
2687}
2688
2689static inline void
2690unpack_ubyte_a1r5g5b5_unorm(const void *void_src, GLubyte dst[4])
2691{
2692   uint16_t *src = (uint16_t *)void_src;
2693            uint8_t a = UNPACK(*src, 0, 1);
2694            uint8_t r = UNPACK(*src, 1, 5);
2695            uint8_t g = UNPACK(*src, 6, 5);
2696            uint8_t b = UNPACK(*src, 11, 5);
2697
2698
2699
2700               dst[0] = _mesa_unorm_to_unorm(r, 5, 8);
2701
2702
2703               dst[1] = _mesa_unorm_to_unorm(g, 5, 8);
2704
2705
2706               dst[2] = _mesa_unorm_to_unorm(b, 5, 8);
2707
2708
2709               dst[3] = _mesa_unorm_to_unorm(a, 1, 8);
2710}
2711
2712static inline void
2713unpack_ubyte_l8a8_unorm(const void *void_src, GLubyte dst[4])
2714{
2715   uint16_t *src = (uint16_t *)void_src;
2716            uint8_t l = UNPACK(*src, 0, 8);
2717            uint8_t a = UNPACK(*src, 8, 8);
2718
2719
2720
2721               dst[0] = _mesa_unorm_to_unorm(l, 8, 8);
2722
2723
2724               dst[1] = _mesa_unorm_to_unorm(l, 8, 8);
2725
2726
2727               dst[2] = _mesa_unorm_to_unorm(l, 8, 8);
2728
2729
2730               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
2731}
2732
2733static inline void
2734unpack_ubyte_a8l8_unorm(const void *void_src, GLubyte dst[4])
2735{
2736   uint16_t *src = (uint16_t *)void_src;
2737            uint8_t a = UNPACK(*src, 0, 8);
2738            uint8_t l = UNPACK(*src, 8, 8);
2739
2740
2741
2742               dst[0] = _mesa_unorm_to_unorm(l, 8, 8);
2743
2744
2745               dst[1] = _mesa_unorm_to_unorm(l, 8, 8);
2746
2747
2748               dst[2] = _mesa_unorm_to_unorm(l, 8, 8);
2749
2750
2751               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
2752}
2753
2754static inline void
2755unpack_ubyte_r8g8_unorm(const void *void_src, GLubyte dst[4])
2756{
2757   uint16_t *src = (uint16_t *)void_src;
2758            uint8_t r = UNPACK(*src, 0, 8);
2759            uint8_t g = UNPACK(*src, 8, 8);
2760
2761
2762
2763               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
2764
2765
2766               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
2767
2768         dst[2] = 0;
2769
2770         dst[3] = 255;
2771}
2772
2773static inline void
2774unpack_ubyte_g8r8_unorm(const void *void_src, GLubyte dst[4])
2775{
2776   uint16_t *src = (uint16_t *)void_src;
2777            uint8_t g = UNPACK(*src, 0, 8);
2778            uint8_t r = UNPACK(*src, 8, 8);
2779
2780
2781
2782               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
2783
2784
2785               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
2786
2787         dst[2] = 0;
2788
2789         dst[3] = 255;
2790}
2791
2792static inline void
2793unpack_ubyte_l4a4_unorm(const void *void_src, GLubyte dst[4])
2794{
2795   uint8_t *src = (uint8_t *)void_src;
2796            uint8_t l = UNPACK(*src, 0, 4);
2797            uint8_t a = UNPACK(*src, 4, 4);
2798
2799
2800
2801               dst[0] = _mesa_unorm_to_unorm(l, 4, 8);
2802
2803
2804               dst[1] = _mesa_unorm_to_unorm(l, 4, 8);
2805
2806
2807               dst[2] = _mesa_unorm_to_unorm(l, 4, 8);
2808
2809
2810               dst[3] = _mesa_unorm_to_unorm(a, 4, 8);
2811}
2812
2813static inline void
2814unpack_ubyte_b2g3r3_unorm(const void *void_src, GLubyte dst[4])
2815{
2816   uint8_t *src = (uint8_t *)void_src;
2817            uint8_t b = UNPACK(*src, 0, 2);
2818            uint8_t g = UNPACK(*src, 2, 3);
2819            uint8_t r = UNPACK(*src, 5, 3);
2820
2821
2822
2823               dst[0] = _mesa_unorm_to_unorm(r, 3, 8);
2824
2825
2826               dst[1] = _mesa_unorm_to_unorm(g, 3, 8);
2827
2828
2829               dst[2] = _mesa_unorm_to_unorm(b, 2, 8);
2830
2831         dst[3] = 255;
2832}
2833
2834static inline void
2835unpack_ubyte_r16g16_unorm(const void *void_src, GLubyte dst[4])
2836{
2837   uint32_t *src = (uint32_t *)void_src;
2838            uint16_t r = UNPACK(*src, 0, 16);
2839            uint16_t g = UNPACK(*src, 16, 16);
2840
2841
2842
2843               dst[0] = _mesa_unorm_to_unorm(r, 16, 8);
2844
2845
2846               dst[1] = _mesa_unorm_to_unorm(g, 16, 8);
2847
2848         dst[2] = 0;
2849
2850         dst[3] = 255;
2851}
2852
2853static inline void
2854unpack_ubyte_g16r16_unorm(const void *void_src, GLubyte dst[4])
2855{
2856   uint32_t *src = (uint32_t *)void_src;
2857            uint16_t g = UNPACK(*src, 0, 16);
2858            uint16_t r = UNPACK(*src, 16, 16);
2859
2860
2861
2862               dst[0] = _mesa_unorm_to_unorm(r, 16, 8);
2863
2864
2865               dst[1] = _mesa_unorm_to_unorm(g, 16, 8);
2866
2867         dst[2] = 0;
2868
2869         dst[3] = 255;
2870}
2871
2872static inline void
2873unpack_ubyte_b10g10r10a2_unorm(const void *void_src, GLubyte dst[4])
2874{
2875   uint32_t *src = (uint32_t *)void_src;
2876            uint16_t b = UNPACK(*src, 0, 10);
2877            uint16_t g = UNPACK(*src, 10, 10);
2878            uint16_t r = UNPACK(*src, 20, 10);
2879            uint8_t a = UNPACK(*src, 30, 2);
2880
2881
2882
2883               dst[0] = _mesa_unorm_to_unorm(r, 10, 8);
2884
2885
2886               dst[1] = _mesa_unorm_to_unorm(g, 10, 8);
2887
2888
2889               dst[2] = _mesa_unorm_to_unorm(b, 10, 8);
2890
2891
2892               dst[3] = _mesa_unorm_to_unorm(a, 2, 8);
2893}
2894
2895static inline void
2896unpack_ubyte_b10g10r10x2_unorm(const void *void_src, GLubyte dst[4])
2897{
2898   uint32_t *src = (uint32_t *)void_src;
2899            uint16_t b = UNPACK(*src, 0, 10);
2900            uint16_t g = UNPACK(*src, 10, 10);
2901            uint16_t r = UNPACK(*src, 20, 10);
2902
2903
2904
2905               dst[0] = _mesa_unorm_to_unorm(r, 10, 8);
2906
2907
2908               dst[1] = _mesa_unorm_to_unorm(g, 10, 8);
2909
2910
2911               dst[2] = _mesa_unorm_to_unorm(b, 10, 8);
2912
2913         dst[3] = 255;
2914}
2915
2916static inline void
2917unpack_ubyte_r10g10b10a2_unorm(const void *void_src, GLubyte dst[4])
2918{
2919   uint32_t *src = (uint32_t *)void_src;
2920            uint16_t r = UNPACK(*src, 0, 10);
2921            uint16_t g = UNPACK(*src, 10, 10);
2922            uint16_t b = UNPACK(*src, 20, 10);
2923            uint8_t a = UNPACK(*src, 30, 2);
2924
2925
2926
2927               dst[0] = _mesa_unorm_to_unorm(r, 10, 8);
2928
2929
2930               dst[1] = _mesa_unorm_to_unorm(g, 10, 8);
2931
2932
2933               dst[2] = _mesa_unorm_to_unorm(b, 10, 8);
2934
2935
2936               dst[3] = _mesa_unorm_to_unorm(a, 2, 8);
2937}
2938
2939static inline void
2940unpack_ubyte_r10g10b10x2_unorm(const void *void_src, GLubyte dst[4])
2941{
2942   uint32_t *src = (uint32_t *)void_src;
2943            uint16_t r = UNPACK(*src, 0, 10);
2944            uint16_t g = UNPACK(*src, 10, 10);
2945            uint16_t b = UNPACK(*src, 20, 10);
2946
2947
2948
2949               dst[0] = _mesa_unorm_to_unorm(r, 10, 8);
2950
2951
2952               dst[1] = _mesa_unorm_to_unorm(g, 10, 8);
2953
2954
2955               dst[2] = _mesa_unorm_to_unorm(b, 10, 8);
2956
2957         dst[3] = 255;
2958}
2959
2960static inline void
2961unpack_ubyte_r3g3b2_unorm(const void *void_src, GLubyte dst[4])
2962{
2963   uint8_t *src = (uint8_t *)void_src;
2964            uint8_t r = UNPACK(*src, 0, 3);
2965            uint8_t g = UNPACK(*src, 3, 3);
2966            uint8_t b = UNPACK(*src, 6, 2);
2967
2968
2969
2970               dst[0] = _mesa_unorm_to_unorm(r, 3, 8);
2971
2972
2973               dst[1] = _mesa_unorm_to_unorm(g, 3, 8);
2974
2975
2976               dst[2] = _mesa_unorm_to_unorm(b, 2, 8);
2977
2978         dst[3] = 255;
2979}
2980
2981static inline void
2982unpack_ubyte_a4b4g4r4_unorm(const void *void_src, GLubyte dst[4])
2983{
2984   uint16_t *src = (uint16_t *)void_src;
2985            uint8_t a = UNPACK(*src, 0, 4);
2986            uint8_t b = UNPACK(*src, 4, 4);
2987            uint8_t g = UNPACK(*src, 8, 4);
2988            uint8_t r = UNPACK(*src, 12, 4);
2989
2990
2991
2992               dst[0] = _mesa_unorm_to_unorm(r, 4, 8);
2993
2994
2995               dst[1] = _mesa_unorm_to_unorm(g, 4, 8);
2996
2997
2998               dst[2] = _mesa_unorm_to_unorm(b, 4, 8);
2999
3000
3001               dst[3] = _mesa_unorm_to_unorm(a, 4, 8);
3002}
3003
3004static inline void
3005unpack_ubyte_r4g4b4a4_unorm(const void *void_src, GLubyte dst[4])
3006{
3007   uint16_t *src = (uint16_t *)void_src;
3008            uint8_t r = UNPACK(*src, 0, 4);
3009            uint8_t g = UNPACK(*src, 4, 4);
3010            uint8_t b = UNPACK(*src, 8, 4);
3011            uint8_t a = UNPACK(*src, 12, 4);
3012
3013
3014
3015               dst[0] = _mesa_unorm_to_unorm(r, 4, 8);
3016
3017
3018               dst[1] = _mesa_unorm_to_unorm(g, 4, 8);
3019
3020
3021               dst[2] = _mesa_unorm_to_unorm(b, 4, 8);
3022
3023
3024               dst[3] = _mesa_unorm_to_unorm(a, 4, 8);
3025}
3026
3027static inline void
3028unpack_ubyte_r5g5b5a1_unorm(const void *void_src, GLubyte dst[4])
3029{
3030   uint16_t *src = (uint16_t *)void_src;
3031            uint8_t r = UNPACK(*src, 0, 5);
3032            uint8_t g = UNPACK(*src, 5, 5);
3033            uint8_t b = UNPACK(*src, 10, 5);
3034            uint8_t a = UNPACK(*src, 15, 1);
3035
3036
3037
3038               dst[0] = _mesa_unorm_to_unorm(r, 5, 8);
3039
3040
3041               dst[1] = _mesa_unorm_to_unorm(g, 5, 8);
3042
3043
3044               dst[2] = _mesa_unorm_to_unorm(b, 5, 8);
3045
3046
3047               dst[3] = _mesa_unorm_to_unorm(a, 1, 8);
3048}
3049
3050static inline void
3051unpack_ubyte_a2b10g10r10_unorm(const void *void_src, GLubyte dst[4])
3052{
3053   uint32_t *src = (uint32_t *)void_src;
3054            uint8_t a = UNPACK(*src, 0, 2);
3055            uint16_t b = UNPACK(*src, 2, 10);
3056            uint16_t g = UNPACK(*src, 12, 10);
3057            uint16_t r = UNPACK(*src, 22, 10);
3058
3059
3060
3061               dst[0] = _mesa_unorm_to_unorm(r, 10, 8);
3062
3063
3064               dst[1] = _mesa_unorm_to_unorm(g, 10, 8);
3065
3066
3067               dst[2] = _mesa_unorm_to_unorm(b, 10, 8);
3068
3069
3070               dst[3] = _mesa_unorm_to_unorm(a, 2, 8);
3071}
3072
3073static inline void
3074unpack_ubyte_a2r10g10b10_unorm(const void *void_src, GLubyte dst[4])
3075{
3076   uint32_t *src = (uint32_t *)void_src;
3077            uint8_t a = UNPACK(*src, 0, 2);
3078            uint16_t r = UNPACK(*src, 2, 10);
3079            uint16_t g = UNPACK(*src, 12, 10);
3080            uint16_t b = UNPACK(*src, 22, 10);
3081
3082
3083
3084               dst[0] = _mesa_unorm_to_unorm(r, 10, 8);
3085
3086
3087               dst[1] = _mesa_unorm_to_unorm(g, 10, 8);
3088
3089
3090               dst[2] = _mesa_unorm_to_unorm(b, 10, 8);
3091
3092
3093               dst[3] = _mesa_unorm_to_unorm(a, 2, 8);
3094}
3095
3096static inline void
3097unpack_ubyte_a_unorm8(const void *void_src, GLubyte dst[4])
3098{
3099   uint8_t *src = (uint8_t *)void_src;
3100            uint8_t a = src[0];
3101
3102
3103         dst[0] = 0;
3104
3105         dst[1] = 0;
3106
3107         dst[2] = 0;
3108
3109
3110               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
3111}
3112
3113static inline void
3114unpack_ubyte_a_unorm16(const void *void_src, GLubyte dst[4])
3115{
3116   uint16_t *src = (uint16_t *)void_src;
3117            uint16_t a = src[0];
3118
3119
3120         dst[0] = 0;
3121
3122         dst[1] = 0;
3123
3124         dst[2] = 0;
3125
3126
3127               dst[3] = _mesa_unorm_to_unorm(a, 16, 8);
3128}
3129
3130static inline void
3131unpack_ubyte_l_unorm8(const void *void_src, GLubyte dst[4])
3132{
3133   uint8_t *src = (uint8_t *)void_src;
3134            uint8_t l = src[0];
3135
3136
3137
3138               dst[0] = _mesa_unorm_to_unorm(l, 8, 8);
3139
3140
3141               dst[1] = _mesa_unorm_to_unorm(l, 8, 8);
3142
3143
3144               dst[2] = _mesa_unorm_to_unorm(l, 8, 8);
3145
3146         dst[3] = 255;
3147}
3148
3149static inline void
3150unpack_ubyte_l_unorm16(const void *void_src, GLubyte dst[4])
3151{
3152   uint16_t *src = (uint16_t *)void_src;
3153            uint16_t l = src[0];
3154
3155
3156
3157               dst[0] = _mesa_unorm_to_unorm(l, 16, 8);
3158
3159
3160               dst[1] = _mesa_unorm_to_unorm(l, 16, 8);
3161
3162
3163               dst[2] = _mesa_unorm_to_unorm(l, 16, 8);
3164
3165         dst[3] = 255;
3166}
3167
3168static inline void
3169unpack_ubyte_i_unorm8(const void *void_src, GLubyte dst[4])
3170{
3171   uint8_t *src = (uint8_t *)void_src;
3172            uint8_t i = src[0];
3173
3174
3175
3176               dst[0] = _mesa_unorm_to_unorm(i, 8, 8);
3177
3178
3179               dst[1] = _mesa_unorm_to_unorm(i, 8, 8);
3180
3181
3182               dst[2] = _mesa_unorm_to_unorm(i, 8, 8);
3183
3184
3185               dst[3] = _mesa_unorm_to_unorm(i, 8, 8);
3186}
3187
3188static inline void
3189unpack_ubyte_i_unorm16(const void *void_src, GLubyte dst[4])
3190{
3191   uint16_t *src = (uint16_t *)void_src;
3192            uint16_t i = src[0];
3193
3194
3195
3196               dst[0] = _mesa_unorm_to_unorm(i, 16, 8);
3197
3198
3199               dst[1] = _mesa_unorm_to_unorm(i, 16, 8);
3200
3201
3202               dst[2] = _mesa_unorm_to_unorm(i, 16, 8);
3203
3204
3205               dst[3] = _mesa_unorm_to_unorm(i, 16, 8);
3206}
3207
3208static inline void
3209unpack_ubyte_r_unorm8(const void *void_src, GLubyte dst[4])
3210{
3211   uint8_t *src = (uint8_t *)void_src;
3212            uint8_t r = src[0];
3213
3214
3215
3216               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
3217
3218         dst[1] = 0;
3219
3220         dst[2] = 0;
3221
3222         dst[3] = 255;
3223}
3224
3225static inline void
3226unpack_ubyte_r_unorm16(const void *void_src, GLubyte dst[4])
3227{
3228   uint16_t *src = (uint16_t *)void_src;
3229            uint16_t r = src[0];
3230
3231
3232
3233               dst[0] = _mesa_unorm_to_unorm(r, 16, 8);
3234
3235         dst[1] = 0;
3236
3237         dst[2] = 0;
3238
3239         dst[3] = 255;
3240}
3241
3242static inline void
3243unpack_ubyte_bgr_unorm8(const void *void_src, GLubyte dst[4])
3244{
3245   uint8_t *src = (uint8_t *)void_src;
3246            uint8_t b = src[0];
3247            uint8_t g = src[1];
3248            uint8_t r = src[2];
3249
3250
3251
3252               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
3253
3254
3255               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
3256
3257
3258               dst[2] = _mesa_unorm_to_unorm(b, 8, 8);
3259
3260         dst[3] = 255;
3261}
3262
3263static inline void
3264unpack_ubyte_rgb_unorm8(const void *void_src, GLubyte dst[4])
3265{
3266   uint8_t *src = (uint8_t *)void_src;
3267            uint8_t r = src[0];
3268            uint8_t g = src[1];
3269            uint8_t b = src[2];
3270
3271
3272
3273               dst[0] = _mesa_unorm_to_unorm(r, 8, 8);
3274
3275
3276               dst[1] = _mesa_unorm_to_unorm(g, 8, 8);
3277
3278
3279               dst[2] = _mesa_unorm_to_unorm(b, 8, 8);
3280
3281         dst[3] = 255;
3282}
3283
3284static inline void
3285unpack_ubyte_rgba_unorm16(const void *void_src, GLubyte dst[4])
3286{
3287   uint16_t *src = (uint16_t *)void_src;
3288            uint16_t r = src[0];
3289            uint16_t g = src[1];
3290            uint16_t b = src[2];
3291            uint16_t a = src[3];
3292
3293
3294
3295               dst[0] = _mesa_unorm_to_unorm(r, 16, 8);
3296
3297
3298               dst[1] = _mesa_unorm_to_unorm(g, 16, 8);
3299
3300
3301               dst[2] = _mesa_unorm_to_unorm(b, 16, 8);
3302
3303
3304               dst[3] = _mesa_unorm_to_unorm(a, 16, 8);
3305}
3306
3307static inline void
3308unpack_ubyte_rgbx_unorm16(const void *void_src, GLubyte dst[4])
3309{
3310   uint16_t *src = (uint16_t *)void_src;
3311            uint16_t r = src[0];
3312            uint16_t g = src[1];
3313            uint16_t b = src[2];
3314
3315
3316
3317               dst[0] = _mesa_unorm_to_unorm(r, 16, 8);
3318
3319
3320               dst[1] = _mesa_unorm_to_unorm(g, 16, 8);
3321
3322
3323               dst[2] = _mesa_unorm_to_unorm(b, 16, 8);
3324
3325         dst[3] = 255;
3326}
3327
3328static inline void
3329unpack_ubyte_a8b8g8r8_snorm(const void *void_src, GLubyte dst[4])
3330{
3331   uint32_t *src = (uint32_t *)void_src;
3332            int8_t a = UNPACK(*src, 0, 8);
3333            int8_t b = UNPACK(*src, 8, 8);
3334            int8_t g = UNPACK(*src, 16, 8);
3335            int8_t r = UNPACK(*src, 24, 8);
3336
3337
3338
3339            dst[0] = _mesa_snorm_to_unorm(r, 8, 8);
3340
3341
3342            dst[1] = _mesa_snorm_to_unorm(g, 8, 8);
3343
3344
3345            dst[2] = _mesa_snorm_to_unorm(b, 8, 8);
3346
3347
3348            dst[3] = _mesa_snorm_to_unorm(a, 8, 8);
3349}
3350
3351static inline void
3352unpack_ubyte_x8b8g8r8_snorm(const void *void_src, GLubyte dst[4])
3353{
3354   uint32_t *src = (uint32_t *)void_src;
3355            int8_t b = UNPACK(*src, 8, 8);
3356            int8_t g = UNPACK(*src, 16, 8);
3357            int8_t r = UNPACK(*src, 24, 8);
3358
3359
3360
3361            dst[0] = _mesa_snorm_to_unorm(r, 8, 8);
3362
3363
3364            dst[1] = _mesa_snorm_to_unorm(g, 8, 8);
3365
3366
3367            dst[2] = _mesa_snorm_to_unorm(b, 8, 8);
3368
3369         dst[3] = 255;
3370}
3371
3372static inline void
3373unpack_ubyte_r8g8b8a8_snorm(const void *void_src, GLubyte dst[4])
3374{
3375   uint32_t *src = (uint32_t *)void_src;
3376            int8_t r = UNPACK(*src, 0, 8);
3377            int8_t g = UNPACK(*src, 8, 8);
3378            int8_t b = UNPACK(*src, 16, 8);
3379            int8_t a = UNPACK(*src, 24, 8);
3380
3381
3382
3383            dst[0] = _mesa_snorm_to_unorm(r, 8, 8);
3384
3385
3386            dst[1] = _mesa_snorm_to_unorm(g, 8, 8);
3387
3388
3389            dst[2] = _mesa_snorm_to_unorm(b, 8, 8);
3390
3391
3392            dst[3] = _mesa_snorm_to_unorm(a, 8, 8);
3393}
3394
3395static inline void
3396unpack_ubyte_r8g8b8x8_snorm(const void *void_src, GLubyte dst[4])
3397{
3398   uint32_t *src = (uint32_t *)void_src;
3399            int8_t r = UNPACK(*src, 0, 8);
3400            int8_t g = UNPACK(*src, 8, 8);
3401            int8_t b = UNPACK(*src, 16, 8);
3402
3403
3404
3405            dst[0] = _mesa_snorm_to_unorm(r, 8, 8);
3406
3407
3408            dst[1] = _mesa_snorm_to_unorm(g, 8, 8);
3409
3410
3411            dst[2] = _mesa_snorm_to_unorm(b, 8, 8);
3412
3413         dst[3] = 255;
3414}
3415
3416static inline void
3417unpack_ubyte_r16g16_snorm(const void *void_src, GLubyte dst[4])
3418{
3419   uint32_t *src = (uint32_t *)void_src;
3420            int16_t r = UNPACK(*src, 0, 16);
3421            int16_t g = UNPACK(*src, 16, 16);
3422
3423
3424
3425            dst[0] = _mesa_snorm_to_unorm(r, 16, 8);
3426
3427
3428            dst[1] = _mesa_snorm_to_unorm(g, 16, 8);
3429
3430         dst[2] = 0;
3431
3432         dst[3] = 255;
3433}
3434
3435static inline void
3436unpack_ubyte_g16r16_snorm(const void *void_src, GLubyte dst[4])
3437{
3438   uint32_t *src = (uint32_t *)void_src;
3439            int16_t g = UNPACK(*src, 0, 16);
3440            int16_t r = UNPACK(*src, 16, 16);
3441
3442
3443
3444            dst[0] = _mesa_snorm_to_unorm(r, 16, 8);
3445
3446
3447            dst[1] = _mesa_snorm_to_unorm(g, 16, 8);
3448
3449         dst[2] = 0;
3450
3451         dst[3] = 255;
3452}
3453
3454static inline void
3455unpack_ubyte_r8g8_snorm(const void *void_src, GLubyte dst[4])
3456{
3457   uint16_t *src = (uint16_t *)void_src;
3458            int8_t r = UNPACK(*src, 0, 8);
3459            int8_t g = UNPACK(*src, 8, 8);
3460
3461
3462
3463            dst[0] = _mesa_snorm_to_unorm(r, 8, 8);
3464
3465
3466            dst[1] = _mesa_snorm_to_unorm(g, 8, 8);
3467
3468         dst[2] = 0;
3469
3470         dst[3] = 255;
3471}
3472
3473static inline void
3474unpack_ubyte_g8r8_snorm(const void *void_src, GLubyte dst[4])
3475{
3476   uint16_t *src = (uint16_t *)void_src;
3477            int8_t g = UNPACK(*src, 0, 8);
3478            int8_t r = UNPACK(*src, 8, 8);
3479
3480
3481
3482            dst[0] = _mesa_snorm_to_unorm(r, 8, 8);
3483
3484
3485            dst[1] = _mesa_snorm_to_unorm(g, 8, 8);
3486
3487         dst[2] = 0;
3488
3489         dst[3] = 255;
3490}
3491
3492static inline void
3493unpack_ubyte_l8a8_snorm(const void *void_src, GLubyte dst[4])
3494{
3495   uint16_t *src = (uint16_t *)void_src;
3496            int8_t l = UNPACK(*src, 0, 8);
3497            int8_t a = UNPACK(*src, 8, 8);
3498
3499
3500
3501            dst[0] = _mesa_snorm_to_unorm(l, 8, 8);
3502
3503
3504            dst[1] = _mesa_snorm_to_unorm(l, 8, 8);
3505
3506
3507            dst[2] = _mesa_snorm_to_unorm(l, 8, 8);
3508
3509
3510            dst[3] = _mesa_snorm_to_unorm(a, 8, 8);
3511}
3512
3513static inline void
3514unpack_ubyte_a8l8_snorm(const void *void_src, GLubyte dst[4])
3515{
3516   uint16_t *src = (uint16_t *)void_src;
3517            int8_t a = UNPACK(*src, 0, 8);
3518            int8_t l = UNPACK(*src, 8, 8);
3519
3520
3521
3522            dst[0] = _mesa_snorm_to_unorm(l, 8, 8);
3523
3524
3525            dst[1] = _mesa_snorm_to_unorm(l, 8, 8);
3526
3527
3528            dst[2] = _mesa_snorm_to_unorm(l, 8, 8);
3529
3530
3531            dst[3] = _mesa_snorm_to_unorm(a, 8, 8);
3532}
3533
3534static inline void
3535unpack_ubyte_a_snorm8(const void *void_src, GLubyte dst[4])
3536{
3537   int8_t *src = (int8_t *)void_src;
3538            int8_t a = src[0];
3539
3540
3541         dst[0] = 0;
3542
3543         dst[1] = 0;
3544
3545         dst[2] = 0;
3546
3547
3548            dst[3] = _mesa_snorm_to_unorm(a, 8, 8);
3549}
3550
3551static inline void
3552unpack_ubyte_a_snorm16(const void *void_src, GLubyte dst[4])
3553{
3554   int16_t *src = (int16_t *)void_src;
3555            int16_t a = src[0];
3556
3557
3558         dst[0] = 0;
3559
3560         dst[1] = 0;
3561
3562         dst[2] = 0;
3563
3564
3565            dst[3] = _mesa_snorm_to_unorm(a, 16, 8);
3566}
3567
3568static inline void
3569unpack_ubyte_l_snorm8(const void *void_src, GLubyte dst[4])
3570{
3571   int8_t *src = (int8_t *)void_src;
3572            int8_t l = src[0];
3573
3574
3575
3576            dst[0] = _mesa_snorm_to_unorm(l, 8, 8);
3577
3578
3579            dst[1] = _mesa_snorm_to_unorm(l, 8, 8);
3580
3581
3582            dst[2] = _mesa_snorm_to_unorm(l, 8, 8);
3583
3584         dst[3] = 255;
3585}
3586
3587static inline void
3588unpack_ubyte_l_snorm16(const void *void_src, GLubyte dst[4])
3589{
3590   int16_t *src = (int16_t *)void_src;
3591            int16_t l = src[0];
3592
3593
3594
3595            dst[0] = _mesa_snorm_to_unorm(l, 16, 8);
3596
3597
3598            dst[1] = _mesa_snorm_to_unorm(l, 16, 8);
3599
3600
3601            dst[2] = _mesa_snorm_to_unorm(l, 16, 8);
3602
3603         dst[3] = 255;
3604}
3605
3606static inline void
3607unpack_ubyte_i_snorm8(const void *void_src, GLubyte dst[4])
3608{
3609   int8_t *src = (int8_t *)void_src;
3610            int8_t i = src[0];
3611
3612
3613
3614            dst[0] = _mesa_snorm_to_unorm(i, 8, 8);
3615
3616
3617            dst[1] = _mesa_snorm_to_unorm(i, 8, 8);
3618
3619
3620            dst[2] = _mesa_snorm_to_unorm(i, 8, 8);
3621
3622
3623            dst[3] = _mesa_snorm_to_unorm(i, 8, 8);
3624}
3625
3626static inline void
3627unpack_ubyte_i_snorm16(const void *void_src, GLubyte dst[4])
3628{
3629   int16_t *src = (int16_t *)void_src;
3630            int16_t i = src[0];
3631
3632
3633
3634            dst[0] = _mesa_snorm_to_unorm(i, 16, 8);
3635
3636
3637            dst[1] = _mesa_snorm_to_unorm(i, 16, 8);
3638
3639
3640            dst[2] = _mesa_snorm_to_unorm(i, 16, 8);
3641
3642
3643            dst[3] = _mesa_snorm_to_unorm(i, 16, 8);
3644}
3645
3646static inline void
3647unpack_ubyte_r_snorm8(const void *void_src, GLubyte dst[4])
3648{
3649   int8_t *src = (int8_t *)void_src;
3650            int8_t r = src[0];
3651
3652
3653
3654            dst[0] = _mesa_snorm_to_unorm(r, 8, 8);
3655
3656         dst[1] = 0;
3657
3658         dst[2] = 0;
3659
3660         dst[3] = 255;
3661}
3662
3663static inline void
3664unpack_ubyte_r_snorm16(const void *void_src, GLubyte dst[4])
3665{
3666   int16_t *src = (int16_t *)void_src;
3667            int16_t r = src[0];
3668
3669
3670
3671            dst[0] = _mesa_snorm_to_unorm(r, 16, 8);
3672
3673         dst[1] = 0;
3674
3675         dst[2] = 0;
3676
3677         dst[3] = 255;
3678}
3679
3680static inline void
3681unpack_ubyte_la_snorm16(const void *void_src, GLubyte dst[4])
3682{
3683   int16_t *src = (int16_t *)void_src;
3684            int16_t l = src[0];
3685            int16_t a = src[1];
3686
3687
3688
3689            dst[0] = _mesa_snorm_to_unorm(l, 16, 8);
3690
3691
3692            dst[1] = _mesa_snorm_to_unorm(l, 16, 8);
3693
3694
3695            dst[2] = _mesa_snorm_to_unorm(l, 16, 8);
3696
3697
3698            dst[3] = _mesa_snorm_to_unorm(a, 16, 8);
3699}
3700
3701static inline void
3702unpack_ubyte_rgb_snorm16(const void *void_src, GLubyte dst[4])
3703{
3704   int16_t *src = (int16_t *)void_src;
3705            int16_t r = src[0];
3706            int16_t g = src[1];
3707            int16_t b = src[2];
3708
3709
3710
3711            dst[0] = _mesa_snorm_to_unorm(r, 16, 8);
3712
3713
3714            dst[1] = _mesa_snorm_to_unorm(g, 16, 8);
3715
3716
3717            dst[2] = _mesa_snorm_to_unorm(b, 16, 8);
3718
3719         dst[3] = 255;
3720}
3721
3722static inline void
3723unpack_ubyte_rgba_snorm16(const void *void_src, GLubyte dst[4])
3724{
3725   int16_t *src = (int16_t *)void_src;
3726            int16_t r = src[0];
3727            int16_t g = src[1];
3728            int16_t b = src[2];
3729            int16_t a = src[3];
3730
3731
3732
3733            dst[0] = _mesa_snorm_to_unorm(r, 16, 8);
3734
3735
3736            dst[1] = _mesa_snorm_to_unorm(g, 16, 8);
3737
3738
3739            dst[2] = _mesa_snorm_to_unorm(b, 16, 8);
3740
3741
3742            dst[3] = _mesa_snorm_to_unorm(a, 16, 8);
3743}
3744
3745static inline void
3746unpack_ubyte_rgbx_snorm16(const void *void_src, GLubyte dst[4])
3747{
3748   int16_t *src = (int16_t *)void_src;
3749            int16_t r = src[0];
3750            int16_t g = src[1];
3751            int16_t b = src[2];
3752
3753
3754
3755            dst[0] = _mesa_snorm_to_unorm(r, 16, 8);
3756
3757
3758            dst[1] = _mesa_snorm_to_unorm(g, 16, 8);
3759
3760
3761            dst[2] = _mesa_snorm_to_unorm(b, 16, 8);
3762
3763         dst[3] = 255;
3764}
3765
3766static inline void
3767unpack_ubyte_a8b8g8r8_srgb(const void *void_src, GLubyte dst[4])
3768{
3769   uint32_t *src = (uint32_t *)void_src;
3770            uint8_t a = UNPACK(*src, 0, 8);
3771            uint8_t b = UNPACK(*src, 8, 8);
3772            uint8_t g = UNPACK(*src, 16, 8);
3773            uint8_t r = UNPACK(*src, 24, 8);
3774
3775
3776
3777
3778               dst[0] = util_format_srgb_to_linear_8unorm(r);
3779
3780
3781
3782               dst[1] = util_format_srgb_to_linear_8unorm(g);
3783
3784
3785
3786               dst[2] = util_format_srgb_to_linear_8unorm(b);
3787
3788
3789               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
3790}
3791
3792static inline void
3793unpack_ubyte_b8g8r8a8_srgb(const void *void_src, GLubyte dst[4])
3794{
3795   uint32_t *src = (uint32_t *)void_src;
3796            uint8_t b = UNPACK(*src, 0, 8);
3797            uint8_t g = UNPACK(*src, 8, 8);
3798            uint8_t r = UNPACK(*src, 16, 8);
3799            uint8_t a = UNPACK(*src, 24, 8);
3800
3801
3802
3803
3804               dst[0] = util_format_srgb_to_linear_8unorm(r);
3805
3806
3807
3808               dst[1] = util_format_srgb_to_linear_8unorm(g);
3809
3810
3811
3812               dst[2] = util_format_srgb_to_linear_8unorm(b);
3813
3814
3815               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
3816}
3817
3818static inline void
3819unpack_ubyte_a8r8g8b8_srgb(const void *void_src, GLubyte dst[4])
3820{
3821   uint32_t *src = (uint32_t *)void_src;
3822            uint8_t a = UNPACK(*src, 0, 8);
3823            uint8_t r = UNPACK(*src, 8, 8);
3824            uint8_t g = UNPACK(*src, 16, 8);
3825            uint8_t b = UNPACK(*src, 24, 8);
3826
3827
3828
3829
3830               dst[0] = util_format_srgb_to_linear_8unorm(r);
3831
3832
3833
3834               dst[1] = util_format_srgb_to_linear_8unorm(g);
3835
3836
3837
3838               dst[2] = util_format_srgb_to_linear_8unorm(b);
3839
3840
3841               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
3842}
3843
3844static inline void
3845unpack_ubyte_b8g8r8x8_srgb(const void *void_src, GLubyte dst[4])
3846{
3847   uint32_t *src = (uint32_t *)void_src;
3848            uint8_t b = UNPACK(*src, 0, 8);
3849            uint8_t g = UNPACK(*src, 8, 8);
3850            uint8_t r = UNPACK(*src, 16, 8);
3851
3852
3853
3854
3855               dst[0] = util_format_srgb_to_linear_8unorm(r);
3856
3857
3858
3859               dst[1] = util_format_srgb_to_linear_8unorm(g);
3860
3861
3862
3863               dst[2] = util_format_srgb_to_linear_8unorm(b);
3864
3865         dst[3] = 255;
3866}
3867
3868static inline void
3869unpack_ubyte_x8r8g8b8_srgb(const void *void_src, GLubyte dst[4])
3870{
3871   uint32_t *src = (uint32_t *)void_src;
3872            uint8_t r = UNPACK(*src, 8, 8);
3873            uint8_t g = UNPACK(*src, 16, 8);
3874            uint8_t b = UNPACK(*src, 24, 8);
3875
3876
3877
3878
3879               dst[0] = util_format_srgb_to_linear_8unorm(r);
3880
3881
3882
3883               dst[1] = util_format_srgb_to_linear_8unorm(g);
3884
3885
3886
3887               dst[2] = util_format_srgb_to_linear_8unorm(b);
3888
3889         dst[3] = 255;
3890}
3891
3892static inline void
3893unpack_ubyte_r8g8b8a8_srgb(const void *void_src, GLubyte dst[4])
3894{
3895   uint32_t *src = (uint32_t *)void_src;
3896            uint8_t r = UNPACK(*src, 0, 8);
3897            uint8_t g = UNPACK(*src, 8, 8);
3898            uint8_t b = UNPACK(*src, 16, 8);
3899            uint8_t a = UNPACK(*src, 24, 8);
3900
3901
3902
3903
3904               dst[0] = util_format_srgb_to_linear_8unorm(r);
3905
3906
3907
3908               dst[1] = util_format_srgb_to_linear_8unorm(g);
3909
3910
3911
3912               dst[2] = util_format_srgb_to_linear_8unorm(b);
3913
3914
3915               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
3916}
3917
3918static inline void
3919unpack_ubyte_r8g8b8x8_srgb(const void *void_src, GLubyte dst[4])
3920{
3921   uint32_t *src = (uint32_t *)void_src;
3922            uint8_t r = UNPACK(*src, 0, 8);
3923            uint8_t g = UNPACK(*src, 8, 8);
3924            uint8_t b = UNPACK(*src, 16, 8);
3925
3926
3927
3928
3929               dst[0] = util_format_srgb_to_linear_8unorm(r);
3930
3931
3932
3933               dst[1] = util_format_srgb_to_linear_8unorm(g);
3934
3935
3936
3937               dst[2] = util_format_srgb_to_linear_8unorm(b);
3938
3939         dst[3] = 255;
3940}
3941
3942static inline void
3943unpack_ubyte_x8b8g8r8_srgb(const void *void_src, GLubyte dst[4])
3944{
3945   uint32_t *src = (uint32_t *)void_src;
3946            uint8_t b = UNPACK(*src, 8, 8);
3947            uint8_t g = UNPACK(*src, 16, 8);
3948            uint8_t r = UNPACK(*src, 24, 8);
3949
3950
3951
3952
3953               dst[0] = util_format_srgb_to_linear_8unorm(r);
3954
3955
3956
3957               dst[1] = util_format_srgb_to_linear_8unorm(g);
3958
3959
3960
3961               dst[2] = util_format_srgb_to_linear_8unorm(b);
3962
3963         dst[3] = 255;
3964}
3965
3966static inline void
3967unpack_ubyte_l8a8_srgb(const void *void_src, GLubyte dst[4])
3968{
3969   uint16_t *src = (uint16_t *)void_src;
3970            uint8_t l = UNPACK(*src, 0, 8);
3971            uint8_t a = UNPACK(*src, 8, 8);
3972
3973
3974
3975               dst[0] = _mesa_unorm_to_unorm(l, 8, 8);
3976
3977
3978               dst[1] = _mesa_unorm_to_unorm(l, 8, 8);
3979
3980
3981               dst[2] = _mesa_unorm_to_unorm(l, 8, 8);
3982
3983
3984               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
3985}
3986
3987static inline void
3988unpack_ubyte_a8l8_srgb(const void *void_src, GLubyte dst[4])
3989{
3990   uint16_t *src = (uint16_t *)void_src;
3991            uint8_t a = UNPACK(*src, 0, 8);
3992            uint8_t l = UNPACK(*src, 8, 8);
3993
3994
3995
3996               dst[0] = _mesa_unorm_to_unorm(l, 8, 8);
3997
3998
3999               dst[1] = _mesa_unorm_to_unorm(l, 8, 8);
4000
4001
4002               dst[2] = _mesa_unorm_to_unorm(l, 8, 8);
4003
4004
4005               dst[3] = _mesa_unorm_to_unorm(a, 8, 8);
4006}
4007
4008static inline void
4009unpack_ubyte_r_srgb8(const void *void_src, GLubyte dst[4])
4010{
4011   uint8_t *src = (uint8_t *)void_src;
4012            uint8_t r = src[0];
4013
4014
4015
4016
4017               dst[0] = util_format_srgb_to_linear_8unorm(r);
4018
4019         dst[1] = 0;
4020
4021         dst[2] = 0;
4022
4023         dst[3] = 255;
4024}
4025
4026static inline void
4027unpack_ubyte_l_srgb8(const void *void_src, GLubyte dst[4])
4028{
4029   uint8_t *src = (uint8_t *)void_src;
4030            uint8_t l = src[0];
4031
4032
4033
4034               dst[0] = _mesa_unorm_to_unorm(l, 8, 8);
4035
4036
4037               dst[1] = _mesa_unorm_to_unorm(l, 8, 8);
4038
4039
4040               dst[2] = _mesa_unorm_to_unorm(l, 8, 8);
4041
4042         dst[3] = 255;
4043}
4044
4045static inline void
4046unpack_ubyte_bgr_srgb8(const void *void_src, GLubyte dst[4])
4047{
4048   uint8_t *src = (uint8_t *)void_src;
4049            uint8_t b = src[0];
4050            uint8_t g = src[1];
4051            uint8_t r = src[2];
4052
4053
4054
4055
4056               dst[0] = util_format_srgb_to_linear_8unorm(r);
4057
4058
4059
4060               dst[1] = util_format_srgb_to_linear_8unorm(g);
4061
4062
4063
4064               dst[2] = util_format_srgb_to_linear_8unorm(b);
4065
4066         dst[3] = 255;
4067}
4068
4069/* integer packing functions */
4070
4071
4072static inline void
4073unpack_int_a8b8g8r8_uint(const void *void_src, GLuint dst[4])
4074{
4075   uint32_t *src = (uint32_t *)void_src;
4076            uint8_t a = UNPACK(*src, 0, 8);
4077            uint8_t b = UNPACK(*src, 8, 8);
4078            uint8_t g = UNPACK(*src, 16, 8);
4079            uint8_t r = UNPACK(*src, 24, 8);
4080
4081
4082         dst[0] = r;
4083
4084         dst[1] = g;
4085
4086         dst[2] = b;
4087
4088         dst[3] = a;
4089}
4090
4091static inline void
4092unpack_int_a8r8g8b8_uint(const void *void_src, GLuint dst[4])
4093{
4094   uint32_t *src = (uint32_t *)void_src;
4095            uint8_t a = UNPACK(*src, 0, 8);
4096            uint8_t r = UNPACK(*src, 8, 8);
4097            uint8_t g = UNPACK(*src, 16, 8);
4098            uint8_t b = UNPACK(*src, 24, 8);
4099
4100
4101         dst[0] = r;
4102
4103         dst[1] = g;
4104
4105         dst[2] = b;
4106
4107         dst[3] = a;
4108}
4109
4110static inline void
4111unpack_int_r8g8b8a8_uint(const void *void_src, GLuint dst[4])
4112{
4113   uint32_t *src = (uint32_t *)void_src;
4114            uint8_t r = UNPACK(*src, 0, 8);
4115            uint8_t g = UNPACK(*src, 8, 8);
4116            uint8_t b = UNPACK(*src, 16, 8);
4117            uint8_t a = UNPACK(*src, 24, 8);
4118
4119
4120         dst[0] = r;
4121
4122         dst[1] = g;
4123
4124         dst[2] = b;
4125
4126         dst[3] = a;
4127}
4128
4129static inline void
4130unpack_int_b8g8r8a8_uint(const void *void_src, GLuint dst[4])
4131{
4132   uint32_t *src = (uint32_t *)void_src;
4133            uint8_t b = UNPACK(*src, 0, 8);
4134            uint8_t g = UNPACK(*src, 8, 8);
4135            uint8_t r = UNPACK(*src, 16, 8);
4136            uint8_t a = UNPACK(*src, 24, 8);
4137
4138
4139         dst[0] = r;
4140
4141         dst[1] = g;
4142
4143         dst[2] = b;
4144
4145         dst[3] = a;
4146}
4147
4148static inline void
4149unpack_int_b10g10r10a2_uint(const void *void_src, GLuint dst[4])
4150{
4151   uint32_t *src = (uint32_t *)void_src;
4152            uint16_t b = UNPACK(*src, 0, 10);
4153            uint16_t g = UNPACK(*src, 10, 10);
4154            uint16_t r = UNPACK(*src, 20, 10);
4155            uint8_t a = UNPACK(*src, 30, 2);
4156
4157
4158         dst[0] = r;
4159
4160         dst[1] = g;
4161
4162         dst[2] = b;
4163
4164         dst[3] = a;
4165}
4166
4167static inline void
4168unpack_int_r10g10b10a2_uint(const void *void_src, GLuint dst[4])
4169{
4170   uint32_t *src = (uint32_t *)void_src;
4171            uint16_t r = UNPACK(*src, 0, 10);
4172            uint16_t g = UNPACK(*src, 10, 10);
4173            uint16_t b = UNPACK(*src, 20, 10);
4174            uint8_t a = UNPACK(*src, 30, 2);
4175
4176
4177         dst[0] = r;
4178
4179         dst[1] = g;
4180
4181         dst[2] = b;
4182
4183         dst[3] = a;
4184}
4185
4186static inline void
4187unpack_int_a2b10g10r10_uint(const void *void_src, GLuint dst[4])
4188{
4189   uint32_t *src = (uint32_t *)void_src;
4190            uint8_t a = UNPACK(*src, 0, 2);
4191            uint16_t b = UNPACK(*src, 2, 10);
4192            uint16_t g = UNPACK(*src, 12, 10);
4193            uint16_t r = UNPACK(*src, 22, 10);
4194
4195
4196         dst[0] = r;
4197
4198         dst[1] = g;
4199
4200         dst[2] = b;
4201
4202         dst[3] = a;
4203}
4204
4205static inline void
4206unpack_int_a2r10g10b10_uint(const void *void_src, GLuint dst[4])
4207{
4208   uint32_t *src = (uint32_t *)void_src;
4209            uint8_t a = UNPACK(*src, 0, 2);
4210            uint16_t r = UNPACK(*src, 2, 10);
4211            uint16_t g = UNPACK(*src, 12, 10);
4212            uint16_t b = UNPACK(*src, 22, 10);
4213
4214
4215         dst[0] = r;
4216
4217         dst[1] = g;
4218
4219         dst[2] = b;
4220
4221         dst[3] = a;
4222}
4223
4224static inline void
4225unpack_int_b5g6r5_uint(const void *void_src, GLuint dst[4])
4226{
4227   uint16_t *src = (uint16_t *)void_src;
4228            uint8_t b = UNPACK(*src, 0, 5);
4229            uint8_t g = UNPACK(*src, 5, 6);
4230            uint8_t r = UNPACK(*src, 11, 5);
4231
4232
4233         dst[0] = r;
4234
4235         dst[1] = g;
4236
4237         dst[2] = b;
4238
4239         dst[3] = 1;
4240}
4241
4242static inline void
4243unpack_int_r5g6b5_uint(const void *void_src, GLuint dst[4])
4244{
4245   uint16_t *src = (uint16_t *)void_src;
4246            uint8_t r = UNPACK(*src, 0, 5);
4247            uint8_t g = UNPACK(*src, 5, 6);
4248            uint8_t b = UNPACK(*src, 11, 5);
4249
4250
4251         dst[0] = r;
4252
4253         dst[1] = g;
4254
4255         dst[2] = b;
4256
4257         dst[3] = 1;
4258}
4259
4260static inline void
4261unpack_int_b2g3r3_uint(const void *void_src, GLuint dst[4])
4262{
4263   uint8_t *src = (uint8_t *)void_src;
4264            uint8_t b = UNPACK(*src, 0, 2);
4265            uint8_t g = UNPACK(*src, 2, 3);
4266            uint8_t r = UNPACK(*src, 5, 3);
4267
4268
4269         dst[0] = r;
4270
4271         dst[1] = g;
4272
4273         dst[2] = b;
4274
4275         dst[3] = 1;
4276}
4277
4278static inline void
4279unpack_int_r3g3b2_uint(const void *void_src, GLuint dst[4])
4280{
4281   uint8_t *src = (uint8_t *)void_src;
4282            uint8_t r = UNPACK(*src, 0, 3);
4283            uint8_t g = UNPACK(*src, 3, 3);
4284            uint8_t b = UNPACK(*src, 6, 2);
4285
4286
4287         dst[0] = r;
4288
4289         dst[1] = g;
4290
4291         dst[2] = b;
4292
4293         dst[3] = 1;
4294}
4295
4296static inline void
4297unpack_int_a4b4g4r4_uint(const void *void_src, GLuint dst[4])
4298{
4299   uint16_t *src = (uint16_t *)void_src;
4300            uint8_t a = UNPACK(*src, 0, 4);
4301            uint8_t b = UNPACK(*src, 4, 4);
4302            uint8_t g = UNPACK(*src, 8, 4);
4303            uint8_t r = UNPACK(*src, 12, 4);
4304
4305
4306         dst[0] = r;
4307
4308         dst[1] = g;
4309
4310         dst[2] = b;
4311
4312         dst[3] = a;
4313}
4314
4315static inline void
4316unpack_int_r4g4b4a4_uint(const void *void_src, GLuint dst[4])
4317{
4318   uint16_t *src = (uint16_t *)void_src;
4319            uint8_t r = UNPACK(*src, 0, 4);
4320            uint8_t g = UNPACK(*src, 4, 4);
4321            uint8_t b = UNPACK(*src, 8, 4);
4322            uint8_t a = UNPACK(*src, 12, 4);
4323
4324
4325         dst[0] = r;
4326
4327         dst[1] = g;
4328
4329         dst[2] = b;
4330
4331         dst[3] = a;
4332}
4333
4334static inline void
4335unpack_int_b4g4r4a4_uint(const void *void_src, GLuint dst[4])
4336{
4337   uint16_t *src = (uint16_t *)void_src;
4338            uint8_t b = UNPACK(*src, 0, 4);
4339            uint8_t g = UNPACK(*src, 4, 4);
4340            uint8_t r = UNPACK(*src, 8, 4);
4341            uint8_t a = UNPACK(*src, 12, 4);
4342
4343
4344         dst[0] = r;
4345
4346         dst[1] = g;
4347
4348         dst[2] = b;
4349
4350         dst[3] = a;
4351}
4352
4353static inline void
4354unpack_int_a4r4g4b4_uint(const void *void_src, GLuint dst[4])
4355{
4356   uint16_t *src = (uint16_t *)void_src;
4357            uint8_t a = UNPACK(*src, 0, 4);
4358            uint8_t r = UNPACK(*src, 4, 4);
4359            uint8_t g = UNPACK(*src, 8, 4);
4360            uint8_t b = UNPACK(*src, 12, 4);
4361
4362
4363         dst[0] = r;
4364
4365         dst[1] = g;
4366
4367         dst[2] = b;
4368
4369         dst[3] = a;
4370}
4371
4372static inline void
4373unpack_int_a1b5g5r5_uint(const void *void_src, GLuint dst[4])
4374{
4375   uint16_t *src = (uint16_t *)void_src;
4376            uint8_t a = UNPACK(*src, 0, 1);
4377            uint8_t b = UNPACK(*src, 1, 5);
4378            uint8_t g = UNPACK(*src, 6, 5);
4379            uint8_t r = UNPACK(*src, 11, 5);
4380
4381
4382         dst[0] = r;
4383
4384         dst[1] = g;
4385
4386         dst[2] = b;
4387
4388         dst[3] = a;
4389}
4390
4391static inline void
4392unpack_int_b5g5r5a1_uint(const void *void_src, GLuint dst[4])
4393{
4394   uint16_t *src = (uint16_t *)void_src;
4395            uint8_t b = UNPACK(*src, 0, 5);
4396            uint8_t g = UNPACK(*src, 5, 5);
4397            uint8_t r = UNPACK(*src, 10, 5);
4398            uint8_t a = UNPACK(*src, 15, 1);
4399
4400
4401         dst[0] = r;
4402
4403         dst[1] = g;
4404
4405         dst[2] = b;
4406
4407         dst[3] = a;
4408}
4409
4410static inline void
4411unpack_int_a1r5g5b5_uint(const void *void_src, GLuint dst[4])
4412{
4413   uint16_t *src = (uint16_t *)void_src;
4414            uint8_t a = UNPACK(*src, 0, 1);
4415            uint8_t r = UNPACK(*src, 1, 5);
4416            uint8_t g = UNPACK(*src, 6, 5);
4417            uint8_t b = UNPACK(*src, 11, 5);
4418
4419
4420         dst[0] = r;
4421
4422         dst[1] = g;
4423
4424         dst[2] = b;
4425
4426         dst[3] = a;
4427}
4428
4429static inline void
4430unpack_int_r5g5b5a1_uint(const void *void_src, GLuint dst[4])
4431{
4432   uint16_t *src = (uint16_t *)void_src;
4433            uint8_t r = UNPACK(*src, 0, 5);
4434            uint8_t g = UNPACK(*src, 5, 5);
4435            uint8_t b = UNPACK(*src, 10, 5);
4436            uint8_t a = UNPACK(*src, 15, 1);
4437
4438
4439         dst[0] = r;
4440
4441         dst[1] = g;
4442
4443         dst[2] = b;
4444
4445         dst[3] = a;
4446}
4447
4448static inline void
4449unpack_int_a_uint8(const void *void_src, GLuint dst[4])
4450{
4451   uint8_t *src = (uint8_t *)void_src;
4452            uint8_t a = src[0];
4453
4454
4455         dst[0] = 0;
4456
4457         dst[1] = 0;
4458
4459         dst[2] = 0;
4460
4461         dst[3] = a;
4462}
4463
4464static inline void
4465unpack_int_a_uint16(const void *void_src, GLuint dst[4])
4466{
4467   uint16_t *src = (uint16_t *)void_src;
4468            uint16_t a = src[0];
4469
4470
4471         dst[0] = 0;
4472
4473         dst[1] = 0;
4474
4475         dst[2] = 0;
4476
4477         dst[3] = a;
4478}
4479
4480static inline void
4481unpack_int_a_uint32(const void *void_src, GLuint dst[4])
4482{
4483   uint32_t *src = (uint32_t *)void_src;
4484            uint32_t a = src[0];
4485
4486
4487         dst[0] = 0;
4488
4489         dst[1] = 0;
4490
4491         dst[2] = 0;
4492
4493         dst[3] = a;
4494}
4495
4496static inline void
4497unpack_int_a_sint8(const void *void_src, GLuint dst[4])
4498{
4499   int8_t *src = (int8_t *)void_src;
4500            int8_t a = src[0];
4501
4502
4503         dst[0] = 0;
4504
4505         dst[1] = 0;
4506
4507         dst[2] = 0;
4508
4509         dst[3] = a;
4510}
4511
4512static inline void
4513unpack_int_a_sint16(const void *void_src, GLuint dst[4])
4514{
4515   int16_t *src = (int16_t *)void_src;
4516            int16_t a = src[0];
4517
4518
4519         dst[0] = 0;
4520
4521         dst[1] = 0;
4522
4523         dst[2] = 0;
4524
4525         dst[3] = a;
4526}
4527
4528static inline void
4529unpack_int_a_sint32(const void *void_src, GLuint dst[4])
4530{
4531   int32_t *src = (int32_t *)void_src;
4532            int32_t a = src[0];
4533
4534
4535         dst[0] = 0;
4536
4537         dst[1] = 0;
4538
4539         dst[2] = 0;
4540
4541         dst[3] = a;
4542}
4543
4544static inline void
4545unpack_int_i_uint8(const void *void_src, GLuint dst[4])
4546{
4547   uint8_t *src = (uint8_t *)void_src;
4548            uint8_t i = src[0];
4549
4550
4551         dst[0] = i;
4552
4553         dst[1] = i;
4554
4555         dst[2] = i;
4556
4557         dst[3] = i;
4558}
4559
4560static inline void
4561unpack_int_i_uint16(const void *void_src, GLuint dst[4])
4562{
4563   uint16_t *src = (uint16_t *)void_src;
4564            uint16_t i = src[0];
4565
4566
4567         dst[0] = i;
4568
4569         dst[1] = i;
4570
4571         dst[2] = i;
4572
4573         dst[3] = i;
4574}
4575
4576static inline void
4577unpack_int_i_uint32(const void *void_src, GLuint dst[4])
4578{
4579   uint32_t *src = (uint32_t *)void_src;
4580            uint32_t i = src[0];
4581
4582
4583         dst[0] = i;
4584
4585         dst[1] = i;
4586
4587         dst[2] = i;
4588
4589         dst[3] = i;
4590}
4591
4592static inline void
4593unpack_int_i_sint8(const void *void_src, GLuint dst[4])
4594{
4595   int8_t *src = (int8_t *)void_src;
4596            int8_t i = src[0];
4597
4598
4599         dst[0] = i;
4600
4601         dst[1] = i;
4602
4603         dst[2] = i;
4604
4605         dst[3] = i;
4606}
4607
4608static inline void
4609unpack_int_i_sint16(const void *void_src, GLuint dst[4])
4610{
4611   int16_t *src = (int16_t *)void_src;
4612            int16_t i = src[0];
4613
4614
4615         dst[0] = i;
4616
4617         dst[1] = i;
4618
4619         dst[2] = i;
4620
4621         dst[3] = i;
4622}
4623
4624static inline void
4625unpack_int_i_sint32(const void *void_src, GLuint dst[4])
4626{
4627   int32_t *src = (int32_t *)void_src;
4628            int32_t i = src[0];
4629
4630
4631         dst[0] = i;
4632
4633         dst[1] = i;
4634
4635         dst[2] = i;
4636
4637         dst[3] = i;
4638}
4639
4640static inline void
4641unpack_int_l_uint8(const void *void_src, GLuint dst[4])
4642{
4643   uint8_t *src = (uint8_t *)void_src;
4644            uint8_t l = src[0];
4645
4646
4647         dst[0] = l;
4648
4649         dst[1] = l;
4650
4651         dst[2] = l;
4652
4653         dst[3] = 1;
4654}
4655
4656static inline void
4657unpack_int_l_uint16(const void *void_src, GLuint dst[4])
4658{
4659   uint16_t *src = (uint16_t *)void_src;
4660            uint16_t l = src[0];
4661
4662
4663         dst[0] = l;
4664
4665         dst[1] = l;
4666
4667         dst[2] = l;
4668
4669         dst[3] = 1;
4670}
4671
4672static inline void
4673unpack_int_l_uint32(const void *void_src, GLuint dst[4])
4674{
4675   uint32_t *src = (uint32_t *)void_src;
4676            uint32_t l = src[0];
4677
4678
4679         dst[0] = l;
4680
4681         dst[1] = l;
4682
4683         dst[2] = l;
4684
4685         dst[3] = 1;
4686}
4687
4688static inline void
4689unpack_int_l_sint8(const void *void_src, GLuint dst[4])
4690{
4691   int8_t *src = (int8_t *)void_src;
4692            int8_t l = src[0];
4693
4694
4695         dst[0] = l;
4696
4697         dst[1] = l;
4698
4699         dst[2] = l;
4700
4701         dst[3] = 1;
4702}
4703
4704static inline void
4705unpack_int_l_sint16(const void *void_src, GLuint dst[4])
4706{
4707   int16_t *src = (int16_t *)void_src;
4708            int16_t l = src[0];
4709
4710
4711         dst[0] = l;
4712
4713         dst[1] = l;
4714
4715         dst[2] = l;
4716
4717         dst[3] = 1;
4718}
4719
4720static inline void
4721unpack_int_l_sint32(const void *void_src, GLuint dst[4])
4722{
4723   int32_t *src = (int32_t *)void_src;
4724            int32_t l = src[0];
4725
4726
4727         dst[0] = l;
4728
4729         dst[1] = l;
4730
4731         dst[2] = l;
4732
4733         dst[3] = 1;
4734}
4735
4736static inline void
4737unpack_int_la_uint8(const void *void_src, GLuint dst[4])
4738{
4739   uint8_t *src = (uint8_t *)void_src;
4740            uint8_t l = src[0];
4741            uint8_t a = src[1];
4742
4743
4744         dst[0] = l;
4745
4746         dst[1] = l;
4747
4748         dst[2] = l;
4749
4750         dst[3] = a;
4751}
4752
4753static inline void
4754unpack_int_la_uint16(const void *void_src, GLuint dst[4])
4755{
4756   uint16_t *src = (uint16_t *)void_src;
4757            uint16_t l = src[0];
4758            uint16_t a = src[1];
4759
4760
4761         dst[0] = l;
4762
4763         dst[1] = l;
4764
4765         dst[2] = l;
4766
4767         dst[3] = a;
4768}
4769
4770static inline void
4771unpack_int_la_uint32(const void *void_src, GLuint dst[4])
4772{
4773   uint32_t *src = (uint32_t *)void_src;
4774            uint32_t l = src[0];
4775            uint32_t a = src[1];
4776
4777
4778         dst[0] = l;
4779
4780         dst[1] = l;
4781
4782         dst[2] = l;
4783
4784         dst[3] = a;
4785}
4786
4787static inline void
4788unpack_int_la_sint8(const void *void_src, GLuint dst[4])
4789{
4790   int8_t *src = (int8_t *)void_src;
4791            int8_t l = src[0];
4792            int8_t a = src[1];
4793
4794
4795         dst[0] = l;
4796
4797         dst[1] = l;
4798
4799         dst[2] = l;
4800
4801         dst[3] = a;
4802}
4803
4804static inline void
4805unpack_int_la_sint16(const void *void_src, GLuint dst[4])
4806{
4807   int16_t *src = (int16_t *)void_src;
4808            int16_t l = src[0];
4809            int16_t a = src[1];
4810
4811
4812         dst[0] = l;
4813
4814         dst[1] = l;
4815
4816         dst[2] = l;
4817
4818         dst[3] = a;
4819}
4820
4821static inline void
4822unpack_int_la_sint32(const void *void_src, GLuint dst[4])
4823{
4824   int32_t *src = (int32_t *)void_src;
4825            int32_t l = src[0];
4826            int32_t a = src[1];
4827
4828
4829         dst[0] = l;
4830
4831         dst[1] = l;
4832
4833         dst[2] = l;
4834
4835         dst[3] = a;
4836}
4837
4838static inline void
4839unpack_int_r_uint8(const void *void_src, GLuint dst[4])
4840{
4841   uint8_t *src = (uint8_t *)void_src;
4842            uint8_t r = src[0];
4843
4844
4845         dst[0] = r;
4846
4847         dst[1] = 0;
4848
4849         dst[2] = 0;
4850
4851         dst[3] = 1;
4852}
4853
4854static inline void
4855unpack_int_r_uint16(const void *void_src, GLuint dst[4])
4856{
4857   uint16_t *src = (uint16_t *)void_src;
4858            uint16_t r = src[0];
4859
4860
4861         dst[0] = r;
4862
4863         dst[1] = 0;
4864
4865         dst[2] = 0;
4866
4867         dst[3] = 1;
4868}
4869
4870static inline void
4871unpack_int_r_uint32(const void *void_src, GLuint dst[4])
4872{
4873   uint32_t *src = (uint32_t *)void_src;
4874            uint32_t r = src[0];
4875
4876
4877         dst[0] = r;
4878
4879         dst[1] = 0;
4880
4881         dst[2] = 0;
4882
4883         dst[3] = 1;
4884}
4885
4886static inline void
4887unpack_int_r_sint8(const void *void_src, GLuint dst[4])
4888{
4889   int8_t *src = (int8_t *)void_src;
4890            int8_t r = src[0];
4891
4892
4893         dst[0] = r;
4894
4895         dst[1] = 0;
4896
4897         dst[2] = 0;
4898
4899         dst[3] = 1;
4900}
4901
4902static inline void
4903unpack_int_r_sint16(const void *void_src, GLuint dst[4])
4904{
4905   int16_t *src = (int16_t *)void_src;
4906            int16_t r = src[0];
4907
4908
4909         dst[0] = r;
4910
4911         dst[1] = 0;
4912
4913         dst[2] = 0;
4914
4915         dst[3] = 1;
4916}
4917
4918static inline void
4919unpack_int_r_sint32(const void *void_src, GLuint dst[4])
4920{
4921   int32_t *src = (int32_t *)void_src;
4922            int32_t r = src[0];
4923
4924
4925         dst[0] = r;
4926
4927         dst[1] = 0;
4928
4929         dst[2] = 0;
4930
4931         dst[3] = 1;
4932}
4933
4934static inline void
4935unpack_int_rg_uint8(const void *void_src, GLuint dst[4])
4936{
4937   uint8_t *src = (uint8_t *)void_src;
4938            uint8_t r = src[0];
4939            uint8_t g = src[1];
4940
4941
4942         dst[0] = r;
4943
4944         dst[1] = g;
4945
4946         dst[2] = 0;
4947
4948         dst[3] = 1;
4949}
4950
4951static inline void
4952unpack_int_rg_uint16(const void *void_src, GLuint dst[4])
4953{
4954   uint16_t *src = (uint16_t *)void_src;
4955            uint16_t r = src[0];
4956            uint16_t g = src[1];
4957
4958
4959         dst[0] = r;
4960
4961         dst[1] = g;
4962
4963         dst[2] = 0;
4964
4965         dst[3] = 1;
4966}
4967
4968static inline void
4969unpack_int_rg_uint32(const void *void_src, GLuint dst[4])
4970{
4971   uint32_t *src = (uint32_t *)void_src;
4972            uint32_t r = src[0];
4973            uint32_t g = src[1];
4974
4975
4976         dst[0] = r;
4977
4978         dst[1] = g;
4979
4980         dst[2] = 0;
4981
4982         dst[3] = 1;
4983}
4984
4985static inline void
4986unpack_int_rg_sint8(const void *void_src, GLuint dst[4])
4987{
4988   int8_t *src = (int8_t *)void_src;
4989            int8_t r = src[0];
4990            int8_t g = src[1];
4991
4992
4993         dst[0] = r;
4994
4995         dst[1] = g;
4996
4997         dst[2] = 0;
4998
4999         dst[3] = 1;
5000}
5001
5002static inline void
5003unpack_int_rg_sint16(const void *void_src, GLuint dst[4])
5004{
5005   int16_t *src = (int16_t *)void_src;
5006            int16_t r = src[0];
5007            int16_t g = src[1];
5008
5009
5010         dst[0] = r;
5011
5012         dst[1] = g;
5013
5014         dst[2] = 0;
5015
5016         dst[3] = 1;
5017}
5018
5019static inline void
5020unpack_int_rg_sint32(const void *void_src, GLuint dst[4])
5021{
5022   int32_t *src = (int32_t *)void_src;
5023            int32_t r = src[0];
5024            int32_t g = src[1];
5025
5026
5027         dst[0] = r;
5028
5029         dst[1] = g;
5030
5031         dst[2] = 0;
5032
5033         dst[3] = 1;
5034}
5035
5036static inline void
5037unpack_int_rgb_uint8(const void *void_src, GLuint dst[4])
5038{
5039   uint8_t *src = (uint8_t *)void_src;
5040            uint8_t r = src[0];
5041            uint8_t g = src[1];
5042            uint8_t b = src[2];
5043
5044
5045         dst[0] = r;
5046
5047         dst[1] = g;
5048
5049         dst[2] = b;
5050
5051         dst[3] = 1;
5052}
5053
5054static inline void
5055unpack_int_rgb_uint16(const void *void_src, GLuint dst[4])
5056{
5057   uint16_t *src = (uint16_t *)void_src;
5058            uint16_t r = src[0];
5059            uint16_t g = src[1];
5060            uint16_t b = src[2];
5061
5062
5063         dst[0] = r;
5064
5065         dst[1] = g;
5066
5067         dst[2] = b;
5068
5069         dst[3] = 1;
5070}
5071
5072static inline void
5073unpack_int_rgb_uint32(const void *void_src, GLuint dst[4])
5074{
5075   uint32_t *src = (uint32_t *)void_src;
5076            uint32_t r = src[0];
5077            uint32_t g = src[1];
5078            uint32_t b = src[2];
5079
5080
5081         dst[0] = r;
5082
5083         dst[1] = g;
5084
5085         dst[2] = b;
5086
5087         dst[3] = 1;
5088}
5089
5090static inline void
5091unpack_int_rgb_sint8(const void *void_src, GLuint dst[4])
5092{
5093   int8_t *src = (int8_t *)void_src;
5094            int8_t r = src[0];
5095            int8_t g = src[1];
5096            int8_t b = src[2];
5097
5098
5099         dst[0] = r;
5100
5101         dst[1] = g;
5102
5103         dst[2] = b;
5104
5105         dst[3] = 1;
5106}
5107
5108static inline void
5109unpack_int_rgb_sint16(const void *void_src, GLuint dst[4])
5110{
5111   int16_t *src = (int16_t *)void_src;
5112            int16_t r = src[0];
5113            int16_t g = src[1];
5114            int16_t b = src[2];
5115
5116
5117         dst[0] = r;
5118
5119         dst[1] = g;
5120
5121         dst[2] = b;
5122
5123         dst[3] = 1;
5124}
5125
5126static inline void
5127unpack_int_rgb_sint32(const void *void_src, GLuint dst[4])
5128{
5129   int32_t *src = (int32_t *)void_src;
5130            int32_t r = src[0];
5131            int32_t g = src[1];
5132            int32_t b = src[2];
5133
5134
5135         dst[0] = r;
5136
5137         dst[1] = g;
5138
5139         dst[2] = b;
5140
5141         dst[3] = 1;
5142}
5143
5144static inline void
5145unpack_int_rgba_uint8(const void *void_src, GLuint dst[4])
5146{
5147   uint8_t *src = (uint8_t *)void_src;
5148            uint8_t r = src[0];
5149            uint8_t g = src[1];
5150            uint8_t b = src[2];
5151            uint8_t a = src[3];
5152
5153
5154         dst[0] = r;
5155
5156         dst[1] = g;
5157
5158         dst[2] = b;
5159
5160         dst[3] = a;
5161}
5162
5163static inline void
5164unpack_int_rgba_uint16(const void *void_src, GLuint dst[4])
5165{
5166   uint16_t *src = (uint16_t *)void_src;
5167            uint16_t r = src[0];
5168            uint16_t g = src[1];
5169            uint16_t b = src[2];
5170            uint16_t a = src[3];
5171
5172
5173         dst[0] = r;
5174
5175         dst[1] = g;
5176
5177         dst[2] = b;
5178
5179         dst[3] = a;
5180}
5181
5182static inline void
5183unpack_int_rgba_uint32(const void *void_src, GLuint dst[4])
5184{
5185   uint32_t *src = (uint32_t *)void_src;
5186            uint32_t r = src[0];
5187            uint32_t g = src[1];
5188            uint32_t b = src[2];
5189            uint32_t a = src[3];
5190
5191
5192         dst[0] = r;
5193
5194         dst[1] = g;
5195
5196         dst[2] = b;
5197
5198         dst[3] = a;
5199}
5200
5201static inline void
5202unpack_int_rgba_sint8(const void *void_src, GLuint dst[4])
5203{
5204   int8_t *src = (int8_t *)void_src;
5205            int8_t r = src[0];
5206            int8_t g = src[1];
5207            int8_t b = src[2];
5208            int8_t a = src[3];
5209
5210
5211         dst[0] = r;
5212
5213         dst[1] = g;
5214
5215         dst[2] = b;
5216
5217         dst[3] = a;
5218}
5219
5220static inline void
5221unpack_int_rgba_sint16(const void *void_src, GLuint dst[4])
5222{
5223   int16_t *src = (int16_t *)void_src;
5224            int16_t r = src[0];
5225            int16_t g = src[1];
5226            int16_t b = src[2];
5227            int16_t a = src[3];
5228
5229
5230         dst[0] = r;
5231
5232         dst[1] = g;
5233
5234         dst[2] = b;
5235
5236         dst[3] = a;
5237}
5238
5239static inline void
5240unpack_int_rgba_sint32(const void *void_src, GLuint dst[4])
5241{
5242   int32_t *src = (int32_t *)void_src;
5243            int32_t r = src[0];
5244            int32_t g = src[1];
5245            int32_t b = src[2];
5246            int32_t a = src[3];
5247
5248
5249         dst[0] = r;
5250
5251         dst[1] = g;
5252
5253         dst[2] = b;
5254
5255         dst[3] = a;
5256}
5257
5258static inline void
5259unpack_int_rgbx_uint8(const void *void_src, GLuint dst[4])
5260{
5261   uint8_t *src = (uint8_t *)void_src;
5262            uint8_t r = src[0];
5263            uint8_t g = src[1];
5264            uint8_t b = src[2];
5265
5266
5267         dst[0] = r;
5268
5269         dst[1] = g;
5270
5271         dst[2] = b;
5272
5273         dst[3] = 1;
5274}
5275
5276static inline void
5277unpack_int_rgbx_uint16(const void *void_src, GLuint dst[4])
5278{
5279   uint16_t *src = (uint16_t *)void_src;
5280            uint16_t r = src[0];
5281            uint16_t g = src[1];
5282            uint16_t b = src[2];
5283
5284
5285         dst[0] = r;
5286
5287         dst[1] = g;
5288
5289         dst[2] = b;
5290
5291         dst[3] = 1;
5292}
5293
5294static inline void
5295unpack_int_rgbx_uint32(const void *void_src, GLuint dst[4])
5296{
5297   uint32_t *src = (uint32_t *)void_src;
5298            uint32_t r = src[0];
5299            uint32_t g = src[1];
5300            uint32_t b = src[2];
5301
5302
5303         dst[0] = r;
5304
5305         dst[1] = g;
5306
5307         dst[2] = b;
5308
5309         dst[3] = 1;
5310}
5311
5312static inline void
5313unpack_int_rgbx_sint8(const void *void_src, GLuint dst[4])
5314{
5315   int8_t *src = (int8_t *)void_src;
5316            int8_t r = src[0];
5317            int8_t g = src[1];
5318            int8_t b = src[2];
5319
5320
5321         dst[0] = r;
5322
5323         dst[1] = g;
5324
5325         dst[2] = b;
5326
5327         dst[3] = 1;
5328}
5329
5330static inline void
5331unpack_int_rgbx_sint16(const void *void_src, GLuint dst[4])
5332{
5333   int16_t *src = (int16_t *)void_src;
5334            int16_t r = src[0];
5335            int16_t g = src[1];
5336            int16_t b = src[2];
5337
5338
5339         dst[0] = r;
5340
5341         dst[1] = g;
5342
5343         dst[2] = b;
5344
5345         dst[3] = 1;
5346}
5347
5348static inline void
5349unpack_int_rgbx_sint32(const void *void_src, GLuint dst[4])
5350{
5351   int32_t *src = (int32_t *)void_src;
5352            int32_t r = src[0];
5353            int32_t g = src[1];
5354            int32_t b = src[2];
5355
5356
5357         dst[0] = r;
5358
5359         dst[1] = g;
5360
5361         dst[2] = b;
5362
5363         dst[3] = 1;
5364}
5365
5366
5367void
5368_mesa_unpack_rgba_row(mesa_format format, GLuint n,
5369                      const void *src, GLfloat dst[][4])
5370{
5371   GLubyte *s = (GLubyte *)src;
5372   GLuint i;
5373
5374   switch (format) {
5375   case MESA_FORMAT_A8B8G8R8_UNORM:
5376      for (i = 0; i < n; ++i) {
5377         unpack_float_a8b8g8r8_unorm(s, dst[i]);
5378         s += 4;
5379      }
5380      break;
5381   case MESA_FORMAT_X8B8G8R8_UNORM:
5382      for (i = 0; i < n; ++i) {
5383         unpack_float_x8b8g8r8_unorm(s, dst[i]);
5384         s += 4;
5385      }
5386      break;
5387   case MESA_FORMAT_R8G8B8A8_UNORM:
5388      for (i = 0; i < n; ++i) {
5389         unpack_float_r8g8b8a8_unorm(s, dst[i]);
5390         s += 4;
5391      }
5392      break;
5393   case MESA_FORMAT_R8G8B8X8_UNORM:
5394      for (i = 0; i < n; ++i) {
5395         unpack_float_r8g8b8x8_unorm(s, dst[i]);
5396         s += 4;
5397      }
5398      break;
5399   case MESA_FORMAT_B8G8R8A8_UNORM:
5400      for (i = 0; i < n; ++i) {
5401         unpack_float_b8g8r8a8_unorm(s, dst[i]);
5402         s += 4;
5403      }
5404      break;
5405   case MESA_FORMAT_B8G8R8X8_UNORM:
5406      for (i = 0; i < n; ++i) {
5407         unpack_float_b8g8r8x8_unorm(s, dst[i]);
5408         s += 4;
5409      }
5410      break;
5411   case MESA_FORMAT_A8R8G8B8_UNORM:
5412      for (i = 0; i < n; ++i) {
5413         unpack_float_a8r8g8b8_unorm(s, dst[i]);
5414         s += 4;
5415      }
5416      break;
5417   case MESA_FORMAT_X8R8G8B8_UNORM:
5418      for (i = 0; i < n; ++i) {
5419         unpack_float_x8r8g8b8_unorm(s, dst[i]);
5420         s += 4;
5421      }
5422      break;
5423   case MESA_FORMAT_L16A16_UNORM:
5424      for (i = 0; i < n; ++i) {
5425         unpack_float_l16a16_unorm(s, dst[i]);
5426         s += 4;
5427      }
5428      break;
5429   case MESA_FORMAT_A16L16_UNORM:
5430      for (i = 0; i < n; ++i) {
5431         unpack_float_a16l16_unorm(s, dst[i]);
5432         s += 4;
5433      }
5434      break;
5435   case MESA_FORMAT_B5G6R5_UNORM:
5436      for (i = 0; i < n; ++i) {
5437         unpack_float_b5g6r5_unorm(s, dst[i]);
5438         s += 2;
5439      }
5440      break;
5441   case MESA_FORMAT_R5G6B5_UNORM:
5442      for (i = 0; i < n; ++i) {
5443         unpack_float_r5g6b5_unorm(s, dst[i]);
5444         s += 2;
5445      }
5446      break;
5447   case MESA_FORMAT_B4G4R4A4_UNORM:
5448      for (i = 0; i < n; ++i) {
5449         unpack_float_b4g4r4a4_unorm(s, dst[i]);
5450         s += 2;
5451      }
5452      break;
5453   case MESA_FORMAT_B4G4R4X4_UNORM:
5454      for (i = 0; i < n; ++i) {
5455         unpack_float_b4g4r4x4_unorm(s, dst[i]);
5456         s += 2;
5457      }
5458      break;
5459   case MESA_FORMAT_A4R4G4B4_UNORM:
5460      for (i = 0; i < n; ++i) {
5461         unpack_float_a4r4g4b4_unorm(s, dst[i]);
5462         s += 2;
5463      }
5464      break;
5465   case MESA_FORMAT_A1B5G5R5_UNORM:
5466      for (i = 0; i < n; ++i) {
5467         unpack_float_a1b5g5r5_unorm(s, dst[i]);
5468         s += 2;
5469      }
5470      break;
5471   case MESA_FORMAT_X1B5G5R5_UNORM:
5472      for (i = 0; i < n; ++i) {
5473         unpack_float_x1b5g5r5_unorm(s, dst[i]);
5474         s += 2;
5475      }
5476      break;
5477   case MESA_FORMAT_B5G5R5A1_UNORM:
5478      for (i = 0; i < n; ++i) {
5479         unpack_float_b5g5r5a1_unorm(s, dst[i]);
5480         s += 2;
5481      }
5482      break;
5483   case MESA_FORMAT_B5G5R5X1_UNORM:
5484      for (i = 0; i < n; ++i) {
5485         unpack_float_b5g5r5x1_unorm(s, dst[i]);
5486         s += 2;
5487      }
5488      break;
5489   case MESA_FORMAT_A1R5G5B5_UNORM:
5490      for (i = 0; i < n; ++i) {
5491         unpack_float_a1r5g5b5_unorm(s, dst[i]);
5492         s += 2;
5493      }
5494      break;
5495   case MESA_FORMAT_L8A8_UNORM:
5496      for (i = 0; i < n; ++i) {
5497         unpack_float_l8a8_unorm(s, dst[i]);
5498         s += 2;
5499      }
5500      break;
5501   case MESA_FORMAT_A8L8_UNORM:
5502      for (i = 0; i < n; ++i) {
5503         unpack_float_a8l8_unorm(s, dst[i]);
5504         s += 2;
5505      }
5506      break;
5507   case MESA_FORMAT_R8G8_UNORM:
5508      for (i = 0; i < n; ++i) {
5509         unpack_float_r8g8_unorm(s, dst[i]);
5510         s += 2;
5511      }
5512      break;
5513   case MESA_FORMAT_G8R8_UNORM:
5514      for (i = 0; i < n; ++i) {
5515         unpack_float_g8r8_unorm(s, dst[i]);
5516         s += 2;
5517      }
5518      break;
5519   case MESA_FORMAT_L4A4_UNORM:
5520      for (i = 0; i < n; ++i) {
5521         unpack_float_l4a4_unorm(s, dst[i]);
5522         s += 1;
5523      }
5524      break;
5525   case MESA_FORMAT_B2G3R3_UNORM:
5526      for (i = 0; i < n; ++i) {
5527         unpack_float_b2g3r3_unorm(s, dst[i]);
5528         s += 1;
5529      }
5530      break;
5531   case MESA_FORMAT_R16G16_UNORM:
5532      for (i = 0; i < n; ++i) {
5533         unpack_float_r16g16_unorm(s, dst[i]);
5534         s += 4;
5535      }
5536      break;
5537   case MESA_FORMAT_G16R16_UNORM:
5538      for (i = 0; i < n; ++i) {
5539         unpack_float_g16r16_unorm(s, dst[i]);
5540         s += 4;
5541      }
5542      break;
5543   case MESA_FORMAT_B10G10R10A2_UNORM:
5544      for (i = 0; i < n; ++i) {
5545         unpack_float_b10g10r10a2_unorm(s, dst[i]);
5546         s += 4;
5547      }
5548      break;
5549   case MESA_FORMAT_B10G10R10X2_UNORM:
5550      for (i = 0; i < n; ++i) {
5551         unpack_float_b10g10r10x2_unorm(s, dst[i]);
5552         s += 4;
5553      }
5554      break;
5555   case MESA_FORMAT_R10G10B10A2_UNORM:
5556      for (i = 0; i < n; ++i) {
5557         unpack_float_r10g10b10a2_unorm(s, dst[i]);
5558         s += 4;
5559      }
5560      break;
5561   case MESA_FORMAT_R10G10B10X2_UNORM:
5562      for (i = 0; i < n; ++i) {
5563         unpack_float_r10g10b10x2_unorm(s, dst[i]);
5564         s += 4;
5565      }
5566      break;
5567   case MESA_FORMAT_R3G3B2_UNORM:
5568      for (i = 0; i < n; ++i) {
5569         unpack_float_r3g3b2_unorm(s, dst[i]);
5570         s += 1;
5571      }
5572      break;
5573   case MESA_FORMAT_A4B4G4R4_UNORM:
5574      for (i = 0; i < n; ++i) {
5575         unpack_float_a4b4g4r4_unorm(s, dst[i]);
5576         s += 2;
5577      }
5578      break;
5579   case MESA_FORMAT_R4G4B4A4_UNORM:
5580      for (i = 0; i < n; ++i) {
5581         unpack_float_r4g4b4a4_unorm(s, dst[i]);
5582         s += 2;
5583      }
5584      break;
5585   case MESA_FORMAT_R5G5B5A1_UNORM:
5586      for (i = 0; i < n; ++i) {
5587         unpack_float_r5g5b5a1_unorm(s, dst[i]);
5588         s += 2;
5589      }
5590      break;
5591   case MESA_FORMAT_A2B10G10R10_UNORM:
5592      for (i = 0; i < n; ++i) {
5593         unpack_float_a2b10g10r10_unorm(s, dst[i]);
5594         s += 4;
5595      }
5596      break;
5597   case MESA_FORMAT_A2R10G10B10_UNORM:
5598      for (i = 0; i < n; ++i) {
5599         unpack_float_a2r10g10b10_unorm(s, dst[i]);
5600         s += 4;
5601      }
5602      break;
5603   case MESA_FORMAT_A_UNORM8:
5604      for (i = 0; i < n; ++i) {
5605         unpack_float_a_unorm8(s, dst[i]);
5606         s += 1;
5607      }
5608      break;
5609   case MESA_FORMAT_A_UNORM16:
5610      for (i = 0; i < n; ++i) {
5611         unpack_float_a_unorm16(s, dst[i]);
5612         s += 2;
5613      }
5614      break;
5615   case MESA_FORMAT_L_UNORM8:
5616      for (i = 0; i < n; ++i) {
5617         unpack_float_l_unorm8(s, dst[i]);
5618         s += 1;
5619      }
5620      break;
5621   case MESA_FORMAT_L_UNORM16:
5622      for (i = 0; i < n; ++i) {
5623         unpack_float_l_unorm16(s, dst[i]);
5624         s += 2;
5625      }
5626      break;
5627   case MESA_FORMAT_I_UNORM8:
5628      for (i = 0; i < n; ++i) {
5629         unpack_float_i_unorm8(s, dst[i]);
5630         s += 1;
5631      }
5632      break;
5633   case MESA_FORMAT_I_UNORM16:
5634      for (i = 0; i < n; ++i) {
5635         unpack_float_i_unorm16(s, dst[i]);
5636         s += 2;
5637      }
5638      break;
5639   case MESA_FORMAT_R_UNORM8:
5640      for (i = 0; i < n; ++i) {
5641         unpack_float_r_unorm8(s, dst[i]);
5642         s += 1;
5643      }
5644      break;
5645   case MESA_FORMAT_R_UNORM16:
5646      for (i = 0; i < n; ++i) {
5647         unpack_float_r_unorm16(s, dst[i]);
5648         s += 2;
5649      }
5650      break;
5651   case MESA_FORMAT_BGR_UNORM8:
5652      for (i = 0; i < n; ++i) {
5653         unpack_float_bgr_unorm8(s, dst[i]);
5654         s += 3;
5655      }
5656      break;
5657   case MESA_FORMAT_RGB_UNORM8:
5658      for (i = 0; i < n; ++i) {
5659         unpack_float_rgb_unorm8(s, dst[i]);
5660         s += 3;
5661      }
5662      break;
5663   case MESA_FORMAT_RGBA_UNORM16:
5664      for (i = 0; i < n; ++i) {
5665         unpack_float_rgba_unorm16(s, dst[i]);
5666         s += 8;
5667      }
5668      break;
5669   case MESA_FORMAT_RGBX_UNORM16:
5670      for (i = 0; i < n; ++i) {
5671         unpack_float_rgbx_unorm16(s, dst[i]);
5672         s += 8;
5673      }
5674      break;
5675   case MESA_FORMAT_A8B8G8R8_SNORM:
5676      for (i = 0; i < n; ++i) {
5677         unpack_float_a8b8g8r8_snorm(s, dst[i]);
5678         s += 4;
5679      }
5680      break;
5681   case MESA_FORMAT_X8B8G8R8_SNORM:
5682      for (i = 0; i < n; ++i) {
5683         unpack_float_x8b8g8r8_snorm(s, dst[i]);
5684         s += 4;
5685      }
5686      break;
5687   case MESA_FORMAT_R8G8B8A8_SNORM:
5688      for (i = 0; i < n; ++i) {
5689         unpack_float_r8g8b8a8_snorm(s, dst[i]);
5690         s += 4;
5691      }
5692      break;
5693   case MESA_FORMAT_R8G8B8X8_SNORM:
5694      for (i = 0; i < n; ++i) {
5695         unpack_float_r8g8b8x8_snorm(s, dst[i]);
5696         s += 4;
5697      }
5698      break;
5699   case MESA_FORMAT_R16G16_SNORM:
5700      for (i = 0; i < n; ++i) {
5701         unpack_float_r16g16_snorm(s, dst[i]);
5702         s += 4;
5703      }
5704      break;
5705   case MESA_FORMAT_G16R16_SNORM:
5706      for (i = 0; i < n; ++i) {
5707         unpack_float_g16r16_snorm(s, dst[i]);
5708         s += 4;
5709      }
5710      break;
5711   case MESA_FORMAT_R8G8_SNORM:
5712      for (i = 0; i < n; ++i) {
5713         unpack_float_r8g8_snorm(s, dst[i]);
5714         s += 2;
5715      }
5716      break;
5717   case MESA_FORMAT_G8R8_SNORM:
5718      for (i = 0; i < n; ++i) {
5719         unpack_float_g8r8_snorm(s, dst[i]);
5720         s += 2;
5721      }
5722      break;
5723   case MESA_FORMAT_L8A8_SNORM:
5724      for (i = 0; i < n; ++i) {
5725         unpack_float_l8a8_snorm(s, dst[i]);
5726         s += 2;
5727      }
5728      break;
5729   case MESA_FORMAT_A8L8_SNORM:
5730      for (i = 0; i < n; ++i) {
5731         unpack_float_a8l8_snorm(s, dst[i]);
5732         s += 2;
5733      }
5734      break;
5735   case MESA_FORMAT_A_SNORM8:
5736      for (i = 0; i < n; ++i) {
5737         unpack_float_a_snorm8(s, dst[i]);
5738         s += 1;
5739      }
5740      break;
5741   case MESA_FORMAT_A_SNORM16:
5742      for (i = 0; i < n; ++i) {
5743         unpack_float_a_snorm16(s, dst[i]);
5744         s += 2;
5745      }
5746      break;
5747   case MESA_FORMAT_L_SNORM8:
5748      for (i = 0; i < n; ++i) {
5749         unpack_float_l_snorm8(s, dst[i]);
5750         s += 1;
5751      }
5752      break;
5753   case MESA_FORMAT_L_SNORM16:
5754      for (i = 0; i < n; ++i) {
5755         unpack_float_l_snorm16(s, dst[i]);
5756         s += 2;
5757      }
5758      break;
5759   case MESA_FORMAT_I_SNORM8:
5760      for (i = 0; i < n; ++i) {
5761         unpack_float_i_snorm8(s, dst[i]);
5762         s += 1;
5763      }
5764      break;
5765   case MESA_FORMAT_I_SNORM16:
5766      for (i = 0; i < n; ++i) {
5767         unpack_float_i_snorm16(s, dst[i]);
5768         s += 2;
5769      }
5770      break;
5771   case MESA_FORMAT_R_SNORM8:
5772      for (i = 0; i < n; ++i) {
5773         unpack_float_r_snorm8(s, dst[i]);
5774         s += 1;
5775      }
5776      break;
5777   case MESA_FORMAT_R_SNORM16:
5778      for (i = 0; i < n; ++i) {
5779         unpack_float_r_snorm16(s, dst[i]);
5780         s += 2;
5781      }
5782      break;
5783   case MESA_FORMAT_LA_SNORM16:
5784      for (i = 0; i < n; ++i) {
5785         unpack_float_la_snorm16(s, dst[i]);
5786         s += 4;
5787      }
5788      break;
5789   case MESA_FORMAT_RGB_SNORM16:
5790      for (i = 0; i < n; ++i) {
5791         unpack_float_rgb_snorm16(s, dst[i]);
5792         s += 6;
5793      }
5794      break;
5795   case MESA_FORMAT_RGBA_SNORM16:
5796      for (i = 0; i < n; ++i) {
5797         unpack_float_rgba_snorm16(s, dst[i]);
5798         s += 8;
5799      }
5800      break;
5801   case MESA_FORMAT_RGBX_SNORM16:
5802      for (i = 0; i < n; ++i) {
5803         unpack_float_rgbx_snorm16(s, dst[i]);
5804         s += 8;
5805      }
5806      break;
5807   case MESA_FORMAT_A8B8G8R8_SRGB:
5808      for (i = 0; i < n; ++i) {
5809         unpack_float_a8b8g8r8_srgb(s, dst[i]);
5810         s += 4;
5811      }
5812      break;
5813   case MESA_FORMAT_B8G8R8A8_SRGB:
5814      for (i = 0; i < n; ++i) {
5815         unpack_float_b8g8r8a8_srgb(s, dst[i]);
5816         s += 4;
5817      }
5818      break;
5819   case MESA_FORMAT_A8R8G8B8_SRGB:
5820      for (i = 0; i < n; ++i) {
5821         unpack_float_a8r8g8b8_srgb(s, dst[i]);
5822         s += 4;
5823      }
5824      break;
5825   case MESA_FORMAT_B8G8R8X8_SRGB:
5826      for (i = 0; i < n; ++i) {
5827         unpack_float_b8g8r8x8_srgb(s, dst[i]);
5828         s += 4;
5829      }
5830      break;
5831   case MESA_FORMAT_X8R8G8B8_SRGB:
5832      for (i = 0; i < n; ++i) {
5833         unpack_float_x8r8g8b8_srgb(s, dst[i]);
5834         s += 4;
5835      }
5836      break;
5837   case MESA_FORMAT_R8G8B8A8_SRGB:
5838      for (i = 0; i < n; ++i) {
5839         unpack_float_r8g8b8a8_srgb(s, dst[i]);
5840         s += 4;
5841      }
5842      break;
5843   case MESA_FORMAT_R8G8B8X8_SRGB:
5844      for (i = 0; i < n; ++i) {
5845         unpack_float_r8g8b8x8_srgb(s, dst[i]);
5846         s += 4;
5847      }
5848      break;
5849   case MESA_FORMAT_X8B8G8R8_SRGB:
5850      for (i = 0; i < n; ++i) {
5851         unpack_float_x8b8g8r8_srgb(s, dst[i]);
5852         s += 4;
5853      }
5854      break;
5855   case MESA_FORMAT_L8A8_SRGB:
5856      for (i = 0; i < n; ++i) {
5857         unpack_float_l8a8_srgb(s, dst[i]);
5858         s += 2;
5859      }
5860      break;
5861   case MESA_FORMAT_A8L8_SRGB:
5862      for (i = 0; i < n; ++i) {
5863         unpack_float_a8l8_srgb(s, dst[i]);
5864         s += 2;
5865      }
5866      break;
5867   case MESA_FORMAT_R_SRGB8:
5868      for (i = 0; i < n; ++i) {
5869         unpack_float_r_srgb8(s, dst[i]);
5870         s += 1;
5871      }
5872      break;
5873   case MESA_FORMAT_L_SRGB8:
5874      for (i = 0; i < n; ++i) {
5875         unpack_float_l_srgb8(s, dst[i]);
5876         s += 1;
5877      }
5878      break;
5879   case MESA_FORMAT_BGR_SRGB8:
5880      for (i = 0; i < n; ++i) {
5881         unpack_float_bgr_srgb8(s, dst[i]);
5882         s += 3;
5883      }
5884      break;
5885   case MESA_FORMAT_R9G9B9E5_FLOAT:
5886      for (i = 0; i < n; ++i) {
5887         unpack_float_r9g9b9e5_float(s, dst[i]);
5888         s += 4;
5889      }
5890      break;
5891   case MESA_FORMAT_R11G11B10_FLOAT:
5892      for (i = 0; i < n; ++i) {
5893         unpack_float_r11g11b10_float(s, dst[i]);
5894         s += 4;
5895      }
5896      break;
5897   case MESA_FORMAT_A_FLOAT16:
5898      for (i = 0; i < n; ++i) {
5899         unpack_float_a_float16(s, dst[i]);
5900         s += 2;
5901      }
5902      break;
5903   case MESA_FORMAT_A_FLOAT32:
5904      for (i = 0; i < n; ++i) {
5905         unpack_float_a_float32(s, dst[i]);
5906         s += 4;
5907      }
5908      break;
5909   case MESA_FORMAT_L_FLOAT16:
5910      for (i = 0; i < n; ++i) {
5911         unpack_float_l_float16(s, dst[i]);
5912         s += 2;
5913      }
5914      break;
5915   case MESA_FORMAT_L_FLOAT32:
5916      for (i = 0; i < n; ++i) {
5917         unpack_float_l_float32(s, dst[i]);
5918         s += 4;
5919      }
5920      break;
5921   case MESA_FORMAT_LA_FLOAT16:
5922      for (i = 0; i < n; ++i) {
5923         unpack_float_la_float16(s, dst[i]);
5924         s += 4;
5925      }
5926      break;
5927   case MESA_FORMAT_LA_FLOAT32:
5928      for (i = 0; i < n; ++i) {
5929         unpack_float_la_float32(s, dst[i]);
5930         s += 8;
5931      }
5932      break;
5933   case MESA_FORMAT_I_FLOAT16:
5934      for (i = 0; i < n; ++i) {
5935         unpack_float_i_float16(s, dst[i]);
5936         s += 2;
5937      }
5938      break;
5939   case MESA_FORMAT_I_FLOAT32:
5940      for (i = 0; i < n; ++i) {
5941         unpack_float_i_float32(s, dst[i]);
5942         s += 4;
5943      }
5944      break;
5945   case MESA_FORMAT_R_FLOAT16:
5946      for (i = 0; i < n; ++i) {
5947         unpack_float_r_float16(s, dst[i]);
5948         s += 2;
5949      }
5950      break;
5951   case MESA_FORMAT_R_FLOAT32:
5952      for (i = 0; i < n; ++i) {
5953         unpack_float_r_float32(s, dst[i]);
5954         s += 4;
5955      }
5956      break;
5957   case MESA_FORMAT_RG_FLOAT16:
5958      for (i = 0; i < n; ++i) {
5959         unpack_float_rg_float16(s, dst[i]);
5960         s += 4;
5961      }
5962      break;
5963   case MESA_FORMAT_RG_FLOAT32:
5964      for (i = 0; i < n; ++i) {
5965         unpack_float_rg_float32(s, dst[i]);
5966         s += 8;
5967      }
5968      break;
5969   case MESA_FORMAT_RGB_FLOAT16:
5970      for (i = 0; i < n; ++i) {
5971         unpack_float_rgb_float16(s, dst[i]);
5972         s += 6;
5973      }
5974      break;
5975   case MESA_FORMAT_RGB_FLOAT32:
5976      for (i = 0; i < n; ++i) {
5977         unpack_float_rgb_float32(s, dst[i]);
5978         s += 12;
5979      }
5980      break;
5981   case MESA_FORMAT_RGBA_FLOAT16:
5982      for (i = 0; i < n; ++i) {
5983         unpack_float_rgba_float16(s, dst[i]);
5984         s += 8;
5985      }
5986      break;
5987   case MESA_FORMAT_RGBA_FLOAT32:
5988      for (i = 0; i < n; ++i) {
5989         unpack_float_rgba_float32(s, dst[i]);
5990         s += 16;
5991      }
5992      break;
5993   case MESA_FORMAT_RGBX_FLOAT16:
5994      for (i = 0; i < n; ++i) {
5995         unpack_float_rgbx_float16(s, dst[i]);
5996         s += 8;
5997      }
5998      break;
5999   case MESA_FORMAT_RGBX_FLOAT32:
6000      for (i = 0; i < n; ++i) {
6001         unpack_float_rgbx_float32(s, dst[i]);
6002         s += 16;
6003      }
6004      break;
6005                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       case MESA_FORMAT_YCBCR:
6006      unpack_float_ycbcr(src, dst, n);
6007      break;
6008   case MESA_FORMAT_YCBCR_REV:
6009      unpack_float_ycbcr_rev(src, dst, n);
6010      break;
6011   default:
6012      _mesa_problem(NULL, "%s: bad format %s", __func__,
6013                    _mesa_get_format_name(format));
6014      return;
6015   }
6016}
6017
6018void
6019_mesa_unpack_ubyte_rgba_row(mesa_format format, GLuint n,
6020                            const void *src, GLubyte dst[][4])
6021{
6022   GLubyte *s = (GLubyte *)src;
6023   GLuint i;
6024
6025   switch (format) {
6026
6027   case MESA_FORMAT_A8B8G8R8_UNORM:
6028      for (i = 0; i < n; ++i) {
6029         unpack_ubyte_a8b8g8r8_unorm(s, dst[i]);
6030         s += 4;
6031      }
6032      break;
6033
6034   case MESA_FORMAT_X8B8G8R8_UNORM:
6035      for (i = 0; i < n; ++i) {
6036         unpack_ubyte_x8b8g8r8_unorm(s, dst[i]);
6037         s += 4;
6038      }
6039      break;
6040
6041   case MESA_FORMAT_R8G8B8A8_UNORM:
6042      for (i = 0; i < n; ++i) {
6043         unpack_ubyte_r8g8b8a8_unorm(s, dst[i]);
6044         s += 4;
6045      }
6046      break;
6047
6048   case MESA_FORMAT_R8G8B8X8_UNORM:
6049      for (i = 0; i < n; ++i) {
6050         unpack_ubyte_r8g8b8x8_unorm(s, dst[i]);
6051         s += 4;
6052      }
6053      break;
6054
6055   case MESA_FORMAT_B8G8R8A8_UNORM:
6056      for (i = 0; i < n; ++i) {
6057         unpack_ubyte_b8g8r8a8_unorm(s, dst[i]);
6058         s += 4;
6059      }
6060      break;
6061
6062   case MESA_FORMAT_B8G8R8X8_UNORM:
6063      for (i = 0; i < n; ++i) {
6064         unpack_ubyte_b8g8r8x8_unorm(s, dst[i]);
6065         s += 4;
6066      }
6067      break;
6068
6069   case MESA_FORMAT_A8R8G8B8_UNORM:
6070      for (i = 0; i < n; ++i) {
6071         unpack_ubyte_a8r8g8b8_unorm(s, dst[i]);
6072         s += 4;
6073      }
6074      break;
6075
6076   case MESA_FORMAT_X8R8G8B8_UNORM:
6077      for (i = 0; i < n; ++i) {
6078         unpack_ubyte_x8r8g8b8_unorm(s, dst[i]);
6079         s += 4;
6080      }
6081      break;
6082
6083   case MESA_FORMAT_L16A16_UNORM:
6084      for (i = 0; i < n; ++i) {
6085         unpack_ubyte_l16a16_unorm(s, dst[i]);
6086         s += 4;
6087      }
6088      break;
6089
6090   case MESA_FORMAT_A16L16_UNORM:
6091      for (i = 0; i < n; ++i) {
6092         unpack_ubyte_a16l16_unorm(s, dst[i]);
6093         s += 4;
6094      }
6095      break;
6096
6097   case MESA_FORMAT_B5G6R5_UNORM:
6098      for (i = 0; i < n; ++i) {
6099         unpack_ubyte_b5g6r5_unorm(s, dst[i]);
6100         s += 2;
6101      }
6102      break;
6103
6104   case MESA_FORMAT_R5G6B5_UNORM:
6105      for (i = 0; i < n; ++i) {
6106         unpack_ubyte_r5g6b5_unorm(s, dst[i]);
6107         s += 2;
6108      }
6109      break;
6110
6111   case MESA_FORMAT_B4G4R4A4_UNORM:
6112      for (i = 0; i < n; ++i) {
6113         unpack_ubyte_b4g4r4a4_unorm(s, dst[i]);
6114         s += 2;
6115      }
6116      break;
6117
6118   case MESA_FORMAT_B4G4R4X4_UNORM:
6119      for (i = 0; i < n; ++i) {
6120         unpack_ubyte_b4g4r4x4_unorm(s, dst[i]);
6121         s += 2;
6122      }
6123      break;
6124
6125   case MESA_FORMAT_A4R4G4B4_UNORM:
6126      for (i = 0; i < n; ++i) {
6127         unpack_ubyte_a4r4g4b4_unorm(s, dst[i]);
6128         s += 2;
6129      }
6130      break;
6131
6132   case MESA_FORMAT_A1B5G5R5_UNORM:
6133      for (i = 0; i < n; ++i) {
6134         unpack_ubyte_a1b5g5r5_unorm(s, dst[i]);
6135         s += 2;
6136      }
6137      break;
6138
6139   case MESA_FORMAT_X1B5G5R5_UNORM:
6140      for (i = 0; i < n; ++i) {
6141         unpack_ubyte_x1b5g5r5_unorm(s, dst[i]);
6142         s += 2;
6143      }
6144      break;
6145
6146   case MESA_FORMAT_B5G5R5A1_UNORM:
6147      for (i = 0; i < n; ++i) {
6148         unpack_ubyte_b5g5r5a1_unorm(s, dst[i]);
6149         s += 2;
6150      }
6151      break;
6152
6153   case MESA_FORMAT_B5G5R5X1_UNORM:
6154      for (i = 0; i < n; ++i) {
6155         unpack_ubyte_b5g5r5x1_unorm(s, dst[i]);
6156         s += 2;
6157      }
6158      break;
6159
6160   case MESA_FORMAT_A1R5G5B5_UNORM:
6161      for (i = 0; i < n; ++i) {
6162         unpack_ubyte_a1r5g5b5_unorm(s, dst[i]);
6163         s += 2;
6164      }
6165      break;
6166
6167   case MESA_FORMAT_L8A8_UNORM:
6168      for (i = 0; i < n; ++i) {
6169         unpack_ubyte_l8a8_unorm(s, dst[i]);
6170         s += 2;
6171      }
6172      break;
6173
6174   case MESA_FORMAT_A8L8_UNORM:
6175      for (i = 0; i < n; ++i) {
6176         unpack_ubyte_a8l8_unorm(s, dst[i]);
6177         s += 2;
6178      }
6179      break;
6180
6181   case MESA_FORMAT_R8G8_UNORM:
6182      for (i = 0; i < n; ++i) {
6183         unpack_ubyte_r8g8_unorm(s, dst[i]);
6184         s += 2;
6185      }
6186      break;
6187
6188   case MESA_FORMAT_G8R8_UNORM:
6189      for (i = 0; i < n; ++i) {
6190         unpack_ubyte_g8r8_unorm(s, dst[i]);
6191         s += 2;
6192      }
6193      break;
6194
6195   case MESA_FORMAT_L4A4_UNORM:
6196      for (i = 0; i < n; ++i) {
6197         unpack_ubyte_l4a4_unorm(s, dst[i]);
6198         s += 1;
6199      }
6200      break;
6201
6202   case MESA_FORMAT_B2G3R3_UNORM:
6203      for (i = 0; i < n; ++i) {
6204         unpack_ubyte_b2g3r3_unorm(s, dst[i]);
6205         s += 1;
6206      }
6207      break;
6208
6209   case MESA_FORMAT_R16G16_UNORM:
6210      for (i = 0; i < n; ++i) {
6211         unpack_ubyte_r16g16_unorm(s, dst[i]);
6212         s += 4;
6213      }
6214      break;
6215
6216   case MESA_FORMAT_G16R16_UNORM:
6217      for (i = 0; i < n; ++i) {
6218         unpack_ubyte_g16r16_unorm(s, dst[i]);
6219         s += 4;
6220      }
6221      break;
6222
6223   case MESA_FORMAT_B10G10R10A2_UNORM:
6224      for (i = 0; i < n; ++i) {
6225         unpack_ubyte_b10g10r10a2_unorm(s, dst[i]);
6226         s += 4;
6227      }
6228      break;
6229
6230   case MESA_FORMAT_B10G10R10X2_UNORM:
6231      for (i = 0; i < n; ++i) {
6232         unpack_ubyte_b10g10r10x2_unorm(s, dst[i]);
6233         s += 4;
6234      }
6235      break;
6236
6237   case MESA_FORMAT_R10G10B10A2_UNORM:
6238      for (i = 0; i < n; ++i) {
6239         unpack_ubyte_r10g10b10a2_unorm(s, dst[i]);
6240         s += 4;
6241      }
6242      break;
6243
6244   case MESA_FORMAT_R10G10B10X2_UNORM:
6245      for (i = 0; i < n; ++i) {
6246         unpack_ubyte_r10g10b10x2_unorm(s, dst[i]);
6247         s += 4;
6248      }
6249      break;
6250
6251   case MESA_FORMAT_R3G3B2_UNORM:
6252      for (i = 0; i < n; ++i) {
6253         unpack_ubyte_r3g3b2_unorm(s, dst[i]);
6254         s += 1;
6255      }
6256      break;
6257
6258   case MESA_FORMAT_A4B4G4R4_UNORM:
6259      for (i = 0; i < n; ++i) {
6260         unpack_ubyte_a4b4g4r4_unorm(s, dst[i]);
6261         s += 2;
6262      }
6263      break;
6264
6265   case MESA_FORMAT_R4G4B4A4_UNORM:
6266      for (i = 0; i < n; ++i) {
6267         unpack_ubyte_r4g4b4a4_unorm(s, dst[i]);
6268         s += 2;
6269      }
6270      break;
6271
6272   case MESA_FORMAT_R5G5B5A1_UNORM:
6273      for (i = 0; i < n; ++i) {
6274         unpack_ubyte_r5g5b5a1_unorm(s, dst[i]);
6275         s += 2;
6276      }
6277      break;
6278
6279   case MESA_FORMAT_A2B10G10R10_UNORM:
6280      for (i = 0; i < n; ++i) {
6281         unpack_ubyte_a2b10g10r10_unorm(s, dst[i]);
6282         s += 4;
6283      }
6284      break;
6285
6286   case MESA_FORMAT_A2R10G10B10_UNORM:
6287      for (i = 0; i < n; ++i) {
6288         unpack_ubyte_a2r10g10b10_unorm(s, dst[i]);
6289         s += 4;
6290      }
6291      break;
6292
6293   case MESA_FORMAT_A_UNORM8:
6294      for (i = 0; i < n; ++i) {
6295         unpack_ubyte_a_unorm8(s, dst[i]);
6296         s += 1;
6297      }
6298      break;
6299
6300   case MESA_FORMAT_A_UNORM16:
6301      for (i = 0; i < n; ++i) {
6302         unpack_ubyte_a_unorm16(s, dst[i]);
6303         s += 2;
6304      }
6305      break;
6306
6307   case MESA_FORMAT_L_UNORM8:
6308      for (i = 0; i < n; ++i) {
6309         unpack_ubyte_l_unorm8(s, dst[i]);
6310         s += 1;
6311      }
6312      break;
6313
6314   case MESA_FORMAT_L_UNORM16:
6315      for (i = 0; i < n; ++i) {
6316         unpack_ubyte_l_unorm16(s, dst[i]);
6317         s += 2;
6318      }
6319      break;
6320
6321   case MESA_FORMAT_I_UNORM8:
6322      for (i = 0; i < n; ++i) {
6323         unpack_ubyte_i_unorm8(s, dst[i]);
6324         s += 1;
6325      }
6326      break;
6327
6328   case MESA_FORMAT_I_UNORM16:
6329      for (i = 0; i < n; ++i) {
6330         unpack_ubyte_i_unorm16(s, dst[i]);
6331         s += 2;
6332      }
6333      break;
6334
6335   case MESA_FORMAT_R_UNORM8:
6336      for (i = 0; i < n; ++i) {
6337         unpack_ubyte_r_unorm8(s, dst[i]);
6338         s += 1;
6339      }
6340      break;
6341
6342   case MESA_FORMAT_R_UNORM16:
6343      for (i = 0; i < n; ++i) {
6344         unpack_ubyte_r_unorm16(s, dst[i]);
6345         s += 2;
6346      }
6347      break;
6348
6349   case MESA_FORMAT_BGR_UNORM8:
6350      for (i = 0; i < n; ++i) {
6351         unpack_ubyte_bgr_unorm8(s, dst[i]);
6352         s += 3;
6353      }
6354      break;
6355
6356   case MESA_FORMAT_RGB_UNORM8:
6357      for (i = 0; i < n; ++i) {
6358         unpack_ubyte_rgb_unorm8(s, dst[i]);
6359         s += 3;
6360      }
6361      break;
6362
6363   case MESA_FORMAT_RGBA_UNORM16:
6364      for (i = 0; i < n; ++i) {
6365         unpack_ubyte_rgba_unorm16(s, dst[i]);
6366         s += 8;
6367      }
6368      break;
6369
6370   case MESA_FORMAT_RGBX_UNORM16:
6371      for (i = 0; i < n; ++i) {
6372         unpack_ubyte_rgbx_unorm16(s, dst[i]);
6373         s += 8;
6374      }
6375      break;
6376
6377   case MESA_FORMAT_A8B8G8R8_SNORM:
6378      for (i = 0; i < n; ++i) {
6379         unpack_ubyte_a8b8g8r8_snorm(s, dst[i]);
6380         s += 4;
6381      }
6382      break;
6383
6384   case MESA_FORMAT_X8B8G8R8_SNORM:
6385      for (i = 0; i < n; ++i) {
6386         unpack_ubyte_x8b8g8r8_snorm(s, dst[i]);
6387         s += 4;
6388      }
6389      break;
6390
6391   case MESA_FORMAT_R8G8B8A8_SNORM:
6392      for (i = 0; i < n; ++i) {
6393         unpack_ubyte_r8g8b8a8_snorm(s, dst[i]);
6394         s += 4;
6395      }
6396      break;
6397
6398   case MESA_FORMAT_R8G8B8X8_SNORM:
6399      for (i = 0; i < n; ++i) {
6400         unpack_ubyte_r8g8b8x8_snorm(s, dst[i]);
6401         s += 4;
6402      }
6403      break;
6404
6405   case MESA_FORMAT_R16G16_SNORM:
6406      for (i = 0; i < n; ++i) {
6407         unpack_ubyte_r16g16_snorm(s, dst[i]);
6408         s += 4;
6409      }
6410      break;
6411
6412   case MESA_FORMAT_G16R16_SNORM:
6413      for (i = 0; i < n; ++i) {
6414         unpack_ubyte_g16r16_snorm(s, dst[i]);
6415         s += 4;
6416      }
6417      break;
6418
6419   case MESA_FORMAT_R8G8_SNORM:
6420      for (i = 0; i < n; ++i) {
6421         unpack_ubyte_r8g8_snorm(s, dst[i]);
6422         s += 2;
6423      }
6424      break;
6425
6426   case MESA_FORMAT_G8R8_SNORM:
6427      for (i = 0; i < n; ++i) {
6428         unpack_ubyte_g8r8_snorm(s, dst[i]);
6429         s += 2;
6430      }
6431      break;
6432
6433   case MESA_FORMAT_L8A8_SNORM:
6434      for (i = 0; i < n; ++i) {
6435         unpack_ubyte_l8a8_snorm(s, dst[i]);
6436         s += 2;
6437      }
6438      break;
6439
6440   case MESA_FORMAT_A8L8_SNORM:
6441      for (i = 0; i < n; ++i) {
6442         unpack_ubyte_a8l8_snorm(s, dst[i]);
6443         s += 2;
6444      }
6445      break;
6446
6447   case MESA_FORMAT_A_SNORM8:
6448      for (i = 0; i < n; ++i) {
6449         unpack_ubyte_a_snorm8(s, dst[i]);
6450         s += 1;
6451      }
6452      break;
6453
6454   case MESA_FORMAT_A_SNORM16:
6455      for (i = 0; i < n; ++i) {
6456         unpack_ubyte_a_snorm16(s, dst[i]);
6457         s += 2;
6458      }
6459      break;
6460
6461   case MESA_FORMAT_L_SNORM8:
6462      for (i = 0; i < n; ++i) {
6463         unpack_ubyte_l_snorm8(s, dst[i]);
6464         s += 1;
6465      }
6466      break;
6467
6468   case MESA_FORMAT_L_SNORM16:
6469      for (i = 0; i < n; ++i) {
6470         unpack_ubyte_l_snorm16(s, dst[i]);
6471         s += 2;
6472      }
6473      break;
6474
6475   case MESA_FORMAT_I_SNORM8:
6476      for (i = 0; i < n; ++i) {
6477         unpack_ubyte_i_snorm8(s, dst[i]);
6478         s += 1;
6479      }
6480      break;
6481
6482   case MESA_FORMAT_I_SNORM16:
6483      for (i = 0; i < n; ++i) {
6484         unpack_ubyte_i_snorm16(s, dst[i]);
6485         s += 2;
6486      }
6487      break;
6488
6489   case MESA_FORMAT_R_SNORM8:
6490      for (i = 0; i < n; ++i) {
6491         unpack_ubyte_r_snorm8(s, dst[i]);
6492         s += 1;
6493      }
6494      break;
6495
6496   case MESA_FORMAT_R_SNORM16:
6497      for (i = 0; i < n; ++i) {
6498         unpack_ubyte_r_snorm16(s, dst[i]);
6499         s += 2;
6500      }
6501      break;
6502
6503   case MESA_FORMAT_LA_SNORM16:
6504      for (i = 0; i < n; ++i) {
6505         unpack_ubyte_la_snorm16(s, dst[i]);
6506         s += 4;
6507      }
6508      break;
6509
6510   case MESA_FORMAT_RGB_SNORM16:
6511      for (i = 0; i < n; ++i) {
6512         unpack_ubyte_rgb_snorm16(s, dst[i]);
6513         s += 6;
6514      }
6515      break;
6516
6517   case MESA_FORMAT_RGBA_SNORM16:
6518      for (i = 0; i < n; ++i) {
6519         unpack_ubyte_rgba_snorm16(s, dst[i]);
6520         s += 8;
6521      }
6522      break;
6523
6524   case MESA_FORMAT_RGBX_SNORM16:
6525      for (i = 0; i < n; ++i) {
6526         unpack_ubyte_rgbx_snorm16(s, dst[i]);
6527         s += 8;
6528      }
6529      break;
6530
6531   case MESA_FORMAT_A8B8G8R8_SRGB:
6532      for (i = 0; i < n; ++i) {
6533         unpack_ubyte_a8b8g8r8_srgb(s, dst[i]);
6534         s += 4;
6535      }
6536      break;
6537
6538   case MESA_FORMAT_B8G8R8A8_SRGB:
6539      for (i = 0; i < n; ++i) {
6540         unpack_ubyte_b8g8r8a8_srgb(s, dst[i]);
6541         s += 4;
6542      }
6543      break;
6544
6545   case MESA_FORMAT_A8R8G8B8_SRGB:
6546      for (i = 0; i < n; ++i) {
6547         unpack_ubyte_a8r8g8b8_srgb(s, dst[i]);
6548         s += 4;
6549      }
6550      break;
6551
6552   case MESA_FORMAT_B8G8R8X8_SRGB:
6553      for (i = 0; i < n; ++i) {
6554         unpack_ubyte_b8g8r8x8_srgb(s, dst[i]);
6555         s += 4;
6556      }
6557      break;
6558
6559   case MESA_FORMAT_X8R8G8B8_SRGB:
6560      for (i = 0; i < n; ++i) {
6561         unpack_ubyte_x8r8g8b8_srgb(s, dst[i]);
6562         s += 4;
6563      }
6564      break;
6565
6566   case MESA_FORMAT_R8G8B8A8_SRGB:
6567      for (i = 0; i < n; ++i) {
6568         unpack_ubyte_r8g8b8a8_srgb(s, dst[i]);
6569         s += 4;
6570      }
6571      break;
6572
6573   case MESA_FORMAT_R8G8B8X8_SRGB:
6574      for (i = 0; i < n; ++i) {
6575         unpack_ubyte_r8g8b8x8_srgb(s, dst[i]);
6576         s += 4;
6577      }
6578      break;
6579
6580   case MESA_FORMAT_X8B8G8R8_SRGB:
6581      for (i = 0; i < n; ++i) {
6582         unpack_ubyte_x8b8g8r8_srgb(s, dst[i]);
6583         s += 4;
6584      }
6585      break;
6586
6587   case MESA_FORMAT_L8A8_SRGB:
6588      for (i = 0; i < n; ++i) {
6589         unpack_ubyte_l8a8_srgb(s, dst[i]);
6590         s += 2;
6591      }
6592      break;
6593
6594   case MESA_FORMAT_A8L8_SRGB:
6595      for (i = 0; i < n; ++i) {
6596         unpack_ubyte_a8l8_srgb(s, dst[i]);
6597         s += 2;
6598      }
6599      break;
6600
6601   case MESA_FORMAT_R_SRGB8:
6602      for (i = 0; i < n; ++i) {
6603         unpack_ubyte_r_srgb8(s, dst[i]);
6604         s += 1;
6605      }
6606      break;
6607
6608   case MESA_FORMAT_L_SRGB8:
6609      for (i = 0; i < n; ++i) {
6610         unpack_ubyte_l_srgb8(s, dst[i]);
6611         s += 1;
6612      }
6613      break;
6614
6615   case MESA_FORMAT_BGR_SRGB8:
6616      for (i = 0; i < n; ++i) {
6617         unpack_ubyte_bgr_srgb8(s, dst[i]);
6618         s += 3;
6619      }
6620      break;
6621                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               default:
6622      /* get float values, convert to ubyte */
6623      {
6624         GLfloat *tmp = malloc(n * 4 * sizeof(GLfloat));
6625         if (tmp) {
6626            GLuint i;
6627            _mesa_unpack_rgba_row(format, n, src, (GLfloat (*)[4]) tmp);
6628            for (i = 0; i < n; i++) {
6629               dst[i][0] = _mesa_float_to_unorm(tmp[i*4+0], 8);
6630               dst[i][1] = _mesa_float_to_unorm(tmp[i*4+1], 8);
6631               dst[i][2] = _mesa_float_to_unorm(tmp[i*4+2], 8);
6632               dst[i][3] = _mesa_float_to_unorm(tmp[i*4+3], 8);
6633            }
6634            free(tmp);
6635         }
6636      }
6637      break;
6638   }
6639}
6640
6641void
6642_mesa_unpack_uint_rgba_row(mesa_format format, GLuint n,
6643                           const void *src, GLuint dst[][4])
6644{
6645   GLubyte *s = (GLubyte *)src;
6646   GLuint i;
6647
6648   switch (format) {
6649
6650   case MESA_FORMAT_A8B8G8R8_UINT:
6651      for (i = 0; i < n; ++i) {
6652         unpack_int_a8b8g8r8_uint(s, dst[i]);
6653         s += 4;
6654      }
6655      break;
6656
6657   case MESA_FORMAT_A8R8G8B8_UINT:
6658      for (i = 0; i < n; ++i) {
6659         unpack_int_a8r8g8b8_uint(s, dst[i]);
6660         s += 4;
6661      }
6662      break;
6663
6664   case MESA_FORMAT_R8G8B8A8_UINT:
6665      for (i = 0; i < n; ++i) {
6666         unpack_int_r8g8b8a8_uint(s, dst[i]);
6667         s += 4;
6668      }
6669      break;
6670
6671   case MESA_FORMAT_B8G8R8A8_UINT:
6672      for (i = 0; i < n; ++i) {
6673         unpack_int_b8g8r8a8_uint(s, dst[i]);
6674         s += 4;
6675      }
6676      break;
6677
6678   case MESA_FORMAT_B10G10R10A2_UINT:
6679      for (i = 0; i < n; ++i) {
6680         unpack_int_b10g10r10a2_uint(s, dst[i]);
6681         s += 4;
6682      }
6683      break;
6684
6685   case MESA_FORMAT_R10G10B10A2_UINT:
6686      for (i = 0; i < n; ++i) {
6687         unpack_int_r10g10b10a2_uint(s, dst[i]);
6688         s += 4;
6689      }
6690      break;
6691
6692   case MESA_FORMAT_A2B10G10R10_UINT:
6693      for (i = 0; i < n; ++i) {
6694         unpack_int_a2b10g10r10_uint(s, dst[i]);
6695         s += 4;
6696      }
6697      break;
6698
6699   case MESA_FORMAT_A2R10G10B10_UINT:
6700      for (i = 0; i < n; ++i) {
6701         unpack_int_a2r10g10b10_uint(s, dst[i]);
6702         s += 4;
6703      }
6704      break;
6705
6706   case MESA_FORMAT_B5G6R5_UINT:
6707      for (i = 0; i < n; ++i) {
6708         unpack_int_b5g6r5_uint(s, dst[i]);
6709         s += 2;
6710      }
6711      break;
6712
6713   case MESA_FORMAT_R5G6B5_UINT:
6714      for (i = 0; i < n; ++i) {
6715         unpack_int_r5g6b5_uint(s, dst[i]);
6716         s += 2;
6717      }
6718      break;
6719
6720   case MESA_FORMAT_B2G3R3_UINT:
6721      for (i = 0; i < n; ++i) {
6722         unpack_int_b2g3r3_uint(s, dst[i]);
6723         s += 1;
6724      }
6725      break;
6726
6727   case MESA_FORMAT_R3G3B2_UINT:
6728      for (i = 0; i < n; ++i) {
6729         unpack_int_r3g3b2_uint(s, dst[i]);
6730         s += 1;
6731      }
6732      break;
6733
6734   case MESA_FORMAT_A4B4G4R4_UINT:
6735      for (i = 0; i < n; ++i) {
6736         unpack_int_a4b4g4r4_uint(s, dst[i]);
6737         s += 2;
6738      }
6739      break;
6740
6741   case MESA_FORMAT_R4G4B4A4_UINT:
6742      for (i = 0; i < n; ++i) {
6743         unpack_int_r4g4b4a4_uint(s, dst[i]);
6744         s += 2;
6745      }
6746      break;
6747
6748   case MESA_FORMAT_B4G4R4A4_UINT:
6749      for (i = 0; i < n; ++i) {
6750         unpack_int_b4g4r4a4_uint(s, dst[i]);
6751         s += 2;
6752      }
6753      break;
6754
6755   case MESA_FORMAT_A4R4G4B4_UINT:
6756      for (i = 0; i < n; ++i) {
6757         unpack_int_a4r4g4b4_uint(s, dst[i]);
6758         s += 2;
6759      }
6760      break;
6761
6762   case MESA_FORMAT_A1B5G5R5_UINT:
6763      for (i = 0; i < n; ++i) {
6764         unpack_int_a1b5g5r5_uint(s, dst[i]);
6765         s += 2;
6766      }
6767      break;
6768
6769   case MESA_FORMAT_B5G5R5A1_UINT:
6770      for (i = 0; i < n; ++i) {
6771         unpack_int_b5g5r5a1_uint(s, dst[i]);
6772         s += 2;
6773      }
6774      break;
6775
6776   case MESA_FORMAT_A1R5G5B5_UINT:
6777      for (i = 0; i < n; ++i) {
6778         unpack_int_a1r5g5b5_uint(s, dst[i]);
6779         s += 2;
6780      }
6781      break;
6782
6783   case MESA_FORMAT_R5G5B5A1_UINT:
6784      for (i = 0; i < n; ++i) {
6785         unpack_int_r5g5b5a1_uint(s, dst[i]);
6786         s += 2;
6787      }
6788      break;
6789
6790   case MESA_FORMAT_A_UINT8:
6791      for (i = 0; i < n; ++i) {
6792         unpack_int_a_uint8(s, dst[i]);
6793         s += 1;
6794      }
6795      break;
6796
6797   case MESA_FORMAT_A_UINT16:
6798      for (i = 0; i < n; ++i) {
6799         unpack_int_a_uint16(s, dst[i]);
6800         s += 2;
6801      }
6802      break;
6803
6804   case MESA_FORMAT_A_UINT32:
6805      for (i = 0; i < n; ++i) {
6806         unpack_int_a_uint32(s, dst[i]);
6807         s += 4;
6808      }
6809      break;
6810
6811   case MESA_FORMAT_A_SINT8:
6812      for (i = 0; i < n; ++i) {
6813         unpack_int_a_sint8(s, dst[i]);
6814         s += 1;
6815      }
6816      break;
6817
6818   case MESA_FORMAT_A_SINT16:
6819      for (i = 0; i < n; ++i) {
6820         unpack_int_a_sint16(s, dst[i]);
6821         s += 2;
6822      }
6823      break;
6824
6825   case MESA_FORMAT_A_SINT32:
6826      for (i = 0; i < n; ++i) {
6827         unpack_int_a_sint32(s, dst[i]);
6828         s += 4;
6829      }
6830      break;
6831
6832   case MESA_FORMAT_I_UINT8:
6833      for (i = 0; i < n; ++i) {
6834         unpack_int_i_uint8(s, dst[i]);
6835         s += 1;
6836      }
6837      break;
6838
6839   case MESA_FORMAT_I_UINT16:
6840      for (i = 0; i < n; ++i) {
6841         unpack_int_i_uint16(s, dst[i]);
6842         s += 2;
6843      }
6844      break;
6845
6846   case MESA_FORMAT_I_UINT32:
6847      for (i = 0; i < n; ++i) {
6848         unpack_int_i_uint32(s, dst[i]);
6849         s += 4;
6850      }
6851      break;
6852
6853   case MESA_FORMAT_I_SINT8:
6854      for (i = 0; i < n; ++i) {
6855         unpack_int_i_sint8(s, dst[i]);
6856         s += 1;
6857      }
6858      break;
6859
6860   case MESA_FORMAT_I_SINT16:
6861      for (i = 0; i < n; ++i) {
6862         unpack_int_i_sint16(s, dst[i]);
6863         s += 2;
6864      }
6865      break;
6866
6867   case MESA_FORMAT_I_SINT32:
6868      for (i = 0; i < n; ++i) {
6869         unpack_int_i_sint32(s, dst[i]);
6870         s += 4;
6871      }
6872      break;
6873
6874   case MESA_FORMAT_L_UINT8:
6875      for (i = 0; i < n; ++i) {
6876         unpack_int_l_uint8(s, dst[i]);
6877         s += 1;
6878      }
6879      break;
6880
6881   case MESA_FORMAT_L_UINT16:
6882      for (i = 0; i < n; ++i) {
6883         unpack_int_l_uint16(s, dst[i]);
6884         s += 2;
6885      }
6886      break;
6887
6888   case MESA_FORMAT_L_UINT32:
6889      for (i = 0; i < n; ++i) {
6890         unpack_int_l_uint32(s, dst[i]);
6891         s += 4;
6892      }
6893      break;
6894
6895   case MESA_FORMAT_L_SINT8:
6896      for (i = 0; i < n; ++i) {
6897         unpack_int_l_sint8(s, dst[i]);
6898         s += 1;
6899      }
6900      break;
6901
6902   case MESA_FORMAT_L_SINT16:
6903      for (i = 0; i < n; ++i) {
6904         unpack_int_l_sint16(s, dst[i]);
6905         s += 2;
6906      }
6907      break;
6908
6909   case MESA_FORMAT_L_SINT32:
6910      for (i = 0; i < n; ++i) {
6911         unpack_int_l_sint32(s, dst[i]);
6912         s += 4;
6913      }
6914      break;
6915
6916   case MESA_FORMAT_LA_UINT8:
6917      for (i = 0; i < n; ++i) {
6918         unpack_int_la_uint8(s, dst[i]);
6919         s += 2;
6920      }
6921      break;
6922
6923   case MESA_FORMAT_LA_UINT16:
6924      for (i = 0; i < n; ++i) {
6925         unpack_int_la_uint16(s, dst[i]);
6926         s += 4;
6927      }
6928      break;
6929
6930   case MESA_FORMAT_LA_UINT32:
6931      for (i = 0; i < n; ++i) {
6932         unpack_int_la_uint32(s, dst[i]);
6933         s += 8;
6934      }
6935      break;
6936
6937   case MESA_FORMAT_LA_SINT8:
6938      for (i = 0; i < n; ++i) {
6939         unpack_int_la_sint8(s, dst[i]);
6940         s += 2;
6941      }
6942      break;
6943
6944   case MESA_FORMAT_LA_SINT16:
6945      for (i = 0; i < n; ++i) {
6946         unpack_int_la_sint16(s, dst[i]);
6947         s += 4;
6948      }
6949      break;
6950
6951   case MESA_FORMAT_LA_SINT32:
6952      for (i = 0; i < n; ++i) {
6953         unpack_int_la_sint32(s, dst[i]);
6954         s += 8;
6955      }
6956      break;
6957
6958   case MESA_FORMAT_R_UINT8:
6959      for (i = 0; i < n; ++i) {
6960         unpack_int_r_uint8(s, dst[i]);
6961         s += 1;
6962      }
6963      break;
6964
6965   case MESA_FORMAT_R_UINT16:
6966      for (i = 0; i < n; ++i) {
6967         unpack_int_r_uint16(s, dst[i]);
6968         s += 2;
6969      }
6970      break;
6971
6972   case MESA_FORMAT_R_UINT32:
6973      for (i = 0; i < n; ++i) {
6974         unpack_int_r_uint32(s, dst[i]);
6975         s += 4;
6976      }
6977      break;
6978
6979   case MESA_FORMAT_R_SINT8:
6980      for (i = 0; i < n; ++i) {
6981         unpack_int_r_sint8(s, dst[i]);
6982         s += 1;
6983      }
6984      break;
6985
6986   case MESA_FORMAT_R_SINT16:
6987      for (i = 0; i < n; ++i) {
6988         unpack_int_r_sint16(s, dst[i]);
6989         s += 2;
6990      }
6991      break;
6992
6993   case MESA_FORMAT_R_SINT32:
6994      for (i = 0; i < n; ++i) {
6995         unpack_int_r_sint32(s, dst[i]);
6996         s += 4;
6997      }
6998      break;
6999
7000   case MESA_FORMAT_RG_UINT8:
7001      for (i = 0; i < n; ++i) {
7002         unpack_int_rg_uint8(s, dst[i]);
7003         s += 2;
7004      }
7005      break;
7006
7007   case MESA_FORMAT_RG_UINT16:
7008      for (i = 0; i < n; ++i) {
7009         unpack_int_rg_uint16(s, dst[i]);
7010         s += 4;
7011      }
7012      break;
7013
7014   case MESA_FORMAT_RG_UINT32:
7015      for (i = 0; i < n; ++i) {
7016         unpack_int_rg_uint32(s, dst[i]);
7017         s += 8;
7018      }
7019      break;
7020
7021   case MESA_FORMAT_RG_SINT8:
7022      for (i = 0; i < n; ++i) {
7023         unpack_int_rg_sint8(s, dst[i]);
7024         s += 2;
7025      }
7026      break;
7027
7028   case MESA_FORMAT_RG_SINT16:
7029      for (i = 0; i < n; ++i) {
7030         unpack_int_rg_sint16(s, dst[i]);
7031         s += 4;
7032      }
7033      break;
7034
7035   case MESA_FORMAT_RG_SINT32:
7036      for (i = 0; i < n; ++i) {
7037         unpack_int_rg_sint32(s, dst[i]);
7038         s += 8;
7039      }
7040      break;
7041
7042   case MESA_FORMAT_RGB_UINT8:
7043      for (i = 0; i < n; ++i) {
7044         unpack_int_rgb_uint8(s, dst[i]);
7045         s += 3;
7046      }
7047      break;
7048
7049   case MESA_FORMAT_RGB_UINT16:
7050      for (i = 0; i < n; ++i) {
7051         unpack_int_rgb_uint16(s, dst[i]);
7052         s += 6;
7053      }
7054      break;
7055
7056   case MESA_FORMAT_RGB_UINT32:
7057      for (i = 0; i < n; ++i) {
7058         unpack_int_rgb_uint32(s, dst[i]);
7059         s += 12;
7060      }
7061      break;
7062
7063   case MESA_FORMAT_RGB_SINT8:
7064      for (i = 0; i < n; ++i) {
7065         unpack_int_rgb_sint8(s, dst[i]);
7066         s += 3;
7067      }
7068      break;
7069
7070   case MESA_FORMAT_RGB_SINT16:
7071      for (i = 0; i < n; ++i) {
7072         unpack_int_rgb_sint16(s, dst[i]);
7073         s += 6;
7074      }
7075      break;
7076
7077   case MESA_FORMAT_RGB_SINT32:
7078      for (i = 0; i < n; ++i) {
7079         unpack_int_rgb_sint32(s, dst[i]);
7080         s += 12;
7081      }
7082      break;
7083
7084   case MESA_FORMAT_RGBA_UINT8:
7085      for (i = 0; i < n; ++i) {
7086         unpack_int_rgba_uint8(s, dst[i]);
7087         s += 4;
7088      }
7089      break;
7090
7091   case MESA_FORMAT_RGBA_UINT16:
7092      for (i = 0; i < n; ++i) {
7093         unpack_int_rgba_uint16(s, dst[i]);
7094         s += 8;
7095      }
7096      break;
7097
7098   case MESA_FORMAT_RGBA_UINT32:
7099      for (i = 0; i < n; ++i) {
7100         unpack_int_rgba_uint32(s, dst[i]);
7101         s += 16;
7102      }
7103      break;
7104
7105   case MESA_FORMAT_RGBA_SINT8:
7106      for (i = 0; i < n; ++i) {
7107         unpack_int_rgba_sint8(s, dst[i]);
7108         s += 4;
7109      }
7110      break;
7111
7112   case MESA_FORMAT_RGBA_SINT16:
7113      for (i = 0; i < n; ++i) {
7114         unpack_int_rgba_sint16(s, dst[i]);
7115         s += 8;
7116      }
7117      break;
7118
7119   case MESA_FORMAT_RGBA_SINT32:
7120      for (i = 0; i < n; ++i) {
7121         unpack_int_rgba_sint32(s, dst[i]);
7122         s += 16;
7123      }
7124      break;
7125
7126   case MESA_FORMAT_RGBX_UINT8:
7127      for (i = 0; i < n; ++i) {
7128         unpack_int_rgbx_uint8(s, dst[i]);
7129         s += 4;
7130      }
7131      break;
7132
7133   case MESA_FORMAT_RGBX_UINT16:
7134      for (i = 0; i < n; ++i) {
7135         unpack_int_rgbx_uint16(s, dst[i]);
7136         s += 8;
7137      }
7138      break;
7139
7140   case MESA_FORMAT_RGBX_UINT32:
7141      for (i = 0; i < n; ++i) {
7142         unpack_int_rgbx_uint32(s, dst[i]);
7143         s += 16;
7144      }
7145      break;
7146
7147   case MESA_FORMAT_RGBX_SINT8:
7148      for (i = 0; i < n; ++i) {
7149         unpack_int_rgbx_sint8(s, dst[i]);
7150         s += 4;
7151      }
7152      break;
7153
7154   case MESA_FORMAT_RGBX_SINT16:
7155      for (i = 0; i < n; ++i) {
7156         unpack_int_rgbx_sint16(s, dst[i]);
7157         s += 8;
7158      }
7159      break;
7160
7161   case MESA_FORMAT_RGBX_SINT32:
7162      for (i = 0; i < n; ++i) {
7163         unpack_int_rgbx_sint32(s, dst[i]);
7164         s += 16;
7165      }
7166      break;
7167                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           default:
7168      _mesa_problem(NULL, "%s: bad format %s", __func__,
7169                    _mesa_get_format_name(format));
7170      return;
7171   }
7172}
7173
7174/**
7175 * Unpack a 2D rect of pixels returning float RGBA colors.
7176 * \param format  the source image format
7177 * \param src  start address of the source image
7178 * \param srcRowStride  source image row stride in bytes
7179 * \param dst  start address of the dest image
7180 * \param dstRowStride  dest image row stride in bytes
7181 * \param x  source image start X pos
7182 * \param y  source image start Y pos
7183 * \param width  width of rect region to convert
7184 * \param height  height of rect region to convert
7185 */
7186void
7187_mesa_unpack_rgba_block(mesa_format format,
7188                        const void *src, GLint srcRowStride,
7189                        GLfloat dst[][4], GLint dstRowStride,
7190                        GLuint x, GLuint y, GLuint width, GLuint height)
7191{
7192   const GLuint srcPixStride = _mesa_get_format_bytes(format);
7193   const GLuint dstPixStride = 4 * sizeof(GLfloat);
7194   const GLubyte *srcRow;
7195   GLubyte *dstRow;
7196   GLuint i;
7197
7198   /* XXX needs to be fixed for compressed formats */
7199
7200   srcRow = ((const GLubyte *) src) + srcRowStride * y + srcPixStride * x;
7201   dstRow = ((GLubyte *) dst) + dstRowStride * y + dstPixStride * x;
7202
7203   for (i = 0; i < height; i++) {
7204      _mesa_unpack_rgba_row(format, width, srcRow, (GLfloat (*)[4]) dstRow);
7205
7206      dstRow += dstRowStride;
7207      srcRow += srcRowStride;
7208   }
7209}
7210
7211/** Helper struct for MESA_FORMAT_Z32_FLOAT_S8X24_UINT */
7212struct z32f_x24s8
7213{
7214   float z;
7215   uint32_t x24s8;
7216};
7217
7218typedef void (*unpack_float_z_func)(GLuint n, const void *src, GLfloat *dst);
7219
7220static void
7221unpack_float_z_X8_UINT_Z24_UNORM(GLuint n, const void *src, GLfloat *dst)
7222{
7223   /* only return Z, not stencil data */
7224   const GLuint *s = ((const GLuint *) src);
7225   const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
7226   GLuint i;
7227   for (i = 0; i < n; i++) {
7228      dst[i] = (GLfloat) ((s[i] >> 8) * scale);
7229      assert(dst[i] >= 0.0F);
7230      assert(dst[i] <= 1.0F);
7231   }
7232}
7233
7234static void
7235unpack_float_z_Z24_UNORM_X8_UINT(GLuint n, const void *src, GLfloat *dst)
7236{
7237   /* only return Z, not stencil data */
7238   const GLuint *s = ((const GLuint *) src);
7239   const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
7240   GLuint i;
7241   for (i = 0; i < n; i++) {
7242      dst[i] = (GLfloat) ((s[i] & 0x00ffffff) * scale);
7243      assert(dst[i] >= 0.0F);
7244      assert(dst[i] <= 1.0F);
7245   }
7246}
7247
7248static void
7249unpack_float_Z_UNORM16(GLuint n, const void *src, GLfloat *dst)
7250{
7251   const GLushort *s = ((const GLushort *) src);
7252   GLuint i;
7253   for (i = 0; i < n; i++) {
7254      dst[i] = s[i] * (1.0F / 65535.0F);
7255   }
7256}
7257
7258static void
7259unpack_float_Z_UNORM32(GLuint n, const void *src, GLfloat *dst)
7260{
7261   const GLuint *s = ((const GLuint *) src);
7262   GLuint i;
7263   for (i = 0; i < n; i++) {
7264      dst[i] = s[i] * (1.0F / 0xffffffff);
7265   }
7266}
7267
7268static void
7269unpack_float_Z_FLOAT32(GLuint n, const void *src, GLfloat *dst)
7270{
7271   memcpy(dst, src, n * sizeof(float));
7272}
7273
7274static void
7275unpack_float_z_Z32X24S8(GLuint n, const void *src, GLfloat *dst)
7276{
7277   const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
7278   GLuint i;
7279   for (i = 0; i < n; i++) {
7280      dst[i] = s[i].z;
7281   }
7282}
7283
7284
7285
7286/**
7287 * Unpack Z values.
7288 * The returned values will always be in the range [0.0, 1.0].
7289 */
7290void
7291_mesa_unpack_float_z_row(mesa_format format, GLuint n,
7292                         const void *src, GLfloat *dst)
7293{
7294   unpack_float_z_func unpack;
7295
7296   switch (format) {
7297   case MESA_FORMAT_S8_UINT_Z24_UNORM:
7298   case MESA_FORMAT_X8_UINT_Z24_UNORM:
7299      unpack = unpack_float_z_X8_UINT_Z24_UNORM;
7300      break;
7301   case MESA_FORMAT_Z24_UNORM_S8_UINT:
7302   case MESA_FORMAT_Z24_UNORM_X8_UINT:
7303      unpack = unpack_float_z_Z24_UNORM_X8_UINT;
7304      break;
7305   case MESA_FORMAT_Z_UNORM16:
7306      unpack = unpack_float_Z_UNORM16;
7307      break;
7308   case MESA_FORMAT_Z_UNORM32:
7309      unpack = unpack_float_Z_UNORM32;
7310      break;
7311   case MESA_FORMAT_Z_FLOAT32:
7312      unpack = unpack_float_Z_FLOAT32;
7313      break;
7314   case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
7315      unpack = unpack_float_z_Z32X24S8;
7316      break;
7317   default:
7318      _mesa_problem(NULL, "bad format %s in _mesa_unpack_float_z_row",
7319                    _mesa_get_format_name(format));
7320      return;
7321   }
7322
7323   unpack(n, src, dst);
7324}
7325
7326
7327
7328typedef void (*unpack_uint_z_func)(const void *src, GLuint *dst, GLuint n);
7329
7330static void
7331unpack_uint_z_X8_UINT_Z24_UNORM(const void *src, GLuint *dst, GLuint n)
7332{
7333   /* only return Z, not stencil data */
7334   const GLuint *s = ((const GLuint *) src);
7335   GLuint i;
7336   for (i = 0; i < n; i++) {
7337      dst[i] = (s[i] & 0xffffff00) | (s[i] >> 24);
7338   }
7339}
7340
7341static void
7342unpack_uint_z_Z24_UNORM_X8_UINT(const void *src, GLuint *dst, GLuint n)
7343{
7344   /* only return Z, not stencil data */
7345   const GLuint *s = ((const GLuint *) src);
7346   GLuint i;
7347   for (i = 0; i < n; i++) {
7348      dst[i] = (s[i] << 8) | ((s[i] >> 16) & 0xff);
7349   }
7350}
7351
7352static void
7353unpack_uint_Z_UNORM16(const void *src, GLuint *dst, GLuint n)
7354{
7355   const GLushort *s = ((const GLushort *)src);
7356   GLuint i;
7357   for (i = 0; i < n; i++) {
7358      dst[i] = (s[i] << 16) | s[i];
7359   }
7360}
7361
7362static void
7363unpack_uint_Z_UNORM32(const void *src, GLuint *dst, GLuint n)
7364{
7365   memcpy(dst, src, n * sizeof(GLuint));
7366}
7367
7368static void
7369unpack_uint_Z_FLOAT32(const void *src, GLuint *dst, GLuint n)
7370{
7371   const float *s = (const float *)src;
7372   GLuint i;
7373   for (i = 0; i < n; i++) {
7374      dst[i] = FLOAT_TO_UINT(CLAMP(s[i], 0.0F, 1.0F));
7375   }
7376}
7377
7378static void
7379unpack_uint_Z_FLOAT32_X24S8(const void *src, GLuint *dst, GLuint n)
7380{
7381   const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
7382   GLuint i;
7383
7384   for (i = 0; i < n; i++) {
7385      dst[i] = FLOAT_TO_UINT(CLAMP(s[i].z, 0.0F, 1.0F));
7386   }
7387}
7388
7389
7390/**
7391 * Unpack Z values.
7392 * The returned values will always be in the range [0, 0xffffffff].
7393 */
7394void
7395_mesa_unpack_uint_z_row(mesa_format format, GLuint n,
7396                        const void *src, GLuint *dst)
7397{
7398   unpack_uint_z_func unpack;
7399   const GLubyte *srcPtr = (GLubyte *) src;
7400
7401   switch (format) {
7402   case MESA_FORMAT_S8_UINT_Z24_UNORM:
7403   case MESA_FORMAT_X8_UINT_Z24_UNORM:
7404      unpack = unpack_uint_z_X8_UINT_Z24_UNORM;
7405      break;
7406   case MESA_FORMAT_Z24_UNORM_S8_UINT:
7407   case MESA_FORMAT_Z24_UNORM_X8_UINT:
7408      unpack = unpack_uint_z_Z24_UNORM_X8_UINT;
7409      break;
7410   case MESA_FORMAT_Z_UNORM16:
7411      unpack = unpack_uint_Z_UNORM16;
7412      break;
7413   case MESA_FORMAT_Z_UNORM32:
7414      unpack = unpack_uint_Z_UNORM32;
7415      break;
7416   case MESA_FORMAT_Z_FLOAT32:
7417      unpack = unpack_uint_Z_FLOAT32;
7418      break;
7419   case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
7420      unpack = unpack_uint_Z_FLOAT32_X24S8;
7421      break;
7422   default:
7423      _mesa_problem(NULL, "bad format %s in _mesa_unpack_uint_z_row",
7424                    _mesa_get_format_name(format));
7425      return;
7426   }
7427
7428   unpack(srcPtr, dst, n);
7429}
7430
7431
7432static void
7433unpack_ubyte_s_S_UINT8(const void *src, GLubyte *dst, GLuint n)
7434{
7435   memcpy(dst, src, n);
7436}
7437
7438static void
7439unpack_ubyte_s_S8_UINT_Z24_UNORM(const void *src, GLubyte *dst, GLuint n)
7440{
7441   GLuint i;
7442   const GLuint *src32 = src;
7443
7444   for (i = 0; i < n; i++)
7445      dst[i] = src32[i] & 0xff;
7446}
7447
7448static void
7449unpack_ubyte_s_Z24_UNORM_S8_UINT(const void *src, GLubyte *dst, GLuint n)
7450{
7451   GLuint i;
7452   const GLuint *src32 = src;
7453
7454   for (i = 0; i < n; i++)
7455      dst[i] = src32[i] >> 24;
7456}
7457
7458static void
7459unpack_ubyte_s_Z32_FLOAT_S8X24_UINT(const void *src, GLubyte *dst, GLuint n)
7460{
7461   GLuint i;
7462   const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
7463
7464   for (i = 0; i < n; i++)
7465      dst[i] = s[i].x24s8 & 0xff;
7466}
7467
7468void
7469_mesa_unpack_ubyte_stencil_row(mesa_format format, GLuint n,
7470			       const void *src, GLubyte *dst)
7471{
7472   switch (format) {
7473   case MESA_FORMAT_S_UINT8:
7474      unpack_ubyte_s_S_UINT8(src, dst, n);
7475      break;
7476   case MESA_FORMAT_S8_UINT_Z24_UNORM:
7477      unpack_ubyte_s_S8_UINT_Z24_UNORM(src, dst, n);
7478      break;
7479   case MESA_FORMAT_Z24_UNORM_S8_UINT:
7480      unpack_ubyte_s_Z24_UNORM_S8_UINT(src, dst, n);
7481      break;
7482   case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
7483      unpack_ubyte_s_Z32_FLOAT_S8X24_UINT(src, dst, n);
7484      break;
7485   default:
7486      _mesa_problem(NULL, "bad format %s in _mesa_unpack_ubyte_s_row",
7487                    _mesa_get_format_name(format));
7488      return;
7489   }
7490}
7491
7492static void
7493unpack_uint_24_8_depth_stencil_Z24_UNORM_S8_UINT(const GLuint *src, GLuint *dst, GLuint n)
7494{
7495   GLuint i;
7496
7497   for (i = 0; i < n; i++) {
7498      GLuint val = src[i];
7499      dst[i] = val >> 24 | val << 8;
7500   }
7501}
7502
7503static void
7504unpack_uint_24_8_depth_stencil_Z32_S8X24(const GLuint *src,
7505                                         GLuint *dst, GLuint n)
7506{
7507   GLuint i;
7508
7509   for (i = 0; i < n; i++) {
7510      /* 8 bytes per pixel (float + uint32) */
7511      GLfloat zf = ((GLfloat *) src)[i * 2 + 0];
7512      GLuint z24 = (GLuint) (zf * (GLfloat) 0xffffff);
7513      GLuint s = src[i * 2 + 1] & 0xff;
7514      dst[i] = (z24 << 8) | s;
7515   }
7516}
7517
7518static void
7519unpack_uint_24_8_depth_stencil_S8_UINT_Z24_UNORM(const GLuint *src, GLuint *dst, GLuint n)
7520{
7521   memcpy(dst, src, n * 4);
7522}
7523
7524/**
7525 * Unpack depth/stencil returning as GL_UNSIGNED_INT_24_8.
7526 * \param format  the source data format
7527 */
7528void
7529_mesa_unpack_uint_24_8_depth_stencil_row(mesa_format format, GLuint n,
7530					 const void *src, GLuint *dst)
7531{
7532   switch (format) {
7533   case MESA_FORMAT_S8_UINT_Z24_UNORM:
7534      unpack_uint_24_8_depth_stencil_S8_UINT_Z24_UNORM(src, dst, n);
7535      break;
7536   case MESA_FORMAT_Z24_UNORM_S8_UINT:
7537      unpack_uint_24_8_depth_stencil_Z24_UNORM_S8_UINT(src, dst, n);
7538      break;
7539   case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
7540      unpack_uint_24_8_depth_stencil_Z32_S8X24(src, dst, n);
7541      break;
7542   default:
7543      _mesa_problem(NULL,
7544                    "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row",
7545                    _mesa_get_format_name(format));
7546      return;
7547   }
7548}
7549
7550static void
7551unpack_float_32_uint_24_8_Z24_UNORM_S8_UINT(const GLuint *src,
7552                                            GLuint *dst, GLuint n)
7553{
7554   GLuint i;
7555   struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
7556   const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
7557
7558   for (i = 0; i < n; i++) {
7559      const GLuint z24 = src[i] & 0xffffff;
7560      d[i].z = z24 * scale;
7561      d[i].x24s8 = src[i] >> 24;
7562      assert(d[i].z >= 0.0f);
7563      assert(d[i].z <= 1.0f);
7564   }
7565}
7566
7567static void
7568unpack_float_32_uint_24_8_Z32_FLOAT_S8X24_UINT(const GLuint *src,
7569                                               GLuint *dst, GLuint n)
7570{
7571   memcpy(dst, src, n * sizeof(struct z32f_x24s8));
7572}
7573
7574static void
7575unpack_float_32_uint_24_8_S8_UINT_Z24_UNORM(const GLuint *src,
7576                                            GLuint *dst, GLuint n)
7577{
7578   GLuint i;
7579   struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
7580   const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
7581
7582   for (i = 0; i < n; i++) {
7583      const GLuint z24 = src[i] >> 8;
7584      d[i].z = z24 * scale;
7585      d[i].x24s8 = src[i] & 0xff;
7586      assert(d[i].z >= 0.0f);
7587      assert(d[i].z <= 1.0f);
7588   }
7589}
7590
7591/**
7592 * Unpack depth/stencil returning as GL_FLOAT_32_UNSIGNED_INT_24_8_REV.
7593 * \param format  the source data format
7594 *
7595 * In GL_FLOAT_32_UNSIGNED_INT_24_8_REV lower 4 bytes contain float
7596 * component and higher 4 bytes contain packed 24-bit and 8-bit
7597 * components.
7598 *
7599 *    31 30 29 28 ... 4 3 2 1 0    31 30 29 ... 9 8 7 6 5 ... 2 1 0
7600 *    +-------------------------+  +--------------------------------+
7601 *    |    Float Component      |  | Unused         | 8 bit stencil |
7602 *    +-------------------------+  +--------------------------------+
7603 *          lower 4 bytes                  higher 4 bytes
7604 */
7605void
7606_mesa_unpack_float_32_uint_24_8_depth_stencil_row(mesa_format format, GLuint n,
7607			                          const void *src, GLuint *dst)
7608{
7609   switch (format) {
7610   case MESA_FORMAT_S8_UINT_Z24_UNORM:
7611      unpack_float_32_uint_24_8_S8_UINT_Z24_UNORM(src, dst, n);
7612      break;
7613   case MESA_FORMAT_Z24_UNORM_S8_UINT:
7614      unpack_float_32_uint_24_8_Z24_UNORM_S8_UINT(src, dst, n);
7615      break;
7616   case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
7617      unpack_float_32_uint_24_8_Z32_FLOAT_S8X24_UINT(src, dst, n);
7618      break;
7619   default:
7620      _mesa_problem(NULL,
7621                    "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row",
7622                    _mesa_get_format_name(format));
7623      return;
7624   }
7625}
7626
7627/**
7628 * Unpack depth/stencil
7629 * \param format  the source data format
7630 * \param type the destination data type
7631 */
7632void
7633_mesa_unpack_depth_stencil_row(mesa_format format, GLuint n,
7634	                       const void *src, GLenum type,
7635                               GLuint *dst)
7636{
7637   assert(type == GL_UNSIGNED_INT_24_8 ||
7638          type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
7639
7640   switch (type) {
7641   case GL_UNSIGNED_INT_24_8:
7642      _mesa_unpack_uint_24_8_depth_stencil_row(format, n, src, dst);
7643      break;
7644   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
7645      _mesa_unpack_float_32_uint_24_8_depth_stencil_row(format, n, src, dst);
7646      break;
7647   default:
7648      _mesa_problem(NULL,
7649                    "bad type 0x%x in _mesa_unpack_depth_stencil_row",
7650                    type);
7651      return;
7652   }
7653}
7654
7655