texcompress.c revision 54bb414e00a4daedbe530b9933bc11bac4ae7149
1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Mesa 3-D graphics library 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Version: 6.5.1 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (c) 2008 VMware, Inc. 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Permission is hereby granted, free of charge, to any person obtaining a 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * copy of this software and associated documentation files (the "Software"), 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to deal in the Software without restriction, including without limitation 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and/or sell copies of the Software, and to permit persons to whom the 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Software is furnished to do so, subject to the following conditions: 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The above copyright notice and this permission notice shall be included 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * in all copies or substantial portions of the Software. 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \file texcompress.c 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Helper functions for texture compression. 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include "glheader.h" 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include "imports.h" 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include "colormac.h" 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include "context.h" 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include "formats.h" 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include "image.h" 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include "mipmap.h" 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include "texcompress.h" 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include "texstore.h" 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Return list of (and count of) all specific texture compression 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * formats that are supported. 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \param ctx the GL context 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \param formats the resulting format list (may be NULL). 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \param all if true return all formats, even those with some kind 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * of restrictions/limitations (See GL_ARB_texture_compression 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * spec for more info). 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \return number of formats. 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruGLuint 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru_mesa_get_compressed_formats(GLcontext *ctx, GLint *formats, GLboolean all) 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru GLuint n = 0; 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (ctx->Extensions.TDFX_texture_compression_FXT1) { 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (formats) { 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_COMPRESSED_RGB_FXT1_3DFX; 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_COMPRESSED_RGBA_FXT1_3DFX; 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else { 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru n += 2; 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (ctx->Extensions.EXT_texture_compression_s3tc) { 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (formats) { 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* This format has some restrictions/limitations and so should 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * not be returned via the GL_COMPRESSED_TEXTURE_FORMATS query. 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Specifically, all transparent pixels become black. NVIDIA 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * omits this format too. 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (all) 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else { 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru n += 3; 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (all) 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru n += 1; 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (ctx->Extensions.S3_s3tc) { 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (formats) { 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_RGB_S3TC; 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_RGB4_S3TC; 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_RGBA_S3TC; 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_RGBA4_S3TC; 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else { 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru n += 4; 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if FEATURE_EXT_texture_sRGB 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (ctx->Extensions.EXT_texture_sRGB) { 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (formats) { 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_COMPRESSED_SRGB_S3TC_DXT1_EXT; 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru formats[n++] = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else { 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru n += 4; 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* FEATURE_EXT_texture_sRGB */ 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return n; 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Convert a compressed MESA_FORMAT_x to a GLenum. 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querugl_format 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru_mesa_glenum_to_compressed_format(GLenum format) 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (format) { 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_COMPRESSED_RGB_FXT1_3DFX: 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return MESA_FORMAT_RGB_FXT1; 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_COMPRESSED_RGBA_FXT1_3DFX: 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return MESA_FORMAT_RGBA_FXT1; 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_RGB_S3TC: 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return MESA_FORMAT_RGB_DXT1; 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_RGB4_S3TC: 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return MESA_FORMAT_RGBA_DXT1; 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_RGBA_S3TC: 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return MESA_FORMAT_RGBA_DXT3; 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_RGBA4_S3TC: 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return MESA_FORMAT_RGBA_DXT5; 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return MESA_FORMAT_SRGB_DXT1; 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return MESA_FORMAT_SRGBA_DXT1; 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return MESA_FORMAT_SRGBA_DXT3; 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return MESA_FORMAT_SRGBA_DXT5; 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru default: 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return MESA_FORMAT_NONE; 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Compute the bytes per row in a compressed texture image. 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * We use this for computing the destination address for sub-texture updates. 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \param mesaFormat one of the MESA_FORMAT_* compressed formats 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \param width image width in pixels 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \return stride, in bytes, between rows for compressed image 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruGLint 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru_mesa_compressed_row_stride(gl_format mesaFormat, GLsizei width) 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru GLint stride = _mesa_format_row_stride(mesaFormat, width); 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return stride; 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Return the address of the pixel at (col, row, img) in a 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * compressed texture image. 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \param col, row, img - image position (3D), should be a multiple of the 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * format's block size. 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \param format - compressed image format 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \param width - image width (stride) in pixels 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \param image - the image address 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * \return address of pixel at (row, col, img) 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruGLubyte * 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru_mesa_compressed_image_address(GLint col, GLint row, GLint img, 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru gl_format mesaFormat, 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru GLsizei width, const GLubyte *image) 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* XXX only 2D images implemented, not 3D */ 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const GLuint blockSize = _mesa_get_format_bytes(mesaFormat); 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru GLuint bw, bh; 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru GLint offset; 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru _mesa_get_format_block_size(mesaFormat, &bw, &bh); 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ASSERT(col % bw == 0); 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ASSERT(row % bh == 0); 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru offset = ((width + bw - 1) / bw) * (row / bh) + col / bw; 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru offset *= blockSize; 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (GLubyte *) image + offset; 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru