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