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 | }>> |