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
1008749c9060aca85277c388377d15fd6323ba20b78eJordan Justen/* MESA_FORMAT_ABGR2101010_UINT */
1009749c9060aca85277c388377d15fd6323ba20b78eJordan Justen
1010749c9060aca85277c388377d15fd6323ba20b78eJordan Justenstatic void
1011749c9060aca85277c388377d15fd6323ba20b78eJordan Justenpack_ubyte_ABGR2101010_UINT(const GLubyte src[4], void *dst)
1012749c9060aca85277c388377d15fd6323ba20b78eJordan Justen{
1013749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   GLuint *d = ((GLuint *) dst);
1014749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
1015749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   GLushort g = UBYTE_TO_USHORT(src[GCOMP]);
1016749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   GLushort b = UBYTE_TO_USHORT(src[BCOMP]);
1017749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   GLushort a = UBYTE_TO_USHORT(src[ACOMP]);
1018749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   *d = PACK_COLOR_2101010_US(a, b, g, r);
1019749c9060aca85277c388377d15fd6323ba20b78eJordan Justen}
1020749c9060aca85277c388377d15fd6323ba20b78eJordan Justen
1021749c9060aca85277c388377d15fd6323ba20b78eJordan Justenstatic void
1022749c9060aca85277c388377d15fd6323ba20b78eJordan Justenpack_float_ABGR2101010_UINT(const GLfloat src[4], void *dst)
1023749c9060aca85277c388377d15fd6323ba20b78eJordan Justen{
1024749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   GLuint *d = ((GLuint *) dst);
1025749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   GLushort r, g, b, a;
1026749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
1027749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
1028749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
1029749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
1030749c9060aca85277c388377d15fd6323ba20b78eJordan Justen   *d = PACK_COLOR_2101010_US(a, b, g, r);
1031749c9060aca85277c388377d15fd6323ba20b78eJordan Justen}
1032749c9060aca85277c388377d15fd6323ba20b78eJordan Justen
1033749c9060aca85277c388377d15fd6323ba20b78eJordan Justen
1034aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_SRGB8 */
1035aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1036aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1037aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_SRGB8(const GLubyte src[4], void *dst)
1038aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1039aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
1040aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1041aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1042aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1043aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1044aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1045aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1046aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SRGB8(const GLfloat src[4], void *dst)
1047aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1048aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
1049aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = linear_float_to_srgb_ubyte(src[RCOMP]);
1050aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = linear_float_to_srgb_ubyte(src[GCOMP]);
1051aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = linear_float_to_srgb_ubyte(src[BCOMP]);
1052aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1053aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1054aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1055aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_SRGBA8 */
1056aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1057aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1058aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_SRGBA8(const GLubyte src[4], void *dst)
1059aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1060aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
1061aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1062aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte g = linear_ubyte_to_srgb_ubyte(src[GCOMP]);
1063aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte b = linear_ubyte_to_srgb_ubyte(src[BCOMP]);
1064aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(r, g, b, src[ACOMP]);
1065aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1066aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1067aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1068aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SRGBA8(const GLfloat src[4], void *dst)
1069aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1070aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
1071aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r, g, b, a;
1072aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   r = linear_float_to_srgb_ubyte(src[RCOMP]);
1073aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   g = linear_float_to_srgb_ubyte(src[GCOMP]);
1074aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   b = linear_float_to_srgb_ubyte(src[BCOMP]);
1075aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(a, src[ACOMP]);
1076aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(r, g, b, a);
1077aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1078aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1079aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1080aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_SARGB8 */
1081aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1082aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1083aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_SARGB8(const GLubyte src[4], void *dst)
1084aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1085aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
1086aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1087aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte g = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1088aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte b = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1089aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(src[ACOMP], r, g, b);
1090aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1091aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1092aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1093aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SARGB8(const GLfloat src[4], void *dst)
1094aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1095aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
1096aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte r, g, b, a;
1097aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   r = linear_float_to_srgb_ubyte(src[RCOMP]);
1098aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   g = linear_float_to_srgb_ubyte(src[GCOMP]);
1099aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   b = linear_float_to_srgb_ubyte(src[BCOMP]);
1100aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_UBYTE(a, src[ACOMP]);
1101aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(a, r, g, b);
1102aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1103aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1104aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1105aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_SL8 */
1106aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1107aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1108aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_SL8(const GLubyte src[4], void *dst)
1109aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1110aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
1111aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1112aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1113aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1114aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1115aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SL8(const GLfloat src[4], void *dst)
1116aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1117aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = ((GLubyte *) dst);
1118aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte l = linear_float_to_srgb_ubyte(src[RCOMP]);
1119aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = l;
1120aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1121aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1122aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1123aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_SLA8 */
1124aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1125aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1126aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_SLA8(const GLubyte src[4], void *dst)
1127aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1128aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1129aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte l = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
1130aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(src[ACOMP], l);
1131aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1132aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1133aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1134aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SLA8(const GLfloat src[4], void *dst)
1135aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1136aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1137aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte a, l = linear_float_to_srgb_ubyte(src[RCOMP]);
1138aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   CLAMPED_FLOAT_TO_UBYTE(a, src[ACOMP]);
1139aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(a, l);
1140aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1141aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1142aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1143aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RGBA_FLOAT32 */
1144aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1145aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1146aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGBA_FLOAT32(const GLubyte src[4], void *dst)
1147aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1148aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1149aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[0]);
1150aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = UBYTE_TO_FLOAT(src[1]);
1151aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = UBYTE_TO_FLOAT(src[2]);
1152aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = UBYTE_TO_FLOAT(src[3]);
1153aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1154aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1155aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1156aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGBA_FLOAT32(const GLfloat src[4], void *dst)
1157aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1158aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1159aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[0];
1160aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = src[1];
1161aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = src[2];
1162aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = src[3];
1163aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1164aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1165aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1166aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RGBA_FLOAT16 */
1167aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1168aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1169aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGBA_FLOAT16(const GLubyte src[4], void *dst)
1170aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1171aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1172aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[0]));
1173aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[1]));
1174aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[2]));
1175aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[3]));
1176aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1177aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1178aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1179aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGBA_FLOAT16(const GLfloat src[4], void *dst)
1180aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1181aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1182aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[0]);
1183aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(src[1]);
1184aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = _mesa_float_to_half(src[2]);
1185aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = _mesa_float_to_half(src[3]);
1186aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1187aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1188aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1189aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RGB_FLOAT32 */
1190aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1191aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1192aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGB_FLOAT32(const GLubyte src[4], void *dst)
1193aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1194aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1195aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[0]);
1196aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = UBYTE_TO_FLOAT(src[1]);
1197aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = UBYTE_TO_FLOAT(src[2]);
1198aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1199aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1200aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1201aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGB_FLOAT32(const GLfloat src[4], void *dst)
1202aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1203aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1204aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[0];
1205aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = src[1];
1206aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = src[2];
1207aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1208aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1209aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1210aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RGB_FLOAT16 */
1211aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1212aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1213aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGB_FLOAT16(const GLubyte src[4], void *dst)
1214aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1215aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1216aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[0]));
1217aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[1]));
1218aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[2]));
1219aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1220aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1221aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1222aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGB_FLOAT16(const GLfloat src[4], void *dst)
1223aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1224aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1225aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[0]);
1226aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(src[1]);
1227aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = _mesa_float_to_half(src[2]);
1228aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1229aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1230aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1231aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_ALPHA_FLOAT32 */
1232aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1233aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1234aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_ALPHA_FLOAT32(const GLubyte src[4], void *dst)
1235aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1236aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1237aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[ACOMP]);
1238aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1239aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1240aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1241aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_ALPHA_FLOAT32(const GLfloat src[4], void *dst)
1242aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1243aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1244aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[ACOMP];
1245aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1246aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1247aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1248aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_ALPHA_FLOAT16 */
1249aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1250aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1251aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_ALPHA_FLOAT16(const GLubyte src[4], void *dst)
1252aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1253aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1254aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[ACOMP]));
1255aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1256aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1257aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1258aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_ALPHA_FLOAT16(const GLfloat src[4], void *dst)
1259aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1260aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1261aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[ACOMP]);
1262aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1263aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1264aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1265aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_LUMINANCE_FLOAT32 (and INTENSITY_FLOAT32, R_FLOAT32) */
1266aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1267aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1268aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_LUMINANCE_FLOAT32(const GLubyte src[4], void *dst)
1269aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1270aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1271aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[RCOMP]);
1272aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1273aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1274aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1275aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_LUMINANCE_FLOAT32(const GLfloat src[4], void *dst)
1276aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1277aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1278aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[RCOMP];
1279aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1280aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1281aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1282aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_LUMINANCE_FLOAT16 (and INTENSITY_FLOAT16, R_FLOAT32) */
1283aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1284aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1285aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_LUMINANCE_FLOAT16(const GLubyte src[4], void *dst)
1286aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1287aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1288aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[RCOMP]));
1289aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1290aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1291aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1292aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_LUMINANCE_FLOAT16(const GLfloat src[4], void *dst)
1293aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1294aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1295aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[RCOMP]);
1296aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1297aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1298aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1299aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 */
1300aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1301aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1302aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_LUMINANCE_ALPHA_FLOAT32(const GLubyte src[4], void *dst)
1303aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1304aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1305aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[RCOMP]);
1306aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = UBYTE_TO_FLOAT(src[ACOMP]);
1307aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1308aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1309aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1310aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_LUMINANCE_ALPHA_FLOAT32(const GLfloat src[4], void *dst)
1311aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1312aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1313aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[RCOMP];
1314aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = src[ACOMP];
1315aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1316aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1317aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1318aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 */
1319aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1320aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1321aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_LUMINANCE_ALPHA_FLOAT16(const GLubyte src[4], void *dst)
1322aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1323aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1324aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[RCOMP]));
1325aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[ACOMP]));
1326aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1327aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1328aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1329aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_LUMINANCE_ALPHA_FLOAT16(const GLfloat src[4], void *dst)
1330aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1331aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1332aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[RCOMP]);
1333aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(src[ACOMP]);
1334aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1335aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1336aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1337aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RG_FLOAT32 */
1338aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1339aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1340aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RG_FLOAT32(const GLubyte src[4], void *dst)
1341aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1342aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1343aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_FLOAT(src[RCOMP]);
1344aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = UBYTE_TO_FLOAT(src[GCOMP]);
1345aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1346aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1347aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1348aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RG_FLOAT32(const GLfloat src[4], void *dst)
1349aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1350aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
1351aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = src[RCOMP];
1352aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = src[GCOMP];
1353aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1354aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1355aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1356aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RG_FLOAT16 */
1357aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1358aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1359aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RG_FLOAT16(const GLubyte src[4], void *dst)
1360aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1361aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1362aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[RCOMP]));
1363aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[GCOMP]));
1364aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1365aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1366aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1367aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RG_FLOAT16(const GLfloat src[4], void *dst)
1368aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1369aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLhalfARB *d = ((GLhalfARB *) dst);
1370aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = _mesa_float_to_half(src[RCOMP]);
1371aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = _mesa_float_to_half(src[GCOMP]);
1372aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1373aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1374aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1375aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_DUDV8 */
1376aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1377aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1378aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_DUDV8(const GLubyte src[4], void *dst)
1379aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1380aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* XXX is this ever used? */
1381aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1382aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(src[0], src[1]);
1383aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1384aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1385aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1386aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_DUDV8(const GLfloat src[4], void *dst)
1387aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1388aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1389aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte du, dv;
1390aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   du = FLOAT_TO_BYTE(CLAMP(src[0], 0.0F, 1.0F));
1391aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   dv = FLOAT_TO_BYTE(CLAMP(src[1], 0.0F, 1.0F));
1392aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_88(du, dv);
1393aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1394aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1395aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1396aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/* MESA_FORMAT_RGBA_16 */
1397aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1398aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1399aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGBA_16(const GLubyte src[4], void *dst)
1400aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1401aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1402aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = UBYTE_TO_USHORT(src[RCOMP]);
1403aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = UBYTE_TO_USHORT(src[GCOMP]);
1404aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = UBYTE_TO_USHORT(src[BCOMP]);
1405aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = UBYTE_TO_USHORT(src[ACOMP]);
1406aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1407aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1408aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1409aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGBA_16(const GLfloat src[4], void *dst)
1410aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1411aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
1412aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(d[0], src[RCOMP]);
1413aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(d[1], src[GCOMP]);
1414aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(d[2], src[BCOMP]);
1415aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   UNCLAMPED_FLOAT_TO_USHORT(d[3], src[ACOMP]);
1416aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1417aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1418aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1419aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1420aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1421aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_R8
1422aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1423aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1424aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1425aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_R8(const GLfloat src[4], void *dst)
1426aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1427aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte *d = (GLbyte *) dst;
1428aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1429aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1430aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1431aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1432aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1433aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RG88_REV
1434aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1435aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1436aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1437aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RG88_REV(const GLfloat src[4], void *dst)
1438aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1439aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = (GLushort *) dst;
1440aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1441aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
1442aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (g << 8) | r;
1443aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1444aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1445aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1446aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1447aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RGBX8888
1448aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1449aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1450aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1451aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RGBX8888(const GLfloat src[4], void *dst)
1452aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1453aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1454aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1455aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
1456aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte b = FLOAT_TO_BYTE(CLAMP(src[BCOMP], -1.0f, 1.0f));
1457aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte a = 127;
1458aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(r, g, b, a);
1459aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1460aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1461aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1462aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1463aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RGBA8888
1464aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1465aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1466aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1467aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RGBA8888(const GLfloat src[4], void *dst)
1468aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1469aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1470aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1471aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
1472aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte b = FLOAT_TO_BYTE(CLAMP(src[BCOMP], -1.0f, 1.0f));
1473aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte a = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
1474aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(r, g, b, a);
1475aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1476aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1477aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1478aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1479aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV
1480aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1481aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1482aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1483aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RGBA8888_REV(const GLfloat src[4], void *dst)
1484aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1485aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1486aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1487aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
1488aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte b = FLOAT_TO_BYTE(CLAMP(src[BCOMP], -1.0f, 1.0f));
1489aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte a = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
1490aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_8888(a, b, g, r);
1491aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1492aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1493aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1494aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1495aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_R16
1496aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1497aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1498aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1499aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_R16(const GLfloat src[4], void *dst)
1500aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1501aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort *d = (GLshort *) dst;
1502aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1503aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1504aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1505aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1506aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1507aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_GR1616
1508aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1509aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1510aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1511aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_GR1616(const GLfloat src[4], void *dst)
1512aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1513aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1514aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort r = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1515aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort g = FLOAT_TO_SHORT(CLAMP(src[GCOMP], -1.0f, 1.0f));
1516aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (g << 16) | (r & 0xffff);
1517aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1518aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1519aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1520aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1521aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RGB_16
1522aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1523aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1524aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1525aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RGB_16(const GLfloat src[4], void *dst)
1526aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1527aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort *d = (GLshort *) dst;
1528aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1529aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = FLOAT_TO_SHORT(CLAMP(src[GCOMP], -1.0f, 1.0f));
1530aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = FLOAT_TO_SHORT(CLAMP(src[BCOMP], -1.0f, 1.0f));
1531aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1532aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1533aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1534aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1535aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_RGBA_16
1536aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1537aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1538aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1539aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_RGBA_16(const GLfloat src[4], void *dst)
1540aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1541aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort *d = (GLshort *) dst;
1542aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[0] = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1543aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = FLOAT_TO_SHORT(CLAMP(src[GCOMP], -1.0f, 1.0f));
1544aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[2] = FLOAT_TO_SHORT(CLAMP(src[BCOMP], -1.0f, 1.0f));
1545aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[3] = FLOAT_TO_SHORT(CLAMP(src[ACOMP], -1.0f, 1.0f));
1546aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1547aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1548aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1549aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1550aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_A8
1551aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1552aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1553aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1554aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_A8(const GLfloat src[4], void *dst)
1555aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1556aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte *d = (GLbyte *) dst;
1557aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
1558aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1559aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1560aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1561aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1562aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_L8
1563aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1564aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1565aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1566aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_L8(const GLfloat src[4], void *dst)
1567aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1568aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte *d = (GLbyte *) dst;
1569aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1570aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1571aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1572aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1573aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1574aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_AL88
1575aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1576aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1577aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1578aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_AL88(const GLfloat src[4], void *dst)
1579aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1580aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = (GLushort *) dst;
1581aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte l = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
1582aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLbyte a = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
1583aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (a << 8) | l;
1584aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1585aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1586aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1587aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1588aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_A16
1589aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1590aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1591aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1592aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_A16(const GLfloat src[4], void *dst)
1593aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1594aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort *d = (GLshort *) dst;
1595aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_SHORT(CLAMP(src[ACOMP], -1.0f, 1.0f));
1596aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1597aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1598aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1599aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1600aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_L16
1601aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1602aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1603aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1604aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_L16(const GLfloat src[4], void *dst)
1605aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1606aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort *d = (GLshort *) dst;
1607aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1608aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1609aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1610aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1611aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1612aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_SIGNED_AL1616
1613aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1614aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1615aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1616aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_SIGNED_AL1616(const GLfloat src[4], void *dst)
1617aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1618aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1619aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort l = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
1620aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLshort a = FLOAT_TO_SHORT(CLAMP(src[ACOMP], -1.0f, 1.0f));
1621aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = PACK_COLOR_1616(a, l);
1622aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1623aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1624aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1625aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1626aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_RGB9_E5_FLOAT;
1627aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1628aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1629aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1630aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_RGB9_E5_FLOAT(const GLfloat src[4], void *dst)
1631aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1632aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1633aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = float3_to_rgb9e5(src);
1634aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1635aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1636aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1637aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_RGB9_E5_FLOAT(const GLubyte src[4], void *dst)
1638aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1639aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1640aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat rgb[3];
1641aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[0] = UBYTE_TO_FLOAT(src[RCOMP]);
1642aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[1] = UBYTE_TO_FLOAT(src[GCOMP]);
1643aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[2] = UBYTE_TO_FLOAT(src[BCOMP]);
1644aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = float3_to_rgb9e5(rgb);
1645aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1646aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1647aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1648aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1649aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/*
1650aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * MESA_FORMAT_R11_G11_B10_FLOAT;
1651aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1652aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1653aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1654aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_R11_G11_B10_FLOAT(const GLubyte src[4], void *dst)
1655aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1656aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1657aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat rgb[3];
1658aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[0] = UBYTE_TO_FLOAT(src[RCOMP]);
1659aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[1] = UBYTE_TO_FLOAT(src[GCOMP]);
1660aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   rgb[2] = UBYTE_TO_FLOAT(src[BCOMP]);
1661aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = float3_to_r11g11b10f(rgb);
1662aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1663aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1664aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
1665aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_R11_G11_B10_FLOAT(const GLfloat src[4], void *dst)
1666aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1667aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = (GLuint *) dst;
1668aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = float3_to_r11g11b10f(src);
1669aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1670aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1671aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1672aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1673aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
1674aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Return a function that can pack a GLubyte rgba[4] color.
1675aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1676aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulgl_pack_ubyte_rgba_func
1677aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_get_pack_ubyte_rgba_function(gl_format format)
1678aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1679aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static gl_pack_ubyte_rgba_func table[MESA_FORMAT_COUNT];
1680aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static GLboolean initialized = GL_FALSE;
1681aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1682aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (!initialized) {
1683aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memset(table, 0, sizeof(table));
1684aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1685aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_NONE] = NULL;
1686aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1687aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888] = pack_ubyte_RGBA8888;
1688aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888_REV] = pack_ubyte_RGBA8888_REV;
1689aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888] = pack_ubyte_ARGB8888;
1690aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888_REV] = pack_ubyte_ARGB8888_REV;
1691aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888] = pack_ubyte_RGBA8888; /* reused */
1692aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888_REV] = pack_ubyte_RGBA8888_REV; /* reused */
1693aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888] = pack_ubyte_XRGB8888;
1694aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888_REV] = pack_ubyte_XRGB8888_REV;
1695aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB888] = pack_ubyte_RGB888;
1696aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_BGR888] = pack_ubyte_BGR888;
1697aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565] = pack_ubyte_RGB565;
1698aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565_REV] = pack_ubyte_RGB565_REV;
1699aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB4444] = pack_ubyte_ARGB4444;
1700aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB4444_REV] = pack_ubyte_ARGB4444_REV;
1701aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA5551] = pack_ubyte_RGBA5551;
1702aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB1555] = pack_ubyte_ARGB1555;
1703aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB1555_REV] = pack_ubyte_ARGB1555_REV;
1704aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL44] = pack_ubyte_AL44;
1705aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL88] = pack_ubyte_AL88;
1706aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL88_REV] = pack_ubyte_AL88_REV;
1707aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL1616] = pack_ubyte_AL1616;
1708aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL1616_REV] = pack_ubyte_AL1616_REV;
1709aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB332] = pack_ubyte_RGB332;
1710aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_A8] = pack_ubyte_A8;
1711aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_A16] = pack_ubyte_A16;
1712aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_L8] = pack_ubyte_L8;
1713aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_L16] = pack_ubyte_L16;
1714aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_I8] = pack_ubyte_L8; /* reuse pack_ubyte_L8 */
1715aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_I16] = pack_ubyte_L16; /* reuse pack_ubyte_L16 */
1716aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_YCBCR] = pack_ubyte_YCBCR;
1717aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_YCBCR_REV] = pack_ubyte_YCBCR_REV;
1718aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R8] = pack_ubyte_R8;
1719aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_GR88] = pack_ubyte_GR88;
1720aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG88] = pack_ubyte_RG88;
1721aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R16] = pack_ubyte_R16;
1722aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG1616] = pack_ubyte_RG1616;
1723aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG1616_REV] = pack_ubyte_RG1616_REV;
1724aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB2101010] = pack_ubyte_ARGB2101010;
1725749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      table[MESA_FORMAT_ABGR2101010_UINT] = pack_ubyte_ABGR2101010_UINT;
1726aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1727aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* should never convert RGBA to these formats */
1728aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z24_S8] = NULL;
1729aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_S8_Z24] = NULL;
1730aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z16] = NULL;
1731aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_X8_Z24] = NULL;
1732aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z24_X8] = NULL;
1733aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z32] = NULL;
1734aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_S8] = NULL;
1735aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1736aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* sRGB */
1737aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGB8] = pack_ubyte_SRGB8;
1738aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA8] = pack_ubyte_SRGBA8;
1739aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SARGB8] = pack_ubyte_SARGB8;
1740aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SL8] = pack_ubyte_SL8;
1741aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SLA8] = pack_ubyte_SLA8;
1742aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1743aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* n/a */
1744aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGB_DXT1] = NULL; /* pack_ubyte_SRGB_DXT1; */
1745aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT1] = NULL; /* pack_ubyte_SRGBA_DXT1; */
1746aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT3] = NULL; /* pack_ubyte_SRGBA_DXT3; */
1747aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT5] = NULL; /* pack_ubyte_SRGBA_DXT5; */
1748aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1749aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FXT1] = NULL; /* pack_ubyte_RGB_FXT1; */
1750aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FXT1] = NULL; /* pack_ubyte_RGBA_FXT1; */
1751aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_DXT1] = NULL; /* pack_ubyte_RGB_DXT1; */
1752aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT1] = NULL; /* pack_ubyte_RGBA_DXT1; */
1753aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT3] = NULL; /* pack_ubyte_RGBA_DXT3; */
1754aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT5] = NULL; /* pack_ubyte_RGBA_DXT5; */
1755aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1756aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FLOAT32] = pack_ubyte_RGBA_FLOAT32;
1757aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FLOAT16] = pack_ubyte_RGBA_FLOAT16;
1758aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FLOAT32] = pack_ubyte_RGB_FLOAT32;
1759aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FLOAT16] = pack_ubyte_RGB_FLOAT16;
1760aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ALPHA_FLOAT32] = pack_ubyte_ALPHA_FLOAT32;
1761aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ALPHA_FLOAT16] = pack_ubyte_ALPHA_FLOAT16;
1762aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_FLOAT32] = pack_ubyte_LUMINANCE_FLOAT32;
1763aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_FLOAT16] = pack_ubyte_LUMINANCE_FLOAT16;
1764aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = pack_ubyte_LUMINANCE_ALPHA_FLOAT32;
1765aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = pack_ubyte_LUMINANCE_ALPHA_FLOAT16;
1766aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_INTENSITY_FLOAT32] = pack_ubyte_LUMINANCE_FLOAT32;
1767aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_INTENSITY_FLOAT16] = pack_ubyte_LUMINANCE_FLOAT16;
1768aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R_FLOAT32] = pack_ubyte_LUMINANCE_FLOAT32;
1769aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R_FLOAT16] = pack_ubyte_LUMINANCE_FLOAT16;
1770aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG_FLOAT32] = pack_ubyte_RG_FLOAT32;
1771aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG_FLOAT16] = pack_ubyte_RG_FLOAT16;
1772aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1773aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* n/a */
1774aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT8] = NULL; /* pack_ubyte_RGBA_INT8 */
1775aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT16] = NULL; /* pack_ubyte_RGBA_INT16 */
1776aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT32] = NULL; /* pack_ubyte_RGBA_INT32 */
1777aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT8] = NULL; /* pack_ubyte_RGBA_UINT8 */
1778aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT16] = NULL; /* pack_ubyte_RGBA_UINT16 */
1779aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT32] = NULL; /* pack_ubyte_RGBA_UINT32 */
1780aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1781aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_DUDV8] = pack_ubyte_DUDV8;
1782aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1783aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_16] = pack_ubyte_RGBA_16;
1784aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1785aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* n/a */
1786aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_R8] = NULL;
1787aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RG88_REV] = NULL;
1788aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBX8888] = NULL;
1789aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA8888] = NULL;
1790aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA8888_REV] = NULL;
1791aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_R16] = NULL;
1792aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_GR1616] = NULL;
1793aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGB_16] = NULL;
1794aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA_16] = NULL;
1795aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_A8] = NULL;
1796aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_L8] = NULL;
1797aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_AL88] = NULL;
1798aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_I8] = NULL;
1799aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_A16] = NULL;
1800aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_L16] = NULL;
1801aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_AL1616] = NULL;
1802aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_I16] = NULL;
1803aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1804aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1805aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_16] = pack_ubyte_RGBA_16;
1806aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1807aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB9_E5_FLOAT] = pack_ubyte_RGB9_E5_FLOAT;
1808aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R11_G11_B10_FLOAT] = pack_ubyte_R11_G11_B10_FLOAT;
1809aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1810aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      initialized = GL_TRUE;
1811aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
1812aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1813aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   return table[format];
1814aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1815aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1816aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1817aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1818aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
1819aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Return a function that can pack a GLfloat rgba[4] color.
1820aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
1821aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulgl_pack_float_rgba_func
1822aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_get_pack_float_rgba_function(gl_format format)
1823aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1824aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static gl_pack_float_rgba_func table[MESA_FORMAT_COUNT];
1825aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static GLboolean initialized = GL_FALSE;
1826aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1827aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (!initialized) {
1828aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memset(table, 0, sizeof(table));
1829aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1830aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_NONE] = NULL;
1831aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1832aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888] = pack_float_RGBA8888;
1833aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888_REV] = pack_float_RGBA8888_REV;
1834aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888] = pack_float_ARGB8888;
1835aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888_REV] = pack_float_ARGB8888_REV;
1836aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888] = pack_float_RGBA8888; /* reused */
1837aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888_REV] = pack_float_RGBA8888_REV; /* reused */
1838aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888] = pack_float_XRGB8888;
1839aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888_REV] = pack_float_XRGB8888_REV;
1840aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB888] = pack_float_RGB888;
1841aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_BGR888] = pack_float_BGR888;
1842aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565] = pack_float_RGB565;
1843aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565_REV] = pack_float_RGB565_REV;
1844aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB4444] = pack_float_ARGB4444;
1845aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB4444_REV] = pack_float_ARGB4444_REV;
1846aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA5551] = pack_float_RGBA5551;
1847aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB1555] = pack_float_ARGB1555;
1848aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB1555_REV] = pack_float_ARGB1555_REV;
1849aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1850aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL44] = pack_float_AL44;
1851aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL88] = pack_float_AL88;
1852aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL88_REV] = pack_float_AL88_REV;
1853aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL1616] = pack_float_AL1616;
1854aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_AL1616_REV] = pack_float_AL1616_REV;
1855aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB332] = pack_float_RGB332;
1856aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_A8] = pack_float_A8;
1857aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_A16] = pack_float_A16;
1858aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_L8] = pack_float_L8;
1859aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_L16] = pack_float_L16;
1860aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_I8] = pack_float_L8; /* reuse pack_float_L8 */
1861aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_I16] = pack_float_L16; /* reuse pack_float_L16 */
1862aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_YCBCR] = pack_float_YCBCR;
1863aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_YCBCR_REV] = pack_float_YCBCR_REV;
1864aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R8] = pack_float_R8;
1865aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_GR88] = pack_float_GR88;
1866aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG88] = pack_float_RG88;
1867aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R16] = pack_float_R16;
1868aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG1616] = pack_float_RG1616;
1869aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG1616_REV] = pack_float_RG1616_REV;
1870aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB2101010] = pack_float_ARGB2101010;
1871749c9060aca85277c388377d15fd6323ba20b78eJordan Justen      table[MESA_FORMAT_ABGR2101010_UINT] = pack_float_ABGR2101010_UINT;
1872aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1873aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* should never convert RGBA to these formats */
1874aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z24_S8] = NULL;
1875aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_S8_Z24] = NULL;
1876aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z16] = NULL;
1877aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_X8_Z24] = NULL;
1878aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z24_X8] = NULL;
1879aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_Z32] = NULL;
1880aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_S8] = NULL;
1881aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1882aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGB8] = pack_float_SRGB8;
1883aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA8] = pack_float_SRGBA8;
1884aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SARGB8] = pack_float_SARGB8;
1885aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SL8] = pack_float_SL8;
1886aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SLA8] = pack_float_SLA8;
1887aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1888aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* n/a */
1889aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGB_DXT1] = NULL;
1890aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT1] = NULL;
1891aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT3] = NULL;
1892aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SRGBA_DXT5] = NULL;
1893aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1894aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FXT1] = NULL;
1895aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FXT1] = NULL;
1896aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_DXT1] = NULL;
1897aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT1] = NULL;
1898aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT3] = NULL;
1899aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_DXT5] = NULL;
1900aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1901aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FLOAT32] = pack_float_RGBA_FLOAT32;
1902aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_FLOAT16] = pack_float_RGBA_FLOAT16;
1903aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FLOAT32] = pack_float_RGB_FLOAT32;
1904aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB_FLOAT16] = pack_float_RGB_FLOAT16;
1905aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ALPHA_FLOAT32] = pack_float_ALPHA_FLOAT32;
1906aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ALPHA_FLOAT16] = pack_float_ALPHA_FLOAT16;
1907aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_FLOAT32] = pack_float_LUMINANCE_FLOAT32;
1908aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_FLOAT16] = pack_float_LUMINANCE_FLOAT16;
1909aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = pack_float_LUMINANCE_ALPHA_FLOAT32;
1910aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = pack_float_LUMINANCE_ALPHA_FLOAT16;
1911aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1912aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_INTENSITY_FLOAT32] = pack_float_LUMINANCE_FLOAT32;
1913aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_INTENSITY_FLOAT16] = pack_float_LUMINANCE_FLOAT16;
1914aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R_FLOAT32] = pack_float_LUMINANCE_FLOAT32;
1915aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R_FLOAT16] = pack_float_LUMINANCE_FLOAT16;
1916aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG_FLOAT32] = pack_float_RG_FLOAT32;
1917aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RG_FLOAT16] = pack_float_RG_FLOAT16;
1918aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1919aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* n/a */
1920aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT8] = NULL;
1921aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT16] = NULL;
1922aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_INT32] = NULL;
1923aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT8] = NULL;
1924aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT16] = NULL;
1925aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_UINT32] = NULL;
1926aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1927aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_DUDV8] = pack_float_DUDV8;
1928aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1929aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA_16] = pack_float_RGBA_16;
1930aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1931aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_R8] = pack_float_SIGNED_R8;
1932aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RG88_REV] = pack_float_SIGNED_RG88_REV;
1933aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBX8888] = pack_float_SIGNED_RGBX8888;
1934aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA8888] = pack_float_SIGNED_RGBA8888;
1935aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA8888_REV] = pack_float_SIGNED_RGBA8888_REV;
1936aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_R16] = pack_float_SIGNED_R16;
1937aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_GR1616] = pack_float_SIGNED_GR1616;
1938aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGB_16] = pack_float_SIGNED_RGB_16;
1939aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_RGBA_16] = pack_float_SIGNED_RGBA_16;
1940aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_A8] = pack_float_SIGNED_A8;
1941aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_L8] = pack_float_SIGNED_L8;
1942aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_AL88] = pack_float_SIGNED_AL88;
1943aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_I8] = pack_float_SIGNED_L8; /* reused */
1944aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_A16] = pack_float_SIGNED_A16;
1945aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_L16] = pack_float_SIGNED_L16;
1946aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_AL1616] = pack_float_SIGNED_AL1616;
1947aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_SIGNED_I16] = pack_float_SIGNED_L16; /* reused */
1948aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1949aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB9_E5_FLOAT] = pack_float_RGB9_E5_FLOAT;
1950aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_R11_G11_B10_FLOAT] = pack_float_R11_G11_B10_FLOAT;
1951aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1952aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      initialized = GL_TRUE;
1953aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
1954aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1955aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   return table[format];
1956aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1957aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1958aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1959aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1960aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic pack_float_rgba_row_func
1961aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulget_pack_float_rgba_row_function(gl_format format)
1962aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1963aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static pack_float_rgba_row_func table[MESA_FORMAT_COUNT];
1964aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static GLboolean initialized = GL_FALSE;
1965aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1966aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (!initialized) {
1967aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* We don't need a special row packing function for each format.
1968aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul       * There's a generic fallback which uses a per-pixel packing function.
1969aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul       */
1970aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memset(table, 0, sizeof(table));
1971aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1972aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888] = pack_row_float_RGBA8888;
1973aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888_REV] = pack_row_float_RGBA8888_REV;
1974aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888] = pack_row_float_ARGB8888;
1975aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888_REV] = pack_row_float_ARGB8888_REV;
1976aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888] = pack_row_float_RGBA8888; /* reused */
1977aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888_REV] = pack_row_float_RGBA8888_REV; /* reused */
1978aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888] = pack_row_float_XRGB8888;
1979aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888_REV] = pack_row_float_XRGB8888_REV;
1980aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB888] = pack_row_float_RGB888;
1981aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_BGR888] = pack_row_float_BGR888;
1982aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565] = pack_row_float_RGB565;
1983aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565_REV] = pack_row_float_RGB565_REV;
1984aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1985aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      initialized = GL_TRUE;
1986aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
1987aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1988aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   return table[format];
1989aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
1990aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1991aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1992aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1993aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic pack_ubyte_rgba_row_func
1994aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulget_pack_ubyte_rgba_row_function(gl_format format)
1995aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
1996aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static pack_ubyte_rgba_row_func table[MESA_FORMAT_COUNT];
1997aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   static GLboolean initialized = GL_FALSE;
1998aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
1999aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (!initialized) {
2000aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* We don't need a special row packing function for each format.
2001aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul       * There's a generic fallback which uses a per-pixel packing function.
2002aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul       */
2003aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memset(table, 0, sizeof(table));
2004aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2005aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888] = pack_row_ubyte_RGBA8888;
2006aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBA8888_REV] = pack_row_ubyte_RGBA8888_REV;
2007aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888] = pack_row_ubyte_ARGB8888;
2008aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_ARGB8888_REV] = pack_row_ubyte_ARGB8888_REV;
2009aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888] = pack_row_ubyte_RGBA8888; /* reused */
2010aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGBX8888_REV] = pack_row_ubyte_RGBA8888_REV; /* reused */
2011aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888] = pack_row_ubyte_XRGB8888;
2012aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_XRGB8888_REV] = pack_row_ubyte_XRGB8888_REV;
2013aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB888] = pack_row_ubyte_RGB888;
2014aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_BGR888] = pack_row_ubyte_BGR888;
2015aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565] = pack_row_ubyte_RGB565;
2016aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      table[MESA_FORMAT_RGB565_REV] = pack_row_ubyte_RGB565_REV;
2017aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2018aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      initialized = GL_TRUE;
2019aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2020aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2021aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   return table[format];
2022aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2023aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2024aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2025aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2026aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
2027aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Pack a row of GLfloat rgba[4] values to the destination.
2028aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
2029aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2030aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_float_rgba_row(gl_format format, GLuint n,
2031aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                          const GLfloat src[][4], void *dst)
2032aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2033aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_float_rgba_row_func packrow = get_pack_float_rgba_row_function(format);
2034aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (packrow) {
2035aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* use "fast" function */
2036aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      packrow(n, src, dst);
2037aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2038aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   else {
2039aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* slower fallback */
2040aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      gl_pack_float_rgba_func pack = _mesa_get_pack_float_rgba_function(format);
2041aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLuint dstStride = _mesa_get_format_bytes(format);
2042aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte *dstPtr = (GLubyte *) dst;
2043aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLuint i;
2044aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2045aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      assert(pack);
2046aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      if (!pack)
2047aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         return;
2048aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2049aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      for (i = 0; i < n; i++) {
2050aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         pack(src[i], dstPtr);
2051aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         dstPtr += dstStride;
2052aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2053aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2054aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2055aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2056aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2057aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
2058aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Pack a row of GLubyte rgba[4] values to the destination.
2059aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
2060aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2061aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_ubyte_rgba_row(gl_format format, GLuint n,
2062aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                          const GLubyte src[][4], void *dst)
2063aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2064aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   pack_ubyte_rgba_row_func packrow = get_pack_ubyte_rgba_row_function(format);
2065aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   if (packrow) {
2066aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* use "fast" function */
2067aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      packrow(n, src, dst);
2068aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2069aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   else {
2070aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      /* slower fallback */
2071aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      gl_pack_ubyte_rgba_func pack = _mesa_get_pack_ubyte_rgba_function(format);
2072aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      const GLuint stride = _mesa_get_format_bytes(format);
2073aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLubyte *d = ((GLubyte *) dst);
2074aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      GLuint i;
2075aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2076aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      assert(pack);
2077aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      if (!pack)
2078aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         return;
2079aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2080aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      for (i = 0; i < n; i++) {
2081aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         pack(src[i], d);
2082aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         d += stride;
2083aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2084aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2085aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2086aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2087aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2088aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
208966940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul * Pack a 2D image of ubyte RGBA pixels in the given format.
209066940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul * \param srcRowStride  source image row stride in bytes
209166940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul * \param dstRowStride  destination image row stride in bytes
209266940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul */
209366940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paulvoid
209466940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul_mesa_pack_ubyte_rgba_rect(gl_format format, GLuint width, GLuint height,
209566940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul                           const GLubyte *src, GLint srcRowStride,
209666940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul                           void *dst, GLint dstRowStride)
209766940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul{
209866940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   pack_ubyte_rgba_row_func packrow = get_pack_ubyte_rgba_row_function(format);
209966940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   GLubyte *dstUB = (GLubyte *) dst;
210066940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   GLuint i;
210166940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul
210266940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   if (packrow) {
210366940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      if (srcRowStride == width * 4 * sizeof(GLubyte) &&
210466940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul          dstRowStride == _mesa_format_row_stride(format, width)) {
210566940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         /* do whole image at once */
210666940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         packrow(width * height, (const GLubyte (*)[4]) src, dst);
210766940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      }
210866940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      else {
210966940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         /* row by row */
211066940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         for (i = 0; i < height; i++) {
211166940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul            packrow(width, (const GLubyte (*)[4]) src, dstUB);
211266940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul            src += srcRowStride;
211366940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul            dstUB += dstRowStride;
211466940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         }
211566940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      }
211666940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   }
211766940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   else {
211866940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      /* slower fallback */
211966940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      for (i = 0; i < height; i++) {
212066940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         _mesa_pack_ubyte_rgba_row(format, width,
212166940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul                                   (const GLubyte (*)[4]) src, dstUB);
212266940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         src += srcRowStride;
212366940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul         dstUB += dstRowStride;
212466940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul      }
212566940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul   }
212666940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul}
212766940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul
212866940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul
212966940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul
213066940ad2d7145d30cf0381a9a2835efaa0d1ee3fBrian Paul/**
2131aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul ** Pack float Z pixels
2132aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul **/
2133aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2134aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2135aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_z_Z24_S8(const GLfloat *src, void *dst)
2136aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2137aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the stencil values */
2138aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2139fc52534f012837a39c03a764eb611d460210514aMarek Olšák   const GLdouble scale = (GLdouble) 0xffffff;
2140aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *d & 0xff;
2141aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = (GLuint) (*src * scale);
2142aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(z <= 0xffffff);
2143aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (z << 8) | s;
2144aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2145aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2146aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2147aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_z_S8_Z24(const GLfloat *src, void *dst)
2148aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2149aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the stencil values */
2150aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2151fc52534f012837a39c03a764eb611d460210514aMarek Olšák   const GLdouble scale = (GLdouble) 0xffffff;
2152aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *d & 0xff000000;
2153aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = (GLuint) (*src * scale);
2154aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(z <= 0xffffff);
2155aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = s | z;
2156aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2157aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2158aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2159aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_z_Z16(const GLfloat *src, void *dst)
2160aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2161aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
2162aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   const GLfloat scale = (GLfloat) 0xffff;
2163aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (GLushort) (*src * scale);
2164aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2165aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2166aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2167aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_z_Z32(const GLfloat *src, void *dst)
2168aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2169aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2170fc52534f012837a39c03a764eb611d460210514aMarek Olšák   const GLdouble scale = (GLdouble) 0xffffffff;
2171aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = (GLuint) (*src * scale);
2172aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2173aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2174aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2175aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_float_z_Z32_FLOAT(const GLfloat *src, void *dst)
2176aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2177aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = (GLfloat *) dst;
2178aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src;
2179aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2180aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2181aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulgl_pack_float_z_func
2182aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_get_pack_float_z_func(gl_format format)
2183aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2184aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2185aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2186aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_X8:
2187aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_float_z_Z24_S8;
2188aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2189aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_X8_Z24:
2190aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_float_z_S8_Z24;
2191aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z16:
2192aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_float_z_Z16;
2193aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32:
2194aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_float_z_Z32;
2195aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT:
2196aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2197aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_float_z_Z32_FLOAT;
2198aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2199aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL,
2200aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                    "unexpected format in _mesa_get_pack_float_z_func()");
2201aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return NULL;
2202aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2203aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2204aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2205aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2206aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2207aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
2208aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul ** Pack uint Z pixels.  The incoming src value is always in
2209aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul ** the range [0, 2^32-1].
2210aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul **/
2211aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2212aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2213aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_Z24_S8(const GLuint *src, void *dst)
2214aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2215aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the stencil values */
2216aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2217aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *d & 0xff;
2218aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = *src & 0xffffff00;
2219aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = z | s;
2220aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2221aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2222aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2223aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_S8_Z24(const GLuint *src, void *dst)
2224aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2225aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the stencil values */
2226aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2227aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *d & 0xff000000;
2228aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = *src >> 8;
2229aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = s | z;
2230aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2231aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2232aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2233aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_Z16(const GLuint *src, void *dst)
2234aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2235aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLushort *d = ((GLushort *) dst);
2236aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src >> 16;
2237aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2238aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2239aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2240aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_Z32(const GLuint *src, void *dst)
2241aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2242aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2243aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src;
2244aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2245aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2246aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2247aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_Z32_FLOAT(const GLuint *src, void *dst)
2248aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2249aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2250fc52534f012837a39c03a764eb611d460210514aMarek Olšák   const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
2251aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src * scale;
2252aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(*d >= 0.0f);
2253aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(*d <= 1.0f);
2254aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2255aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2256aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2257aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_uint_z_Z32_FLOAT_X24S8(const GLuint *src, void *dst)
2258aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2259aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
2260fc52534f012837a39c03a764eb611d460210514aMarek Olšák   const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
2261aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src * scale;
2262aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(*d >= 0.0f);
2263aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   assert(*d <= 1.0f);
2264aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2265aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2266aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulgl_pack_uint_z_func
2267aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_get_pack_uint_z_func(gl_format format)
2268aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2269aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2270aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2271aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_X8:
2272aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_Z24_S8;
2273aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2274aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_X8_Z24:
2275aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_S8_Z24;
2276aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z16:
2277aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_Z16;
2278aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32:
2279aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_Z32;
2280aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT:
2281aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_Z32_FLOAT;
2282aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2283aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_uint_z_Z32_FLOAT_X24S8;
2284aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2285aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL, "unexpected format in _mesa_get_pack_uint_z_func()");
2286aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return NULL;
2287aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2288aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2289aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2290aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2291aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
2292aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul ** Pack ubyte stencil pixels
2293aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul **/
2294aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2295aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2296aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_stencil_Z24_S8(const GLubyte *src, void *dst)
2297aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2298aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the Z values */
2299aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2300aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *src;
2301aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = *d & 0xffffff00;
2302aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = z | s;
2303aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2304aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2305aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2306aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_stencil_S8_Z24(const GLubyte *src, void *dst)
2307aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2308aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   /* don't disturb the Z values */
2309aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint *d = ((GLuint *) dst);
2310aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint s = *src << 24;
2311aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLuint z = *d & 0xffffff;
2312aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = s | z;
2313aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2314aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2315aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2316aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_stencil_S8(const GLubyte *src, void *dst)
2317aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2318aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLubyte *d = (GLubyte *) dst;
2319aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   *d = *src;
2320aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2321aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2322aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulstatic void
2323aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulpack_ubyte_stencil_Z32_FLOAT_X24S8(const GLubyte *src, void *dst)
2324aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2325aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   GLfloat *d = ((GLfloat *) dst);
2326aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   d[1] = *src;
2327aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2328aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2329aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2330aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulgl_pack_ubyte_stencil_func
2331aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_get_pack_ubyte_stencil_func(gl_format format)
2332aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2333aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2334aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2335aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_ubyte_stencil_Z24_S8;
2336aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2337aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_ubyte_stencil_S8_Z24;
2338aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8:
2339aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_ubyte_stencil_S8;
2340aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2341aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return pack_ubyte_stencil_Z32_FLOAT_X24S8;
2342aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2343aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL,
2344aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                    "unexpected format in _mesa_pack_ubyte_stencil_func()");
2345aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return NULL;
2346aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2347aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2348aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2349aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2350aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2351aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2352aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_float_z_row(gl_format format, GLuint n,
2353aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                       const GLfloat *src, void *dst)
2354aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2355aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2356aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2357aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_X8:
2358aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2359aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the stencil values */
2360aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2361fc52534f012837a39c03a764eb611d460210514aMarek Olšák         const GLdouble scale = (GLdouble) 0xffffff;
2362aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2363aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2364aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = d[i] & 0xff;
2365aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = (GLuint) (src[i] * scale);
2366aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            assert(z <= 0xffffff);
2367aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = (z << 8) | s;
2368aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2369aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2370aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2371aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2372aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_X8_Z24:
2373aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2374aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the stencil values */
2375aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2376fc52534f012837a39c03a764eb611d460210514aMarek Olšák         const GLdouble scale = (GLdouble) 0xffffff;
2377aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2378aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2379aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = d[i] & 0xff000000;
2380aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = (GLuint) (src[i] * scale);
2381aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            assert(z <= 0xffffff);
2382aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = s | z;
2383aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2384aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2385aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2386aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z16:
2387aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2388aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLushort *d = ((GLushort *) dst);
2389aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         const GLfloat scale = (GLfloat) 0xffff;
2390aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2391aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2392aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = (GLushort) (src[i] * scale);
2393aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2394aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2395aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2396aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32:
2397aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2398aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2399fc52534f012837a39c03a764eb611d460210514aMarek Olšák         const GLdouble scale = (GLdouble) 0xffffffff;
2400aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2401aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2402aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = (GLuint) (src[i] * scale);
2403aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2404aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2405aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2406aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT:
2407aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memcpy(dst, src, n * sizeof(GLfloat));
2408aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2409aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2410aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
24110bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul         struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
2412aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2413aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
24140bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            d[i].z = src[i];
2415aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2416aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2417aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2418aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2419aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL, "unexpected format in _mesa_pack_float_z_row()");
2420aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2421aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2422aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2423aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2424aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
2425aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * The incoming Z values are always in the range [0, 0xffffffff].
2426aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
2427aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2428aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_uint_z_row(gl_format format, GLuint n,
2429aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                      const GLuint *src, void *dst)
2430aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2431aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2432aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2433aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_X8:
2434aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2435aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the stencil values */
2436aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2437aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2438aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2439aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = d[i] & 0xff;
2440aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = src[i] & 0xffffff00;
2441aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = z | s;
2442aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2443aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2444aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2445aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2446aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_X8_Z24:
2447aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2448aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the stencil values */
2449aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2450aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2451aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2452aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = d[i] & 0xff000000;
2453aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = src[i] >> 8;
2454aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = s | z;
2455aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2456aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2457aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2458aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z16:
2459aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2460aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLushort *d = ((GLushort *) dst);
2461aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2462aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2463aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = src[i] >> 16;
2464aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2465aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2466aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2467aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32:
2468aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memcpy(dst, src, n * sizeof(GLfloat));
2469aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2470aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT:
2471aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2472aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2473fc52534f012837a39c03a764eb611d460210514aMarek Olšák         const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
2474aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2475aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2476aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = src[i] * scale;
2477aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            assert(d[i] >= 0.0f);
2478aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            assert(d[i] <= 1.0f);
2479aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2480aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2481aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2482aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2483aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
24840bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul         struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
2485fc52534f012837a39c03a764eb611d460210514aMarek Olšák         const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
2486aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2487aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
24880bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            d[i].z = src[i] * scale;
24890bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            assert(d[i].z >= 0.0f);
24900bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            assert(d[i].z <= 1.0f);
2491aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2492aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2493aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2494aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2495aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL, "unexpected format in _mesa_pack_uint_z_row()");
2496aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2497aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2498aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2499aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2500aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2501aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_ubyte_stencil_row(gl_format format, GLuint n,
2502aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                             const GLubyte *src, void *dst)
2503aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2504aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2505aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2506aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2507aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the Z values */
2508aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2509aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2510aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2511aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = src[i];
2512aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = d[i] & 0xffffff00;
2513aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = z | s;
2514aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2515aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2516aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2517aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2518aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2519aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         /* don't disturb the Z values */
2520aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2521aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2522aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2523aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = src[i] << 24;
2524aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = d[i] & 0xffffff;
2525aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = s | z;
2526aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2527aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2528aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2529aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8:
2530aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memcpy(dst, src, n * sizeof(GLubyte));
2531aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2532aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
2533aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
25340bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul         struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
2535aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2536aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
25370bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            d[i].x24s8 = src[i];
2538aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2539aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2540aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2541aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2542aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL, "unexpected format in _mesa_pack_ubyte_stencil_row()");
2543aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2544aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2545aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2546aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul
2547aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul/**
2548aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul * Incoming Z/stencil values are always in uint_24_8 format.
2549aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul */
2550aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paulvoid
2551aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul_mesa_pack_uint_24_8_depth_stencil_row(gl_format format, GLuint n,
2552aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                                       const GLuint *src, void *dst)
2553aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul{
2554aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   switch (format) {
2555aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_Z24_S8:
2556aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      memcpy(dst, src, n * sizeof(GLuint));
2557aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
2558aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   case MESA_FORMAT_S8_Z24:
2559aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      {
2560aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint *d = ((GLuint *) dst);
2561aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         GLuint i;
2562aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         for (i = 0; i < n; i++) {
2563aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint s = src[i] << 24;
2564aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            GLuint z = src[i] >> 8;
2565aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul            d[i] = s | z;
2566aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul         }
2567aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      }
2568aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      break;
256982ddd1129e76b8bb978497df2940d1449a848551Brian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
257082ddd1129e76b8bb978497df2940d1449a848551Brian Paul      {
257182ddd1129e76b8bb978497df2940d1449a848551Brian Paul         const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
25720bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul         struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
257382ddd1129e76b8bb978497df2940d1449a848551Brian Paul         GLint i;
257482ddd1129e76b8bb978497df2940d1449a848551Brian Paul         for (i = 0; i < n; i++) {
257582ddd1129e76b8bb978497df2940d1449a848551Brian Paul            GLfloat z = (src[i] >> 8) * scale;
25760bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            d[i].z = z;
25770bda900743702a2c0f95024f004e6210e59fd5ddBrian Paul            d[i].x24s8 = src[i];
257882ddd1129e76b8bb978497df2940d1449a848551Brian Paul         }
257982ddd1129e76b8bb978497df2940d1449a848551Brian Paul      }
258082ddd1129e76b8bb978497df2940d1449a848551Brian Paul      break;
2581aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   default:
2582aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      _mesa_problem(NULL, "bad format %s in _mesa_pack_ubyte_s_row",
2583aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul                    _mesa_get_format_name(format));
2584aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul      return;
2585aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul   }
2586aa6cb952c917f4280d75b322c05885fcf7eb6cdbBrian Paul}
2587f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2588f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2589f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2590f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul/**
2591f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul * Convert a boolean color mask to a packed color where each channel of
2592f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul * the packed value at dst will be 0 or ~0 depending on the colorMask.
2593f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul */
2594f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paulvoid
2595f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul_mesa_pack_colormask(gl_format format, const GLubyte colorMask[4], void *dst)
2596f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul{
2597f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   GLfloat maskColor[4];
2598f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2599f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   switch (_mesa_get_format_datatype(format)) {
2600f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   case GL_UNSIGNED_NORMALIZED:
2601f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      /* simple: 1.0 will convert to ~0 in the right bit positions */
2602f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      maskColor[0] = colorMask[0] ? 1.0 : 0.0;
2603f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      maskColor[1] = colorMask[1] ? 1.0 : 0.0;
2604f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      maskColor[2] = colorMask[2] ? 1.0 : 0.0;
2605f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      maskColor[3] = colorMask[3] ? 1.0 : 0.0;
2606f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      _mesa_pack_float_rgba_row(format, 1,
2607f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul                                (const GLfloat (*)[4]) maskColor, dst);
2608f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      break;
2609f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   case GL_SIGNED_NORMALIZED:
2610f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   case GL_FLOAT:
2611f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      /* These formats are harder because it's hard to know the floating
2612f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * point values that will convert to ~0 for each color channel's bits.
2613f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * This solution just generates a non-zero value for each color channel
2614f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * then fixes up the non-zero values to be ~0.
2615f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * Note: we'll need to add special case code if we ever have to deal
2616f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * with formats with unequal color channel sizes, like R11_G11_B10.
2617f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       * We issue a warning below for channel sizes other than 8,16,32.
2618f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul       */
2619f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      {
2620f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         GLuint bits = _mesa_get_format_max_bits(format); /* bits per chan */
2621f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         GLuint bytes = _mesa_get_format_bytes(format);
2622f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         GLuint i;
2623f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2624f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         /* this should put non-zero values into the channels of dst */
26256bf7d402149b36e0eac7c385c561ec6277a8339dBrian Paul         maskColor[0] = colorMask[0] ? -1.0f : 0.0f;
26266bf7d402149b36e0eac7c385c561ec6277a8339dBrian Paul         maskColor[1] = colorMask[1] ? -1.0f : 0.0f;
26276bf7d402149b36e0eac7c385c561ec6277a8339dBrian Paul         maskColor[2] = colorMask[2] ? -1.0f : 0.0f;
26286bf7d402149b36e0eac7c385c561ec6277a8339dBrian Paul         maskColor[3] = colorMask[3] ? -1.0f : 0.0f;
2629f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         _mesa_pack_float_rgba_row(format, 1,
2630f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul                                   (const GLfloat (*)[4]) maskColor, dst);
2631f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul
2632f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         /* fix-up the dst channels by converting non-zero values to ~0 */
2633f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         if (bits == 8) {
2634f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            GLubyte *d = (GLubyte *) dst;
2635f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            for (i = 0; i < bytes; i++) {
263652d021d4d785a4567b9e73ef89e74a295e8cfed9Dylan Noblesmith               d[i] = d[i] ? 0xff : 0x0;
2637f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            }
2638f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         }
2639f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         else if (bits == 16) {
2640f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            GLushort *d = (GLushort *) dst;
2641f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            for (i = 0; i < bytes / 2; i++) {
2642f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul               d[i] = d[i] ? 0xffff : 0x0;
2643f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            }
2644f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         }
2645f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         else if (bits == 32) {
2646f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            GLuint *d = (GLuint *) dst;
2647f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            for (i = 0; i < bytes / 4; i++) {
2648f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul               d[i] = d[i] ? 0xffffffffU : 0x0;
2649f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            }
2650f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         }
2651f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         else {
2652f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            _mesa_problem(NULL, "unexpected size in _mesa_pack_colormask()");
2653f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul            return;
2654f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul         }
2655f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      }
2656f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      break;
2657f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   default:
2658f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      _mesa_problem(NULL, "unexpected format data type in gen_color_mask()");
2659f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul      return;
2660f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul   }
2661f1a2aa5cb338766d7a612b2c82c7ec588ed23d0bBrian Paul}
2662