Merge commit 'origin/master' into gallium-0.2
[mesa.git] / src / mesa / main / texformat.c
1 /*
2 * Mesa 3-D graphics library
3 * Version: 6.5.1
4 *
5 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
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 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25
26 /**
27 * \file texformat.c
28 * Texture formats.
29 *
30 * \author Gareth Hughes
31 */
32
33
34 #include "colormac.h"
35 #include "context.h"
36 #include "texformat.h"
37 #include "texstore.h"
38
39
40 #if FEATURE_EXT_texture_sRGB
41
42 /**
43 * Convert an 8-bit sRGB value from non-linear space to a
44 * linear RGB value in [0, 1].
45 * Implemented with a 256-entry lookup table.
46 */
47 static INLINE GLfloat
48 nonlinear_to_linear(GLubyte cs8)
49 {
50 static GLfloat table[256];
51 static GLboolean tableReady = GL_FALSE;
52 if (!tableReady) {
53 /* compute lookup table now */
54 GLuint i;
55 for (i = 0; i < 256; i++) {
56 const GLfloat cs = UBYTE_TO_FLOAT(i);
57 if (cs <= 0.04045) {
58 table[i] = cs / 12.92f;
59 }
60 else {
61 table[i] = (GLfloat) _mesa_pow((cs + 0.055) / 1.055, 2.4);
62 }
63 }
64 tableReady = GL_TRUE;
65 }
66 return table[cs8];
67 }
68
69
70 #endif /* FEATURE_EXT_texture_sRGB */
71
72
73 /* Texel fetch routines for all supported formats
74 */
75 #define DIM 1
76 #include "texformat_tmp.h"
77
78 #define DIM 2
79 #include "texformat_tmp.h"
80
81 #define DIM 3
82 #include "texformat_tmp.h"
83
84 /**
85 * Null texel fetch function.
86 *
87 * Have to have this so the FetchTexel function pointer is never NULL.
88 */
89 static void fetch_null_texel( const struct gl_texture_image *texImage,
90 GLint i, GLint j, GLint k, GLchan *texel )
91 {
92 (void) texImage; (void) i; (void) j; (void) k;
93 texel[RCOMP] = 0;
94 texel[GCOMP] = 0;
95 texel[BCOMP] = 0;
96 texel[ACOMP] = 0;
97 _mesa_warning(NULL, "fetch_null_texel() called!");
98 }
99
100 static void fetch_null_texelf( const struct gl_texture_image *texImage,
101 GLint i, GLint j, GLint k, GLfloat *texel )
102 {
103 (void) texImage; (void) i; (void) j; (void) k;
104 texel[RCOMP] = 0.0;
105 texel[GCOMP] = 0.0;
106 texel[BCOMP] = 0.0;
107 texel[ACOMP] = 0.0;
108 _mesa_warning(NULL, "fetch_null_texelf() called!");
109 }
110
111 static void store_null_texel(struct gl_texture_image *texImage,
112 GLint i, GLint j, GLint k, const void *texel)
113 {
114 (void) texImage;
115 (void) i;
116 (void) j;
117 (void) k;
118 (void) texel;
119 /* no-op */
120 }
121
122
123 /**
124 * Notes about the predefined gl_texture_formats:
125 *
126 * 1. There are 1D, 2D and 3D functions for fetching texels from texture
127 * images, returning both GLchan values and GLfloat values. (six
128 * functions in total)
129 * You don't have to provide both the GLchan and GLfloat functions;
130 * just one or the other is OK. Mesa will use an "adaptor" to convert
131 * between GLchan/GLfloat when needed.
132 * Since the adaptors have small performance penalty, we provide both
133 * GLchan and GLfloat functions for some common formats like RGB, RGBA.
134 */
135
136
137 /***************************************************************/
138 /** \name Default GLchan-based formats */
139 /*@{*/
140
141 const struct gl_texture_format _mesa_texformat_rgba = {
142 MESA_FORMAT_RGBA, /* MesaFormat */
143 GL_RGBA, /* BaseFormat */
144 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
145 CHAN_BITS, /* RedBits */
146 CHAN_BITS, /* GreenBits */
147 CHAN_BITS, /* BlueBits */
148 CHAN_BITS, /* AlphaBits */
149 0, /* LuminanceBits */
150 0, /* IntensityBits */
151 0, /* IndexBits */
152 0, /* DepthBits */
153 0, /* StencilBits */
154 4 * sizeof(GLchan), /* TexelBytes */
155 _mesa_texstore_rgba, /* StoreTexImageFunc */
156 fetch_texel_1d_rgba, /* FetchTexel1D */
157 fetch_texel_2d_rgba, /* FetchTexel2D */
158 fetch_texel_3d_rgba, /* FetchTexel3D */
159 fetch_texel_1d_f_rgba, /* FetchTexel1Df */
160 fetch_texel_2d_f_rgba, /* FetchTexel2Df */
161 fetch_texel_3d_f_rgba, /* FetchTexel3Df */
162 store_texel_rgba /* StoreTexel */
163 };
164
165 const struct gl_texture_format _mesa_texformat_rgb = {
166 MESA_FORMAT_RGB, /* MesaFormat */
167 GL_RGB, /* BaseFormat */
168 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
169 CHAN_BITS, /* RedBits */
170 CHAN_BITS, /* GreenBits */
171 CHAN_BITS, /* BlueBits */
172 0, /* AlphaBits */
173 0, /* LuminanceBits */
174 0, /* IntensityBits */
175 0, /* IndexBits */
176 0, /* DepthBits */
177 0, /* StencilBits */
178 3 * sizeof(GLchan), /* TexelBytes */
179 _mesa_texstore_rgba,/*yes*/ /* StoreTexImageFunc */
180 fetch_texel_1d_rgb, /* FetchTexel1D */
181 fetch_texel_2d_rgb, /* FetchTexel2D */
182 fetch_texel_3d_rgb, /* FetchTexel3D */
183 fetch_texel_1d_f_rgb, /* FetchTexel1Df */
184 fetch_texel_2d_f_rgb, /* FetchTexel2Df */
185 fetch_texel_3d_f_rgb, /* FetchTexel3Df */
186 store_texel_rgb /* StoreTexel */
187 };
188
189 const struct gl_texture_format _mesa_texformat_alpha = {
190 MESA_FORMAT_ALPHA, /* MesaFormat */
191 GL_ALPHA, /* BaseFormat */
192 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
193 0, /* RedBits */
194 0, /* GreenBits */
195 0, /* BlueBits */
196 CHAN_BITS, /* AlphaBits */
197 0, /* LuminanceBits */
198 0, /* IntensityBits */
199 0, /* IndexBits */
200 0, /* DepthBits */
201 0, /* StencilBits */
202 sizeof(GLchan), /* TexelBytes */
203 _mesa_texstore_rgba,/*yes*/ /* StoreTexImageFunc */
204 fetch_texel_1d_alpha, /* FetchTexel1D */
205 fetch_texel_2d_alpha, /* FetchTexel2D */
206 fetch_texel_3d_alpha, /* FetchTexel3D */
207 NULL, /* FetchTexel1Df */
208 NULL, /* FetchTexel2Df */
209 NULL, /* FetchTexel3Df */
210 store_texel_alpha /* StoreTexel */
211 };
212
213 const struct gl_texture_format _mesa_texformat_luminance = {
214 MESA_FORMAT_LUMINANCE, /* MesaFormat */
215 GL_LUMINANCE, /* BaseFormat */
216 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
217 0, /* RedBits */
218 0, /* GreenBits */
219 0, /* BlueBits */
220 0, /* AlphaBits */
221 CHAN_BITS, /* LuminanceBits */
222 0, /* IntensityBits */
223 0, /* IndexBits */
224 0, /* DepthBits */
225 0, /* StencilBits */
226 sizeof(GLchan), /* TexelBytes */
227 _mesa_texstore_rgba,/*yes*/ /* StoreTexImageFunc */
228 fetch_texel_1d_luminance, /* FetchTexel1D */
229 fetch_texel_2d_luminance, /* FetchTexel2D */
230 fetch_texel_3d_luminance, /* FetchTexel3D */
231 NULL, /* FetchTexel1Df */
232 NULL, /* FetchTexel2Df */
233 NULL, /* FetchTexel3Df */
234 store_texel_luminance /* StoreTexel */
235 };
236
237 const struct gl_texture_format _mesa_texformat_luminance_alpha = {
238 MESA_FORMAT_LUMINANCE_ALPHA, /* MesaFormat */
239 GL_LUMINANCE_ALPHA, /* BaseFormat */
240 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
241 0, /* RedBits */
242 0, /* GreenBits */
243 0, /* BlueBits */
244 CHAN_BITS, /* AlphaBits */
245 CHAN_BITS, /* LuminanceBits */
246 0, /* IntensityBits */
247 0, /* IndexBits */
248 0, /* DepthBits */
249 0, /* StencilBits */
250 2 * sizeof(GLchan), /* TexelBytes */
251 _mesa_texstore_rgba,/*yes*/ /* StoreTexImageFunc */
252 fetch_texel_1d_luminance_alpha, /* FetchTexel1D */
253 fetch_texel_2d_luminance_alpha, /* FetchTexel2D */
254 fetch_texel_3d_luminance_alpha, /* FetchTexel3D */
255 NULL, /* FetchTexel1Df */
256 NULL, /* FetchTexel2Df */
257 NULL, /* FetchTexel3Df */
258 store_texel_luminance_alpha /* StoreTexel */
259 };
260
261 const struct gl_texture_format _mesa_texformat_intensity = {
262 MESA_FORMAT_INTENSITY, /* MesaFormat */
263 GL_INTENSITY, /* BaseFormat */
264 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
265 0, /* RedBits */
266 0, /* GreenBits */
267 0, /* BlueBits */
268 0, /* AlphaBits */
269 0, /* LuminanceBits */
270 CHAN_BITS, /* IntensityBits */
271 0, /* IndexBits */
272 0, /* DepthBits */
273 0, /* StencilBits */
274 sizeof(GLchan), /* TexelBytes */
275 _mesa_texstore_rgba,/*yes*/ /* StoreTexImageFunc */
276 fetch_texel_1d_intensity, /* FetchTexel1D */
277 fetch_texel_2d_intensity, /* FetchTexel2D */
278 fetch_texel_3d_intensity, /* FetchTexel3D */
279 NULL, /* FetchTexel1Df */
280 NULL, /* FetchTexel2Df */
281 NULL, /* FetchTexel3Df */
282 store_texel_intensity /* StoreTexel */
283 };
284
285
286 #if FEATURE_EXT_texture_sRGB
287
288 const struct gl_texture_format _mesa_texformat_srgb8 = {
289 MESA_FORMAT_SRGB8, /* MesaFormat */
290 GL_RGB, /* BaseFormat */
291 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
292 8, /* RedBits */
293 8, /* GreenBits */
294 8, /* BlueBits */
295 0, /* AlphaBits */
296 0, /* LuminanceBits */
297 0, /* IntensityBits */
298 0, /* IndexBits */
299 0, /* DepthBits */
300 0, /* StencilBits */
301 3, /* TexelBytes */
302 _mesa_texstore_srgb8, /* StoreTexImageFunc */
303 NULL, /* FetchTexel1D */
304 NULL, /* FetchTexel2D */
305 NULL, /* FetchTexel3D */
306 fetch_texel_1d_srgb8, /* FetchTexel1Df */
307 fetch_texel_2d_srgb8, /* FetchTexel2Df */
308 fetch_texel_3d_srgb8, /* FetchTexel3Df */
309 store_texel_srgb8 /* StoreTexel */
310 };
311
312 const struct gl_texture_format _mesa_texformat_srgba8 = {
313 MESA_FORMAT_SRGBA8, /* MesaFormat */
314 GL_RGBA, /* BaseFormat */
315 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
316 8, /* RedBits */
317 8, /* GreenBits */
318 8, /* BlueBits */
319 8, /* AlphaBits */
320 0, /* LuminanceBits */
321 0, /* IntensityBits */
322 0, /* IndexBits */
323 0, /* DepthBits */
324 0, /* StencilBits */
325 4, /* TexelBytes */
326 _mesa_texstore_srgba8, /* StoreTexImageFunc */
327 NULL, /* FetchTexel1D */
328 NULL, /* FetchTexel2D */
329 NULL, /* FetchTexel3D */
330 fetch_texel_1d_srgba8, /* FetchTexel1Df */
331 fetch_texel_2d_srgba8, /* FetchTexel2Df */
332 fetch_texel_3d_srgba8, /* FetchTexel3Df */
333 store_texel_srgba8 /* StoreTexel */
334 };
335
336 const struct gl_texture_format _mesa_texformat_sl8 = {
337 MESA_FORMAT_SL8, /* MesaFormat */
338 GL_LUMINANCE, /* BaseFormat */
339 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
340 0, /* RedBits */
341 0, /* GreenBits */
342 0, /* BlueBits */
343 0, /* AlphaBits */
344 8, /* LuminanceBits */
345 0, /* IntensityBits */
346 0, /* IndexBits */
347 0, /* DepthBits */
348 0, /* StencilBits */
349 1, /* TexelBytes */
350 _mesa_texstore_sl8, /* StoreTexImageFunc */
351 NULL, /* FetchTexel1D */
352 NULL, /* FetchTexel2D */
353 NULL, /* FetchTexel3D */
354 fetch_texel_1d_sl8, /* FetchTexel1Df */
355 fetch_texel_2d_sl8, /* FetchTexel2Df */
356 fetch_texel_3d_sl8, /* FetchTexel3Df */
357 store_texel_sl8 /* StoreTexel */
358 };
359
360 const struct gl_texture_format _mesa_texformat_sla8 = {
361 MESA_FORMAT_SLA8, /* MesaFormat */
362 GL_LUMINANCE_ALPHA, /* BaseFormat */
363 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
364 0, /* RedBits */
365 0, /* GreenBits */
366 0, /* BlueBits */
367 8, /* AlphaBits */
368 8, /* LuminanceBits */
369 0, /* IntensityBits */
370 0, /* IndexBits */
371 0, /* DepthBits */
372 0, /* StencilBits */
373 2, /* TexelBytes */
374 _mesa_texstore_sla8, /* StoreTexImageFunc */
375 NULL, /* FetchTexel1D */
376 NULL, /* FetchTexel2D */
377 NULL, /* FetchTexel3D */
378 fetch_texel_1d_sla8, /* FetchTexel1Df */
379 fetch_texel_2d_sla8, /* FetchTexel2Df */
380 fetch_texel_3d_sla8, /* FetchTexel3Df */
381 store_texel_sla8 /* StoreTexel */
382 };
383
384 #endif /* FEATURE_EXT_texture_sRGB */
385
386 const struct gl_texture_format _mesa_texformat_rgba_float32 = {
387 MESA_FORMAT_RGBA_FLOAT32, /* MesaFormat */
388 GL_RGBA, /* BaseFormat */
389 GL_FLOAT, /* DataType */
390 8 * sizeof(GLfloat), /* RedBits */
391 8 * sizeof(GLfloat), /* GreenBits */
392 8 * sizeof(GLfloat), /* BlueBits */
393 8 * sizeof(GLfloat), /* AlphaBits */
394 0, /* LuminanceBits */
395 0, /* IntensityBits */
396 0, /* IndexBits */
397 0, /* DepthBits */
398 0, /* StencilBits */
399 4 * sizeof(GLfloat), /* TexelBytes */
400 _mesa_texstore_rgba_float32, /* StoreTexImageFunc */
401 NULL, /* FetchTexel1D */
402 NULL, /* FetchTexel1D */
403 NULL, /* FetchTexel1D */
404 fetch_texel_1d_f_rgba_f32, /* FetchTexel1Df */
405 fetch_texel_2d_f_rgba_f32, /* FetchTexel2Df */
406 fetch_texel_3d_f_rgba_f32, /* FetchTexel3Df */
407 store_texel_rgba_f32 /* StoreTexel */
408 };
409
410 const struct gl_texture_format _mesa_texformat_rgba_float16 = {
411 MESA_FORMAT_RGBA_FLOAT16, /* MesaFormat */
412 GL_RGBA, /* BaseFormat */
413 GL_FLOAT, /* DataType */
414 8 * sizeof(GLhalfARB), /* RedBits */
415 8 * sizeof(GLhalfARB), /* GreenBits */
416 8 * sizeof(GLhalfARB), /* BlueBits */
417 8 * sizeof(GLhalfARB), /* AlphaBits */
418 0, /* LuminanceBits */
419 0, /* IntensityBits */
420 0, /* IndexBits */
421 0, /* DepthBits */
422 0, /* StencilBits */
423 4 * sizeof(GLhalfARB), /* TexelBytes */
424 _mesa_texstore_rgba_float16, /* StoreTexImageFunc */
425 NULL, /* FetchTexel1D */
426 NULL, /* FetchTexel1D */
427 NULL, /* FetchTexel1D */
428 fetch_texel_1d_f_rgba_f16, /* FetchTexel1Df */
429 fetch_texel_2d_f_rgba_f16, /* FetchTexel2Df */
430 fetch_texel_3d_f_rgba_f16, /* FetchTexel3Df */
431 store_texel_rgba_f16 /* StoreTexel */
432 };
433
434 const struct gl_texture_format _mesa_texformat_rgb_float32 = {
435 MESA_FORMAT_RGB_FLOAT32, /* MesaFormat */
436 GL_RGB, /* BaseFormat */
437 GL_FLOAT, /* DataType */
438 8 * sizeof(GLfloat), /* RedBits */
439 8 * sizeof(GLfloat), /* GreenBits */
440 8 * sizeof(GLfloat), /* BlueBits */
441 0, /* AlphaBits */
442 0, /* LuminanceBits */
443 0, /* IntensityBits */
444 0, /* IndexBits */
445 0, /* DepthBits */
446 0, /* StencilBits */
447 3 * sizeof(GLfloat), /* TexelBytes */
448 _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */
449 NULL, /* FetchTexel1D */
450 NULL, /* FetchTexel1D */
451 NULL, /* FetchTexel1D */
452 fetch_texel_1d_f_rgb_f32, /* FetchTexel1Df */
453 fetch_texel_2d_f_rgb_f32, /* FetchTexel2Df */
454 fetch_texel_3d_f_rgb_f32, /* FetchTexel3Df */
455 store_texel_rgb_f32 /* StoreTexel */
456 };
457
458 const struct gl_texture_format _mesa_texformat_rgb_float16 = {
459 MESA_FORMAT_RGB_FLOAT16, /* MesaFormat */
460 GL_RGB, /* BaseFormat */
461 GL_FLOAT, /* DataType */
462 8 * sizeof(GLhalfARB), /* RedBits */
463 8 * sizeof(GLhalfARB), /* GreenBits */
464 8 * sizeof(GLhalfARB), /* BlueBits */
465 0, /* AlphaBits */
466 0, /* LuminanceBits */
467 0, /* IntensityBits */
468 0, /* IndexBits */
469 0, /* DepthBits */
470 0, /* StencilBits */
471 3 * sizeof(GLhalfARB), /* TexelBytes */
472 _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */
473 NULL, /* FetchTexel1D */
474 NULL, /* FetchTexel1D */
475 NULL, /* FetchTexel1D */
476 fetch_texel_1d_f_rgb_f16, /* FetchTexel1Df */
477 fetch_texel_2d_f_rgb_f16, /* FetchTexel2Df */
478 fetch_texel_3d_f_rgb_f16, /* FetchTexel3Df */
479 store_texel_rgb_f16 /* StoreTexel */
480 };
481
482 const struct gl_texture_format _mesa_texformat_alpha_float32 = {
483 MESA_FORMAT_ALPHA_FLOAT32, /* MesaFormat */
484 GL_ALPHA, /* BaseFormat */
485 GL_FLOAT, /* DataType */
486 0, /* RedBits */
487 0, /* GreenBits */
488 0, /* BlueBits */
489 8 * sizeof(GLfloat), /* AlphaBits */
490 0, /* LuminanceBits */
491 0, /* IntensityBits */
492 0, /* IndexBits */
493 0, /* DepthBits */
494 0, /* StencilBits */
495 1 * sizeof(GLfloat), /* TexelBytes */
496 _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */
497 NULL, /* FetchTexel1D */
498 NULL, /* FetchTexel1D */
499 NULL, /* FetchTexel1D */
500 fetch_texel_1d_f_alpha_f32, /* FetchTexel1Df */
501 fetch_texel_2d_f_alpha_f32, /* FetchTexel2Df */
502 fetch_texel_3d_f_alpha_f32, /* FetchTexel3Df */
503 store_texel_alpha_f32 /* StoreTexel */
504 };
505
506 const struct gl_texture_format _mesa_texformat_alpha_float16 = {
507 MESA_FORMAT_ALPHA_FLOAT16, /* MesaFormat */
508 GL_ALPHA, /* BaseFormat */
509 GL_FLOAT, /* DataType */
510 0, /* RedBits */
511 0, /* GreenBits */
512 0, /* BlueBits */
513 8 * sizeof(GLhalfARB), /* AlphaBits */
514 0, /* LuminanceBits */
515 0, /* IntensityBits */
516 0, /* IndexBits */
517 0, /* DepthBits */
518 0, /* StencilBits */
519 1 * sizeof(GLhalfARB), /* TexelBytes */
520 _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */
521 NULL, /* FetchTexel1D */
522 NULL, /* FetchTexel1D */
523 NULL, /* FetchTexel1D */
524 fetch_texel_1d_f_alpha_f16, /* FetchTexel1Df */
525 fetch_texel_2d_f_alpha_f16, /* FetchTexel2Df */
526 fetch_texel_3d_f_alpha_f16, /* FetchTexel3Df */
527 store_texel_alpha_f16 /* StoreTexel */
528 };
529
530 const struct gl_texture_format _mesa_texformat_luminance_float32 = {
531 MESA_FORMAT_LUMINANCE_FLOAT32, /* MesaFormat */
532 GL_LUMINANCE, /* BaseFormat */
533 GL_FLOAT, /* DataType */
534 0, /* RedBits */
535 0, /* GreenBits */
536 0, /* BlueBits */
537 0, /* AlphaBits */
538 8 * sizeof(GLfloat), /* LuminanceBits */
539 0, /* IntensityBits */
540 0, /* IndexBits */
541 0, /* DepthBits */
542 0, /* StencilBits */
543 1 * sizeof(GLfloat), /* TexelBytes */
544 _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */
545 NULL, /* FetchTexel1D */
546 NULL, /* FetchTexel2D */
547 NULL, /* FetchTexel3D */
548 fetch_texel_1d_f_luminance_f32, /* FetchTexel1Df */
549 fetch_texel_2d_f_luminance_f32, /* FetchTexel2Df */
550 fetch_texel_3d_f_luminance_f32, /* FetchTexel3Df */
551 store_texel_luminance_f32 /* StoreTexel */
552 };
553
554 const struct gl_texture_format _mesa_texformat_luminance_float16 = {
555 MESA_FORMAT_LUMINANCE_FLOAT16, /* MesaFormat */
556 GL_LUMINANCE, /* BaseFormat */
557 GL_FLOAT, /* DataType */
558 0, /* RedBits */
559 0, /* GreenBits */
560 0, /* BlueBits */
561 0, /* AlphaBits */
562 8 * sizeof(GLhalfARB), /* LuminanceBits */
563 0, /* IntensityBits */
564 0, /* IndexBits */
565 0, /* DepthBits */
566 0, /* StencilBits */
567 1 * sizeof(GLhalfARB), /* TexelBytes */
568 _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */
569 NULL, /* FetchTexel1D */
570 NULL, /* FetchTexel2D */
571 NULL, /* FetchTexel3D */
572 fetch_texel_1d_f_luminance_f16, /* FetchTexel1Df */
573 fetch_texel_2d_f_luminance_f16, /* FetchTexel2Df */
574 fetch_texel_3d_f_luminance_f16, /* FetchTexel3Df */
575 store_texel_luminance_f16 /* StoreTexel */
576 };
577
578 const struct gl_texture_format _mesa_texformat_luminance_alpha_float32 = {
579 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32, /* MesaFormat */
580 GL_LUMINANCE_ALPHA, /* BaseFormat */
581 GL_FLOAT, /* DataType */
582 0, /* RedBits */
583 0, /* GreenBits */
584 0, /* BlueBits */
585 8 * sizeof(GLfloat), /* AlphaBits */
586 8 * sizeof(GLfloat), /* LuminanceBits */
587 0, /* IntensityBits */
588 0, /* IndexBits */
589 0, /* DepthBits */
590 0, /* StencilBits */
591 2 * sizeof(GLfloat), /* TexelBytes */
592 _mesa_texstore_rgba_float32, /* StoreTexImageFunc */
593 NULL, /* FetchTexel1D */
594 NULL, /* FetchTexel2D */
595 NULL, /* FetchTexel3D */
596 fetch_texel_1d_f_luminance_alpha_f32,/* FetchTexel1Df */
597 fetch_texel_2d_f_luminance_alpha_f32,/* FetchTexel2Df */
598 fetch_texel_3d_f_luminance_alpha_f32,/* FetchTexel3Df */
599 store_texel_luminance_alpha_f32 /* StoreTexel */
600 };
601
602 const struct gl_texture_format _mesa_texformat_luminance_alpha_float16 = {
603 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, /* MesaFormat */
604 GL_LUMINANCE_ALPHA, /* BaseFormat */
605 GL_FLOAT, /* DataType */
606 0, /* RedBits */
607 0, /* GreenBits */
608 0, /* BlueBits */
609 8 * sizeof(GLhalfARB), /* AlphaBits */
610 8 * sizeof(GLhalfARB), /* LuminanceBits */
611 0, /* IntensityBits */
612 0, /* IndexBits */
613 0, /* DepthBits */
614 0, /* StencilBits */
615 2 * sizeof(GLhalfARB), /* TexelBytes */
616 _mesa_texstore_rgba_float16, /* StoreTexImageFunc */
617 NULL, /* FetchTexel1D */
618 NULL, /* FetchTexel2D */
619 NULL, /* FetchTexel3D */
620 fetch_texel_1d_f_luminance_alpha_f16,/* FetchTexel1Df */
621 fetch_texel_2d_f_luminance_alpha_f16,/* FetchTexel2Df */
622 fetch_texel_3d_f_luminance_alpha_f16,/* FetchTexel3Df */
623 store_texel_luminance_alpha_f16 /* StoreTexel */
624 };
625
626 const struct gl_texture_format _mesa_texformat_intensity_float32 = {
627 MESA_FORMAT_INTENSITY_FLOAT32, /* MesaFormat */
628 GL_INTENSITY, /* BaseFormat */
629 GL_FLOAT, /* DataType */
630 0, /* RedBits */
631 0, /* GreenBits */
632 0, /* BlueBits */
633 0, /* AlphaBits */
634 0, /* LuminanceBits */
635 8 * sizeof(GLfloat), /* IntensityBits */
636 0, /* IndexBits */
637 0, /* DepthBits */
638 0, /* StencilBits */
639 1 * sizeof(GLfloat), /* TexelBytes */
640 _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */
641 NULL, /* FetchTexel1D */
642 NULL, /* FetchTexel2D */
643 NULL, /* FetchTexel3D */
644 fetch_texel_1d_f_intensity_f32, /* FetchTexel1Df */
645 fetch_texel_2d_f_intensity_f32, /* FetchTexel2Df */
646 fetch_texel_3d_f_intensity_f32, /* FetchTexel3Df */
647 store_texel_intensity_f32 /* StoreTexel */
648 };
649
650 const struct gl_texture_format _mesa_texformat_intensity_float16 = {
651 MESA_FORMAT_INTENSITY_FLOAT16, /* MesaFormat */
652 GL_INTENSITY, /* BaseFormat */
653 GL_FLOAT, /* DataType */
654 0, /* RedBits */
655 0, /* GreenBits */
656 0, /* BlueBits */
657 0, /* AlphaBits */
658 0, /* LuminanceBits */
659 8 * sizeof(GLhalfARB), /* IntensityBits */
660 0, /* IndexBits */
661 0, /* DepthBits */
662 0, /* StencilBits */
663 1 * sizeof(GLhalfARB), /* TexelBytes */
664 _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */
665 NULL, /* FetchTexel1D */
666 NULL, /* FetchTexel2D */
667 NULL, /* FetchTexel3D */
668 fetch_texel_1d_f_intensity_f16, /* FetchTexel1Df */
669 fetch_texel_2d_f_intensity_f16, /* FetchTexel2Df */
670 fetch_texel_3d_f_intensity_f16, /* FetchTexel3Df */
671 store_texel_intensity_f16 /* StoreTexel */
672 };
673
674
675 /*@}*/
676
677
678 /***************************************************************/
679 /** \name Hardware formats */
680 /*@{*/
681
682 const struct gl_texture_format _mesa_texformat_rgba8888 = {
683 MESA_FORMAT_RGBA8888, /* MesaFormat */
684 GL_RGBA, /* BaseFormat */
685 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
686 8, /* RedBits */
687 8, /* GreenBits */
688 8, /* BlueBits */
689 8, /* AlphaBits */
690 0, /* LuminanceBits */
691 0, /* IntensityBits */
692 0, /* IndexBits */
693 0, /* DepthBits */
694 0, /* StencilBits */
695 4, /* TexelBytes */
696 _mesa_texstore_rgba8888, /* StoreTexImageFunc */
697 fetch_texel_1d_rgba8888, /* FetchTexel1D */
698 fetch_texel_2d_rgba8888, /* FetchTexel2D */
699 fetch_texel_3d_rgba8888, /* FetchTexel3D */
700 NULL, /* FetchTexel1Df */
701 NULL, /* FetchTexel2Df */
702 NULL, /* FetchTexel3Df */
703 store_texel_rgba8888 /* StoreTexel */
704 };
705
706 const struct gl_texture_format _mesa_texformat_rgba8888_rev = {
707 MESA_FORMAT_RGBA8888_REV, /* MesaFormat */
708 GL_RGBA, /* BaseFormat */
709 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
710 8, /* RedBits */
711 8, /* GreenBits */
712 8, /* BlueBits */
713 8, /* AlphaBits */
714 0, /* LuminanceBits */
715 0, /* IntensityBits */
716 0, /* IndexBits */
717 0, /* DepthBits */
718 0, /* StencilBits */
719 4, /* TexelBytes */
720 _mesa_texstore_rgba8888, /* StoreTexImageFunc */
721 fetch_texel_1d_rgba8888_rev, /* FetchTexel1D */
722 fetch_texel_2d_rgba8888_rev, /* FetchTexel2D */
723 fetch_texel_3d_rgba8888_rev, /* FetchTexel3D */
724 NULL, /* FetchTexel1Df */
725 NULL, /* FetchTexel2Df */
726 NULL, /* FetchTexel3Df */
727 store_texel_rgba8888_rev /* StoreTexel */
728 };
729
730 const struct gl_texture_format _mesa_texformat_argb8888 = {
731 MESA_FORMAT_ARGB8888, /* MesaFormat */
732 GL_RGBA, /* BaseFormat */
733 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
734 8, /* RedBits */
735 8, /* GreenBits */
736 8, /* BlueBits */
737 8, /* AlphaBits */
738 0, /* LuminanceBits */
739 0, /* IntensityBits */
740 0, /* IndexBits */
741 0, /* DepthBits */
742 0, /* StencilBits */
743 4, /* TexelBytes */
744 _mesa_texstore_argb8888, /* StoreTexImageFunc */
745 fetch_texel_1d_argb8888, /* FetchTexel1D */
746 fetch_texel_2d_argb8888, /* FetchTexel2D */
747 fetch_texel_3d_argb8888, /* FetchTexel3D */
748 NULL, /* FetchTexel1Df */
749 NULL, /* FetchTexel2Df */
750 NULL, /* FetchTexel3Df */
751 store_texel_argb8888 /* StoreTexel */
752 };
753
754 const struct gl_texture_format _mesa_texformat_argb8888_rev = {
755 MESA_FORMAT_ARGB8888_REV, /* MesaFormat */
756 GL_RGBA, /* BaseFormat */
757 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
758 8, /* RedBits */
759 8, /* GreenBits */
760 8, /* BlueBits */
761 8, /* AlphaBits */
762 0, /* LuminanceBits */
763 0, /* IntensityBits */
764 0, /* IndexBits */
765 0, /* DepthBits */
766 0, /* StencilBits */
767 4, /* TexelBytes */
768 _mesa_texstore_argb8888, /* StoreTexImageFunc */
769 fetch_texel_1d_argb8888_rev, /* FetchTexel1D */
770 fetch_texel_2d_argb8888_rev, /* FetchTexel2D */
771 fetch_texel_3d_argb8888_rev, /* FetchTexel3D */
772 NULL, /* FetchTexel1Df */
773 NULL, /* FetchTexel2Df */
774 NULL, /* FetchTexel3Df */
775 store_texel_argb8888_rev /* StoreTexel */
776 };
777
778 const struct gl_texture_format _mesa_texformat_rgb888 = {
779 MESA_FORMAT_RGB888, /* MesaFormat */
780 GL_RGB, /* BaseFormat */
781 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
782 8, /* RedBits */
783 8, /* GreenBits */
784 8, /* BlueBits */
785 0, /* AlphaBits */
786 0, /* LuminanceBits */
787 0, /* IntensityBits */
788 0, /* IndexBits */
789 0, /* DepthBits */
790 0, /* StencilBits */
791 3, /* TexelBytes */
792 _mesa_texstore_rgb888, /* StoreTexImageFunc */
793 fetch_texel_1d_rgb888, /* FetchTexel1D */
794 fetch_texel_2d_rgb888, /* FetchTexel2D */
795 fetch_texel_3d_rgb888, /* FetchTexel3D */
796 NULL, /* FetchTexel1Df */
797 NULL, /* FetchTexel2Df */
798 NULL, /* FetchTexel3Df */
799 store_texel_rgb888 /* StoreTexel */
800 };
801
802 const struct gl_texture_format _mesa_texformat_bgr888 = {
803 MESA_FORMAT_BGR888, /* MesaFormat */
804 GL_RGB, /* BaseFormat */
805 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
806 8, /* RedBits */
807 8, /* GreenBits */
808 8, /* BlueBits */
809 0, /* AlphaBits */
810 0, /* LuminanceBits */
811 0, /* IntensityBits */
812 0, /* IndexBits */
813 0, /* DepthBits */
814 0, /* StencilBits */
815 3, /* TexelBytes */
816 _mesa_texstore_bgr888, /* StoreTexImageFunc */
817 fetch_texel_1d_bgr888, /* FetchTexel1D */
818 fetch_texel_2d_bgr888, /* FetchTexel2D */
819 fetch_texel_3d_bgr888, /* FetchTexel3D */
820 NULL, /* FetchTexel1Df */
821 NULL, /* FetchTexel2Df */
822 NULL, /* FetchTexel3Df */
823 store_texel_bgr888 /* StoreTexel */
824 };
825
826 const struct gl_texture_format _mesa_texformat_rgb565 = {
827 MESA_FORMAT_RGB565, /* MesaFormat */
828 GL_RGB, /* BaseFormat */
829 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
830 5, /* RedBits */
831 6, /* GreenBits */
832 5, /* BlueBits */
833 0, /* AlphaBits */
834 0, /* LuminanceBits */
835 0, /* IntensityBits */
836 0, /* IndexBits */
837 0, /* DepthBits */
838 0, /* StencilBits */
839 2, /* TexelBytes */
840 _mesa_texstore_rgb565, /* StoreTexImageFunc */
841 fetch_texel_1d_rgb565, /* FetchTexel1D */
842 fetch_texel_2d_rgb565, /* FetchTexel2D */
843 fetch_texel_3d_rgb565, /* FetchTexel3D */
844 NULL, /* FetchTexel1Df */
845 NULL, /* FetchTexel2Df */
846 NULL, /* FetchTexel3Df */
847 store_texel_rgb565 /* StoreTexel */
848 };
849
850 const struct gl_texture_format _mesa_texformat_rgb565_rev = {
851 MESA_FORMAT_RGB565_REV, /* MesaFormat */
852 GL_RGB, /* BaseFormat */
853 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
854 5, /* RedBits */
855 6, /* GreenBits */
856 5, /* BlueBits */
857 0, /* AlphaBits */
858 0, /* LuminanceBits */
859 0, /* IntensityBits */
860 0, /* IndexBits */
861 0, /* DepthBits */
862 0, /* StencilBits */
863 2, /* TexelBytes */
864 _mesa_texstore_rgb565, /* StoreTexImageFunc */
865 fetch_texel_1d_rgb565_rev, /* FetchTexel1D */
866 fetch_texel_2d_rgb565_rev, /* FetchTexel2D */
867 fetch_texel_3d_rgb565_rev, /* FetchTexel3D */
868 NULL, /* FetchTexel1Df */
869 NULL, /* FetchTexel2Df */
870 NULL, /* FetchTexel3Df */
871 store_texel_rgb565_rev /* StoreTexel */
872 };
873
874 const struct gl_texture_format _mesa_texformat_argb4444 = {
875 MESA_FORMAT_ARGB4444, /* MesaFormat */
876 GL_RGBA, /* BaseFormat */
877 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
878 4, /* RedBits */
879 4, /* GreenBits */
880 4, /* BlueBits */
881 4, /* AlphaBits */
882 0, /* LuminanceBits */
883 0, /* IntensityBits */
884 0, /* IndexBits */
885 0, /* DepthBits */
886 0, /* StencilBits */
887 2, /* TexelBytes */
888 _mesa_texstore_argb4444, /* StoreTexImageFunc */
889 fetch_texel_1d_argb4444, /* FetchTexel1D */
890 fetch_texel_2d_argb4444, /* FetchTexel2D */
891 fetch_texel_3d_argb4444, /* FetchTexel3D */
892 NULL, /* FetchTexel1Df */
893 NULL, /* FetchTexel2Df */
894 NULL, /* FetchTexel3Df */
895 store_texel_argb4444 /* StoreTexel */
896 };
897
898 const struct gl_texture_format _mesa_texformat_argb4444_rev = {
899 MESA_FORMAT_ARGB4444_REV, /* MesaFormat */
900 GL_RGBA, /* BaseFormat */
901 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
902 4, /* RedBits */
903 4, /* GreenBits */
904 4, /* BlueBits */
905 4, /* AlphaBits */
906 0, /* LuminanceBits */
907 0, /* IntensityBits */
908 0, /* IndexBits */
909 0, /* DepthBits */
910 0, /* StencilBits */
911 2, /* TexelBytes */
912 _mesa_texstore_argb4444, /* StoreTexImageFunc */
913 fetch_texel_1d_argb4444_rev, /* FetchTexel1D */
914 fetch_texel_2d_argb4444_rev, /* FetchTexel2D */
915 fetch_texel_3d_argb4444_rev, /* FetchTexel3D */
916 NULL, /* FetchTexel1Df */
917 NULL, /* FetchTexel2Df */
918 NULL, /* FetchTexel3Df */
919 store_texel_argb4444_rev /* StoreTexel */
920 };
921
922 const struct gl_texture_format _mesa_texformat_argb1555 = {
923 MESA_FORMAT_ARGB1555, /* MesaFormat */
924 GL_RGBA, /* BaseFormat */
925 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
926 5, /* RedBits */
927 5, /* GreenBits */
928 5, /* BlueBits */
929 1, /* AlphaBits */
930 0, /* LuminanceBits */
931 0, /* IntensityBits */
932 0, /* IndexBits */
933 0, /* DepthBits */
934 0, /* StencilBits */
935 2, /* TexelBytes */
936 _mesa_texstore_argb1555, /* StoreTexImageFunc */
937 fetch_texel_1d_argb1555, /* FetchTexel1D */
938 fetch_texel_2d_argb1555, /* FetchTexel2D */
939 fetch_texel_3d_argb1555, /* FetchTexel3D */
940 NULL, /* FetchTexel1Df */
941 NULL, /* FetchTexel2Df */
942 NULL, /* FetchTexel3Df */
943 store_texel_argb1555 /* StoreTexel */
944 };
945
946 const struct gl_texture_format _mesa_texformat_argb1555_rev = {
947 MESA_FORMAT_ARGB1555_REV, /* MesaFormat */
948 GL_RGBA, /* BaseFormat */
949 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
950 5, /* RedBits */
951 5, /* GreenBits */
952 5, /* BlueBits */
953 1, /* AlphaBits */
954 0, /* LuminanceBits */
955 0, /* IntensityBits */
956 0, /* IndexBits */
957 0, /* DepthBits */
958 0, /* StencilBits */
959 2, /* TexelBytes */
960 _mesa_texstore_argb1555, /* StoreTexImageFunc */
961 fetch_texel_1d_argb1555_rev, /* FetchTexel1D */
962 fetch_texel_2d_argb1555_rev, /* FetchTexel2D */
963 fetch_texel_3d_argb1555_rev, /* FetchTexel3D */
964 NULL, /* FetchTexel1Df */
965 NULL, /* FetchTexel2Df */
966 NULL, /* FetchTexel3Df */
967 store_texel_argb1555_rev /* StoreTexel */
968 };
969
970 const struct gl_texture_format _mesa_texformat_al88 = {
971 MESA_FORMAT_AL88, /* MesaFormat */
972 GL_LUMINANCE_ALPHA, /* BaseFormat */
973 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
974 0, /* RedBits */
975 0, /* GreenBits */
976 0, /* BlueBits */
977 8, /* AlphaBits */
978 8, /* LuminanceBits */
979 0, /* IntensityBits */
980 0, /* IndexBits */
981 0, /* DepthBits */
982 0, /* StencilBits */
983 2, /* TexelBytes */
984 _mesa_texstore_al88, /* StoreTexImageFunc */
985 fetch_texel_1d_al88, /* FetchTexel1D */
986 fetch_texel_2d_al88, /* FetchTexel2D */
987 fetch_texel_3d_al88, /* FetchTexel3D */
988 NULL, /* FetchTexel1Df */
989 NULL, /* FetchTexel2Df */
990 NULL, /* FetchTexel3Df */
991 store_texel_al88 /* StoreTexel */
992 };
993
994 const struct gl_texture_format _mesa_texformat_al88_rev = {
995 MESA_FORMAT_AL88_REV, /* MesaFormat */
996 GL_LUMINANCE_ALPHA, /* BaseFormat */
997 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
998 0, /* RedBits */
999 0, /* GreenBits */
1000 0, /* BlueBits */
1001 8, /* AlphaBits */
1002 8, /* LuminanceBits */
1003 0, /* IntensityBits */
1004 0, /* IndexBits */
1005 0, /* DepthBits */
1006 0, /* StencilBits */
1007 2, /* TexelBytes */
1008 _mesa_texstore_al88, /* StoreTexImageFunc */
1009 fetch_texel_1d_al88_rev, /* FetchTexel1D */
1010 fetch_texel_2d_al88_rev, /* FetchTexel2D */
1011 fetch_texel_3d_al88_rev, /* FetchTexel3D */
1012 NULL, /* FetchTexel1Df */
1013 NULL, /* FetchTexel2Df */
1014 NULL, /* FetchTexel3Df */
1015 store_texel_al88_rev /* StoreTexel */
1016 };
1017
1018 const struct gl_texture_format _mesa_texformat_rgb332 = {
1019 MESA_FORMAT_RGB332, /* MesaFormat */
1020 GL_RGB, /* BaseFormat */
1021 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1022 3, /* RedBits */
1023 3, /* GreenBits */
1024 2, /* BlueBits */
1025 0, /* AlphaBits */
1026 0, /* LuminanceBits */
1027 0, /* IntensityBits */
1028 0, /* IndexBits */
1029 0, /* DepthBits */
1030 0, /* StencilBits */
1031 1, /* TexelBytes */
1032 _mesa_texstore_rgb332, /* StoreTexImageFunc */
1033 fetch_texel_1d_rgb332, /* FetchTexel1D */
1034 fetch_texel_2d_rgb332, /* FetchTexel2D */
1035 fetch_texel_3d_rgb332, /* FetchTexel3D */
1036 NULL, /* FetchTexel1Df */
1037 NULL, /* FetchTexel2Df */
1038 NULL, /* FetchTexel3Df */
1039 store_texel_rgb332 /* StoreTexel */
1040 };
1041
1042 const struct gl_texture_format _mesa_texformat_a8 = {
1043 MESA_FORMAT_A8, /* MesaFormat */
1044 GL_ALPHA, /* BaseFormat */
1045 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1046 0, /* RedBits */
1047 0, /* GreenBits */
1048 0, /* BlueBits */
1049 8, /* AlphaBits */
1050 0, /* LuminanceBits */
1051 0, /* IntensityBits */
1052 0, /* IndexBits */
1053 0, /* DepthBits */
1054 0, /* StencilBits */
1055 1, /* TexelBytes */
1056 _mesa_texstore_a8, /* StoreTexImageFunc */
1057 fetch_texel_1d_a8, /* FetchTexel1D */
1058 fetch_texel_2d_a8, /* FetchTexel2D */
1059 fetch_texel_3d_a8, /* FetchTexel3D */
1060 NULL, /* FetchTexel1Df */
1061 NULL, /* FetchTexel2Df */
1062 NULL, /* FetchTexel3Df */
1063 store_texel_a8 /* StoreTexel */
1064 };
1065
1066 const struct gl_texture_format _mesa_texformat_l8 = {
1067 MESA_FORMAT_L8, /* MesaFormat */
1068 GL_LUMINANCE, /* BaseFormat */
1069 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1070 0, /* RedBits */
1071 0, /* GreenBits */
1072 0, /* BlueBits */
1073 0, /* AlphaBits */
1074 8, /* LuminanceBits */
1075 0, /* IntensityBits */
1076 0, /* IndexBits */
1077 0, /* DepthBits */
1078 0, /* StencilBits */
1079 1, /* TexelBytes */
1080 _mesa_texstore_a8,/*yes*/ /* StoreTexImageFunc */
1081 fetch_texel_1d_l8, /* FetchTexel1D */
1082 fetch_texel_2d_l8, /* FetchTexel2D */
1083 fetch_texel_3d_l8, /* FetchTexel3D */
1084 NULL, /* FetchTexel1Df */
1085 NULL, /* FetchTexel2Df */
1086 NULL, /* FetchTexel3Df */
1087 store_texel_l8 /* StoreTexel */
1088 };
1089
1090 const struct gl_texture_format _mesa_texformat_i8 = {
1091 MESA_FORMAT_I8, /* MesaFormat */
1092 GL_INTENSITY, /* BaseFormat */
1093 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1094 0, /* RedBits */
1095 0, /* GreenBits */
1096 0, /* BlueBits */
1097 0, /* AlphaBits */
1098 0, /* LuminanceBits */
1099 8, /* IntensityBits */
1100 0, /* IndexBits */
1101 0, /* DepthBits */
1102 0, /* StencilBits */
1103 1, /* TexelBytes */
1104 _mesa_texstore_a8,/*yes*/ /* StoreTexImageFunc */
1105 fetch_texel_1d_i8, /* FetchTexel1D */
1106 fetch_texel_2d_i8, /* FetchTexel2D */
1107 fetch_texel_3d_i8, /* FetchTexel3D */
1108 NULL, /* FetchTexel1Df */
1109 NULL, /* FetchTexel2Df */
1110 NULL, /* FetchTexel3Df */
1111 store_texel_i8 /* StoreTexel */
1112 };
1113
1114 const struct gl_texture_format _mesa_texformat_ci8 = {
1115 MESA_FORMAT_CI8, /* MesaFormat */
1116 GL_COLOR_INDEX, /* BaseFormat */
1117 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1118 0, /* RedBits */
1119 0, /* GreenBits */
1120 0, /* BlueBits */
1121 0, /* AlphaBits */
1122 0, /* LuminanceBits */
1123 0, /* IntensityBits */
1124 8, /* IndexBits */
1125 0, /* DepthBits */
1126 0, /* StencilBits */
1127 1, /* TexelBytes */
1128 _mesa_texstore_ci8, /* StoreTexImageFunc */
1129 fetch_texel_1d_ci8, /* FetchTexel1D */
1130 fetch_texel_2d_ci8, /* FetchTexel2D */
1131 fetch_texel_3d_ci8, /* FetchTexel3D */
1132 NULL, /* FetchTexel1Df */
1133 NULL, /* FetchTexel2Df */
1134 NULL, /* FetchTexel3Df */
1135 store_texel_ci8 /* StoreTexel */
1136 };
1137
1138 const struct gl_texture_format _mesa_texformat_ycbcr = {
1139 MESA_FORMAT_YCBCR, /* MesaFormat */
1140 GL_YCBCR_MESA, /* BaseFormat */
1141 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1142 0, /* RedBits */
1143 0, /* GreenBits */
1144 0, /* BlueBits */
1145 0, /* AlphaBits */
1146 0, /* LuminanceBits */
1147 0, /* IntensityBits */
1148 0, /* IndexBits */
1149 0, /* DepthBits */
1150 0, /* StencilBits */
1151 2, /* TexelBytes */
1152 _mesa_texstore_ycbcr, /* StoreTexImageFunc */
1153 fetch_texel_1d_ycbcr, /* FetchTexel1D */
1154 fetch_texel_2d_ycbcr, /* FetchTexel2D */
1155 fetch_texel_3d_ycbcr, /* FetchTexel3D */
1156 NULL, /* FetchTexel1Df */
1157 NULL, /* FetchTexel2Df */
1158 NULL, /* FetchTexel3Df */
1159 store_texel_ycbcr /* StoreTexel */
1160 };
1161
1162 const struct gl_texture_format _mesa_texformat_ycbcr_rev = {
1163 MESA_FORMAT_YCBCR_REV, /* MesaFormat */
1164 GL_YCBCR_MESA, /* BaseFormat */
1165 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1166 0, /* RedBits */
1167 0, /* GreenBits */
1168 0, /* BlueBits */
1169 0, /* AlphaBits */
1170 0, /* LuminanceBits */
1171 0, /* IntensityBits */
1172 0, /* IndexBits */
1173 0, /* DepthBits */
1174 0, /* StencilBits */
1175 2, /* TexelBytes */
1176 _mesa_texstore_ycbcr, /* StoreTexImageFunc */
1177 fetch_texel_1d_ycbcr_rev, /* FetchTexel1D */
1178 fetch_texel_2d_ycbcr_rev, /* FetchTexel2D */
1179 fetch_texel_3d_ycbcr_rev, /* FetchTexel3D */
1180 NULL, /* FetchTexel1Df */
1181 NULL, /* FetchTexel2Df */
1182 NULL, /* FetchTexel3Df */
1183 store_texel_ycbcr_rev /* StoreTexel */
1184 };
1185
1186 const struct gl_texture_format _mesa_texformat_z24_s8 = {
1187 MESA_FORMAT_Z24_S8, /* MesaFormat */
1188 GL_DEPTH_STENCIL_EXT, /* BaseFormat */
1189 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1190 0, /* RedBits */
1191 0, /* GreenBits */
1192 0, /* BlueBits */
1193 0, /* AlphaBits */
1194 0, /* LuminanceBits */
1195 0, /* IntensityBits */
1196 0, /* IndexBits */
1197 24, /* DepthBits */
1198 8, /* StencilBits */
1199 4, /* TexelBytes */
1200 _mesa_texstore_z24_s8, /* StoreTexImageFunc */
1201 NULL, /* FetchTexel1D */
1202 NULL, /* FetchTexel2D */
1203 NULL, /* FetchTexel3D */
1204 fetch_texel_1d_f_z24_s8, /* FetchTexel1Df */
1205 fetch_texel_2d_f_z24_s8, /* FetchTexel2Df */
1206 fetch_texel_3d_f_z24_s8, /* FetchTexel3Df */
1207 store_texel_z24_s8 /* StoreTexel */
1208 };
1209
1210 const struct gl_texture_format _mesa_texformat_s8_z24 = {
1211 MESA_FORMAT_S8_Z24, /* MesaFormat */
1212 GL_DEPTH_STENCIL_EXT, /* BaseFormat */
1213 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1214 0, /* RedBits */
1215 0, /* GreenBits */
1216 0, /* BlueBits */
1217 0, /* AlphaBits */
1218 0, /* LuminanceBits */
1219 0, /* IntensityBits */
1220 0, /* IndexBits */
1221 24, /* DepthBits */
1222 8, /* StencilBits */
1223 4, /* TexelBytes */
1224 _mesa_texstore_s8_z24, /* StoreTexImageFunc */
1225 NULL, /* FetchTexel1D */
1226 NULL, /* FetchTexel2D */
1227 NULL, /* FetchTexel3D */
1228 fetch_texel_1d_f_s8_z24, /* FetchTexel1Df */
1229 fetch_texel_2d_f_s8_z24, /* FetchTexel2Df */
1230 fetch_texel_3d_f_s8_z24, /* FetchTexel3Df */
1231 store_texel_s8_z24 /* StoreTexel */
1232 };
1233
1234 const struct gl_texture_format _mesa_texformat_z16 = {
1235 MESA_FORMAT_Z16, /* MesaFormat */
1236 GL_DEPTH_COMPONENT, /* BaseFormat */
1237 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1238 0, /* RedBits */
1239 0, /* GreenBits */
1240 0, /* BlueBits */
1241 0, /* AlphaBits */
1242 0, /* LuminanceBits */
1243 0, /* IntensityBits */
1244 0, /* IndexBits */
1245 sizeof(GLushort) * 8, /* DepthBits */
1246 0, /* StencilBits */
1247 sizeof(GLushort), /* TexelBytes */
1248 _mesa_texstore_z16, /* StoreTexImageFunc */
1249 NULL, /* FetchTexel1D */
1250 NULL, /* FetchTexel1D */
1251 NULL, /* FetchTexel1D */
1252 fetch_texel_1d_f_z16, /* FetchTexel1Df */
1253 fetch_texel_2d_f_z16, /* FetchTexel2Df */
1254 fetch_texel_3d_f_z16, /* FetchTexel3Df */
1255 store_texel_z16 /* StoreTexel */
1256 };
1257
1258 const struct gl_texture_format _mesa_texformat_z32 = {
1259 MESA_FORMAT_Z32, /* MesaFormat */
1260 GL_DEPTH_COMPONENT, /* BaseFormat */
1261 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1262 0, /* RedBits */
1263 0, /* GreenBits */
1264 0, /* BlueBits */
1265 0, /* AlphaBits */
1266 0, /* LuminanceBits */
1267 0, /* IntensityBits */
1268 0, /* IndexBits */
1269 sizeof(GLuint) * 8, /* DepthBits */
1270 0, /* StencilBits */
1271 sizeof(GLuint), /* TexelBytes */
1272 _mesa_texstore_z32, /* StoreTexImageFunc */
1273 NULL, /* FetchTexel1D */
1274 NULL, /* FetchTexel1D */
1275 NULL, /* FetchTexel1D */
1276 fetch_texel_1d_f_z32, /* FetchTexel1Df */
1277 fetch_texel_2d_f_z32, /* FetchTexel2Df */
1278 fetch_texel_3d_f_z32, /* FetchTexel3Df */
1279 store_texel_z32 /* StoreTexel */
1280 };
1281
1282 /*@}*/
1283
1284
1285 /***************************************************************/
1286 /** \name Null format (useful for proxy textures) */
1287 /*@{*/
1288
1289 const struct gl_texture_format _mesa_null_texformat = {
1290 -1, /* MesaFormat */
1291 0, /* BaseFormat */
1292 GL_NONE, /* DataType */
1293 0, /* RedBits */
1294 0, /* GreenBits */
1295 0, /* BlueBits */
1296 0, /* AlphaBits */
1297 0, /* LuminanceBits */
1298 0, /* IntensityBits */
1299 0, /* IndexBits */
1300 0, /* DepthBits */
1301 0, /* StencilBits */
1302 0, /* TexelBytes */
1303 NULL, /* StoreTexImageFunc */
1304 fetch_null_texel, /* FetchTexel1D */
1305 fetch_null_texel, /* FetchTexel2D */
1306 fetch_null_texel, /* FetchTexel3D */
1307 fetch_null_texelf, /* FetchTexel1Df */
1308 fetch_null_texelf, /* FetchTexel2Df */
1309 fetch_null_texelf, /* FetchTexel3Df */
1310 store_null_texel /* StoreTexel */
1311 };
1312
1313 /*@}*/
1314
1315
1316 /**
1317 * Choose an appropriate texture format given the format, type and
1318 * internalFormat parameters passed to glTexImage().
1319 *
1320 * \param ctx the GL context.
1321 * \param internalFormat user's prefered internal texture format.
1322 * \param format incoming image pixel format.
1323 * \param type incoming image data type.
1324 *
1325 * \return a pointer to a gl_texture_format object which describes the
1326 * choosen texture format, or NULL on failure.
1327 *
1328 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers
1329 * will typically override this function with a specialized version.
1330 */
1331 const struct gl_texture_format *
1332 _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
1333 GLenum format, GLenum type )
1334 {
1335 (void) format;
1336 (void) type;
1337
1338 switch (internalFormat) {
1339 /* RGBA formats */
1340 case 4:
1341 case GL_RGBA:
1342 case GL_RGB10_A2:
1343 case GL_RGBA12:
1344 case GL_RGBA16:
1345 return &_mesa_texformat_rgba;
1346 case GL_RGBA8:
1347 return &_mesa_texformat_rgba8888;
1348 case GL_RGB5_A1:
1349 return &_mesa_texformat_argb1555;
1350 case GL_RGBA2:
1351 return &_mesa_texformat_argb4444_rev; /* just to test another format*/
1352 case GL_RGBA4:
1353 return &_mesa_texformat_argb4444;
1354
1355 /* RGB formats */
1356 case 3:
1357 case GL_RGB:
1358 case GL_RGB10:
1359 case GL_RGB12:
1360 case GL_RGB16:
1361 return &_mesa_texformat_rgb;
1362 case GL_RGB8:
1363 return &_mesa_texformat_rgb888;
1364 case GL_R3_G3_B2:
1365 return &_mesa_texformat_rgb332;
1366 case GL_RGB4:
1367 return &_mesa_texformat_rgb565_rev; /* just to test another format */
1368 case GL_RGB5:
1369 return &_mesa_texformat_rgb565;
1370
1371 /* Alpha formats */
1372 case GL_ALPHA:
1373 case GL_ALPHA4:
1374 case GL_ALPHA12:
1375 case GL_ALPHA16:
1376 return &_mesa_texformat_alpha;
1377 case GL_ALPHA8:
1378 return &_mesa_texformat_a8;
1379
1380 /* Luminance formats */
1381 case 1:
1382 case GL_LUMINANCE:
1383 case GL_LUMINANCE4:
1384 case GL_LUMINANCE12:
1385 case GL_LUMINANCE16:
1386 return &_mesa_texformat_luminance;
1387 case GL_LUMINANCE8:
1388 return &_mesa_texformat_l8;
1389
1390 /* Luminance/Alpha formats */
1391 case 2:
1392 case GL_LUMINANCE_ALPHA:
1393 case GL_LUMINANCE4_ALPHA4:
1394 case GL_LUMINANCE6_ALPHA2:
1395 case GL_LUMINANCE12_ALPHA4:
1396 case GL_LUMINANCE12_ALPHA12:
1397 case GL_LUMINANCE16_ALPHA16:
1398 return &_mesa_texformat_luminance_alpha;
1399 case GL_LUMINANCE8_ALPHA8:
1400 return &_mesa_texformat_al88;
1401
1402 case GL_INTENSITY:
1403 case GL_INTENSITY4:
1404 case GL_INTENSITY12:
1405 case GL_INTENSITY16:
1406 return &_mesa_texformat_intensity;
1407 case GL_INTENSITY8:
1408 return &_mesa_texformat_i8;
1409
1410 case GL_COLOR_INDEX:
1411 case GL_COLOR_INDEX1_EXT:
1412 case GL_COLOR_INDEX2_EXT:
1413 case GL_COLOR_INDEX4_EXT:
1414 case GL_COLOR_INDEX12_EXT:
1415 case GL_COLOR_INDEX16_EXT:
1416 case GL_COLOR_INDEX8_EXT:
1417 return &_mesa_texformat_ci8;
1418
1419 default:
1420 ; /* fallthrough */
1421 }
1422
1423 if (ctx->Extensions.SGIX_depth_texture ||
1424 ctx->Extensions.ARB_depth_texture) {
1425 switch (internalFormat) {
1426 case GL_DEPTH_COMPONENT:
1427 case GL_DEPTH_COMPONENT24_SGIX:
1428 case GL_DEPTH_COMPONENT32_SGIX:
1429 return &_mesa_texformat_z32;
1430 case GL_DEPTH_COMPONENT16_SGIX:
1431 return &_mesa_texformat_z16;
1432 default:
1433 ; /* fallthrough */
1434 }
1435 }
1436
1437 if (ctx->Extensions.ARB_texture_compression) {
1438 switch (internalFormat) {
1439 case GL_COMPRESSED_ALPHA_ARB:
1440 return &_mesa_texformat_alpha;
1441 case GL_COMPRESSED_LUMINANCE_ARB:
1442 return &_mesa_texformat_luminance;
1443 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
1444 return &_mesa_texformat_luminance_alpha;
1445 case GL_COMPRESSED_INTENSITY_ARB:
1446 return &_mesa_texformat_intensity;
1447 case GL_COMPRESSED_RGB_ARB:
1448 #if FEATURE_texture_fxt1
1449 if (ctx->Extensions.TDFX_texture_compression_FXT1)
1450 return &_mesa_texformat_rgb_fxt1;
1451 #endif
1452 #if FEATURE_texture_s3tc
1453 if (ctx->Extensions.EXT_texture_compression_s3tc ||
1454 ctx->Extensions.S3_s3tc)
1455 return &_mesa_texformat_rgb_dxt1;
1456 #endif
1457 return &_mesa_texformat_rgb;
1458 case GL_COMPRESSED_RGBA_ARB:
1459 #if FEATURE_texture_fxt1
1460 if (ctx->Extensions.TDFX_texture_compression_FXT1)
1461 return &_mesa_texformat_rgba_fxt1;
1462 #endif
1463 #if FEATURE_texture_s3tc
1464 if (ctx->Extensions.EXT_texture_compression_s3tc ||
1465 ctx->Extensions.S3_s3tc)
1466 return &_mesa_texformat_rgba_dxt3; /* Not rgba_dxt1, see spec */
1467 #endif
1468 return &_mesa_texformat_rgba;
1469 default:
1470 ; /* fallthrough */
1471 }
1472 }
1473
1474 if (ctx->Extensions.MESA_ycbcr_texture) {
1475 if (internalFormat == GL_YCBCR_MESA) {
1476 if (type == GL_UNSIGNED_SHORT_8_8_MESA)
1477 return &_mesa_texformat_ycbcr;
1478 else
1479 return &_mesa_texformat_ycbcr_rev;
1480 }
1481 }
1482
1483 #if FEATURE_texture_fxt1
1484 if (ctx->Extensions.TDFX_texture_compression_FXT1) {
1485 switch (internalFormat) {
1486 case GL_COMPRESSED_RGB_FXT1_3DFX:
1487 return &_mesa_texformat_rgb_fxt1;
1488 case GL_COMPRESSED_RGBA_FXT1_3DFX:
1489 return &_mesa_texformat_rgba_fxt1;
1490 default:
1491 ; /* fallthrough */
1492 }
1493 }
1494 #endif
1495
1496 #if FEATURE_texture_s3tc
1497 if (ctx->Extensions.EXT_texture_compression_s3tc) {
1498 switch (internalFormat) {
1499 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1500 return &_mesa_texformat_rgb_dxt1;
1501 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1502 return &_mesa_texformat_rgba_dxt1;
1503 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
1504 return &_mesa_texformat_rgba_dxt3;
1505 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
1506 return &_mesa_texformat_rgba_dxt5;
1507 default:
1508 ; /* fallthrough */
1509 }
1510 }
1511
1512 if (ctx->Extensions.S3_s3tc) {
1513 switch (internalFormat) {
1514 case GL_RGB_S3TC:
1515 case GL_RGB4_S3TC:
1516 return &_mesa_texformat_rgb_dxt1;
1517 case GL_RGBA_S3TC:
1518 case GL_RGBA4_S3TC:
1519 return &_mesa_texformat_rgba_dxt3;
1520 default:
1521 ; /* fallthrough */
1522 }
1523 }
1524 #endif
1525
1526 if (ctx->Extensions.ARB_texture_float) {
1527 switch (internalFormat) {
1528 case GL_ALPHA16F_ARB:
1529 return &_mesa_texformat_alpha_float16;
1530 case GL_ALPHA32F_ARB:
1531 return &_mesa_texformat_alpha_float32;
1532 case GL_LUMINANCE16F_ARB:
1533 return &_mesa_texformat_luminance_float16;
1534 case GL_LUMINANCE32F_ARB:
1535 return &_mesa_texformat_luminance_float32;
1536 case GL_LUMINANCE_ALPHA16F_ARB:
1537 return &_mesa_texformat_luminance_alpha_float16;
1538 case GL_LUMINANCE_ALPHA32F_ARB:
1539 return &_mesa_texformat_luminance_alpha_float32;
1540 case GL_INTENSITY16F_ARB:
1541 return &_mesa_texformat_intensity_float16;
1542 case GL_INTENSITY32F_ARB:
1543 return &_mesa_texformat_intensity_float32;
1544 case GL_RGB16F_ARB:
1545 return &_mesa_texformat_rgb_float16;
1546 case GL_RGB32F_ARB:
1547 return &_mesa_texformat_rgb_float32;
1548 case GL_RGBA16F_ARB:
1549 return &_mesa_texformat_rgba_float16;
1550 case GL_RGBA32F_ARB:
1551 return &_mesa_texformat_rgba_float32;
1552 default:
1553 ; /* fallthrough */
1554 }
1555 }
1556
1557 if (ctx->Extensions.EXT_packed_depth_stencil) {
1558 switch (internalFormat) {
1559 case GL_DEPTH_STENCIL_EXT:
1560 case GL_DEPTH24_STENCIL8_EXT:
1561 return &_mesa_texformat_z24_s8;
1562 default:
1563 ; /* fallthrough */
1564 }
1565 }
1566
1567 #if FEATURE_EXT_texture_sRGB
1568 if (ctx->Extensions.EXT_texture_sRGB) {
1569 switch (internalFormat) {
1570 case GL_SRGB_EXT:
1571 case GL_SRGB8_EXT:
1572 return &_mesa_texformat_srgb8;
1573 case GL_SRGB_ALPHA_EXT:
1574 case GL_SRGB8_ALPHA8_EXT:
1575 return &_mesa_texformat_srgba8;
1576 case GL_SLUMINANCE_EXT:
1577 case GL_SLUMINANCE8_EXT:
1578 return &_mesa_texformat_sl8;
1579 case GL_SLUMINANCE_ALPHA_EXT:
1580 case GL_SLUMINANCE8_ALPHA8_EXT:
1581 return &_mesa_texformat_sla8;
1582 /* NOTE: not supporting any compression of sRGB at this time */
1583 case GL_COMPRESSED_SRGB_EXT:
1584 return &_mesa_texformat_srgb8;
1585 case GL_COMPRESSED_SRGB_ALPHA_EXT:
1586 return &_mesa_texformat_srgba8;
1587 case GL_COMPRESSED_SLUMINANCE_EXT:
1588 return &_mesa_texformat_sl8;
1589 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
1590 return &_mesa_texformat_sla8;
1591 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
1592 return &_mesa_texformat_srgb8;
1593 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
1594 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
1595 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
1596 return &_mesa_texformat_srgba8;
1597 default:
1598 ; /* fallthrough */
1599 }
1600 }
1601 #endif /* FEATURE_EXT_texture_sRGB */
1602
1603 _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
1604 return NULL;
1605 }
1606
1607
1608
1609 /**
1610 * Return datatype and number of components per texel for the
1611 * given gl_texture_format.
1612 */
1613 void
1614 _mesa_format_to_type_and_comps(const struct gl_texture_format *format,
1615 GLenum *datatype, GLuint *comps)
1616 {
1617 switch (format->MesaFormat) {
1618 case MESA_FORMAT_RGBA8888:
1619 case MESA_FORMAT_RGBA8888_REV:
1620 case MESA_FORMAT_ARGB8888:
1621 case MESA_FORMAT_ARGB8888_REV:
1622 *datatype = CHAN_TYPE;
1623 *comps = 4;
1624 return;
1625 case MESA_FORMAT_RGB888:
1626 case MESA_FORMAT_BGR888:
1627 *datatype = GL_UNSIGNED_BYTE;
1628 *comps = 3;
1629 return;
1630 case MESA_FORMAT_RGB565:
1631 case MESA_FORMAT_RGB565_REV:
1632 *datatype = GL_UNSIGNED_SHORT_5_6_5;
1633 *comps = 3;
1634 return;
1635
1636 case MESA_FORMAT_ARGB4444:
1637 case MESA_FORMAT_ARGB4444_REV:
1638 *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
1639 *comps = 4;
1640 return;
1641
1642 case MESA_FORMAT_ARGB1555:
1643 case MESA_FORMAT_ARGB1555_REV:
1644 *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
1645 *comps = 3;
1646 return;
1647
1648 case MESA_FORMAT_AL88:
1649 case MESA_FORMAT_AL88_REV:
1650 *datatype = GL_UNSIGNED_BYTE;
1651 *comps = 2;
1652 return;
1653 case MESA_FORMAT_RGB332:
1654 *datatype = GL_UNSIGNED_BYTE_3_3_2;
1655 *comps = 3;
1656 return;
1657
1658 case MESA_FORMAT_A8:
1659 case MESA_FORMAT_L8:
1660 case MESA_FORMAT_I8:
1661 case MESA_FORMAT_CI8:
1662 *datatype = GL_UNSIGNED_BYTE;
1663 *comps = 1;
1664 return;
1665
1666 case MESA_FORMAT_YCBCR:
1667 case MESA_FORMAT_YCBCR_REV:
1668 *datatype = GL_UNSIGNED_SHORT;
1669 *comps = 2;
1670 return;
1671
1672 case MESA_FORMAT_Z24_S8:
1673 *datatype = GL_UNSIGNED_INT;
1674 *comps = 1; /* XXX OK? */
1675 return;
1676
1677 case MESA_FORMAT_S8_Z24:
1678 *datatype = GL_UNSIGNED_INT;
1679 *comps = 1; /* XXX OK? */
1680 return;
1681
1682 case MESA_FORMAT_Z16:
1683 *datatype = GL_UNSIGNED_SHORT;
1684 *comps = 1;
1685 return;
1686
1687 case MESA_FORMAT_Z32:
1688 *datatype = GL_UNSIGNED_INT;
1689 *comps = 1;
1690 return;
1691
1692 #if FEATURE_EXT_texture_sRGB
1693 case MESA_FORMAT_SRGB8:
1694 *datatype = GL_UNSIGNED_BYTE;
1695 *comps = 3;
1696 return;
1697 case MESA_FORMAT_SRGBA8:
1698 *datatype = GL_UNSIGNED_BYTE;
1699 *comps = 4;
1700 return;
1701 case MESA_FORMAT_SL8:
1702 *datatype = GL_UNSIGNED_BYTE;
1703 *comps = 1;
1704 return;
1705 case MESA_FORMAT_SLA8:
1706 *datatype = GL_UNSIGNED_BYTE;
1707 *comps = 2;
1708 return;
1709 #endif
1710
1711 #if FEATURE_texture_fxt1
1712 case MESA_FORMAT_RGB_FXT1:
1713 case MESA_FORMAT_RGBA_FXT1:
1714 #endif
1715 #if FEATURE_texture_s3tc
1716 case MESA_FORMAT_RGB_DXT1:
1717 case MESA_FORMAT_RGBA_DXT1:
1718 case MESA_FORMAT_RGBA_DXT3:
1719 case MESA_FORMAT_RGBA_DXT5:
1720 /* XXX generate error instead? */
1721 *datatype = GL_UNSIGNED_BYTE;
1722 *comps = 0;
1723 return;
1724 #endif
1725
1726 case MESA_FORMAT_RGBA:
1727 *datatype = CHAN_TYPE;
1728 *comps = 4;
1729 return;
1730 case MESA_FORMAT_RGB:
1731 *datatype = CHAN_TYPE;
1732 *comps = 3;
1733 return;
1734 case MESA_FORMAT_LUMINANCE_ALPHA:
1735 *datatype = CHAN_TYPE;
1736 *comps = 2;
1737 return;
1738 case MESA_FORMAT_ALPHA:
1739 case MESA_FORMAT_LUMINANCE:
1740 case MESA_FORMAT_INTENSITY:
1741 *datatype = CHAN_TYPE;
1742 *comps = 1;
1743 return;
1744
1745 case MESA_FORMAT_RGBA_FLOAT32:
1746 *datatype = GL_FLOAT;
1747 *comps = 4;
1748 return;
1749 case MESA_FORMAT_RGBA_FLOAT16:
1750 *datatype = GL_HALF_FLOAT_ARB;
1751 *comps = 4;
1752 return;
1753 case MESA_FORMAT_RGB_FLOAT32:
1754 *datatype = GL_FLOAT;
1755 *comps = 3;
1756 return;
1757 case MESA_FORMAT_RGB_FLOAT16:
1758 *datatype = GL_HALF_FLOAT_ARB;
1759 *comps = 3;
1760 return;
1761 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
1762 *datatype = GL_FLOAT;
1763 *comps = 2;
1764 return;
1765 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
1766 *datatype = GL_HALF_FLOAT_ARB;
1767 *comps = 2;
1768 return;
1769 case MESA_FORMAT_ALPHA_FLOAT32:
1770 case MESA_FORMAT_LUMINANCE_FLOAT32:
1771 case MESA_FORMAT_INTENSITY_FLOAT32:
1772 *datatype = GL_FLOAT;
1773 *comps = 1;
1774 return;
1775 case MESA_FORMAT_ALPHA_FLOAT16:
1776 case MESA_FORMAT_LUMINANCE_FLOAT16:
1777 case MESA_FORMAT_INTENSITY_FLOAT16:
1778 *datatype = GL_HALF_FLOAT_ARB;
1779 *comps = 1;
1780 return;
1781
1782 default:
1783 _mesa_problem(NULL, "bad format in _mesa_format_to_type_and_comps");
1784 *datatype = 0;
1785 *comps = 1;
1786 }
1787 }