texcompress.c revision aab06dc0f0bf295abe213021b79ff65d70a4f4c0
1/*
2 * Mesa 3-D graphics library
3 * Version:  6.5.1
4 *
5 * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6 * Copyright (c) 2008 VMware, Inc.
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25
26
27/**
28 * \file texcompress.c
29 * Helper functions for texture compression.
30 */
31
32
33#include "glheader.h"
34#include "imports.h"
35#include "colormac.h"
36#include "formats.h"
37#include "mfeatures.h"
38#include "mtypes.h"
39#include "texcompress.h"
40#include "texcompress_fxt1.h"
41#include "texcompress_rgtc.h"
42#include "texcompress_s3tc.h"
43#include "texcompress_etc.h"
44#include "swrast/s_context.h"
45
46
47/**
48 * Get the GL base format of a specified GL compressed texture format
49 *
50 * From page 232 of the OpenGL 3.3 (Compatiblity Profile) spec:
51 *
52 *     "Compressed Internal Format      Base Internal Format    Type
53 *     ---------------------------     --------------------    ---------
54 *     COMPRESSED_ALPHA                ALPHA                   Generic
55 *     COMPRESSED_LUMINANCE            LUMINANCE               Generic
56 *     COMPRESSED_LUMINANCE_ALPHA      LUMINANCE_ALPHA         Generic
57 *     COMPRESSED_INTENSITY            INTENSITY               Generic
58 *     COMPRESSED_RED                  RED                     Generic
59 *     COMPRESSED_RG                   RG                      Generic
60 *     COMPRESSED_RGB                  RGB                     Generic
61 *     COMPRESSED_RGBA                 RGBA                    Generic
62 *     COMPRESSED_SRGB                 RGB                     Generic
63 *     COMPRESSED_SRGB_ALPHA           RGBA                    Generic
64 *     COMPRESSED_SLUMINANCE           LUMINANCE               Generic
65 *     COMPRESSED_SLUMINANCE_ALPHA     LUMINANCE_ALPHA         Generic
66 *     COMPRESSED_RED_RGTC1            RED                     Specific
67 *     COMPRESSED_SIGNED_RED_RGTC1     RED                     Specific
68 *     COMPRESSED_RG_RGTC2             RG                      Specific
69 *     COMPRESSED_SIGNED_RG_RGTC2      RG                      Specific"
70 *
71 * \return
72 * The base format of \c format if \c format is a compressed format (either
73 * generic or specific.  Otherwise 0 is returned.
74 */
75GLenum
76_mesa_gl_compressed_format_base_format(GLenum format)
77{
78   switch (format) {
79   case GL_COMPRESSED_RED:
80   case GL_COMPRESSED_RED_RGTC1:
81   case GL_COMPRESSED_SIGNED_RED_RGTC1:
82      return GL_RED;
83
84   case GL_COMPRESSED_RG:
85   case GL_COMPRESSED_RG_RGTC2:
86   case GL_COMPRESSED_SIGNED_RG_RGTC2:
87      return GL_RG;
88
89   case GL_COMPRESSED_RGB:
90   case GL_COMPRESSED_SRGB:
91   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
92   case GL_COMPRESSED_RGB_FXT1_3DFX:
93   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
94   case GL_ETC1_RGB8_OES:
95      return GL_RGB;
96
97   case GL_COMPRESSED_RGBA:
98   case GL_COMPRESSED_SRGB_ALPHA:
99   case GL_COMPRESSED_RGBA_BPTC_UNORM_ARB:
100   case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB:
101   case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB:
102   case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB:
103   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
104   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
105   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
106   case GL_COMPRESSED_RGBA_FXT1_3DFX:
107   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
108   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
109   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
110      return GL_RGBA;
111
112   case GL_COMPRESSED_ALPHA:
113      return GL_ALPHA;
114
115   case GL_COMPRESSED_LUMINANCE:
116   case GL_COMPRESSED_SLUMINANCE:
117   case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
118   case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
119      return GL_LUMINANCE;
120
121   case GL_COMPRESSED_LUMINANCE_ALPHA:
122   case GL_COMPRESSED_SLUMINANCE_ALPHA:
123   case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
124   case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
125   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
126      return GL_LUMINANCE_ALPHA;
127
128   case GL_COMPRESSED_INTENSITY:
129      return GL_INTENSITY;
130
131   default:
132      return 0;
133   }
134}
135
136/**
137 * Return list of (and count of) all specific texture compression
138 * formats that are supported.
139 *
140 * Some formats are \b not returned by this function.  The
141 * \c GL_COMPRESSED_TEXTURE_FORMATS query only returns formats that are
142 * "suitable for general-purpose usage."  All texture compression extensions
143 * have taken this to mean either linear RGB or linear RGBA.
144 *
145 * The GL_ARB_texture_compress_rgtc spec says:
146 *
147 *    "19) Should the GL_NUM_COMPRESSED_TEXTURE_FORMATS and
148 *        GL_COMPRESSED_TEXTURE_FORMATS queries return the RGTC formats?
149 *
150 *        RESOLVED:  No.
151 *
152 *        The OpenGL 2.1 specification says "The only values returned
153 *        by this query [GL_COMPRESSED_TEXTURE_FORMATS"] are those
154 *        corresponding to formats suitable for general-purpose usage.
155 *        The renderer will not enumerate formats with restrictions that
156 *        need to be specifically understood prior to use."
157 *
158 *        Compressed textures with just red or red-green components are
159 *        not general-purpose so should not be returned by these queries
160 *        because they have restrictions.
161 *
162 *        Applications that seek to use the RGTC formats should do so
163 *        by looking for this extension's name in the string returned by
164 *        glGetString(GL_EXTENSIONS) rather than
165 *        what GL_NUM_COMPRESSED_TEXTURE_FORMATS and
166 *        GL_COMPRESSED_TEXTURE_FORMATS return."
167 *
168 * There is nearly identical wording in the GL_EXT_texture_compression_rgtc
169 * spec.
170 *
171 * The GL_EXT_texture_rRGB spec says:
172 *
173 *    "22) Should the new COMPRESSED_SRGB_* formats be listed in an
174 *        implementation's GL_COMPRESSED_TEXTURE_FORMATS list?
175 *
176 *        RESOLVED:  No.  Section 3.8.1 says formats listed by
177 *        GL_COMPRESSED_TEXTURE_FORMATS are "suitable for general-purpose
178 *        usage."  The non-linear distribution of red, green, and
179 *        blue for these sRGB compressed formats makes them not really
180 *        general-purpose."
181 *
182 * The GL_EXT_texture_compression_latc spec says:
183 *
184 *    "16) Should the GL_NUM_COMPRESSED_TEXTURE_FORMATS and
185 *        GL_COMPRESSED_TEXTURE_FORMATS queries return the LATC formats?
186 *
187 *        RESOLVED:  No.
188 *
189 *        The OpenGL 2.1 specification says "The only values returned
190 *        by this query [GL_COMPRESSED_TEXTURE_FORMATS"] are those
191 *        corresponding to formats suitable for general-purpose usage.
192 *        The renderer will not enumerate formats with restrictions that
193 *        need to be specifically understood prior to use."
194 *
195 *        Historically, OpenGL implementation have advertised the RGB and
196 *        RGBA versions of the S3TC extensions compressed format tokens
197 *        through this mechanism.
198 *
199 *        The specification is not sufficiently clear about what "suitable
200 *        for general-purpose usage" means.  Historically that seems to mean
201 *        unsigned RGB or unsigned RGBA.  The DXT1 format supporting alpha
202 *        (GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) is not exposed in the list (at
203 *        least for NVIDIA drivers) because the alpha is always 1.0 expect
204 *        when it is 0.0 when RGB is required to be black.  NVIDIA's even
205 *        limits itself to true linear RGB or RGBA formats, specifically
206 *        not including EXT_texture_sRGB's sRGB S3TC compressed formats.
207 *
208 *        Adding luminance and luminance-alpha texture formats (and
209 *        certainly signed versions of luminance and luminance-alpha
210 *        formats!) invites potential comptaibility problems with old
211 *        applications using this mechanism since old applications are
212 *        unlikely to expect non-RGB or non-RGBA formats to be advertised
213 *        through this mechanism.  However no specific misinteractions
214 *        with old applications is known.
215 *
216 *        Applications that seek to use the LATC formats should do so
217 *        by looking for this extension's name in the string returned by
218 *        glGetString(GL_EXTENSIONS) rather than
219 *        what GL_NUM_COMPRESSED_TEXTURE_FORMATS and
220 *        GL_COMPRESSED_TEXTURE_FORMATS return."
221 *
222 * There is no formal spec for GL_ATI_texture_compression_3dc.  Since the
223 * formats added by this extension are luminance-alpha formats, it is
224 * reasonable to expect them to follow the same rules as
225 * GL_EXT_texture_compression_latc.  At the very least, Catalyst 11.6 does not
226 * expose the 3dc formats through this mechanism.
227 *
228 * \param ctx  the GL context
229 * \param formats  the resulting format list (may be NULL).
230 *
231 * \return number of formats.
232 */
233GLuint
234_mesa_get_compressed_formats(struct gl_context *ctx, GLint *formats)
235{
236   GLuint n = 0;
237   if (ctx->Extensions.TDFX_texture_compression_FXT1) {
238      if (formats) {
239         formats[n++] = GL_COMPRESSED_RGB_FXT1_3DFX;
240         formats[n++] = GL_COMPRESSED_RGBA_FXT1_3DFX;
241      }
242      else {
243         n += 2;
244      }
245   }
246
247   if (ctx->Extensions.EXT_texture_compression_s3tc) {
248      if (formats) {
249         formats[n++] = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
250         formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
251         formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
252      }
253      else {
254         n += 3;
255      }
256   }
257   if (ctx->Extensions.S3_s3tc) {
258      if (formats) {
259         formats[n++] = GL_RGB_S3TC;
260         formats[n++] = GL_RGB4_S3TC;
261         formats[n++] = GL_RGBA_S3TC;
262         formats[n++] = GL_RGBA4_S3TC;
263      }
264      else {
265         n += 4;
266      }
267   }
268
269   if (ctx->Extensions.OES_compressed_ETC1_RGB8_texture) {
270      if (formats) {
271         formats[n++] = GL_ETC1_RGB8_OES;
272      }
273      else {
274         n += 1;
275      }
276   }
277
278#if FEATURE_ES1
279   if (ctx->API == API_OPENGLES) {
280      if (formats) {
281	 formats[n++] = GL_PALETTE4_RGB8_OES;
282	 formats[n++] = GL_PALETTE4_RGBA8_OES;
283	 formats[n++] = GL_PALETTE4_R5_G6_B5_OES;
284	 formats[n++] = GL_PALETTE4_RGBA4_OES;
285	 formats[n++] = GL_PALETTE4_RGB5_A1_OES;
286	 formats[n++] = GL_PALETTE8_RGB8_OES;
287	 formats[n++] = GL_PALETTE8_RGBA8_OES;
288	 formats[n++] = GL_PALETTE8_R5_G6_B5_OES;
289	 formats[n++] = GL_PALETTE8_RGBA4_OES;
290	 formats[n++] = GL_PALETTE8_RGB5_A1_OES;
291      }
292      else {
293	 n += 10;
294      }
295   }
296#endif
297
298   return n;
299}
300
301
302/**
303 * Convert a compressed MESA_FORMAT_x to a GLenum.
304 */
305gl_format
306_mesa_glenum_to_compressed_format(GLenum format)
307{
308   switch (format) {
309   case GL_COMPRESSED_RGB_FXT1_3DFX:
310      return MESA_FORMAT_RGB_FXT1;
311   case GL_COMPRESSED_RGBA_FXT1_3DFX:
312      return MESA_FORMAT_RGBA_FXT1;
313
314   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
315   case GL_RGB_S3TC:
316      return MESA_FORMAT_RGB_DXT1;
317   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
318   case GL_RGB4_S3TC:
319      return MESA_FORMAT_RGBA_DXT1;
320   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
321   case GL_RGBA_S3TC:
322      return MESA_FORMAT_RGBA_DXT3;
323   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
324   case GL_RGBA4_S3TC:
325      return MESA_FORMAT_RGBA_DXT5;
326
327   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
328      return MESA_FORMAT_SRGB_DXT1;
329   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
330      return MESA_FORMAT_SRGBA_DXT1;
331   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
332      return MESA_FORMAT_SRGBA_DXT3;
333   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
334      return MESA_FORMAT_SRGBA_DXT5;
335
336   case GL_COMPRESSED_RED_RGTC1:
337      return MESA_FORMAT_RED_RGTC1;
338   case GL_COMPRESSED_SIGNED_RED_RGTC1:
339      return MESA_FORMAT_SIGNED_RED_RGTC1;
340   case GL_COMPRESSED_RG_RGTC2:
341      return MESA_FORMAT_RG_RGTC2;
342   case GL_COMPRESSED_SIGNED_RG_RGTC2:
343      return MESA_FORMAT_SIGNED_RG_RGTC2;
344
345   case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
346      return MESA_FORMAT_L_LATC1;
347   case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
348      return MESA_FORMAT_SIGNED_L_LATC1;
349   case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
350   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
351      return MESA_FORMAT_LA_LATC2;
352   case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
353      return MESA_FORMAT_SIGNED_LA_LATC2;
354
355   case GL_ETC1_RGB8_OES:
356      return MESA_FORMAT_ETC1_RGB8;
357
358   default:
359      return MESA_FORMAT_NONE;
360   }
361}
362
363
364/**
365 * Given a compressed MESA_FORMAT_x value, return the corresponding
366 * GLenum for that format.
367 * This is needed for glGetTexLevelParameter(GL_TEXTURE_INTERNAL_FORMAT)
368 * which must return the specific texture format used when the user might
369 * have originally specified a generic compressed format in their
370 * glTexImage2D() call.
371 * For non-compressed textures, we always return the user-specified
372 * internal format unchanged.
373 */
374GLenum
375_mesa_compressed_format_to_glenum(struct gl_context *ctx, gl_format mesaFormat)
376{
377   switch (mesaFormat) {
378#if FEATURE_texture_fxt1
379   case MESA_FORMAT_RGB_FXT1:
380      return GL_COMPRESSED_RGB_FXT1_3DFX;
381   case MESA_FORMAT_RGBA_FXT1:
382      return GL_COMPRESSED_RGBA_FXT1_3DFX;
383#endif
384#if FEATURE_texture_s3tc
385   case MESA_FORMAT_RGB_DXT1:
386      return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
387   case MESA_FORMAT_RGBA_DXT1:
388      return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
389   case MESA_FORMAT_RGBA_DXT3:
390      return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
391   case MESA_FORMAT_RGBA_DXT5:
392      return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
393#if FEATURE_EXT_texture_sRGB
394   case MESA_FORMAT_SRGB_DXT1:
395      return GL_COMPRESSED_SRGB_S3TC_DXT1_EXT;
396   case MESA_FORMAT_SRGBA_DXT1:
397      return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
398   case MESA_FORMAT_SRGBA_DXT3:
399      return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
400   case MESA_FORMAT_SRGBA_DXT5:
401      return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
402#endif
403#endif
404
405   case MESA_FORMAT_RED_RGTC1:
406      return GL_COMPRESSED_RED_RGTC1;
407   case MESA_FORMAT_SIGNED_RED_RGTC1:
408      return GL_COMPRESSED_SIGNED_RED_RGTC1;
409   case MESA_FORMAT_RG_RGTC2:
410      return GL_COMPRESSED_RG_RGTC2;
411   case MESA_FORMAT_SIGNED_RG_RGTC2:
412      return GL_COMPRESSED_SIGNED_RG_RGTC2;
413
414   case MESA_FORMAT_L_LATC1:
415      return GL_COMPRESSED_LUMINANCE_LATC1_EXT;
416   case MESA_FORMAT_SIGNED_L_LATC1:
417      return GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT;
418   case MESA_FORMAT_LA_LATC2:
419      return GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT;
420   case MESA_FORMAT_SIGNED_LA_LATC2:
421      return GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT;
422
423   case MESA_FORMAT_ETC1_RGB8:
424      return GL_ETC1_RGB8_OES;
425
426   default:
427      _mesa_problem(ctx, "Unexpected mesa texture format in"
428                    " _mesa_compressed_format_to_glenum()");
429      return 0;
430   }
431}
432
433
434/*
435 * Return the address of the pixel at (col, row, img) in a
436 * compressed texture image.
437 * \param col, row, img - image position (3D), should be a multiple of the
438 *                        format's block size.
439 * \param format - compressed image format
440 * \param width - image width (stride) in pixels
441 * \param image - the image address
442 * \return address of pixel at (row, col, img)
443 */
444GLubyte *
445_mesa_compressed_image_address(GLint col, GLint row, GLint img,
446                               gl_format mesaFormat,
447                               GLsizei width, const GLubyte *image)
448{
449   /* XXX only 2D images implemented, not 3D */
450   const GLuint blockSize = _mesa_get_format_bytes(mesaFormat);
451   GLuint bw, bh;
452   GLint offset;
453
454   _mesa_get_format_block_size(mesaFormat, &bw, &bh);
455
456   ASSERT(col % bw == 0);
457   ASSERT(row % bh == 0);
458
459   offset = ((width + bw - 1) / bw) * (row / bh) + col / bw;
460   offset *= blockSize;
461
462   return (GLubyte *) image + offset;
463}
464
465
466/**
467 * Decompress a compressed texture image, returning a GL_RGBA/GL_FLOAT image.
468 * \param srcRowStride  stride in bytes between rows of blocks in the
469 *                      compressed source image.
470 */
471void
472_mesa_decompress_image(gl_format format, GLuint width, GLuint height,
473                       const GLubyte *src, GLint srcRowStride,
474                       GLfloat *dest)
475{
476   void (*fetch)(const struct swrast_texture_image *texImage,
477                 GLint i, GLint j, GLint k, GLfloat *texel);
478   struct swrast_texture_image texImage;  /* dummy teximage */
479   GLuint i, j;
480   GLuint bytes, bw, bh;
481
482   bytes = _mesa_get_format_bytes(format);
483   _mesa_get_format_block_size(format, &bw, &bh);
484
485   /* setup dummy texture image info */
486   memset(&texImage, 0, sizeof(texImage));
487   texImage.Map = (void *) src;
488
489   /* XXX This line is a bit of a hack to adapt to the row stride
490    * convention used by the texture decompression functions.
491    */
492   texImage.RowStride = srcRowStride * bh / bytes;
493
494   switch (format) {
495   /* DXT formats */
496   case MESA_FORMAT_RGB_DXT1:
497      fetch = _mesa_fetch_texel_2d_f_rgb_dxt1;
498      break;
499   case MESA_FORMAT_RGBA_DXT1:
500      fetch = _mesa_fetch_texel_2d_f_rgba_dxt1;
501      break;
502   case MESA_FORMAT_RGBA_DXT3:
503      fetch = _mesa_fetch_texel_2d_f_rgba_dxt3;
504      break;
505   case MESA_FORMAT_RGBA_DXT5:
506      fetch = _mesa_fetch_texel_2d_f_rgba_dxt5;
507      break;
508
509   /* FXT1 formats */
510   case MESA_FORMAT_RGB_FXT1:
511      fetch = _mesa_fetch_texel_2d_f_rgb_fxt1;
512      break;
513   case MESA_FORMAT_RGBA_FXT1:
514      fetch = _mesa_fetch_texel_2d_f_rgba_fxt1;
515      break;
516
517   /* Red/RG formats */
518   case MESA_FORMAT_RED_RGTC1:
519      fetch = _mesa_fetch_texel_2d_f_red_rgtc1;
520      break;
521   case MESA_FORMAT_SIGNED_RED_RGTC1:
522      fetch = _mesa_fetch_texel_2d_f_signed_red_rgtc1;
523      break;
524   case MESA_FORMAT_RG_RGTC2:
525      fetch = _mesa_fetch_texel_2d_f_rg_rgtc2;
526      break;
527   case MESA_FORMAT_SIGNED_RG_RGTC2:
528      fetch = _mesa_fetch_texel_2d_f_signed_rg_rgtc2;
529      break;
530
531   /* L/LA formats */
532   case MESA_FORMAT_L_LATC1:
533      fetch = _mesa_fetch_texel_2d_f_l_latc1;
534      break;
535   case MESA_FORMAT_SIGNED_L_LATC1:
536      fetch = _mesa_fetch_texel_2d_f_signed_l_latc1;
537      break;
538   case MESA_FORMAT_LA_LATC2:
539      fetch = _mesa_fetch_texel_2d_f_la_latc2;
540      break;
541   case MESA_FORMAT_SIGNED_LA_LATC2:
542      fetch = _mesa_fetch_texel_2d_f_signed_la_latc2;
543      break;
544
545   /* ETC1 formats */
546   case MESA_FORMAT_ETC1_RGB8:
547      fetch = _mesa_fetch_texel_2d_f_etc1_rgb8;
548      break;
549
550   default:
551      _mesa_problem(NULL, "Unexpected format in _mesa_decompress_image()");
552      return;
553   }
554
555   for (j = 0; j < height; j++) {
556      for (i = 0; i < width; i++) {
557         fetch(&texImage, i, j, 0, dest);
558         dest += 4;
559      }
560   }
561}
562