1b8e80941Smrgfrom __future__ import print_function
2b8e80941Smrg
3b8e80941Smrgfrom mako.template import Template
4b8e80941Smrgfrom sys import argv
5b8e80941Smrg
6b8e80941Smrgstring = """/*
7b8e80941Smrg * Mesa 3-D graphics library
8b8e80941Smrg *
9b8e80941Smrg * Copyright (c) 2011 VMware, Inc.
10b8e80941Smrg * Copyright (c) 2014 Intel Corporation.
11b8e80941Smrg *
12b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a
13b8e80941Smrg * copy of this software and associated documentation files (the "Software"),
14b8e80941Smrg * to deal in the Software without restriction, including without limitation
15b8e80941Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16b8e80941Smrg * and/or sell copies of the Software, and to permit persons to whom the
17b8e80941Smrg * Software is furnished to do so, subject to the following conditions:
18b8e80941Smrg *
19b8e80941Smrg * The above copyright notice and this permission notice shall be included
20b8e80941Smrg * in all copies or substantial portions of the Software.
21b8e80941Smrg *
22b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23b8e80941Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24b8e80941Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
25b8e80941Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
26b8e80941Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
27b8e80941Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28b8e80941Smrg * OTHER DEALINGS IN THE SOFTWARE.
29b8e80941Smrg */
30b8e80941Smrg
31b8e80941Smrg
32b8e80941Smrg/**
33b8e80941Smrg * Color, depth, stencil packing functions.
34b8e80941Smrg * Used to pack basic color, depth and stencil formats to specific
35b8e80941Smrg * hardware formats.
36b8e80941Smrg *
37b8e80941Smrg * There are both per-pixel and per-row packing functions:
38b8e80941Smrg * - The former will be used by swrast to write values to the color, depth,
39b8e80941Smrg *   stencil buffers when drawing points, lines and masked spans.
40b8e80941Smrg * - The later will be used for image-oriented functions like glDrawPixels,
41b8e80941Smrg *   glAccum, and glTexImage.
42b8e80941Smrg */
43b8e80941Smrg
44b8e80941Smrg#include <stdint.h>
45b8e80941Smrg
46b8e80941Smrg#include "errors.h"
47b8e80941Smrg#include "format_unpack.h"
48b8e80941Smrg#include "format_utils.h"
49b8e80941Smrg#include "macros.h"
50b8e80941Smrg#include "util/format_rgb9e5.h"
51b8e80941Smrg#include "util/format_r11g11b10f.h"
52b8e80941Smrg#include "util/format_srgb.h"
53b8e80941Smrg
54b8e80941Smrg#define UNPACK(SRC, OFFSET, BITS) (((SRC) >> (OFFSET)) & MAX_UINT(BITS))
55b8e80941Smrg
56b8e80941Smrg<%
57b8e80941Smrgimport format_parser as parser
58b8e80941Smrg
59b8e80941Smrgformats = parser.parse(argv[1])
60b8e80941Smrg
61b8e80941Smrgrgb_formats = []
62b8e80941Smrgfor f in formats:
63b8e80941Smrg   if f.name == 'MESA_FORMAT_NONE':
64b8e80941Smrg      continue
65b8e80941Smrg   if f.colorspace not in ('rgb', 'srgb'):
66b8e80941Smrg      continue
67b8e80941Smrg
68b8e80941Smrg   rgb_formats.append(f)
69b8e80941Smrg%>
70b8e80941Smrg
71b8e80941Smrg/* float unpacking functions */
72b8e80941Smrg
73b8e80941Smrg%for f in rgb_formats:
74b8e80941Smrg   %if f.name in ('MESA_FORMAT_R9G9B9E5_FLOAT', 'MESA_FORMAT_R11G11B10_FLOAT'):
75b8e80941Smrg      <% continue %>
76b8e80941Smrg   %elif f.is_int() and not f.is_normalized():
77b8e80941Smrg      <% continue %>
78b8e80941Smrg   %elif f.is_compressed():
79b8e80941Smrg      <% continue %>
80b8e80941Smrg   %endif
81b8e80941Smrg
82b8e80941Smrgstatic inline void
83b8e80941Smrgunpack_float_${f.short_name()}(const void *void_src, GLfloat dst[4])
84b8e80941Smrg{
85b8e80941Smrg   ${f.datatype()} *src = (${f.datatype()} *)void_src;
86b8e80941Smrg   %if f.layout == parser.PACKED:
87b8e80941Smrg      %for c in f.channels:
88b8e80941Smrg         %if c.type != 'x':
89b8e80941Smrg            ${c.datatype()} ${c.name} = UNPACK(*src, ${c.shift}, ${c.size});
90b8e80941Smrg         %endif
91b8e80941Smrg      %endfor
92b8e80941Smrg   %elif f.layout == parser.ARRAY:
93b8e80941Smrg      %for (i, c) in enumerate(f.channels):
94b8e80941Smrg         %if c.type != 'x':
95b8e80941Smrg            ${c.datatype()} ${c.name} = src[${i}];
96b8e80941Smrg         %endif
97b8e80941Smrg      %endfor
98b8e80941Smrg   %else:
99b8e80941Smrg      <% assert False %>
100b8e80941Smrg   %endif
101b8e80941Smrg
102b8e80941Smrg   %for i in range(4):
103b8e80941Smrg      <% s = f.swizzle[i] %>
104b8e80941Smrg      %if 0 <= s and s <= parser.Swizzle.SWIZZLE_W:
105b8e80941Smrg         <% c = f.channels[s] %>
106b8e80941Smrg         %if c.type == parser.UNSIGNED:
107b8e80941Smrg            %if f.colorspace == 'srgb' and c.name in 'rgb':
108b8e80941Smrg               <% assert c.size == 8 %>
109b8e80941Smrg               dst[${i}] = util_format_srgb_8unorm_to_linear_float(${c.name});
110b8e80941Smrg            %else:
111b8e80941Smrg               dst[${i}] = _mesa_unorm_to_float(${c.name}, ${c.size});
112b8e80941Smrg            %endif
113b8e80941Smrg         %elif c.type == parser.SIGNED:
114b8e80941Smrg            dst[${i}] = _mesa_snorm_to_float(${c.name}, ${c.size});
115b8e80941Smrg         %elif c.type == parser.FLOAT:
116b8e80941Smrg            %if c.size == 32:
117b8e80941Smrg               dst[${i}] = ${c.name};
118b8e80941Smrg            %elif c.size == 16:
119b8e80941Smrg               dst[${i}] = _mesa_half_to_float(${c.name});
120b8e80941Smrg            %else:
121b8e80941Smrg               <% assert False %>
122b8e80941Smrg            %endif
123b8e80941Smrg         %else:
124b8e80941Smrg            <% assert False %>
125b8e80941Smrg         %endif
126b8e80941Smrg      %elif s == parser.Swizzle.SWIZZLE_ZERO:
127b8e80941Smrg         dst[${i}] = 0.0f;
128b8e80941Smrg      %elif s == parser.Swizzle.SWIZZLE_ONE:
129b8e80941Smrg         dst[${i}] = 1.0f;
130b8e80941Smrg      %else:
131b8e80941Smrg         <% assert False %>
132b8e80941Smrg      %endif
133b8e80941Smrg   %endfor
134b8e80941Smrg}
135b8e80941Smrg%endfor
136b8e80941Smrg
137b8e80941Smrgstatic void
138b8e80941Smrgunpack_float_r9g9b9e5_float(const void *src, GLfloat dst[4])
139b8e80941Smrg{
140b8e80941Smrg   rgb9e5_to_float3(*(const GLuint *)src, dst);
141b8e80941Smrg   dst[3] = 1.0f;
142b8e80941Smrg}
143b8e80941Smrg
144b8e80941Smrgstatic void
145b8e80941Smrgunpack_float_r11g11b10_float(const void *src, GLfloat dst[4])
146b8e80941Smrg{
147b8e80941Smrg   r11g11b10f_to_float3(*(const GLuint *)src, dst);
148b8e80941Smrg   dst[3] = 1.0f;
149b8e80941Smrg}
150b8e80941Smrg
151b8e80941Smrgstatic void
152b8e80941Smrgunpack_float_ycbcr(const void *src, GLfloat dst[][4], GLuint n)
153b8e80941Smrg{
154b8e80941Smrg   GLuint i;
155b8e80941Smrg   for (i = 0; i < n; i++) {
156b8e80941Smrg      const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
157b8e80941Smrg      const GLushort *src1 = src0 + 1;         /* odd */
158b8e80941Smrg      const GLubyte y0 = (*src0 >> 8) & 0xff;  /* luminance */
159b8e80941Smrg      const GLubyte cb = *src0 & 0xff;         /* chroma U */
160b8e80941Smrg      const GLubyte y1 = (*src1 >> 8) & 0xff;  /* luminance */
161b8e80941Smrg      const GLubyte cr = *src1 & 0xff;         /* chroma V */
162b8e80941Smrg      const GLubyte y = (i & 1) ? y1 : y0;     /* choose even/odd luminance */
163b8e80941Smrg      GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
164b8e80941Smrg      GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
165b8e80941Smrg      GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
166b8e80941Smrg      r *= (1.0F / 255.0F);
167b8e80941Smrg      g *= (1.0F / 255.0F);
168b8e80941Smrg      b *= (1.0F / 255.0F);
169b8e80941Smrg      dst[i][0] = CLAMP(r, 0.0F, 1.0F);
170b8e80941Smrg      dst[i][1] = CLAMP(g, 0.0F, 1.0F);
171b8e80941Smrg      dst[i][2] = CLAMP(b, 0.0F, 1.0F);
172b8e80941Smrg      dst[i][3] = 1.0F;
173b8e80941Smrg   }
174b8e80941Smrg}
175b8e80941Smrg
176b8e80941Smrgstatic void
177b8e80941Smrgunpack_float_ycbcr_rev(const void *src, GLfloat dst[][4], GLuint n)
178b8e80941Smrg{
179b8e80941Smrg   GLuint i;
180b8e80941Smrg   for (i = 0; i < n; i++) {
181b8e80941Smrg      const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */
182b8e80941Smrg      const GLushort *src1 = src0 + 1;         /* odd */
183b8e80941Smrg      const GLubyte y0 = *src0 & 0xff;         /* luminance */
184b8e80941Smrg      const GLubyte cr = (*src0 >> 8) & 0xff;  /* chroma V */
185b8e80941Smrg      const GLubyte y1 = *src1 & 0xff;         /* luminance */
186b8e80941Smrg      const GLubyte cb = (*src1 >> 8) & 0xff;  /* chroma U */
187b8e80941Smrg      const GLubyte y = (i & 1) ? y1 : y0;     /* choose even/odd luminance */
188b8e80941Smrg      GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
189b8e80941Smrg      GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
190b8e80941Smrg      GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
191b8e80941Smrg      r *= (1.0F / 255.0F);
192b8e80941Smrg      g *= (1.0F / 255.0F);
193b8e80941Smrg      b *= (1.0F / 255.0F);
194b8e80941Smrg      dst[i][0] = CLAMP(r, 0.0F, 1.0F);
195b8e80941Smrg      dst[i][1] = CLAMP(g, 0.0F, 1.0F);
196b8e80941Smrg      dst[i][2] = CLAMP(b, 0.0F, 1.0F);
197b8e80941Smrg      dst[i][3] = 1.0F;
198b8e80941Smrg   }
199b8e80941Smrg}
200b8e80941Smrg
201b8e80941Smrg/* ubyte packing functions */
202b8e80941Smrg
203b8e80941Smrg%for f in rgb_formats:
204b8e80941Smrg   %if not f.is_normalized():
205b8e80941Smrg      <% continue %>
206b8e80941Smrg   %endif
207b8e80941Smrg
208b8e80941Smrgstatic inline void
209b8e80941Smrgunpack_ubyte_${f.short_name()}(const void *void_src, GLubyte dst[4])
210b8e80941Smrg{
211b8e80941Smrg   ${f.datatype()} *src = (${f.datatype()} *)void_src;
212b8e80941Smrg   %if f.layout == parser.PACKED:
213b8e80941Smrg      %for c in f.channels:
214b8e80941Smrg         %if c.type != 'x':
215b8e80941Smrg            ${c.datatype()} ${c.name} = UNPACK(*src, ${c.shift}, ${c.size});
216b8e80941Smrg         %endif
217b8e80941Smrg      %endfor
218b8e80941Smrg   %elif f.layout == parser.ARRAY:
219b8e80941Smrg      %for (i, c) in enumerate(f.channels):
220b8e80941Smrg         %if c.type != 'x':
221b8e80941Smrg            ${c.datatype()} ${c.name} = src[${i}];
222b8e80941Smrg         %endif
223b8e80941Smrg      %endfor
224b8e80941Smrg   %else:
225b8e80941Smrg      <% assert False %>
226b8e80941Smrg   %endif
227b8e80941Smrg
228b8e80941Smrg   %for i in range(4):
229b8e80941Smrg      <% s = f.swizzle[i] %>
230b8e80941Smrg      %if 0 <= s and s <= parser.Swizzle.SWIZZLE_W:
231b8e80941Smrg         <% c = f.channels[s] %>
232b8e80941Smrg         %if c.type == parser.UNSIGNED:
233b8e80941Smrg            %if f.colorspace == 'srgb' and c.name in 'rgb':
234b8e80941Smrg               <% assert c.size == 8 %>
235b8e80941Smrg               dst[${i}] = util_format_srgb_to_linear_8unorm(${c.name});
236b8e80941Smrg            %else:
237b8e80941Smrg               dst[${i}] = _mesa_unorm_to_unorm(${c.name}, ${c.size}, 8);
238b8e80941Smrg            %endif
239b8e80941Smrg         %elif c.type == parser.SIGNED:
240b8e80941Smrg            dst[${i}] = _mesa_snorm_to_unorm(${c.name}, ${c.size}, 8);
241b8e80941Smrg         %elif c.type == parser.FLOAT:
242b8e80941Smrg            %if c.size == 32:
243b8e80941Smrg               dst[${i}] = _mesa_float_to_unorm(${c.name}, 8);
244b8e80941Smrg            %elif c.size == 16:
245b8e80941Smrg               dst[${i}] = _mesa_half_to_unorm(${c.name}, 8);
246b8e80941Smrg            %else:
247b8e80941Smrg               <% assert False %>
248b8e80941Smrg            %endif
249b8e80941Smrg         %else:
250b8e80941Smrg            <% assert False %>
251b8e80941Smrg         %endif
252b8e80941Smrg      %elif s == parser.Swizzle.SWIZZLE_ZERO:
253b8e80941Smrg         dst[${i}] = 0;
254b8e80941Smrg      %elif s == parser.Swizzle.SWIZZLE_ONE:
255b8e80941Smrg         dst[${i}] = 255;
256b8e80941Smrg      %else:
257b8e80941Smrg         <% assert False %>
258b8e80941Smrg      %endif
259b8e80941Smrg   %endfor
260b8e80941Smrg}
261b8e80941Smrg%endfor
262b8e80941Smrg
263b8e80941Smrg/* integer packing functions */
264b8e80941Smrg
265b8e80941Smrg%for f in rgb_formats:
266b8e80941Smrg   %if not f.is_int():
267b8e80941Smrg      <% continue %>
268b8e80941Smrg   %elif f.is_normalized():
269b8e80941Smrg      <% continue %>
270b8e80941Smrg   %endif
271b8e80941Smrg
272b8e80941Smrgstatic inline void
273b8e80941Smrgunpack_int_${f.short_name()}(const void *void_src, GLuint dst[4])
274b8e80941Smrg{
275b8e80941Smrg   ${f.datatype()} *src = (${f.datatype()} *)void_src;
276b8e80941Smrg   %if f.layout == parser.PACKED:
277b8e80941Smrg      %for c in f.channels:
278b8e80941Smrg         %if c.type != 'x':
279b8e80941Smrg            ${c.datatype()} ${c.name} = UNPACK(*src, ${c.shift}, ${c.size});
280b8e80941Smrg         %endif
281b8e80941Smrg      %endfor
282b8e80941Smrg   %elif f.layout == parser.ARRAY:
283b8e80941Smrg      %for (i, c) in enumerate(f.channels):
284b8e80941Smrg         %if c.type != 'x':
285b8e80941Smrg            ${c.datatype()} ${c.name} = src[${i}];
286b8e80941Smrg         %endif
287b8e80941Smrg      %endfor
288b8e80941Smrg   %else:
289b8e80941Smrg      <% assert False %>
290b8e80941Smrg   %endif
291b8e80941Smrg
292b8e80941Smrg   %for i in range(4):
293b8e80941Smrg      <% s = f.swizzle[i] %>
294b8e80941Smrg      %if 0 <= s and s <= parser.Swizzle.SWIZZLE_W:
295b8e80941Smrg         dst[${i}] = ${f.channels[s].name};
296b8e80941Smrg      %elif s == parser.Swizzle.SWIZZLE_ZERO:
297b8e80941Smrg         dst[${i}] = 0;
298b8e80941Smrg      %elif s == parser.Swizzle.SWIZZLE_ONE:
299b8e80941Smrg         dst[${i}] = 1;
300b8e80941Smrg      %else:
301b8e80941Smrg         <% assert False %>
302b8e80941Smrg      %endif
303b8e80941Smrg   %endfor
304b8e80941Smrg}
305b8e80941Smrg%endfor
306b8e80941Smrg
307b8e80941Smrg
308b8e80941Smrgvoid
309b8e80941Smrg_mesa_unpack_rgba_row(mesa_format format, GLuint n,
310b8e80941Smrg                      const void *src, GLfloat dst[][4])
311b8e80941Smrg{
312b8e80941Smrg   GLubyte *s = (GLubyte *)src;
313b8e80941Smrg   GLuint i;
314b8e80941Smrg
315b8e80941Smrg   switch (format) {
316b8e80941Smrg%for f in rgb_formats:
317b8e80941Smrg   %if f.is_compressed():
318b8e80941Smrg      <% continue %>
319b8e80941Smrg   %elif f.is_int() and not f.is_normalized():
320b8e80941Smrg      <% continue %>
321b8e80941Smrg   %endif
322b8e80941Smrg   case ${f.name}:
323b8e80941Smrg      for (i = 0; i < n; ++i) {
324b8e80941Smrg         unpack_float_${f.short_name()}(s, dst[i]);
325b8e80941Smrg         s += ${f.block_size() // 8};
326b8e80941Smrg      }
327b8e80941Smrg      break;
328b8e80941Smrg%endfor
329b8e80941Smrg   case MESA_FORMAT_YCBCR:
330b8e80941Smrg      unpack_float_ycbcr(src, dst, n);
331b8e80941Smrg      break;
332b8e80941Smrg   case MESA_FORMAT_YCBCR_REV:
333b8e80941Smrg      unpack_float_ycbcr_rev(src, dst, n);
334b8e80941Smrg      break;
335b8e80941Smrg   default:
336b8e80941Smrg      _mesa_problem(NULL, "%s: bad format %s", __func__,
337b8e80941Smrg                    _mesa_get_format_name(format));
338b8e80941Smrg      return;
339b8e80941Smrg   }
340b8e80941Smrg}
341b8e80941Smrg
342b8e80941Smrgvoid
343b8e80941Smrg_mesa_unpack_ubyte_rgba_row(mesa_format format, GLuint n,
344b8e80941Smrg                            const void *src, GLubyte dst[][4])
345b8e80941Smrg{
346b8e80941Smrg   GLubyte *s = (GLubyte *)src;
347b8e80941Smrg   GLuint i;
348b8e80941Smrg
349b8e80941Smrg   switch (format) {
350b8e80941Smrg%for f in rgb_formats:
351b8e80941Smrg   %if not f.is_normalized():
352b8e80941Smrg      <% continue %>
353b8e80941Smrg   %endif
354b8e80941Smrg
355b8e80941Smrg   case ${f.name}:
356b8e80941Smrg      for (i = 0; i < n; ++i) {
357b8e80941Smrg         unpack_ubyte_${f.short_name()}(s, dst[i]);
358b8e80941Smrg         s += ${f.block_size() // 8};
359b8e80941Smrg      }
360b8e80941Smrg      break;
361b8e80941Smrg%endfor
362b8e80941Smrg   default:
363b8e80941Smrg      /* get float values, convert to ubyte */
364b8e80941Smrg      {
365b8e80941Smrg         GLfloat *tmp = malloc(n * 4 * sizeof(GLfloat));
366b8e80941Smrg         if (tmp) {
367b8e80941Smrg            GLuint i;
368b8e80941Smrg            _mesa_unpack_rgba_row(format, n, src, (GLfloat (*)[4]) tmp);
369b8e80941Smrg            for (i = 0; i < n; i++) {
370b8e80941Smrg               dst[i][0] = _mesa_float_to_unorm(tmp[i*4+0], 8);
371b8e80941Smrg               dst[i][1] = _mesa_float_to_unorm(tmp[i*4+1], 8);
372b8e80941Smrg               dst[i][2] = _mesa_float_to_unorm(tmp[i*4+2], 8);
373b8e80941Smrg               dst[i][3] = _mesa_float_to_unorm(tmp[i*4+3], 8);
374b8e80941Smrg            }
375b8e80941Smrg            free(tmp);
376b8e80941Smrg         }
377b8e80941Smrg      }
378b8e80941Smrg      break;
379b8e80941Smrg   }
380b8e80941Smrg}
381b8e80941Smrg
382b8e80941Smrgvoid
383b8e80941Smrg_mesa_unpack_uint_rgba_row(mesa_format format, GLuint n,
384b8e80941Smrg                           const void *src, GLuint dst[][4])
385b8e80941Smrg{
386b8e80941Smrg   GLubyte *s = (GLubyte *)src;
387b8e80941Smrg   GLuint i;
388b8e80941Smrg
389b8e80941Smrg   switch (format) {
390b8e80941Smrg%for f in rgb_formats:
391b8e80941Smrg   %if not f.is_int():
392b8e80941Smrg      <% continue %>
393b8e80941Smrg   %elif f.is_normalized():
394b8e80941Smrg      <% continue %>
395b8e80941Smrg   %endif
396b8e80941Smrg
397b8e80941Smrg   case ${f.name}:
398b8e80941Smrg      for (i = 0; i < n; ++i) {
399b8e80941Smrg         unpack_int_${f.short_name()}(s, dst[i]);
400b8e80941Smrg         s += ${f.block_size() // 8};
401b8e80941Smrg      }
402b8e80941Smrg      break;
403b8e80941Smrg%endfor
404b8e80941Smrg   default:
405b8e80941Smrg      _mesa_problem(NULL, "%s: bad format %s", __func__,
406b8e80941Smrg                    _mesa_get_format_name(format));
407b8e80941Smrg      return;
408b8e80941Smrg   }
409b8e80941Smrg}
410b8e80941Smrg
411b8e80941Smrg/**
412b8e80941Smrg * Unpack a 2D rect of pixels returning float RGBA colors.
413b8e80941Smrg * \param format  the source image format
414b8e80941Smrg * \param src  start address of the source image
415b8e80941Smrg * \param srcRowStride  source image row stride in bytes
416b8e80941Smrg * \param dst  start address of the dest image
417b8e80941Smrg * \param dstRowStride  dest image row stride in bytes
418b8e80941Smrg * \param x  source image start X pos
419b8e80941Smrg * \param y  source image start Y pos
420b8e80941Smrg * \param width  width of rect region to convert
421b8e80941Smrg * \param height  height of rect region to convert
422b8e80941Smrg */
423b8e80941Smrgvoid
424b8e80941Smrg_mesa_unpack_rgba_block(mesa_format format,
425b8e80941Smrg                        const void *src, GLint srcRowStride,
426b8e80941Smrg                        GLfloat dst[][4], GLint dstRowStride,
427b8e80941Smrg                        GLuint x, GLuint y, GLuint width, GLuint height)
428b8e80941Smrg{
429b8e80941Smrg   const GLuint srcPixStride = _mesa_get_format_bytes(format);
430b8e80941Smrg   const GLuint dstPixStride = 4 * sizeof(GLfloat);
431b8e80941Smrg   const GLubyte *srcRow;
432b8e80941Smrg   GLubyte *dstRow;
433b8e80941Smrg   GLuint i;
434b8e80941Smrg
435b8e80941Smrg   /* XXX needs to be fixed for compressed formats */
436b8e80941Smrg
437b8e80941Smrg   srcRow = ((const GLubyte *) src) + srcRowStride * y + srcPixStride * x;
438b8e80941Smrg   dstRow = ((GLubyte *) dst) + dstRowStride * y + dstPixStride * x;
439b8e80941Smrg
440b8e80941Smrg   for (i = 0; i < height; i++) {
441b8e80941Smrg      _mesa_unpack_rgba_row(format, width, srcRow, (GLfloat (*)[4]) dstRow);
442b8e80941Smrg
443b8e80941Smrg      dstRow += dstRowStride;
444b8e80941Smrg      srcRow += srcRowStride;
445b8e80941Smrg   }
446b8e80941Smrg}
447b8e80941Smrg
448b8e80941Smrg/** Helper struct for MESA_FORMAT_Z32_FLOAT_S8X24_UINT */
449b8e80941Smrgstruct z32f_x24s8
450b8e80941Smrg{
451b8e80941Smrg   float z;
452b8e80941Smrg   uint32_t x24s8;
453b8e80941Smrg};
454b8e80941Smrg
455b8e80941Smrgtypedef void (*unpack_float_z_func)(GLuint n, const void *src, GLfloat *dst);
456b8e80941Smrg
457b8e80941Smrgstatic void
458b8e80941Smrgunpack_float_z_X8_UINT_Z24_UNORM(GLuint n, const void *src, GLfloat *dst)
459b8e80941Smrg{
460b8e80941Smrg   /* only return Z, not stencil data */
461b8e80941Smrg   const GLuint *s = ((const GLuint *) src);
462b8e80941Smrg   const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
463b8e80941Smrg   GLuint i;
464b8e80941Smrg   for (i = 0; i < n; i++) {
465b8e80941Smrg      dst[i] = (GLfloat) ((s[i] >> 8) * scale);
466b8e80941Smrg      assert(dst[i] >= 0.0F);
467b8e80941Smrg      assert(dst[i] <= 1.0F);
468b8e80941Smrg   }
469b8e80941Smrg}
470b8e80941Smrg
471b8e80941Smrgstatic void
472b8e80941Smrgunpack_float_z_Z24_UNORM_X8_UINT(GLuint n, const void *src, GLfloat *dst)
473b8e80941Smrg{
474b8e80941Smrg   /* only return Z, not stencil data */
475b8e80941Smrg   const GLuint *s = ((const GLuint *) src);
476b8e80941Smrg   const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
477b8e80941Smrg   GLuint i;
478b8e80941Smrg   for (i = 0; i < n; i++) {
479b8e80941Smrg      dst[i] = (GLfloat) ((s[i] & 0x00ffffff) * scale);
480b8e80941Smrg      assert(dst[i] >= 0.0F);
481b8e80941Smrg      assert(dst[i] <= 1.0F);
482b8e80941Smrg   }
483b8e80941Smrg}
484b8e80941Smrg
485b8e80941Smrgstatic void
486b8e80941Smrgunpack_float_Z_UNORM16(GLuint n, const void *src, GLfloat *dst)
487b8e80941Smrg{
488b8e80941Smrg   const GLushort *s = ((const GLushort *) src);
489b8e80941Smrg   GLuint i;
490b8e80941Smrg   for (i = 0; i < n; i++) {
491b8e80941Smrg      dst[i] = s[i] * (1.0F / 65535.0F);
492b8e80941Smrg   }
493b8e80941Smrg}
494b8e80941Smrg
495b8e80941Smrgstatic void
496b8e80941Smrgunpack_float_Z_UNORM32(GLuint n, const void *src, GLfloat *dst)
497b8e80941Smrg{
498b8e80941Smrg   const GLuint *s = ((const GLuint *) src);
499b8e80941Smrg   GLuint i;
500b8e80941Smrg   for (i = 0; i < n; i++) {
501b8e80941Smrg      dst[i] = s[i] * (1.0F / 0xffffffff);
502b8e80941Smrg   }
503b8e80941Smrg}
504b8e80941Smrg
505b8e80941Smrgstatic void
506b8e80941Smrgunpack_float_Z_FLOAT32(GLuint n, const void *src, GLfloat *dst)
507b8e80941Smrg{
508b8e80941Smrg   memcpy(dst, src, n * sizeof(float));
509b8e80941Smrg}
510b8e80941Smrg
511b8e80941Smrgstatic void
512b8e80941Smrgunpack_float_z_Z32X24S8(GLuint n, const void *src, GLfloat *dst)
513b8e80941Smrg{
514b8e80941Smrg   const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
515b8e80941Smrg   GLuint i;
516b8e80941Smrg   for (i = 0; i < n; i++) {
517b8e80941Smrg      dst[i] = s[i].z;
518b8e80941Smrg   }
519b8e80941Smrg}
520b8e80941Smrg
521b8e80941Smrg
522b8e80941Smrg
523b8e80941Smrg/**
524b8e80941Smrg * Unpack Z values.
525b8e80941Smrg * The returned values will always be in the range [0.0, 1.0].
526b8e80941Smrg */
527b8e80941Smrgvoid
528b8e80941Smrg_mesa_unpack_float_z_row(mesa_format format, GLuint n,
529b8e80941Smrg                         const void *src, GLfloat *dst)
530b8e80941Smrg{
531b8e80941Smrg   unpack_float_z_func unpack;
532b8e80941Smrg
533b8e80941Smrg   switch (format) {
534b8e80941Smrg   case MESA_FORMAT_S8_UINT_Z24_UNORM:
535b8e80941Smrg   case MESA_FORMAT_X8_UINT_Z24_UNORM:
536b8e80941Smrg      unpack = unpack_float_z_X8_UINT_Z24_UNORM;
537b8e80941Smrg      break;
538b8e80941Smrg   case MESA_FORMAT_Z24_UNORM_S8_UINT:
539b8e80941Smrg   case MESA_FORMAT_Z24_UNORM_X8_UINT:
540b8e80941Smrg      unpack = unpack_float_z_Z24_UNORM_X8_UINT;
541b8e80941Smrg      break;
542b8e80941Smrg   case MESA_FORMAT_Z_UNORM16:
543b8e80941Smrg      unpack = unpack_float_Z_UNORM16;
544b8e80941Smrg      break;
545b8e80941Smrg   case MESA_FORMAT_Z_UNORM32:
546b8e80941Smrg      unpack = unpack_float_Z_UNORM32;
547b8e80941Smrg      break;
548b8e80941Smrg   case MESA_FORMAT_Z_FLOAT32:
549b8e80941Smrg      unpack = unpack_float_Z_FLOAT32;
550b8e80941Smrg      break;
551b8e80941Smrg   case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
552b8e80941Smrg      unpack = unpack_float_z_Z32X24S8;
553b8e80941Smrg      break;
554b8e80941Smrg   default:
555b8e80941Smrg      _mesa_problem(NULL, "bad format %s in _mesa_unpack_float_z_row",
556b8e80941Smrg                    _mesa_get_format_name(format));
557b8e80941Smrg      return;
558b8e80941Smrg   }
559b8e80941Smrg
560b8e80941Smrg   unpack(n, src, dst);
561b8e80941Smrg}
562b8e80941Smrg
563b8e80941Smrg
564b8e80941Smrg
565b8e80941Smrgtypedef void (*unpack_uint_z_func)(const void *src, GLuint *dst, GLuint n);
566b8e80941Smrg
567b8e80941Smrgstatic void
568b8e80941Smrgunpack_uint_z_X8_UINT_Z24_UNORM(const void *src, GLuint *dst, GLuint n)
569b8e80941Smrg{
570b8e80941Smrg   /* only return Z, not stencil data */
571b8e80941Smrg   const GLuint *s = ((const GLuint *) src);
572b8e80941Smrg   GLuint i;
573b8e80941Smrg   for (i = 0; i < n; i++) {
574b8e80941Smrg      dst[i] = (s[i] & 0xffffff00) | (s[i] >> 24);
575b8e80941Smrg   }
576b8e80941Smrg}
577b8e80941Smrg
578b8e80941Smrgstatic void
579b8e80941Smrgunpack_uint_z_Z24_UNORM_X8_UINT(const void *src, GLuint *dst, GLuint n)
580b8e80941Smrg{
581b8e80941Smrg   /* only return Z, not stencil data */
582b8e80941Smrg   const GLuint *s = ((const GLuint *) src);
583b8e80941Smrg   GLuint i;
584b8e80941Smrg   for (i = 0; i < n; i++) {
585b8e80941Smrg      dst[i] = (s[i] << 8) | ((s[i] >> 16) & 0xff);
586b8e80941Smrg   }
587b8e80941Smrg}
588b8e80941Smrg
589b8e80941Smrgstatic void
590b8e80941Smrgunpack_uint_Z_UNORM16(const void *src, GLuint *dst, GLuint n)
591b8e80941Smrg{
592b8e80941Smrg   const GLushort *s = ((const GLushort *)src);
593b8e80941Smrg   GLuint i;
594b8e80941Smrg   for (i = 0; i < n; i++) {
595b8e80941Smrg      dst[i] = (s[i] << 16) | s[i];
596b8e80941Smrg   }
597b8e80941Smrg}
598b8e80941Smrg
599b8e80941Smrgstatic void
600b8e80941Smrgunpack_uint_Z_UNORM32(const void *src, GLuint *dst, GLuint n)
601b8e80941Smrg{
602b8e80941Smrg   memcpy(dst, src, n * sizeof(GLuint));
603b8e80941Smrg}
604b8e80941Smrg
605b8e80941Smrgstatic void
606b8e80941Smrgunpack_uint_Z_FLOAT32(const void *src, GLuint *dst, GLuint n)
607b8e80941Smrg{
608b8e80941Smrg   const float *s = (const float *)src;
609b8e80941Smrg   GLuint i;
610b8e80941Smrg   for (i = 0; i < n; i++) {
611b8e80941Smrg      dst[i] = FLOAT_TO_UINT(CLAMP(s[i], 0.0F, 1.0F));
612b8e80941Smrg   }
613b8e80941Smrg}
614b8e80941Smrg
615b8e80941Smrgstatic void
616b8e80941Smrgunpack_uint_Z_FLOAT32_X24S8(const void *src, GLuint *dst, GLuint n)
617b8e80941Smrg{
618b8e80941Smrg   const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
619b8e80941Smrg   GLuint i;
620b8e80941Smrg
621b8e80941Smrg   for (i = 0; i < n; i++) {
622b8e80941Smrg      dst[i] = FLOAT_TO_UINT(CLAMP(s[i].z, 0.0F, 1.0F));
623b8e80941Smrg   }
624b8e80941Smrg}
625b8e80941Smrg
626b8e80941Smrg
627b8e80941Smrg/**
628b8e80941Smrg * Unpack Z values.
629b8e80941Smrg * The returned values will always be in the range [0, 0xffffffff].
630b8e80941Smrg */
631b8e80941Smrgvoid
632b8e80941Smrg_mesa_unpack_uint_z_row(mesa_format format, GLuint n,
633b8e80941Smrg                        const void *src, GLuint *dst)
634b8e80941Smrg{
635b8e80941Smrg   unpack_uint_z_func unpack;
636b8e80941Smrg   const GLubyte *srcPtr = (GLubyte *) src;
637b8e80941Smrg
638b8e80941Smrg   switch (format) {
639b8e80941Smrg   case MESA_FORMAT_S8_UINT_Z24_UNORM:
640b8e80941Smrg   case MESA_FORMAT_X8_UINT_Z24_UNORM:
641b8e80941Smrg      unpack = unpack_uint_z_X8_UINT_Z24_UNORM;
642b8e80941Smrg      break;
643b8e80941Smrg   case MESA_FORMAT_Z24_UNORM_S8_UINT:
644b8e80941Smrg   case MESA_FORMAT_Z24_UNORM_X8_UINT:
645b8e80941Smrg      unpack = unpack_uint_z_Z24_UNORM_X8_UINT;
646b8e80941Smrg      break;
647b8e80941Smrg   case MESA_FORMAT_Z_UNORM16:
648b8e80941Smrg      unpack = unpack_uint_Z_UNORM16;
649b8e80941Smrg      break;
650b8e80941Smrg   case MESA_FORMAT_Z_UNORM32:
651b8e80941Smrg      unpack = unpack_uint_Z_UNORM32;
652b8e80941Smrg      break;
653b8e80941Smrg   case MESA_FORMAT_Z_FLOAT32:
654b8e80941Smrg      unpack = unpack_uint_Z_FLOAT32;
655b8e80941Smrg      break;
656b8e80941Smrg   case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
657b8e80941Smrg      unpack = unpack_uint_Z_FLOAT32_X24S8;
658b8e80941Smrg      break;
659b8e80941Smrg   default:
660b8e80941Smrg      _mesa_problem(NULL, "bad format %s in _mesa_unpack_uint_z_row",
661b8e80941Smrg                    _mesa_get_format_name(format));
662b8e80941Smrg      return;
663b8e80941Smrg   }
664b8e80941Smrg
665b8e80941Smrg   unpack(srcPtr, dst, n);
666b8e80941Smrg}
667b8e80941Smrg
668b8e80941Smrg
669b8e80941Smrgstatic void
670b8e80941Smrgunpack_ubyte_s_S_UINT8(const void *src, GLubyte *dst, GLuint n)
671b8e80941Smrg{
672b8e80941Smrg   memcpy(dst, src, n);
673b8e80941Smrg}
674b8e80941Smrg
675b8e80941Smrgstatic void
676b8e80941Smrgunpack_ubyte_s_S8_UINT_Z24_UNORM(const void *src, GLubyte *dst, GLuint n)
677b8e80941Smrg{
678b8e80941Smrg   GLuint i;
679b8e80941Smrg   const GLuint *src32 = src;
680b8e80941Smrg
681b8e80941Smrg   for (i = 0; i < n; i++)
682b8e80941Smrg      dst[i] = src32[i] & 0xff;
683b8e80941Smrg}
684b8e80941Smrg
685b8e80941Smrgstatic void
686b8e80941Smrgunpack_ubyte_s_Z24_UNORM_S8_UINT(const void *src, GLubyte *dst, GLuint n)
687b8e80941Smrg{
688b8e80941Smrg   GLuint i;
689b8e80941Smrg   const GLuint *src32 = src;
690b8e80941Smrg
691b8e80941Smrg   for (i = 0; i < n; i++)
692b8e80941Smrg      dst[i] = src32[i] >> 24;
693b8e80941Smrg}
694b8e80941Smrg
695b8e80941Smrgstatic void
696b8e80941Smrgunpack_ubyte_s_Z32_FLOAT_S8X24_UINT(const void *src, GLubyte *dst, GLuint n)
697b8e80941Smrg{
698b8e80941Smrg   GLuint i;
699b8e80941Smrg   const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src;
700b8e80941Smrg
701b8e80941Smrg   for (i = 0; i < n; i++)
702b8e80941Smrg      dst[i] = s[i].x24s8 & 0xff;
703b8e80941Smrg}
704b8e80941Smrg
705b8e80941Smrgvoid
706b8e80941Smrg_mesa_unpack_ubyte_stencil_row(mesa_format format, GLuint n,
707b8e80941Smrg			       const void *src, GLubyte *dst)
708b8e80941Smrg{
709b8e80941Smrg   switch (format) {
710b8e80941Smrg   case MESA_FORMAT_S_UINT8:
711b8e80941Smrg      unpack_ubyte_s_S_UINT8(src, dst, n);
712b8e80941Smrg      break;
713b8e80941Smrg   case MESA_FORMAT_S8_UINT_Z24_UNORM:
714b8e80941Smrg      unpack_ubyte_s_S8_UINT_Z24_UNORM(src, dst, n);
715b8e80941Smrg      break;
716b8e80941Smrg   case MESA_FORMAT_Z24_UNORM_S8_UINT:
717b8e80941Smrg      unpack_ubyte_s_Z24_UNORM_S8_UINT(src, dst, n);
718b8e80941Smrg      break;
719b8e80941Smrg   case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
720b8e80941Smrg      unpack_ubyte_s_Z32_FLOAT_S8X24_UINT(src, dst, n);
721b8e80941Smrg      break;
722b8e80941Smrg   default:
723b8e80941Smrg      _mesa_problem(NULL, "bad format %s in _mesa_unpack_ubyte_s_row",
724b8e80941Smrg                    _mesa_get_format_name(format));
725b8e80941Smrg      return;
726b8e80941Smrg   }
727b8e80941Smrg}
728b8e80941Smrg
729b8e80941Smrgstatic void
730b8e80941Smrgunpack_uint_24_8_depth_stencil_Z24_UNORM_S8_UINT(const GLuint *src, GLuint *dst, GLuint n)
731b8e80941Smrg{
732b8e80941Smrg   GLuint i;
733b8e80941Smrg
734b8e80941Smrg   for (i = 0; i < n; i++) {
735b8e80941Smrg      GLuint val = src[i];
736b8e80941Smrg      dst[i] = val >> 24 | val << 8;
737b8e80941Smrg   }
738b8e80941Smrg}
739b8e80941Smrg
740b8e80941Smrgstatic void
741b8e80941Smrgunpack_uint_24_8_depth_stencil_Z32_S8X24(const GLuint *src,
742b8e80941Smrg                                         GLuint *dst, GLuint n)
743b8e80941Smrg{
744b8e80941Smrg   GLuint i;
745b8e80941Smrg
746b8e80941Smrg   for (i = 0; i < n; i++) {
747b8e80941Smrg      /* 8 bytes per pixel (float + uint32) */
748b8e80941Smrg      GLfloat zf = ((GLfloat *) src)[i * 2 + 0];
749b8e80941Smrg      GLuint z24 = (GLuint) (zf * (GLfloat) 0xffffff);
750b8e80941Smrg      GLuint s = src[i * 2 + 1] & 0xff;
751b8e80941Smrg      dst[i] = (z24 << 8) | s;
752b8e80941Smrg   }
753b8e80941Smrg}
754b8e80941Smrg
755b8e80941Smrgstatic void
756b8e80941Smrgunpack_uint_24_8_depth_stencil_S8_UINT_Z24_UNORM(const GLuint *src, GLuint *dst, GLuint n)
757b8e80941Smrg{
758b8e80941Smrg   memcpy(dst, src, n * 4);
759b8e80941Smrg}
760b8e80941Smrg
761b8e80941Smrg/**
762b8e80941Smrg * Unpack depth/stencil returning as GL_UNSIGNED_INT_24_8.
763b8e80941Smrg * \param format  the source data format
764b8e80941Smrg */
765b8e80941Smrgvoid
766b8e80941Smrg_mesa_unpack_uint_24_8_depth_stencil_row(mesa_format format, GLuint n,
767b8e80941Smrg					 const void *src, GLuint *dst)
768b8e80941Smrg{
769b8e80941Smrg   switch (format) {
770b8e80941Smrg   case MESA_FORMAT_S8_UINT_Z24_UNORM:
771b8e80941Smrg      unpack_uint_24_8_depth_stencil_S8_UINT_Z24_UNORM(src, dst, n);
772b8e80941Smrg      break;
773b8e80941Smrg   case MESA_FORMAT_Z24_UNORM_S8_UINT:
774b8e80941Smrg      unpack_uint_24_8_depth_stencil_Z24_UNORM_S8_UINT(src, dst, n);
775b8e80941Smrg      break;
776b8e80941Smrg   case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
777b8e80941Smrg      unpack_uint_24_8_depth_stencil_Z32_S8X24(src, dst, n);
778b8e80941Smrg      break;
779b8e80941Smrg   default:
780b8e80941Smrg      _mesa_problem(NULL,
781b8e80941Smrg                    "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row",
782b8e80941Smrg                    _mesa_get_format_name(format));
783b8e80941Smrg      return;
784b8e80941Smrg   }
785b8e80941Smrg}
786b8e80941Smrg
787b8e80941Smrgstatic void
788b8e80941Smrgunpack_float_32_uint_24_8_Z24_UNORM_S8_UINT(const GLuint *src,
789b8e80941Smrg                                            GLuint *dst, GLuint n)
790b8e80941Smrg{
791b8e80941Smrg   GLuint i;
792b8e80941Smrg   struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
793b8e80941Smrg   const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
794b8e80941Smrg
795b8e80941Smrg   for (i = 0; i < n; i++) {
796b8e80941Smrg      const GLuint z24 = src[i] & 0xffffff;
797b8e80941Smrg      d[i].z = z24 * scale;
798b8e80941Smrg      d[i].x24s8 = src[i] >> 24;
799b8e80941Smrg      assert(d[i].z >= 0.0f);
800b8e80941Smrg      assert(d[i].z <= 1.0f);
801b8e80941Smrg   }
802b8e80941Smrg}
803b8e80941Smrg
804b8e80941Smrgstatic void
805b8e80941Smrgunpack_float_32_uint_24_8_Z32_FLOAT_S8X24_UINT(const GLuint *src,
806b8e80941Smrg                                               GLuint *dst, GLuint n)
807b8e80941Smrg{
808b8e80941Smrg   memcpy(dst, src, n * sizeof(struct z32f_x24s8));
809b8e80941Smrg}
810b8e80941Smrg
811b8e80941Smrgstatic void
812b8e80941Smrgunpack_float_32_uint_24_8_S8_UINT_Z24_UNORM(const GLuint *src,
813b8e80941Smrg                                            GLuint *dst, GLuint n)
814b8e80941Smrg{
815b8e80941Smrg   GLuint i;
816b8e80941Smrg   struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
817b8e80941Smrg   const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
818b8e80941Smrg
819b8e80941Smrg   for (i = 0; i < n; i++) {
820b8e80941Smrg      const GLuint z24 = src[i] >> 8;
821b8e80941Smrg      d[i].z = z24 * scale;
822b8e80941Smrg      d[i].x24s8 = src[i] & 0xff;
823b8e80941Smrg      assert(d[i].z >= 0.0f);
824b8e80941Smrg      assert(d[i].z <= 1.0f);
825b8e80941Smrg   }
826b8e80941Smrg}
827b8e80941Smrg
828b8e80941Smrg/**
829b8e80941Smrg * Unpack depth/stencil returning as GL_FLOAT_32_UNSIGNED_INT_24_8_REV.
830b8e80941Smrg * \param format  the source data format
831b8e80941Smrg *
832b8e80941Smrg * In GL_FLOAT_32_UNSIGNED_INT_24_8_REV lower 4 bytes contain float
833b8e80941Smrg * component and higher 4 bytes contain packed 24-bit and 8-bit
834b8e80941Smrg * components.
835b8e80941Smrg *
836b8e80941Smrg *    31 30 29 28 ... 4 3 2 1 0    31 30 29 ... 9 8 7 6 5 ... 2 1 0
837b8e80941Smrg *    +-------------------------+  +--------------------------------+
838b8e80941Smrg *    |    Float Component      |  | Unused         | 8 bit stencil |
839b8e80941Smrg *    +-------------------------+  +--------------------------------+
840b8e80941Smrg *          lower 4 bytes                  higher 4 bytes
841b8e80941Smrg */
842b8e80941Smrgvoid
843b8e80941Smrg_mesa_unpack_float_32_uint_24_8_depth_stencil_row(mesa_format format, GLuint n,
844b8e80941Smrg			                          const void *src, GLuint *dst)
845b8e80941Smrg{
846b8e80941Smrg   switch (format) {
847b8e80941Smrg   case MESA_FORMAT_S8_UINT_Z24_UNORM:
848b8e80941Smrg      unpack_float_32_uint_24_8_S8_UINT_Z24_UNORM(src, dst, n);
849b8e80941Smrg      break;
850b8e80941Smrg   case MESA_FORMAT_Z24_UNORM_S8_UINT:
851b8e80941Smrg      unpack_float_32_uint_24_8_Z24_UNORM_S8_UINT(src, dst, n);
852b8e80941Smrg      break;
853b8e80941Smrg   case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
854b8e80941Smrg      unpack_float_32_uint_24_8_Z32_FLOAT_S8X24_UINT(src, dst, n);
855b8e80941Smrg      break;
856b8e80941Smrg   default:
857b8e80941Smrg      _mesa_problem(NULL,
858b8e80941Smrg                    "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row",
859b8e80941Smrg                    _mesa_get_format_name(format));
860b8e80941Smrg      return;
861b8e80941Smrg   }
862b8e80941Smrg}
863b8e80941Smrg
864b8e80941Smrg/**
865b8e80941Smrg * Unpack depth/stencil
866b8e80941Smrg * \param format  the source data format
867b8e80941Smrg * \param type the destination data type
868b8e80941Smrg */
869b8e80941Smrgvoid
870b8e80941Smrg_mesa_unpack_depth_stencil_row(mesa_format format, GLuint n,
871b8e80941Smrg	                       const void *src, GLenum type,
872b8e80941Smrg                               GLuint *dst)
873b8e80941Smrg{
874b8e80941Smrg   assert(type == GL_UNSIGNED_INT_24_8 ||
875b8e80941Smrg          type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
876b8e80941Smrg
877b8e80941Smrg   switch (type) {
878b8e80941Smrg   case GL_UNSIGNED_INT_24_8:
879b8e80941Smrg      _mesa_unpack_uint_24_8_depth_stencil_row(format, n, src, dst);
880b8e80941Smrg      break;
881b8e80941Smrg   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
882b8e80941Smrg      _mesa_unpack_float_32_uint_24_8_depth_stencil_row(format, n, src, dst);
883b8e80941Smrg      break;
884b8e80941Smrg   default:
885b8e80941Smrg      _mesa_problem(NULL,
886b8e80941Smrg                    "bad type 0x%x in _mesa_unpack_depth_stencil_row",
887b8e80941Smrg                    type);
888b8e80941Smrg      return;
889b8e80941Smrg   }
890b8e80941Smrg}
891b8e80941Smrg"""
892b8e80941Smrg
893b8e80941Smrgtemplate = Template(string, future_imports=['division']);
894b8e80941Smrg
895b8e80941Smrgprint(template.render(argv = argv[0:]))
896