format_pack.c revision 0bda900743702a2c0f95024f004e6210e59fd5dd
1aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
2aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Mesa 3-D graphics library
3aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul *
4aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Copyright (c) 2011 VMware, Inc.
5aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul *
6aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
7aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * copy of this software and associated documentation files (the "Software"),
8aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * to deal in the Software without restriction, including without limitation
9aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * and/or sell copies of the Software, and to permit persons to whom the
11aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Software is furnished to do so, subject to the following conditions:
12aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul *
13aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * The above copyright notice and this permission notice shall be included
14aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * in all copies or substantial portions of the Software.
15aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul *
16aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
23aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
24aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
25aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
26aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Color, depth, stencil packing functions.
27aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Used to pack basic color, depth and stencil formats to specific
28aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * hardware formats.
29aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul *
30aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * There are both per-pixel and per-row packing functions:
31aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * - The former will be used by swrast to write values to the color, depth,
32aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul *   stencil buffers when drawing points, lines and masked spans.
33aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * - The later will be used for image-oriented functions like glDrawPixels,
34aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul *   glAccum, and glTexImage.
35aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
36aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
37aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
38aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul#include "colormac.h"
39aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul#include "format_pack.h"
40aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul#include "macros.h"
41aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul#include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
42aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
43aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
44aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
450bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul/** Helper struct for MESA_FORMAT_Z32_FLOAT_X24S8 */
460bda900743702a2c0f95024f004e6210e59fd5ddBrian Paulstruct z32f_x24s8
470bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul{
480bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul   float z;
490bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul   uint32_t x24s8;
500bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul};
510bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul
520bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul
53aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paultypedef void (*pack_ubyte_rgba_row_func)(GLuint n,
54aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                                         const GLubyte src[][4], void *dst);
55aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
56aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paultypedef void (*pack_float_rgba_row_func)(GLuint n,
57aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                                         const GLfloat src[][4], void *dst);
58aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
59aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
60aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
61aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic inline GLfloat
62aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paullinear_to_srgb(GLfloat cl)
63aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
64aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (cl < 0.0f)
65aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return 0.0f;
66aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   else if (cl < 0.0031308f)
67aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return 12.92f * cl;
68aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   else if (cl < 1.0f)
69aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return 1.055f * powf(cl, 0.41666f) - 0.055f;
70aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   else
71aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return 1.0f;
72aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
73aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
74aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
75aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic inline GLubyte
76aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paullinear_float_to_srgb_ubyte(GLfloat cl)
77aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
78aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte res = FLOAT_TO_UBYTE(linear_to_srgb(cl));
79aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   return res;
80aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
81aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
82aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
83aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic inline GLubyte
84aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paullinear_ubyte_to_srgb_ubyte(GLubyte cl)
85aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
86aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte res = FLOAT_TO_UBYTE(linear_to_srgb(cl / 255.0f));
87aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   return res;
88aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
89aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
90aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
91aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
92aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
93aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
94aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_RGBA8888
95aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
96aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
97aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
98aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGBA8888(const GLubyte src[4], void *dst)
99aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
100aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
101aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(src[RCOMP], src[GCOMP], src[BCOMP], src[ACOMP]);
102aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
103aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
104aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
105aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGBA8888(const GLfloat src[4], void *dst)
106aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
107aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
108aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   _mesa_unclamped_float_rgba_to_ubyte(v, src);
109aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_RGBA8888(v, dst);
110aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
111aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
112aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
113aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_ubyte_RGBA8888(GLuint n, const GLubyte src[][4], void *dst)
114aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
115aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
116aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
117aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
118aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i] = PACK_COLOR_8888(src[i][RCOMP], src[i][GCOMP],
119aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                             src[i][BCOMP], src[i][ACOMP]);
120aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
121aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
122aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
123aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
124aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_float_RGBA8888(GLuint n, const GLfloat src[][4], void *dst)
125aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
126aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
127aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
128aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
129aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte v[4];
130aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
131aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      pack_ubyte_RGBA8888(v, d + i);
132aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
133aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
134aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
135aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
136aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
137aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
138aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_RGBA8888_REV
139aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
140aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
141aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
142aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGBA8888_REV(const GLubyte src[4], void *dst)
143aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
144aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
145aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(src[ACOMP], src[BCOMP], src[GCOMP], src[RCOMP]);
146aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
147aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
148aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
149aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGBA8888_REV(const GLfloat src[4], void *dst)
150aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
151aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
152aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   _mesa_unclamped_float_rgba_to_ubyte(v, src);
153aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_RGBA8888_REV(v, dst);
154aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
155aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
156aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
157aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_ubyte_RGBA8888_REV(GLuint n, const GLubyte src[][4], void *dst)
158aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
159aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
160aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
161aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
162aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i] = PACK_COLOR_8888(src[i][ACOMP], src[i][BCOMP],
163aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                             src[i][GCOMP], src[i][RCOMP]);
164aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
165aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
166aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
167aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
168aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_float_RGBA8888_REV(GLuint n, const GLfloat src[][4], void *dst)
169aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
170aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
171aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
172aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
173aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte v[4];
174aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
175aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      pack_ubyte_RGBA8888_REV(v, d + i);
176aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
177aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
178aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
179aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
180aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
181aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_ARGB8888
182aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
183aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
184aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
185aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_ARGB8888(const GLubyte src[4], void *dst)
186aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
187aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
188aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(src[ACOMP], src[RCOMP], src[GCOMP], src[BCOMP]);
189aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
190aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
191aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
192aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_ARGB8888(const GLfloat src[4], void *dst)
193aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
194aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
195aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   _mesa_unclamped_float_rgba_to_ubyte(v, src);
196aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_ARGB8888(v, dst);
197aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
198aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
199aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
200aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_ubyte_ARGB8888(GLuint n, const GLubyte src[][4], void *dst)
201aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
202aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
203aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
204aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
205aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i] = PACK_COLOR_8888(src[i][ACOMP], src[i][RCOMP],
206aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                             src[i][GCOMP], src[i][BCOMP]);
207aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
208aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
209aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
210aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
211aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_float_ARGB8888(GLuint n, const GLfloat src[][4], void *dst)
212aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
213aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
214aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
215aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
216aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte v[4];
217aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
218aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      pack_ubyte_ARGB8888(v, d + i);
219aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
220aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
221aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
222aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
223aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
224aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_ARGB8888_REV
225aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
226aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
227aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
228aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_ARGB8888_REV(const GLubyte src[4], void *dst)
229aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
230aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
231aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(src[BCOMP], src[GCOMP], src[RCOMP], src[ACOMP]);
232aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
233aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
234aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
235aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_ARGB8888_REV(const GLfloat src[4], void *dst)
236aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
237aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
238aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   _mesa_unclamped_float_rgba_to_ubyte(v, src);
239aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_ARGB8888_REV(v, dst);
240aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
241aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
242aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
243aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_ubyte_ARGB8888_REV(GLuint n, const GLubyte src[][4], void *dst)
244aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
245aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
246aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
247aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
248aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i] = PACK_COLOR_8888(src[i][BCOMP], src[i][GCOMP],
249aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                             src[i][RCOMP], src[i][ACOMP]);
250aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
251aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
252aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
253aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
254aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_float_ARGB8888_REV(GLuint n, const GLfloat src[][4], void *dst)
255aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
256aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
257aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
258aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
259aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte v[4];
260aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
261aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      pack_ubyte_ARGB8888_REV(v, d + i);
262aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
263aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
264aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
265aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
266aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
267aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_XRGB8888
268aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
269aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
270aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
271aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_XRGB8888(const GLubyte src[4], void *dst)
272aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
273aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
274aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(0x0, src[RCOMP], src[GCOMP], src[BCOMP]);
275aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
276aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
277aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
278aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_XRGB8888(const GLfloat src[4], void *dst)
279aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
280aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
281aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   _mesa_unclamped_float_rgba_to_ubyte(v, src);
282aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_XRGB8888(v, dst);
283aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
284aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
285aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
286aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_ubyte_XRGB8888(GLuint n, const GLubyte src[][4], void *dst)
287aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
288aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
289aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
290aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
291aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i] = PACK_COLOR_8888(0, src[i][RCOMP], src[i][GCOMP], src[i][BCOMP]);
292aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
293aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
294aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
295aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
296aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_float_XRGB8888(GLuint n, const GLfloat src[][4], void *dst)
297aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
298aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
299aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
300aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
301aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte v[4];
302aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
303aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      pack_ubyte_XRGB8888(v, d + i);
304aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
305aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
306aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
307aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
308aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
309aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_XRGB8888_REV
310aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
311aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
312aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
313aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_XRGB8888_REV(const GLubyte src[4], void *dst)
314aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
315aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
316aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(src[BCOMP], src[GCOMP], src[RCOMP], 0);
317aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
318aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
319aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
320aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_XRGB8888_REV(const GLfloat src[4], void *dst)
321aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
322aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
323aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   _mesa_unclamped_float_rgba_to_ubyte(v, src);
324aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_XRGB8888_REV(v, dst);
325aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
326aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
327aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
328aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_ubyte_XRGB8888_REV(GLuint n, const GLubyte src[][4], void *dst)
329aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
330aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
331aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
332aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
333aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i] = PACK_COLOR_8888(src[i][BCOMP], src[i][GCOMP], src[i][RCOMP], 0);
334aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
335aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
336aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
337aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
338aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_float_XRGB8888_REV(GLuint n, const GLfloat src[][4], void *dst)
339aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
340aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
341aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
342aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
343aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte v[4];
344aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
345aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      pack_ubyte_XRGB8888_REV(v, d + i);
346aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
347aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
348aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
349aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
350aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
351aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_RGB888
352aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
353aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
354aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
355aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGB888(const GLubyte src[4], void *dst)
356aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
357aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
358aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = src[RCOMP];
359aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = src[GCOMP];
360aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[BCOMP];
361aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
362aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
363aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
364aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGB888(const GLfloat src[4], void *dst)
365aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
366aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
367aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(d[2], src[RCOMP]);
368aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(d[1], src[GCOMP]);
369aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(d[0], src[BCOMP]);
370aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
371aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
372aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
373aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_ubyte_RGB888(GLuint n, const GLubyte src[][4], void *dst)
374aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
375aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
376aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
377aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
378aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+2] = src[i][RCOMP];
379aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+1] = src[i][GCOMP];
380aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+0] = src[i][BCOMP];
381aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
382aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
383aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
384aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
385aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_float_RGB888(GLuint n, const GLfloat src[][4], void *dst)
386aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
387aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
388aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
389aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
390aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte v[4];
391aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
392aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+2] = v[RCOMP];
393aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+1] = v[GCOMP];
394aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+0] = v[BCOMP];
395aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
396aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
397aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
398aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
399aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
400aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_BGR888
401aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
402aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
403aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
404aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_BGR888(const GLubyte src[4], void *dst)
405aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
406aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
407aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = src[BCOMP];
408aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = src[GCOMP];
409aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[RCOMP];
410aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
411aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
412aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
413aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_BGR888(const GLfloat src[4], void *dst)
414aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
415aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
416aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(d[2], src[BCOMP]);
417aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(d[1], src[GCOMP]);
418aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(d[0], src[RCOMP]);
419aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
420aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
421aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
422aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_ubyte_BGR888(GLuint n, const GLubyte src[][4], void *dst)
423aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
424aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
425aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
426aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
427aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+2] = src[i][BCOMP];
428aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+1] = src[i][GCOMP];
429aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+0] = src[i][RCOMP];
430aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
431aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
432aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
433aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
434aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_float_BGR888(GLuint n, const GLfloat src[][4], void *dst)
435aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
436aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
437aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
438aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
439aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte v[4];
440aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
441aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+2] = v[BCOMP];
442aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+1] = v[GCOMP];
443aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      d[i*3+0] = v[RCOMP];
444aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
445aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
446aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
447aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
448aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
449aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_RGB565
450aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
451aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
452aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
453aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGB565(const GLubyte src[4], void *dst)
454aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
455aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
456aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_565(src[RCOMP], src[GCOMP], src[BCOMP]);
457aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
458aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
459aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
460aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGB565(const GLfloat src[4], void *dst)
461aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
462aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[3];
463aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[0], src[RCOMP]);
464aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[1], src[GCOMP]);
465aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[2], src[BCOMP]);
466aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_RGB565(v, dst);
467aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
468aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
469aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
470aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_ubyte_RGB565(GLuint n, const GLubyte src[][4], void *dst)
471aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
472aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
473aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
474aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
475aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      pack_ubyte_RGB565(src[i], d + i);
476aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
477aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
478aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
479aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
480aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_float_RGB565(GLuint n, const GLfloat src[][4], void *dst)
481aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
482aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
483aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
484aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
485aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte v[4];
486aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
487aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      pack_ubyte_RGB565(v, d + i);
488aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
489aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
490aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
491aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
492aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
493aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_RGB565_REV
494aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
495aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
496aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
497aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGB565_REV(const GLubyte src[4], void *dst)
498aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
499aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
500aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_565_REV(src[RCOMP], src[GCOMP], src[BCOMP]);
501aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
502aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
503aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
504aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGB565_REV(const GLfloat src[4], void *dst)
505aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
506aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
507aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r, g, b;
508aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(r, src[RCOMP]);
509aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(g, src[GCOMP]);
510aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(b, src[BCOMP]);
511aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_565_REV(r, g, b);
512aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
513aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
514aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
515aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_ubyte_RGB565_REV(GLuint n, const GLubyte src[][4], void *dst)
516aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
517aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
518aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
519aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
520aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      pack_ubyte_RGB565_REV(src[i], d + i);
521aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
522aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
523aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
524aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
525aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_row_float_RGB565_REV(GLuint n, const GLfloat src[][4], void *dst)
526aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
527aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
528aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint i;
529aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   for (i = 0; i < n; i++) {
530aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte v[4];
531aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
532aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      pack_ubyte_RGB565_REV(v, d + i);
533aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
534aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
535aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
536aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
537aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
538aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_ARGB4444
539aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
540aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
541aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
542aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_ARGB4444(const GLubyte src[4], void *dst)
543aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
544aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
545aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_4444(src[ACOMP], src[RCOMP], src[GCOMP], src[BCOMP]);
546aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
547aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
548aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
549aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_ARGB4444(const GLfloat src[4], void *dst)
550aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
551aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
552aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   _mesa_unclamped_float_rgba_to_ubyte(v, src);
553aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_ARGB4444(v, dst);
554aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
555aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
556aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* use fallback row packing functions */
557aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
558aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
559aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
560aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_ARGB4444_REV
561aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
562aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
563aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
564aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_ARGB4444_REV(const GLubyte src[4], void *dst)
565aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
566aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
567aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_4444(src[GCOMP], src[BCOMP], src[ACOMP], src[RCOMP]);
568aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
569aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
570aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
571aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_ARGB4444_REV(const GLfloat src[4], void *dst)
572aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
573aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
574aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   _mesa_unclamped_float_rgba_to_ubyte(v, src);
575aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_ARGB4444_REV(v, dst);
576aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
577aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
578aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* use fallback row packing functions */
579aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
580aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
581aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
582aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_RGBA5551
583aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
584aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
585aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
586aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGBA5551(const GLubyte src[4], void *dst)
587aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
588aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
589aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_5551(src[RCOMP], src[GCOMP], src[BCOMP], src[ACOMP]);
590aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
591aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
592aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
593aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGBA5551(const GLfloat src[4], void *dst)
594aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
595aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
596aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   _mesa_unclamped_float_rgba_to_ubyte(v, src);
597aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_RGBA5551(v, dst);
598aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
599aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
600aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* use fallback row packing functions */
601aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
602aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
603aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
604aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_ARGB1555
605aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
606aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
607aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
608aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_ARGB1555(const GLubyte src[4], void *dst)
609aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
610aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
611aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_1555(src[ACOMP], src[RCOMP], src[GCOMP], src[BCOMP]);
612aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
613aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
614aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
615aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_ARGB1555(const GLfloat src[4], void *dst)
616aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
617aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
618aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   _mesa_unclamped_float_rgba_to_ubyte(v, src);
619aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_ARGB1555(v, dst);
620aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
621aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
622aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
623aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_ARGB1555_REV */
624aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
625aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
626aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_ARGB1555_REV(const GLubyte src[4], void *dst)
627aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
628aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst), tmp;
629aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   tmp = PACK_COLOR_1555(src[ACOMP], src[RCOMP], src[GCOMP], src[BCOMP]);
630aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (tmp >> 8) | (tmp << 8);
631aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
632aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
633aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
634aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_ARGB1555_REV(const GLfloat src[4], void *dst)
635aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
636aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
637aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   _mesa_unclamped_float_rgba_to_ubyte(v, src);
638aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_ARGB1555_REV(v, dst);
639aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
640aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
641aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
642aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_AL44 */
643aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
644aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
645aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_AL44(const GLubyte src[4], void *dst)
646aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
647b0af16abf1153da243b856e55f59ca1945860f47Brian Paul   GLubyte *d = ((GLubyte *) dst);
648aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_44(src[ACOMP], src[RCOMP]);
649aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
650aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
651aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
652aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_AL44(const GLfloat src[4], void *dst)
653aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
654aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
655aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[0], src[RCOMP]);
656aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[3], src[ACOMP]);
657aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_AL44(v, dst);
658aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
659aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
660aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
661aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_AL88 */
662aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
663aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
664aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_AL88(const GLubyte src[4], void *dst)
665aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
666aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
667aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(src[ACOMP], src[RCOMP]);
668aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
669aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
670aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
671aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_AL88(const GLfloat src[4], void *dst)
672aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
673aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
674aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[0], src[RCOMP]);
675aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[3], src[ACOMP]);
676aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_AL88(v, dst);
677aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
678aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
679aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
680aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_AL88_REV */
681aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
682aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
683aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_AL88_REV(const GLubyte src[4], void *dst)
684aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
685aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
686aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(src[RCOMP], src[ACOMP]);
687aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
688aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
689aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
690aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_AL88_REV(const GLfloat src[4], void *dst)
691aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
692aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
693aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[0], src[RCOMP]);
694aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[3], src[ACOMP]);
695aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_AL88_REV(v, dst);
696aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
697aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
698aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
699aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_AL1616 */
700aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
701aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
702aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_AL1616(const GLubyte src[4], void *dst)
703aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
704aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
705aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort l = UBYTE_TO_USHORT(src[RCOMP]);
706aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort a = UBYTE_TO_USHORT(src[ACOMP]);
707aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_1616(a, l);
708aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
709aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
710aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
711aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_AL1616(const GLfloat src[4], void *dst)
712aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
713aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
714aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort l, a;
715aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(l, src[RCOMP]);
716aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
717aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_1616(a, l);
718aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
719aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
720aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
721aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_AL1616_REV */
722aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
723aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
724aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_AL1616_REV(const GLubyte src[4], void *dst)
725aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
726aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
727aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort l = UBYTE_TO_USHORT(src[RCOMP]);
728aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort a = UBYTE_TO_USHORT(src[ACOMP]);
729aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_1616(l, a);
730aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
731aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
732aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
733aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_AL1616_REV(const GLfloat src[4], void *dst)
734aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
735aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
736aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort l, a;
737aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(l, src[RCOMP]);
738aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
739aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_1616(l, a);
740aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
741aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
742aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
743aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RGB332 */
744aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
745aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
746aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGB332(const GLubyte src[4], void *dst)
747aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
748aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
749aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_332(src[RCOMP], src[GCOMP], src[BCOMP]);
750aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
751aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
752aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
753aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGB332(const GLfloat src[4], void *dst)
754aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
755aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte v[4];
756aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[0], src[RCOMP]);
757aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[1], src[GCOMP]);
758aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(v[2], src[BCOMP]);
759aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_RGB332(v, dst);
760aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
761aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
762aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
763aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_A8 */
764aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
765aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
766aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_A8(const GLubyte src[4], void *dst)
767aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
768aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
769aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = src[ACOMP];
770aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
771aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
772aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
773aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_A8(const GLfloat src[4], void *dst)
774aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
775aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
776aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(d[0], src[ACOMP]);
777aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
778aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
779aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
780aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_A16 */
781aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
782aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
783aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_A16(const GLubyte src[4], void *dst)
784aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
785aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
786aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = UBYTE_TO_USHORT(src[ACOMP]);
787aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
788aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
789aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
790aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_A16(const GLfloat src[4], void *dst)
791aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
792aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
793aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(d[0], src[ACOMP]);
794aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
795aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
796aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
797aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_L8 */
798aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
799aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
800aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_L8(const GLubyte src[4], void *dst)
801aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
802aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
803aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = src[RCOMP];
804aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
805aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
806aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
807aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_L8(const GLfloat src[4], void *dst)
808aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
809aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
810aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(d[0], src[RCOMP]);
811aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
812aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
813aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
814aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_L16 */
815aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
816aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
817aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_L16(const GLubyte src[4], void *dst)
818aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
819aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
820aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = UBYTE_TO_USHORT(src[RCOMP]);
821aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
822aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
823aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
824aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_L16(const GLfloat src[4], void *dst)
825aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
826aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
827aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(d[0], src[RCOMP]);
828aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
829aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
830aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
831aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_YCBCR */
832aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
833aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
834aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_YCBCR(const GLubyte src[4], void *dst)
835aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
836aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* todo */
837aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
838aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
839aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
840aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_YCBCR(const GLfloat src[4], void *dst)
841aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
842aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* todo */
843aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
844aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
845aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
846aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_YCBCR_REV */
847aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
848aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
849aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_YCBCR_REV(const GLubyte src[4], void *dst)
850aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
851aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* todo */
852aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
853aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
854aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
855aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_YCBCR_REV(const GLfloat src[4], void *dst)
856aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
857aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* todo */
858aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
859aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
860aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
861aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_R8 */
862aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
863aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
864aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_R8(const GLubyte src[4], void *dst)
865aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
866aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
867aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = src[RCOMP];
868aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
869aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
870aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
871aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_R8(const GLfloat src[4], void *dst)
872aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
873aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
874aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r;
875aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(r, src[RCOMP]);
876aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = r;
877aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
878aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
879aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
880aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_GR88 */
881aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
882aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
883aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_GR88(const GLubyte src[4], void *dst)
884aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
885aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
886aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(src[GCOMP], src[RCOMP]);
887aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
888aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
889aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
890aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_GR88(const GLfloat src[4], void *dst)
891aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
892aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
893aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r, g;
894aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(r, src[RCOMP]);
895aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(g, src[GCOMP]);
896aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(g, r);
897aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
898aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
899aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
900aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RG88 */
901aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
902aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
903aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RG88(const GLubyte src[4], void *dst)
904aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
905aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
906aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(src[RCOMP], src[GCOMP]);
907aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
908aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
909aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
910aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RG88(const GLfloat src[4], void *dst)
911aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
912aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
913aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r, g;
914aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(r, src[RCOMP]);
915aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(g, src[GCOMP]);
916aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(r, g);
917aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
918aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
919aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
920aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_R16 */
921aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
922aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
923aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_R16(const GLubyte src[4], void *dst)
924aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
925aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
926aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = UBYTE_TO_USHORT(src[RCOMP]);
927aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
928aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
929aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
930aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_R16(const GLfloat src[4], void *dst)
931aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
932aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
933aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(d[0], src[RCOMP]);
934aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
935aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
936aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
937aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RG1616 */
938aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
939aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
940aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RG1616(const GLubyte src[4], void *dst)
941aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
942aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
943aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
944aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort g = UBYTE_TO_USHORT(src[GCOMP]);
945aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_1616(g, r);
946aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
947aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
948aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
949aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RG1616(const GLfloat src[4], void *dst)
950aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
951aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
952aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort r, g;
953aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
954aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
955aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_1616(g, r);
956aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
957aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
958aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
959aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RG1616_REV */
960aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
961aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
962aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RG1616_REV(const GLubyte src[4], void *dst)
963aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
964aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
965aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
966aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort g = UBYTE_TO_USHORT(src[GCOMP]);
967aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_1616(r, g);
968aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
969aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
970aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
971aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
972aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RG1616_REV(const GLfloat src[4], void *dst)
973aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
974aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
975aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort r, g;
976aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
977aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
978aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_1616(r, g);
979aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
980aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
981aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
982aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_ARGB2101010 */
983aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
984aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
985aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_ARGB2101010(const GLubyte src[4], void *dst)
986aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
987aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
988aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
989aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort g = UBYTE_TO_USHORT(src[GCOMP]);
990aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort b = UBYTE_TO_USHORT(src[BCOMP]);
991aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort a = UBYTE_TO_USHORT(src[ACOMP]);
992aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_2101010_US(a, r, g, b);
993aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
994aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
995aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
996aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_ARGB2101010(const GLfloat src[4], void *dst)
997aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
998aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
999aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort r, g, b, a;
1000aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
1001aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
1002aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
1003aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
1004aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_2101010_US(a, r, g, b);
1005aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1006aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1007aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1008aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_SRGB8 */
1009aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1010aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1011aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_SRGB8(const GLubyte src[4], void *dst)
1012aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1013aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
1014aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1015aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1016aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1017aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1018aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1019aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1020aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SRGB8(const GLfloat src[4], void *dst)
1021aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1022aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
1023aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = linear_float_to_srgb_ubyte(src[RCOMP]);
1024aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = linear_float_to_srgb_ubyte(src[GCOMP]);
1025aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = linear_float_to_srgb_ubyte(src[BCOMP]);
1026aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1027aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1028aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1029aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_SRGBA8 */
1030aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1031aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1032aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_SRGBA8(const GLubyte src[4], void *dst)
1033aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1034aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
1035aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1036aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte g = linear_ubyte_to_srgb_ubyte(src[GCOMP]);
1037aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte b = linear_ubyte_to_srgb_ubyte(src[BCOMP]);
1038aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(r, g, b, src[ACOMP]);
1039aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1040aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1041aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1042aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SRGBA8(const GLfloat src[4], void *dst)
1043aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1044aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
1045aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r, g, b, a;
1046aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   r = linear_float_to_srgb_ubyte(src[RCOMP]);
1047aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   g = linear_float_to_srgb_ubyte(src[GCOMP]);
1048aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   b = linear_float_to_srgb_ubyte(src[BCOMP]);
1049aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(a, src[ACOMP]);
1050aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(r, g, b, a);
1051aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1052aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1053aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1054aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_SARGB8 */
1055aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1056aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1057aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_SARGB8(const GLubyte src[4], void *dst)
1058aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1059aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
1060aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1061aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte g = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1062aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte b = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1063aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(src[ACOMP], r, g, b);
1064aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1065aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1066aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1067aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SARGB8(const GLfloat src[4], void *dst)
1068aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1069aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
1070aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r, g, b, a;
1071aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   r = linear_float_to_srgb_ubyte(src[RCOMP]);
1072aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   g = linear_float_to_srgb_ubyte(src[GCOMP]);
1073aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   b = linear_float_to_srgb_ubyte(src[BCOMP]);
1074aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(a, src[ACOMP]);
1075aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(a, r, g, b);
1076aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1077aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1078aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1079aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_SL8 */
1080aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1081aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1082aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_SL8(const GLubyte src[4], void *dst)
1083aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1084aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
1085aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1086aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1087aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1088aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1089aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SL8(const GLfloat src[4], void *dst)
1090aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1091aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
1092aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte l = linear_float_to_srgb_ubyte(src[RCOMP]);
1093aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = l;
1094aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1095aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1096aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1097aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_SLA8 */
1098aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1099aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1100aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_SLA8(const GLubyte src[4], void *dst)
1101aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1102aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1103aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte l = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1104aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(src[ACOMP], l);
1105aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1106aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1107aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1108aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SLA8(const GLfloat src[4], void *dst)
1109aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1110aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1111aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte a, l = linear_float_to_srgb_ubyte(src[RCOMP]);
1112aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   CLAMPED_FLOAT_TO_UBYTE(a, src[ACOMP]);
1113aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(a, l);
1114aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1115aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1116aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1117aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RGBA_FLOAT32 */
1118aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1119aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1120aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGBA_FLOAT32(const GLubyte src[4], void *dst)
1121aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1122aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1123aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[0]);
1124aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = UBYTE_TO_FLOAT(src[1]);
1125aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = UBYTE_TO_FLOAT(src[2]);
1126aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = UBYTE_TO_FLOAT(src[3]);
1127aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1128aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1129aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1130aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGBA_FLOAT32(const GLfloat src[4], void *dst)
1131aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1132aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1133aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[0];
1134aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = src[1];
1135aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = src[2];
1136aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = src[3];
1137aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1138aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1139aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1140aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RGBA_FLOAT16 */
1141aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1142aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1143aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGBA_FLOAT16(const GLubyte src[4], void *dst)
1144aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1145aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1146aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[0]));
1147aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[1]));
1148aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[2]));
1149aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[3]));
1150aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1151aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1152aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1153aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGBA_FLOAT16(const GLfloat src[4], void *dst)
1154aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1155aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1156aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[0]);
1157aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(src[1]);
1158aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = _mesa_float_to_half(src[2]);
1159aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = _mesa_float_to_half(src[3]);
1160aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1161aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1162aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1163aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RGB_FLOAT32 */
1164aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1165aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1166aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGB_FLOAT32(const GLubyte src[4], void *dst)
1167aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1168aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1169aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[0]);
1170aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = UBYTE_TO_FLOAT(src[1]);
1171aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = UBYTE_TO_FLOAT(src[2]);
1172aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1173aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1174aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1175aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGB_FLOAT32(const GLfloat src[4], void *dst)
1176aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1177aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1178aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[0];
1179aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = src[1];
1180aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = src[2];
1181aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1182aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1183aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1184aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RGB_FLOAT16 */
1185aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1186aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1187aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGB_FLOAT16(const GLubyte src[4], void *dst)
1188aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1189aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1190aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[0]));
1191aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[1]));
1192aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[2]));
1193aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1194aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1195aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1196aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGB_FLOAT16(const GLfloat src[4], void *dst)
1197aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1198aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1199aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[0]);
1200aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(src[1]);
1201aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = _mesa_float_to_half(src[2]);
1202aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1203aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1204aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1205aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_ALPHA_FLOAT32 */
1206aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1207aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1208aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_ALPHA_FLOAT32(const GLubyte src[4], void *dst)
1209aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1210aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1211aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[ACOMP]);
1212aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1213aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1214aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1215aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_ALPHA_FLOAT32(const GLfloat src[4], void *dst)
1216aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1217aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1218aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[ACOMP];
1219aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1220aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1221aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1222aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_ALPHA_FLOAT16 */
1223aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1224aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1225aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_ALPHA_FLOAT16(const GLubyte src[4], void *dst)
1226aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1227aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1228aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[ACOMP]));
1229aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1230aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1231aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1232aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_ALPHA_FLOAT16(const GLfloat src[4], void *dst)
1233aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1234aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1235aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[ACOMP]);
1236aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1237aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1238aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1239aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_LUMINANCE_FLOAT32 (and INTENSITY_FLOAT32, R_FLOAT32) */
1240aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1241aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1242aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_LUMINANCE_FLOAT32(const GLubyte src[4], void *dst)
1243aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1244aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1245aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[RCOMP]);
1246aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1247aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1248aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1249aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_LUMINANCE_FLOAT32(const GLfloat src[4], void *dst)
1250aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1251aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1252aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[RCOMP];
1253aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1254aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1255aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1256aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_LUMINANCE_FLOAT16 (and INTENSITY_FLOAT16, R_FLOAT32) */
1257aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1258aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1259aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_LUMINANCE_FLOAT16(const GLubyte src[4], void *dst)
1260aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1261aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1262aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[RCOMP]));
1263aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1264aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1265aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1266aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_LUMINANCE_FLOAT16(const GLfloat src[4], void *dst)
1267aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1268aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1269aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[RCOMP]);
1270aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1271aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1272aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1273aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 */
1274aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1275aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1276aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_LUMINANCE_ALPHA_FLOAT32(const GLubyte src[4], void *dst)
1277aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1278aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1279aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[RCOMP]);
1280aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = UBYTE_TO_FLOAT(src[ACOMP]);
1281aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1282aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1283aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1284aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_LUMINANCE_ALPHA_FLOAT32(const GLfloat src[4], void *dst)
1285aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1286aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1287aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[RCOMP];
1288aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = src[ACOMP];
1289aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1290aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1291aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1292aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 */
1293aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1294aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1295aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_LUMINANCE_ALPHA_FLOAT16(const GLubyte src[4], void *dst)
1296aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1297aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1298aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[RCOMP]));
1299aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[ACOMP]));
1300aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1301aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1302aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1303aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_LUMINANCE_ALPHA_FLOAT16(const GLfloat src[4], void *dst)
1304aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1305aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1306aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[RCOMP]);
1307aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(src[ACOMP]);
1308aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1309aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1310aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1311aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RG_FLOAT32 */
1312aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1313aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1314aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RG_FLOAT32(const GLubyte src[4], void *dst)
1315aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1316aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1317aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[RCOMP]);
1318aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = UBYTE_TO_FLOAT(src[GCOMP]);
1319aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1320aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1321aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1322aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RG_FLOAT32(const GLfloat src[4], void *dst)
1323aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1324aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1325aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[RCOMP];
1326aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = src[GCOMP];
1327aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1328aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1329aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1330aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RG_FLOAT16 */
1331aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1332aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1333aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RG_FLOAT16(const GLubyte src[4], void *dst)
1334aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1335aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1336aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[RCOMP]));
1337aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[GCOMP]));
1338aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1339aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1340aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1341aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RG_FLOAT16(const GLfloat src[4], void *dst)
1342aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1343aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1344aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[RCOMP]);
1345aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(src[GCOMP]);
1346aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1347aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1348aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1349aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_DUDV8 */
1350aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1351aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1352aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_DUDV8(const GLubyte src[4], void *dst)
1353aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1354aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* XXX is this ever used? */
1355aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1356aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(src[0], src[1]);
1357aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1358aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1359aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1360aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_DUDV8(const GLfloat src[4], void *dst)
1361aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1362aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1363aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte du, dv;
1364aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   du = FLOAT_TO_BYTE(CLAMP(src[0], 0.0F, 1.0F));
1365aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   dv = FLOAT_TO_BYTE(CLAMP(src[1], 0.0F, 1.0F));
1366aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(du, dv);
1367aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1368aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1369aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1370aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RGBA_16 */
1371aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1372aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1373aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGBA_16(const GLubyte src[4], void *dst)
1374aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1375aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1376aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_USHORT(src[RCOMP]);
1377aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = UBYTE_TO_USHORT(src[GCOMP]);
1378aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = UBYTE_TO_USHORT(src[BCOMP]);
1379aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = UBYTE_TO_USHORT(src[ACOMP]);
1380aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1381aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1382aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1383aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGBA_16(const GLfloat src[4], void *dst)
1384aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1385aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1386aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(d[0], src[RCOMP]);
1387aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(d[1], src[GCOMP]);
1388aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(d[2], src[BCOMP]);
1389aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(d[3], src[ACOMP]);
1390aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1391aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1392aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1393aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1394aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1395aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_R8
1396aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1397aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1398aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1399aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_R8(const GLfloat src[4], void *dst)
1400aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1401aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte *d = (GLbyte *) dst;
1402aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1403aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1404aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1405aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1406aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1407aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RG88_REV
1408aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1409aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1410aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1411aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RG88_REV(const GLfloat src[4], void *dst)
1412aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1413aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = (GLushort *) dst;
1414aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1415aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
1416aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (g << 8) | r;
1417aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1418aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1419aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1420aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1421aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RGBX8888
1422aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1423aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1424aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1425aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RGBX8888(const GLfloat src[4], void *dst)
1426aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1427aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1428aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1429aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
1430aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte b = FLOAT_TO_BYTE(CLAMP(src[BCOMP], -1.0f, 1.0f));
1431aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte a = 127;
1432aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(r, g, b, a);
1433aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1434aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1435aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1436aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1437aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RGBA8888
1438aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1439aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1440aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1441aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RGBA8888(const GLfloat src[4], void *dst)
1442aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1443aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1444aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1445aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
1446aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte b = FLOAT_TO_BYTE(CLAMP(src[BCOMP], -1.0f, 1.0f));
1447aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte a = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
1448aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(r, g, b, a);
1449aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1450aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1451aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1452aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1453aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV
1454aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1455aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1456aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1457aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RGBA8888_REV(const GLfloat src[4], void *dst)
1458aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1459aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1460aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1461aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
1462aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte b = FLOAT_TO_BYTE(CLAMP(src[BCOMP], -1.0f, 1.0f));
1463aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte a = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
1464aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(a, b, g, r);
1465aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1466aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1467aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1468aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1469aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_R16
1470aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1471aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1472aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1473aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_R16(const GLfloat src[4], void *dst)
1474aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1475aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort *d = (GLshort *) dst;
1476aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1477aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1478aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1479aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1480aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1481aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_GR1616
1482aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1483aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1484aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1485aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_GR1616(const GLfloat src[4], void *dst)
1486aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1487aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1488aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort r = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1489aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort g = FLOAT_TO_SHORT(CLAMP(src[GCOMP], -1.0f, 1.0f));
1490aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (g << 16) | (r & 0xffff);
1491aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1492aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1493aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1494aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1495aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RGB_16
1496aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1497aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1498aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1499aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RGB_16(const GLfloat src[4], void *dst)
1500aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1501aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort *d = (GLshort *) dst;
1502aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1503aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = FLOAT_TO_SHORT(CLAMP(src[GCOMP], -1.0f, 1.0f));
1504aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = FLOAT_TO_SHORT(CLAMP(src[BCOMP], -1.0f, 1.0f));
1505aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1506aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1507aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1508aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1509aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RGBA_16
1510aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1511aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1512aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1513aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RGBA_16(const GLfloat src[4], void *dst)
1514aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1515aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort *d = (GLshort *) dst;
1516aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1517aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = FLOAT_TO_SHORT(CLAMP(src[GCOMP], -1.0f, 1.0f));
1518aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = FLOAT_TO_SHORT(CLAMP(src[BCOMP], -1.0f, 1.0f));
1519aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = FLOAT_TO_SHORT(CLAMP(src[ACOMP], -1.0f, 1.0f));
1520aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1521aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1522aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1523aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1524aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_A8
1525aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1526aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1527aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1528aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_A8(const GLfloat src[4], void *dst)
1529aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1530aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte *d = (GLbyte *) dst;
1531aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
1532aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1533aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1534aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1535aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1536aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_L8
1537aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1538aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1539aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1540aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_L8(const GLfloat src[4], void *dst)
1541aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1542aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte *d = (GLbyte *) dst;
1543aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1544aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1545aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1546aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1547aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1548aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_AL88
1549aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1550aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1551aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1552aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_AL88(const GLfloat src[4], void *dst)
1553aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1554aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = (GLushort *) dst;
1555aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte l = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1556aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte a = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
1557aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (a << 8) | l;
1558aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1559aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1560aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1561aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1562aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_A16
1563aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1564aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1565aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1566aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_A16(const GLfloat src[4], void *dst)
1567aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1568aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort *d = (GLshort *) dst;
1569aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_SHORT(CLAMP(src[ACOMP], -1.0f, 1.0f));
1570aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1571aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1572aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1573aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1574aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_L16
1575aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1576aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1577aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1578aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_L16(const GLfloat src[4], void *dst)
1579aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1580aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort *d = (GLshort *) dst;
1581aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1582aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1583aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1584aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1585aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1586aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_AL1616
1587aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1588aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1589aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1590aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_AL1616(const GLfloat src[4], void *dst)
1591aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1592aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1593aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort l = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1594aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort a = FLOAT_TO_SHORT(CLAMP(src[ACOMP], -1.0f, 1.0f));
1595aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_1616(a, l);
1596aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1597aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1598aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1599aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1600aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_RGB9_E5_FLOAT;
1601aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1602aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1603aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1604aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGB9_E5_FLOAT(const GLfloat src[4], void *dst)
1605aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1606aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1607aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = float3_to_rgb9e5(src);
1608aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1609aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1610aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1611aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGB9_E5_FLOAT(const GLubyte src[4], void *dst)
1612aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1613aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1614aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat rgb[3];
1615aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[0] = UBYTE_TO_FLOAT(src[RCOMP]);
1616aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[1] = UBYTE_TO_FLOAT(src[GCOMP]);
1617aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[2] = UBYTE_TO_FLOAT(src[BCOMP]);
1618aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = float3_to_rgb9e5(rgb);
1619aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1620aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1621aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1622aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1623aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1624aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_R11_G11_B10_FLOAT;
1625aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1626aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1627aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1628aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_R11_G11_B10_FLOAT(const GLubyte src[4], void *dst)
1629aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1630aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1631aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat rgb[3];
1632aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[0] = UBYTE_TO_FLOAT(src[RCOMP]);
1633aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[1] = UBYTE_TO_FLOAT(src[GCOMP]);
1634aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[2] = UBYTE_TO_FLOAT(src[BCOMP]);
1635aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = float3_to_r11g11b10f(rgb);
1636aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1637aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1638aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1639aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_R11_G11_B10_FLOAT(const GLfloat src[4], void *dst)
1640aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1641aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1642aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = float3_to_r11g11b10f(src);
1643aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1644aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1645aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1646aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1647aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
1648aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Return a function that can pack a GLubyte rgba[4] color.
1649aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1650aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulgl_pack_ubyte_rgba_func
1651aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_get_pack_ubyte_rgba_function(gl_format format)
1652aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1653aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static gl_pack_ubyte_rgba_func table[MESA_FORMAT_COUNT];
1654aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static GLboolean initialized = GL_FALSE;
1655aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1656aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (!initialized) {
1657aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memset(table, 0, sizeof(table));
1658aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1659aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_NONE] = NULL;
1660aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1661aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888] = pack_ubyte_RGBA8888;
1662aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888_REV] = pack_ubyte_RGBA8888_REV;
1663aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888] = pack_ubyte_ARGB8888;
1664aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888_REV] = pack_ubyte_ARGB8888_REV;
1665aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888] = pack_ubyte_RGBA8888; /* reused */
1666aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888_REV] = pack_ubyte_RGBA8888_REV; /* reused */
1667aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888] = pack_ubyte_XRGB8888;
1668aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888_REV] = pack_ubyte_XRGB8888_REV;
1669aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB888] = pack_ubyte_RGB888;
1670aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_BGR888] = pack_ubyte_BGR888;
1671aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565] = pack_ubyte_RGB565;
1672aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565_REV] = pack_ubyte_RGB565_REV;
1673aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB4444] = pack_ubyte_ARGB4444;
1674aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB4444_REV] = pack_ubyte_ARGB4444_REV;
1675aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA5551] = pack_ubyte_RGBA5551;
1676aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB1555] = pack_ubyte_ARGB1555;
1677aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB1555_REV] = pack_ubyte_ARGB1555_REV;
1678aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL44] = pack_ubyte_AL44;
1679aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL88] = pack_ubyte_AL88;
1680aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL88_REV] = pack_ubyte_AL88_REV;
1681aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL1616] = pack_ubyte_AL1616;
1682aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL1616_REV] = pack_ubyte_AL1616_REV;
1683aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB332] = pack_ubyte_RGB332;
1684aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_A8] = pack_ubyte_A8;
1685aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_A16] = pack_ubyte_A16;
1686aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_L8] = pack_ubyte_L8;
1687aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_L16] = pack_ubyte_L16;
1688aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_I8] = pack_ubyte_L8; /* reuse pack_ubyte_L8 */
1689aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_I16] = pack_ubyte_L16; /* reuse pack_ubyte_L16 */
1690aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_YCBCR] = pack_ubyte_YCBCR;
1691aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_YCBCR_REV] = pack_ubyte_YCBCR_REV;
1692aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R8] = pack_ubyte_R8;
1693aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_GR88] = pack_ubyte_GR88;
1694aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG88] = pack_ubyte_RG88;
1695aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R16] = pack_ubyte_R16;
1696aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG1616] = pack_ubyte_RG1616;
1697aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG1616_REV] = pack_ubyte_RG1616_REV;
1698aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB2101010] = pack_ubyte_ARGB2101010;
1699aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1700aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* should never convert RGBA to these formats */
1701aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z24_S8] = NULL;
1702aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_S8_Z24] = NULL;
1703aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z16] = NULL;
1704aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_X8_Z24] = NULL;
1705aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z24_X8] = NULL;
1706aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z32] = NULL;
1707aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_S8] = NULL;
1708aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1709aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* sRGB */
1710aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGB8] = pack_ubyte_SRGB8;
1711aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA8] = pack_ubyte_SRGBA8;
1712aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SARGB8] = pack_ubyte_SARGB8;
1713aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SL8] = pack_ubyte_SL8;
1714aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SLA8] = pack_ubyte_SLA8;
1715aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1716aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* n/a */
1717aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGB_DXT1] = NULL; /* pack_ubyte_SRGB_DXT1; */
1718aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT1] = NULL; /* pack_ubyte_SRGBA_DXT1; */
1719aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT3] = NULL; /* pack_ubyte_SRGBA_DXT3; */
1720aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT5] = NULL; /* pack_ubyte_SRGBA_DXT5; */
1721aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1722aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FXT1] = NULL; /* pack_ubyte_RGB_FXT1; */
1723aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FXT1] = NULL; /* pack_ubyte_RGBA_FXT1; */
1724aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_DXT1] = NULL; /* pack_ubyte_RGB_DXT1; */
1725aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT1] = NULL; /* pack_ubyte_RGBA_DXT1; */
1726aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT3] = NULL; /* pack_ubyte_RGBA_DXT3; */
1727aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT5] = NULL; /* pack_ubyte_RGBA_DXT5; */
1728aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1729aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FLOAT32] = pack_ubyte_RGBA_FLOAT32;
1730aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FLOAT16] = pack_ubyte_RGBA_FLOAT16;
1731aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FLOAT32] = pack_ubyte_RGB_FLOAT32;
1732aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FLOAT16] = pack_ubyte_RGB_FLOAT16;
1733aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ALPHA_FLOAT32] = pack_ubyte_ALPHA_FLOAT32;
1734aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ALPHA_FLOAT16] = pack_ubyte_ALPHA_FLOAT16;
1735aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_FLOAT32] = pack_ubyte_LUMINANCE_FLOAT32;
1736aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_FLOAT16] = pack_ubyte_LUMINANCE_FLOAT16;
1737aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = pack_ubyte_LUMINANCE_ALPHA_FLOAT32;
1738aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = pack_ubyte_LUMINANCE_ALPHA_FLOAT16;
1739aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_INTENSITY_FLOAT32] = pack_ubyte_LUMINANCE_FLOAT32;
1740aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_INTENSITY_FLOAT16] = pack_ubyte_LUMINANCE_FLOAT16;
1741aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R_FLOAT32] = pack_ubyte_LUMINANCE_FLOAT32;
1742aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R_FLOAT16] = pack_ubyte_LUMINANCE_FLOAT16;
1743aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG_FLOAT32] = pack_ubyte_RG_FLOAT32;
1744aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG_FLOAT16] = pack_ubyte_RG_FLOAT16;
1745aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1746aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* n/a */
1747aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT8] = NULL; /* pack_ubyte_RGBA_INT8 */
1748aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT16] = NULL; /* pack_ubyte_RGBA_INT16 */
1749aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT32] = NULL; /* pack_ubyte_RGBA_INT32 */
1750aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT8] = NULL; /* pack_ubyte_RGBA_UINT8 */
1751aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT16] = NULL; /* pack_ubyte_RGBA_UINT16 */
1752aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT32] = NULL; /* pack_ubyte_RGBA_UINT32 */
1753aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1754aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_DUDV8] = pack_ubyte_DUDV8;
1755aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1756aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_16] = pack_ubyte_RGBA_16;
1757aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1758aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* n/a */
1759aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_R8] = NULL;
1760aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RG88_REV] = NULL;
1761aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBX8888] = NULL;
1762aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA8888] = NULL;
1763aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA8888_REV] = NULL;
1764aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_R16] = NULL;
1765aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_GR1616] = NULL;
1766aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGB_16] = NULL;
1767aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA_16] = NULL;
1768aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_A8] = NULL;
1769aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_L8] = NULL;
1770aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_AL88] = NULL;
1771aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_I8] = NULL;
1772aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_A16] = NULL;
1773aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_L16] = NULL;
1774aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_AL1616] = NULL;
1775aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_I16] = NULL;
1776aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1777aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1778aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_16] = pack_ubyte_RGBA_16;
1779aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1780aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB9_E5_FLOAT] = pack_ubyte_RGB9_E5_FLOAT;
1781aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R11_G11_B10_FLOAT] = pack_ubyte_R11_G11_B10_FLOAT;
1782aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1783aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      initialized = GL_TRUE;
1784aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
1785aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1786aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   return table[format];
1787aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1788aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1789aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1790aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1791aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
1792aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Return a function that can pack a GLfloat rgba[4] color.
1793aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1794aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulgl_pack_float_rgba_func
1795aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_get_pack_float_rgba_function(gl_format format)
1796aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1797aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static gl_pack_float_rgba_func table[MESA_FORMAT_COUNT];
1798aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static GLboolean initialized = GL_FALSE;
1799aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1800aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (!initialized) {
1801aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memset(table, 0, sizeof(table));
1802aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1803aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_NONE] = NULL;
1804aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1805aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888] = pack_float_RGBA8888;
1806aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888_REV] = pack_float_RGBA8888_REV;
1807aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888] = pack_float_ARGB8888;
1808aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888_REV] = pack_float_ARGB8888_REV;
1809aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888] = pack_float_RGBA8888; /* reused */
1810aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888_REV] = pack_float_RGBA8888_REV; /* reused */
1811aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888] = pack_float_XRGB8888;
1812aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888_REV] = pack_float_XRGB8888_REV;
1813aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB888] = pack_float_RGB888;
1814aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_BGR888] = pack_float_BGR888;
1815aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565] = pack_float_RGB565;
1816aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565_REV] = pack_float_RGB565_REV;
1817aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB4444] = pack_float_ARGB4444;
1818aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB4444_REV] = pack_float_ARGB4444_REV;
1819aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA5551] = pack_float_RGBA5551;
1820aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB1555] = pack_float_ARGB1555;
1821aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB1555_REV] = pack_float_ARGB1555_REV;
1822aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1823aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL44] = pack_float_AL44;
1824aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL88] = pack_float_AL88;
1825aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL88_REV] = pack_float_AL88_REV;
1826aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL1616] = pack_float_AL1616;
1827aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL1616_REV] = pack_float_AL1616_REV;
1828aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB332] = pack_float_RGB332;
1829aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_A8] = pack_float_A8;
1830aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_A16] = pack_float_A16;
1831aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_L8] = pack_float_L8;
1832aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_L16] = pack_float_L16;
1833aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_I8] = pack_float_L8; /* reuse pack_float_L8 */
1834aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_I16] = pack_float_L16; /* reuse pack_float_L16 */
1835aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_YCBCR] = pack_float_YCBCR;
1836aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_YCBCR_REV] = pack_float_YCBCR_REV;
1837aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R8] = pack_float_R8;
1838aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_GR88] = pack_float_GR88;
1839aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG88] = pack_float_RG88;
1840aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R16] = pack_float_R16;
1841aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG1616] = pack_float_RG1616;
1842aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG1616_REV] = pack_float_RG1616_REV;
1843aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB2101010] = pack_float_ARGB2101010;
1844aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1845aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* should never convert RGBA to these formats */
1846aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z24_S8] = NULL;
1847aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_S8_Z24] = NULL;
1848aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z16] = NULL;
1849aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_X8_Z24] = NULL;
1850aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z24_X8] = NULL;
1851aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z32] = NULL;
1852aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_S8] = NULL;
1853aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1854aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGB8] = pack_float_SRGB8;
1855aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA8] = pack_float_SRGBA8;
1856aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SARGB8] = pack_float_SARGB8;
1857aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SL8] = pack_float_SL8;
1858aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SLA8] = pack_float_SLA8;
1859aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1860aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* n/a */
1861aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGB_DXT1] = NULL;
1862aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT1] = NULL;
1863aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT3] = NULL;
1864aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT5] = NULL;
1865aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1866aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FXT1] = NULL;
1867aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FXT1] = NULL;
1868aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_DXT1] = NULL;
1869aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT1] = NULL;
1870aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT3] = NULL;
1871aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT5] = NULL;
1872aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1873aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FLOAT32] = pack_float_RGBA_FLOAT32;
1874aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FLOAT16] = pack_float_RGBA_FLOAT16;
1875aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FLOAT32] = pack_float_RGB_FLOAT32;
1876aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FLOAT16] = pack_float_RGB_FLOAT16;
1877aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ALPHA_FLOAT32] = pack_float_ALPHA_FLOAT32;
1878aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ALPHA_FLOAT16] = pack_float_ALPHA_FLOAT16;
1879aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_FLOAT32] = pack_float_LUMINANCE_FLOAT32;
1880aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_FLOAT16] = pack_float_LUMINANCE_FLOAT16;
1881aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = pack_float_LUMINANCE_ALPHA_FLOAT32;
1882aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = pack_float_LUMINANCE_ALPHA_FLOAT16;
1883aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1884aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_INTENSITY_FLOAT32] = pack_float_LUMINANCE_FLOAT32;
1885aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_INTENSITY_FLOAT16] = pack_float_LUMINANCE_FLOAT16;
1886aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R_FLOAT32] = pack_float_LUMINANCE_FLOAT32;
1887aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R_FLOAT16] = pack_float_LUMINANCE_FLOAT16;
1888aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG_FLOAT32] = pack_float_RG_FLOAT32;
1889aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG_FLOAT16] = pack_float_RG_FLOAT16;
1890aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1891aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* n/a */
1892aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT8] = NULL;
1893aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT16] = NULL;
1894aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT32] = NULL;
1895aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT8] = NULL;
1896aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT16] = NULL;
1897aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT32] = NULL;
1898aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1899aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_DUDV8] = pack_float_DUDV8;
1900aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1901aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_16] = pack_float_RGBA_16;
1902aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1903aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_R8] = pack_float_SIGNED_R8;
1904aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RG88_REV] = pack_float_SIGNED_RG88_REV;
1905aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBX8888] = pack_float_SIGNED_RGBX8888;
1906aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA8888] = pack_float_SIGNED_RGBA8888;
1907aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA8888_REV] = pack_float_SIGNED_RGBA8888_REV;
1908aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_R16] = pack_float_SIGNED_R16;
1909aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_GR1616] = pack_float_SIGNED_GR1616;
1910aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGB_16] = pack_float_SIGNED_RGB_16;
1911aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA_16] = pack_float_SIGNED_RGBA_16;
1912aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_A8] = pack_float_SIGNED_A8;
1913aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_L8] = pack_float_SIGNED_L8;
1914aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_AL88] = pack_float_SIGNED_AL88;
1915aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_I8] = pack_float_SIGNED_L8; /* reused */
1916aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_A16] = pack_float_SIGNED_A16;
1917aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_L16] = pack_float_SIGNED_L16;
1918aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_AL1616] = pack_float_SIGNED_AL1616;
1919aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_I16] = pack_float_SIGNED_L16; /* reused */
1920aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1921aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB9_E5_FLOAT] = pack_float_RGB9_E5_FLOAT;
1922aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R11_G11_B10_FLOAT] = pack_float_R11_G11_B10_FLOAT;
1923aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1924aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      initialized = GL_TRUE;
1925aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
1926aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1927aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   return table[format];
1928aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1929aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1930aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1931aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1932aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic pack_float_rgba_row_func
1933aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulget_pack_float_rgba_row_function(gl_format format)
1934aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1935aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static pack_float_rgba_row_func table[MESA_FORMAT_COUNT];
1936aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static GLboolean initialized = GL_FALSE;
1937aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1938aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (!initialized) {
1939aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* We don't need a special row packing function for each format.
1940aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul       * There's a generic fallback which uses a per-pixel packing function.
1941aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul       */
1942aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memset(table, 0, sizeof(table));
1943aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1944aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888] = pack_row_float_RGBA8888;
1945aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888_REV] = pack_row_float_RGBA8888_REV;
1946aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888] = pack_row_float_ARGB8888;
1947aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888_REV] = pack_row_float_ARGB8888_REV;
1948aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888] = pack_row_float_RGBA8888; /* reused */
1949aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888_REV] = pack_row_float_RGBA8888_REV; /* reused */
1950aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888] = pack_row_float_XRGB8888;
1951aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888_REV] = pack_row_float_XRGB8888_REV;
1952aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB888] = pack_row_float_RGB888;
1953aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_BGR888] = pack_row_float_BGR888;
1954aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565] = pack_row_float_RGB565;
1955aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565_REV] = pack_row_float_RGB565_REV;
1956aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1957aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      initialized = GL_TRUE;
1958aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
1959aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1960aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   return table[format];
1961aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1962aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1963aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1964aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1965aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic pack_ubyte_rgba_row_func
1966aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulget_pack_ubyte_rgba_row_function(gl_format format)
1967aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1968aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static pack_ubyte_rgba_row_func table[MESA_FORMAT_COUNT];
1969aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static GLboolean initialized = GL_FALSE;
1970aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1971aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (!initialized) {
1972aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* We don't need a special row packing function for each format.
1973aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul       * There's a generic fallback which uses a per-pixel packing function.
1974aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul       */
1975aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memset(table, 0, sizeof(table));
1976aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1977aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888] = pack_row_ubyte_RGBA8888;
1978aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888_REV] = pack_row_ubyte_RGBA8888_REV;
1979aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888] = pack_row_ubyte_ARGB8888;
1980aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888_REV] = pack_row_ubyte_ARGB8888_REV;
1981aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888] = pack_row_ubyte_RGBA8888; /* reused */
1982aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888_REV] = pack_row_ubyte_RGBA8888_REV; /* reused */
1983aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888] = pack_row_ubyte_XRGB8888;
1984aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888_REV] = pack_row_ubyte_XRGB8888_REV;
1985aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB888] = pack_row_ubyte_RGB888;
1986aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_BGR888] = pack_row_ubyte_BGR888;
1987aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565] = pack_row_ubyte_RGB565;
1988aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565_REV] = pack_row_ubyte_RGB565_REV;
1989aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1990aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      initialized = GL_TRUE;
1991aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
1992aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1993aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   return table[format];
1994aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1995aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1996aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1997aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1998aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
1999aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Pack a row of GLfloat rgba[4] values to the destination.
2000aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
2001aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2002aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_float_rgba_row(gl_format format, GLuint n,
2003aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                          const GLfloat src[][4], void *dst)
2004aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2005aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_float_rgba_row_func packrow = get_pack_float_rgba_row_function(format);
2006aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (packrow) {
2007aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* use "fast" function */
2008aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      packrow(n, src, dst);
2009aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2010aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   else {
2011aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* slower fallback */
2012aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      gl_pack_float_rgba_func pack = _mesa_get_pack_float_rgba_function(format);
2013aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLuint dstStride = _mesa_get_format_bytes(format);
2014aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte *dstPtr = (GLubyte *) dst;
2015aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLuint i;
2016aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2017aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      assert(pack);
2018aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      if (!pack)
2019aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         return;
2020aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2021aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      for (i = 0; i < n; i++) {
2022aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         pack(src[i], dstPtr);
2023aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         dstPtr += dstStride;
2024aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2025aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2026aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2027aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2028aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2029aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
2030aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Pack a row of GLubyte rgba[4] values to the destination.
2031aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
2032aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2033aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_ubyte_rgba_row(gl_format format, GLuint n,
2034aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                          const GLubyte src[][4], void *dst)
2035aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2036aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_rgba_row_func packrow = get_pack_ubyte_rgba_row_function(format);
2037aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (packrow) {
2038aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* use "fast" function */
2039aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      packrow(n, src, dst);
2040aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2041aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   else {
2042aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* slower fallback */
2043aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      gl_pack_ubyte_rgba_func pack = _mesa_get_pack_ubyte_rgba_function(format);
2044aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      const GLuint stride = _mesa_get_format_bytes(format);
2045aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte *d = ((GLubyte *) dst);
2046aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLuint i;
2047aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2048aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      assert(pack);
2049aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      if (!pack)
2050aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         return;
2051aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2052aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      for (i = 0; i < n; i++) {
2053aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         pack(src[i], d);
2054aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         d += stride;
2055aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2056aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2057aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2058aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2059aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2060aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
206166940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul * Pack a 2D image of ubyte RGBA pixels in the given format.
206266940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul * \param srcRowStride  source image row stride in bytes
206366940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul * \param dstRowStride  destination image row stride in bytes
206466940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul */
206566940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paulvoid
206666940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul_mesa_pack_ubyte_rgba_rect(gl_format format, GLuint width, GLuint height,
206766940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul                           const GLubyte *src, GLint srcRowStride,
206866940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul                           void *dst, GLint dstRowStride)
206966940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul{
207066940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   pack_ubyte_rgba_row_func packrow = get_pack_ubyte_rgba_row_function(format);
207166940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   GLubyte *dstUB = (GLubyte *) dst;
207266940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   GLuint i;
207366940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul
207466940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   if (packrow) {
207566940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      if (srcRowStride == width * 4 * sizeof(GLubyte) &&
207666940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul          dstRowStride == _mesa_format_row_stride(format, width)) {
207766940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         /* do whole image at once */
207866940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         packrow(width * height, (const GLubyte (*)[4]) src, dst);
207966940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      }
208066940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      else {
208166940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         /* row by row */
208266940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         for (i = 0; i < height; i++) {
208366940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul            packrow(width, (const GLubyte (*)[4]) src, dstUB);
208466940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul            src += srcRowStride;
208566940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul            dstUB += dstRowStride;
208666940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         }
208766940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      }
208866940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   }
208966940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   else {
209066940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      /* slower fallback */
209166940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      for (i = 0; i < height; i++) {
209266940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         _mesa_pack_ubyte_rgba_row(format, width,
209366940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul                                   (const GLubyte (*)[4]) src, dstUB);
209466940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         src += srcRowStride;
209566940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         dstUB += dstRowStride;
209666940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      }
209766940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   }
209866940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul}
209966940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul
210066940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul
210166940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul
210266940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul/**
2103aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul ** Pack float Z pixels
2104aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul **/
2105aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2106aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2107aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_z_Z24_S8(const GLfloat *src, void *dst)
2108aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2109aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the stencil values */
2110aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2111fc52534f012837a39c03a764eb611d460210514aMarek Olšák   const GLdouble scale = (GLdouble) 0xffffff;
2112aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *d & 0xff;
2113aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = (GLuint) (*src * scale);
2114aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(z <= 0xffffff);
2115aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (z << 8) | s;
2116aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2117aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2118aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2119aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_z_S8_Z24(const GLfloat *src, void *dst)
2120aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2121aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the stencil values */
2122aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2123fc52534f012837a39c03a764eb611d460210514aMarek Olšák   const GLdouble scale = (GLdouble) 0xffffff;
2124aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *d & 0xff000000;
2125aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = (GLuint) (*src * scale);
2126aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(z <= 0xffffff);
2127aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = s | z;
2128aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2129aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2130aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2131aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_z_Z16(const GLfloat *src, void *dst)
2132aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2133aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
2134aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   const GLfloat scale = (GLfloat) 0xffff;
2135aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (GLushort) (*src * scale);
2136aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2137aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2138aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2139aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_z_Z32(const GLfloat *src, void *dst)
2140aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2141aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2142fc52534f012837a39c03a764eb611d460210514aMarek Olšák   const GLdouble scale = (GLdouble) 0xffffffff;
2143aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (GLuint) (*src * scale);
2144aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2145aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2146aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2147aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_z_Z32_FLOAT(const GLfloat *src, void *dst)
2148aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2149aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = (GLfloat *) dst;
2150aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src;
2151aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2152aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2153aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulgl_pack_float_z_func
2154aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_get_pack_float_z_func(gl_format format)
2155aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2156aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2157aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2158aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_X8:
2159aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_float_z_Z24_S8;
2160aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2161aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_X8_Z24:
2162aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_float_z_S8_Z24;
2163aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z16:
2164aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_float_z_Z16;
2165aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32:
2166aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_float_z_Z32;
2167aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT:
2168aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2169aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_float_z_Z32_FLOAT;
2170aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2171aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL,
2172aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                    "unexpected format in _mesa_get_pack_float_z_func()");
2173aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return NULL;
2174aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2175aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2176aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2177aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2178aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2179aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
2180aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul ** Pack uint Z pixels.  The incoming src value is always in
2181aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul ** the range [0, 2^32-1].
2182aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul **/
2183aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2184aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2185aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_Z24_S8(const GLuint *src, void *dst)
2186aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2187aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the stencil values */
2188aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2189aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *d & 0xff;
2190aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = *src & 0xffffff00;
2191aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = z | s;
2192aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2193aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2194aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2195aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_S8_Z24(const GLuint *src, void *dst)
2196aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2197aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the stencil values */
2198aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2199aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *d & 0xff000000;
2200aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = *src >> 8;
2201aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = s | z;
2202aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2203aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2204aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2205aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_Z16(const GLuint *src, void *dst)
2206aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2207aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
2208aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src >> 16;
2209aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2210aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2211aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2212aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_Z32(const GLuint *src, void *dst)
2213aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2214aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2215aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src;
2216aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2217aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2218aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2219aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_Z32_FLOAT(const GLuint *src, void *dst)
2220aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2221aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2222fc52534f012837a39c03a764eb611d460210514aMarek Olšák   const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
2223aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src * scale;
2224aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(*d >= 0.0f);
2225aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(*d <= 1.0f);
2226aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2227aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2228aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2229aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_Z32_FLOAT_X24S8(const GLuint *src, void *dst)
2230aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2231aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
2232fc52534f012837a39c03a764eb611d460210514aMarek Olšák   const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
2233aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src * scale;
2234aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(*d >= 0.0f);
2235aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(*d <= 1.0f);
2236aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2237aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2238aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulgl_pack_uint_z_func
2239aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_get_pack_uint_z_func(gl_format format)
2240aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2241aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2242aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2243aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_X8:
2244aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_Z24_S8;
2245aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2246aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_X8_Z24:
2247aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_S8_Z24;
2248aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z16:
2249aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_Z16;
2250aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32:
2251aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_Z32;
2252aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT:
2253aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_Z32_FLOAT;
2254aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2255aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_Z32_FLOAT_X24S8;
2256aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2257aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL, "unexpected format in _mesa_get_pack_uint_z_func()");
2258aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return NULL;
2259aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2260aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2261aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2262aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2263aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
2264aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul ** Pack ubyte stencil pixels
2265aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul **/
2266aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2267aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2268aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_stencil_Z24_S8(const GLubyte *src, void *dst)
2269aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2270aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the Z values */
2271aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2272aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *src;
2273aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = *d & 0xffffff00;
2274aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = z | s;
2275aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2276aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2277aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2278aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_stencil_S8_Z24(const GLubyte *src, void *dst)
2279aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2280aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the Z values */
2281aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2282aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *src << 24;
2283aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = *d & 0xffffff;
2284aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = s | z;
2285aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2286aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2287aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2288aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_stencil_S8(const GLubyte *src, void *dst)
2289aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2290aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = (GLubyte *) dst;
2291aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src;
2292aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2293aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2294aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2295aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_stencil_Z32_FLOAT_X24S8(const GLubyte *src, void *dst)
2296aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2297aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
2298aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = *src;
2299aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2300aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2301aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2302aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulgl_pack_ubyte_stencil_func
2303aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_get_pack_ubyte_stencil_func(gl_format format)
2304aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2305aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2306aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2307aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_ubyte_stencil_Z24_S8;
2308aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2309aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_ubyte_stencil_S8_Z24;
2310aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8:
2311aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_ubyte_stencil_S8;
2312aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2313aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_ubyte_stencil_Z32_FLOAT_X24S8;
2314aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2315aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL,
2316aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                    "unexpected format in _mesa_pack_ubyte_stencil_func()");
2317aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return NULL;
2318aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2319aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2320aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2321aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2322aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2323aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2324aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_float_z_row(gl_format format, GLuint n,
2325aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                       const GLfloat *src, void *dst)
2326aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2327aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2328aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2329aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_X8:
2330aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2331aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the stencil values */
2332aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2333fc52534f012837a39c03a764eb611d460210514aMarek Olšák         const GLdouble scale = (GLdouble) 0xffffff;
2334aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2335aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2336aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = d[i] & 0xff;
2337aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = (GLuint) (src[i] * scale);
2338aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            assert(z <= 0xffffff);
2339aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = (z << 8) | s;
2340aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2341aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2342aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2343aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2344aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_X8_Z24:
2345aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2346aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the stencil values */
2347aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2348fc52534f012837a39c03a764eb611d460210514aMarek Olšák         const GLdouble scale = (GLdouble) 0xffffff;
2349aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2350aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2351aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = d[i] & 0xff000000;
2352aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = (GLuint) (src[i] * scale);
2353aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            assert(z <= 0xffffff);
2354aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = s | z;
2355aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2356aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2357aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2358aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z16:
2359aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2360aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLushort *d = ((GLushort *) dst);
2361aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         const GLfloat scale = (GLfloat) 0xffff;
2362aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2363aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2364aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = (GLushort) (src[i] * scale);
2365aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2366aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2367aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2368aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32:
2369aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2370aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2371fc52534f012837a39c03a764eb611d460210514aMarek Olšák         const GLdouble scale = (GLdouble) 0xffffffff;
2372aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2373aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2374aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = (GLuint) (src[i] * scale);
2375aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2376aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2377aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2378aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT:
2379aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memcpy(dst, src, n * sizeof(GLfloat));
2380aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2381aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2382aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
23830bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul         struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
2384aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2385aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
23860bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            d[i].z = src[i];
2387aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2388aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2389aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2390aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2391aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL, "unexpected format in _mesa_pack_float_z_row()");
2392aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2393aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2394aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2395aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2396aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
2397aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * The incoming Z values are always in the range [0, 0xffffffff].
2398aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
2399aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2400aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_uint_z_row(gl_format format, GLuint n,
2401aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                      const GLuint *src, void *dst)
2402aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2403aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2404aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2405aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_X8:
2406aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2407aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the stencil values */
2408aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2409aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2410aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2411aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = d[i] & 0xff;
2412aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = src[i] & 0xffffff00;
2413aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = z | s;
2414aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2415aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2416aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2417aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2418aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_X8_Z24:
2419aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2420aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the stencil values */
2421aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2422aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2423aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2424aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = d[i] & 0xff000000;
2425aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = src[i] >> 8;
2426aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = s | z;
2427aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2428aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2429aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2430aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z16:
2431aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2432aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLushort *d = ((GLushort *) dst);
2433aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2434aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2435aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = src[i] >> 16;
2436aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2437aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2438aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2439aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32:
2440aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memcpy(dst, src, n * sizeof(GLfloat));
2441aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2442aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT:
2443aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2444aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2445fc52534f012837a39c03a764eb611d460210514aMarek Olšák         const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
2446aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2447aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2448aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = src[i] * scale;
2449aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            assert(d[i] >= 0.0f);
2450aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            assert(d[i] <= 1.0f);
2451aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2452aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2453aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2454aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2455aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
24560bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul         struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
2457fc52534f012837a39c03a764eb611d460210514aMarek Olšák         const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
2458aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2459aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
24600bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            d[i].z = src[i] * scale;
24610bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            assert(d[i].z >= 0.0f);
24620bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            assert(d[i].z <= 1.0f);
2463aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2464aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2465aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2466aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2467aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL, "unexpected format in _mesa_pack_uint_z_row()");
2468aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2469aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2470aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2471aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2472aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2473aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_ubyte_stencil_row(gl_format format, GLuint n,
2474aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                             const GLubyte *src, void *dst)
2475aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2476aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2477aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2478aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2479aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the Z values */
2480aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2481aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2482aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2483aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = src[i];
2484aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = d[i] & 0xffffff00;
2485aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = z | s;
2486aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2487aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2488aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2489aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2490aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2491aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the Z values */
2492aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2493aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2494aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2495aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = src[i] << 24;
2496aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = d[i] & 0xffffff;
2497aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = s | z;
2498aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2499aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2500aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2501aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8:
2502aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memcpy(dst, src, n * sizeof(GLubyte));
2503aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2504aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2505aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
25060bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul         struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
2507aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2508aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
25090bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            d[i].x24s8 = src[i];
2510aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2511aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2512aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2513aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2514aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL, "unexpected format in _mesa_pack_ubyte_stencil_row()");
2515aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2516aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2517aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2518aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2519aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
2520aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Incoming Z/stencil values are always in uint_24_8 format.
2521aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
2522aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2523aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_uint_24_8_depth_stencil_row(gl_format format, GLuint n,
2524aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                                       const GLuint *src, void *dst)
2525aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2526aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2527aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2528aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memcpy(dst, src, n * sizeof(GLuint));
2529aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2530aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2531aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2532aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2533aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2534aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2535aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = src[i] << 24;
2536aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = src[i] >> 8;
2537aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = s | z;
2538aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2539aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2540aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
254182ddd1129e76b8bb978497df2940d1449a848551Brian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
254282ddd1129e76b8bb978497df2940d1449a848551Brian Paul      {
254382ddd1129e76b8bb978497df2940d1449a848551Brian Paul         const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
25440bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul         struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
254582ddd1129e76b8bb978497df2940d1449a848551Brian Paul         GLint i;
254682ddd1129e76b8bb978497df2940d1449a848551Brian Paul         for (i = 0; i < n; i++) {
254782ddd1129e76b8bb978497df2940d1449a848551Brian Paul            GLfloat z = (src[i] >> 8) * scale;
25480bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            d[i].z = z;
25490bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            d[i].x24s8 = src[i];
255082ddd1129e76b8bb978497df2940d1449a848551Brian Paul         }
255182ddd1129e76b8bb978497df2940d1449a848551Brian Paul      }
255282ddd1129e76b8bb978497df2940d1449a848551Brian Paul      break;
2553aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2554aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL, "bad format %s in _mesa_pack_ubyte_s_row",
2555aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                    _mesa_get_format_name(format));
2556aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return;
2557aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2558aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2559f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2560f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2561f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2562f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul/**
2563f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul * Convert a boolean color mask to a packed color where each channel of
2564f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul * the packed value at dst will be 0 or ~0 depending on the colorMask.
2565f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul */
2566f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paulvoid
2567f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul_mesa_pack_colormask(gl_format format, const GLubyte colorMask[4], void *dst)
2568f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul{
2569f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   GLfloat maskColor[4];
2570f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2571f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   switch (_mesa_get_format_datatype(format)) {
2572f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   case GL_UNSIGNED_NORMALIZED:
2573f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      /* simple: 1.0 will convert to ~0 in the right bit positions */
2574f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      maskColor[0] = colorMask[0] ? 1.0 : 0.0;
2575f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      maskColor[1] = colorMask[1] ? 1.0 : 0.0;
2576f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      maskColor[2] = colorMask[2] ? 1.0 : 0.0;
2577f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      maskColor[3] = colorMask[3] ? 1.0 : 0.0;
2578f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      _mesa_pack_float_rgba_row(format, 1,
2579f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul                                (const GLfloat (*)[4]) maskColor, dst);
2580f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      break;
2581f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   case GL_SIGNED_NORMALIZED:
2582f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   case GL_FLOAT:
2583f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      /* These formats are harder because it's hard to know the floating
2584f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * point values that will convert to ~0 for each color channel's bits.
2585f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * This solution just generates a non-zero value for each color channel
2586f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * then fixes up the non-zero values to be ~0.
2587f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * Note: we'll need to add special case code if we ever have to deal
2588f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * with formats with unequal color channel sizes, like R11_G11_B10.
2589f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * We issue a warning below for channel sizes other than 8,16,32.
2590f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       */
2591f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      {
2592f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         GLuint bits = _mesa_get_format_max_bits(format); /* bits per chan */
2593f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         GLuint bytes = _mesa_get_format_bytes(format);
2594f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         GLuint i;
2595f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2596f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         /* this should put non-zero values into the channels of dst */
25976bf7d402149b36e0eac7c385c561ec6277a8339dBrian Paul         maskColor[0] = colorMask[0] ? -1.0f : 0.0f;
25986bf7d402149b36e0eac7c385c561ec6277a8339dBrian Paul         maskColor[1] = colorMask[1] ? -1.0f : 0.0f;
25996bf7d402149b36e0eac7c385c561ec6277a8339dBrian Paul         maskColor[2] = colorMask[2] ? -1.0f : 0.0f;
26006bf7d402149b36e0eac7c385c561ec6277a8339dBrian Paul         maskColor[3] = colorMask[3] ? -1.0f : 0.0f;
2601f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         _mesa_pack_float_rgba_row(format, 1,
2602f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul                                   (const GLfloat (*)[4]) maskColor, dst);
2603f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2604f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         /* fix-up the dst channels by converting non-zero values to ~0 */
2605f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         if (bits == 8) {
2606f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            GLubyte *d = (GLubyte *) dst;
2607f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            for (i = 0; i < bytes; i++) {
2608f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul               d[i] = d[i] ? 0xffff : 0x0;
2609f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            }
2610f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         }
2611f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         else if (bits == 16) {
2612f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            GLushort *d = (GLushort *) dst;
2613f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            for (i = 0; i < bytes / 2; i++) {
2614f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul               d[i] = d[i] ? 0xffff : 0x0;
2615f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            }
2616f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         }
2617f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         else if (bits == 32) {
2618f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            GLuint *d = (GLuint *) dst;
2619f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            for (i = 0; i < bytes / 4; i++) {
2620f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul               d[i] = d[i] ? 0xffffffffU : 0x0;
2621f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            }
2622f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         }
2623f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         else {
2624f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            _mesa_problem(NULL, "unexpected size in _mesa_pack_colormask()");
2625f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            return;
2626f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         }
2627f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      }
2628f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      break;
2629f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   default:
2630f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      _mesa_problem(NULL, "unexpected format data type in gen_color_mask()");
2631f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      return;
2632f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   }
2633f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul}
2634