Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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