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