mesa: refactor: move #define FEATURE flags into new mfeatures.h file
[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.92;
59 }
60 else {
61 table[i] = _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 #if 0
1225 _mesa_texstore_s8_z24, /* StoreTexImageFunc */
1226 #else
1227 _mesa_texstore_z24_s8, /* StoreTexImageFunc */
1228 #endif
1229 NULL, /* FetchTexel1D */
1230 NULL, /* FetchTexel2D */
1231 NULL, /* FetchTexel3D */
1232 fetch_texel_1d_f_s8_z24, /* FetchTexel1Df */
1233 fetch_texel_2d_f_s8_z24, /* FetchTexel2Df */
1234 fetch_texel_3d_f_s8_z24, /* FetchTexel3Df */
1235 store_texel_s8_z24 /* StoreTexel */
1236 };
1237
1238 const struct gl_texture_format _mesa_texformat_z16 = {
1239 MESA_FORMAT_Z16, /* MesaFormat */
1240 GL_DEPTH_COMPONENT, /* BaseFormat */
1241 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1242 0, /* RedBits */
1243 0, /* GreenBits */
1244 0, /* BlueBits */
1245 0, /* AlphaBits */
1246 0, /* LuminanceBits */
1247 0, /* IntensityBits */
1248 0, /* IndexBits */
1249 sizeof(GLushort) * 8, /* DepthBits */
1250 0, /* StencilBits */
1251 sizeof(GLushort), /* TexelBytes */
1252 _mesa_texstore_z16, /* StoreTexImageFunc */
1253 NULL, /* FetchTexel1D */
1254 NULL, /* FetchTexel1D */
1255 NULL, /* FetchTexel1D */
1256 fetch_texel_1d_f_z16, /* FetchTexel1Df */
1257 fetch_texel_2d_f_z16, /* FetchTexel2Df */
1258 fetch_texel_3d_f_z16, /* FetchTexel3Df */
1259 store_texel_z16 /* StoreTexel */
1260 };
1261
1262 const struct gl_texture_format _mesa_texformat_z32 = {
1263 MESA_FORMAT_Z32, /* MesaFormat */
1264 GL_DEPTH_COMPONENT, /* BaseFormat */
1265 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
1266 0, /* RedBits */
1267 0, /* GreenBits */
1268 0, /* BlueBits */
1269 0, /* AlphaBits */
1270 0, /* LuminanceBits */
1271 0, /* IntensityBits */
1272 0, /* IndexBits */
1273 sizeof(GLuint) * 8, /* DepthBits */
1274 0, /* StencilBits */
1275 sizeof(GLuint), /* TexelBytes */
1276 _mesa_texstore_z32, /* StoreTexImageFunc */
1277 NULL, /* FetchTexel1D */
1278 NULL, /* FetchTexel1D */
1279 NULL, /* FetchTexel1D */
1280 fetch_texel_1d_f_z32, /* FetchTexel1Df */
1281 fetch_texel_2d_f_z32, /* FetchTexel2Df */
1282 fetch_texel_3d_f_z32, /* FetchTexel3Df */
1283 store_texel_z32 /* StoreTexel */
1284 };
1285
1286 /*@}*/
1287
1288
1289 /***************************************************************/
1290 /** \name Null format (useful for proxy textures) */
1291 /*@{*/
1292
1293 const struct gl_texture_format _mesa_null_texformat = {
1294 -1, /* MesaFormat */
1295 0, /* BaseFormat */
1296 GL_NONE, /* DataType */
1297 0, /* RedBits */
1298 0, /* GreenBits */
1299 0, /* BlueBits */
1300 0, /* AlphaBits */
1301 0, /* LuminanceBits */
1302 0, /* IntensityBits */
1303 0, /* IndexBits */
1304 0, /* DepthBits */
1305 0, /* StencilBits */
1306 0, /* TexelBytes */
1307 NULL, /* StoreTexImageFunc */
1308 fetch_null_texel, /* FetchTexel1D */
1309 fetch_null_texel, /* FetchTexel2D */
1310 fetch_null_texel, /* FetchTexel3D */
1311 fetch_null_texelf, /* FetchTexel1Df */
1312 fetch_null_texelf, /* FetchTexel2Df */
1313 fetch_null_texelf, /* FetchTexel3Df */
1314 store_null_texel /* StoreTexel */
1315 };
1316
1317 /*@}*/
1318
1319
1320 /**
1321 * Choose an appropriate texture format given the format, type and
1322 * internalFormat parameters passed to glTexImage().
1323 *
1324 * \param ctx the GL context.
1325 * \param internalFormat user's prefered internal texture format.
1326 * \param format incoming image pixel format.
1327 * \param type incoming image data type.
1328 *
1329 * \return a pointer to a gl_texture_format object which describes the
1330 * choosen texture format, or NULL on failure.
1331 *
1332 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers
1333 * will typically override this function with a specialized version.
1334 */
1335 const struct gl_texture_format *
1336 _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
1337 GLenum format, GLenum type )
1338 {
1339 (void) format;
1340 (void) type;
1341
1342 switch (internalFormat) {
1343 /* RGBA formats */
1344 case 4:
1345 case GL_RGBA:
1346 case GL_RGB10_A2:
1347 case GL_RGBA12:
1348 case GL_RGBA16:
1349 return &_mesa_texformat_rgba;
1350 case GL_RGBA8:
1351 return &_mesa_texformat_rgba8888;
1352 case GL_RGB5_A1:
1353 return &_mesa_texformat_argb1555;
1354 case GL_RGBA2:
1355 return &_mesa_texformat_argb4444_rev; /* just to test another format*/
1356 case GL_RGBA4:
1357 return &_mesa_texformat_argb4444;
1358
1359 /* RGB formats */
1360 case 3:
1361 case GL_RGB:
1362 case GL_RGB10:
1363 case GL_RGB12:
1364 case GL_RGB16:
1365 return &_mesa_texformat_rgb;
1366 case GL_RGB8:
1367 return &_mesa_texformat_rgb888;
1368 case GL_R3_G3_B2:
1369 return &_mesa_texformat_rgb332;
1370 case GL_RGB4:
1371 return &_mesa_texformat_rgb565_rev; /* just to test another format */
1372 case GL_RGB5:
1373 return &_mesa_texformat_rgb565;
1374
1375 /* Alpha formats */
1376 case GL_ALPHA:
1377 case GL_ALPHA4:
1378 case GL_ALPHA12:
1379 case GL_ALPHA16:
1380 return &_mesa_texformat_alpha;
1381 case GL_ALPHA8:
1382 return &_mesa_texformat_a8;
1383
1384 /* Luminance formats */
1385 case 1:
1386 case GL_LUMINANCE:
1387 case GL_LUMINANCE4:
1388 case GL_LUMINANCE12:
1389 case GL_LUMINANCE16:
1390 return &_mesa_texformat_luminance;
1391 case GL_LUMINANCE8:
1392 return &_mesa_texformat_l8;
1393
1394 /* Luminance/Alpha formats */
1395 case 2:
1396 case GL_LUMINANCE_ALPHA:
1397 case GL_LUMINANCE4_ALPHA4:
1398 case GL_LUMINANCE6_ALPHA2:
1399 case GL_LUMINANCE12_ALPHA4:
1400 case GL_LUMINANCE12_ALPHA12:
1401 case GL_LUMINANCE16_ALPHA16:
1402 return &_mesa_texformat_luminance_alpha;
1403 case GL_LUMINANCE8_ALPHA8:
1404 return &_mesa_texformat_al88;
1405
1406 case GL_INTENSITY:
1407 case GL_INTENSITY4:
1408 case GL_INTENSITY12:
1409 case GL_INTENSITY16:
1410 return &_mesa_texformat_intensity;
1411 case GL_INTENSITY8:
1412 return &_mesa_texformat_i8;
1413
1414 case GL_COLOR_INDEX:
1415 case GL_COLOR_INDEX1_EXT:
1416 case GL_COLOR_INDEX2_EXT:
1417 case GL_COLOR_INDEX4_EXT:
1418 case GL_COLOR_INDEX12_EXT:
1419 case GL_COLOR_INDEX16_EXT:
1420 case GL_COLOR_INDEX8_EXT:
1421 return &_mesa_texformat_ci8;
1422
1423 default:
1424 ; /* fallthrough */
1425 }
1426
1427 if (ctx->Extensions.SGIX_depth_texture ||
1428 ctx->Extensions.ARB_depth_texture) {
1429 switch (internalFormat) {
1430 case GL_DEPTH_COMPONENT:
1431 case GL_DEPTH_COMPONENT24_SGIX:
1432 case GL_DEPTH_COMPONENT32_SGIX:
1433 return &_mesa_texformat_z32;
1434 case GL_DEPTH_COMPONENT16_SGIX:
1435 return &_mesa_texformat_z16;
1436 default:
1437 ; /* fallthrough */
1438 }
1439 }
1440
1441 if (ctx->Extensions.ARB_texture_compression) {
1442 switch (internalFormat) {
1443 case GL_COMPRESSED_ALPHA_ARB:
1444 return &_mesa_texformat_alpha;
1445 case GL_COMPRESSED_LUMINANCE_ARB:
1446 return &_mesa_texformat_luminance;
1447 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
1448 return &_mesa_texformat_luminance_alpha;
1449 case GL_COMPRESSED_INTENSITY_ARB:
1450 return &_mesa_texformat_intensity;
1451 case GL_COMPRESSED_RGB_ARB:
1452 #if FEATURE_texture_fxt1
1453 if (ctx->Extensions.TDFX_texture_compression_FXT1)
1454 return &_mesa_texformat_rgb_fxt1;
1455 #endif
1456 #if FEATURE_texture_s3tc
1457 if (ctx->Extensions.EXT_texture_compression_s3tc ||
1458 ctx->Extensions.S3_s3tc)
1459 return &_mesa_texformat_rgb_dxt1;
1460 #endif
1461 return &_mesa_texformat_rgb;
1462 case GL_COMPRESSED_RGBA_ARB:
1463 #if FEATURE_texture_fxt1
1464 if (ctx->Extensions.TDFX_texture_compression_FXT1)
1465 return &_mesa_texformat_rgba_fxt1;
1466 #endif
1467 #if FEATURE_texture_s3tc
1468 if (ctx->Extensions.EXT_texture_compression_s3tc ||
1469 ctx->Extensions.S3_s3tc)
1470 return &_mesa_texformat_rgba_dxt3; /* Not rgba_dxt1, see spec */
1471 #endif
1472 return &_mesa_texformat_rgba;
1473 default:
1474 ; /* fallthrough */
1475 }
1476 }
1477
1478 if (ctx->Extensions.MESA_ycbcr_texture) {
1479 if (internalFormat == GL_YCBCR_MESA) {
1480 if (type == GL_UNSIGNED_SHORT_8_8_MESA)
1481 return &_mesa_texformat_ycbcr;
1482 else
1483 return &_mesa_texformat_ycbcr_rev;
1484 }
1485 }
1486
1487 #if FEATURE_texture_fxt1
1488 if (ctx->Extensions.TDFX_texture_compression_FXT1) {
1489 switch (internalFormat) {
1490 case GL_COMPRESSED_RGB_FXT1_3DFX:
1491 return &_mesa_texformat_rgb_fxt1;
1492 case GL_COMPRESSED_RGBA_FXT1_3DFX:
1493 return &_mesa_texformat_rgba_fxt1;
1494 default:
1495 ; /* fallthrough */
1496 }
1497 }
1498 #endif
1499
1500 #if FEATURE_texture_s3tc
1501 if (ctx->Extensions.EXT_texture_compression_s3tc) {
1502 switch (internalFormat) {
1503 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1504 return &_mesa_texformat_rgb_dxt1;
1505 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1506 return &_mesa_texformat_rgba_dxt1;
1507 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
1508 return &_mesa_texformat_rgba_dxt3;
1509 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
1510 return &_mesa_texformat_rgba_dxt5;
1511 default:
1512 ; /* fallthrough */
1513 }
1514 }
1515
1516 if (ctx->Extensions.S3_s3tc) {
1517 switch (internalFormat) {
1518 case GL_RGB_S3TC:
1519 case GL_RGB4_S3TC:
1520 return &_mesa_texformat_rgb_dxt1;
1521 case GL_RGBA_S3TC:
1522 case GL_RGBA4_S3TC:
1523 return &_mesa_texformat_rgba_dxt3;
1524 default:
1525 ; /* fallthrough */
1526 }
1527 }
1528 #endif
1529
1530 if (ctx->Extensions.ARB_texture_float) {
1531 switch (internalFormat) {
1532 case GL_ALPHA16F_ARB:
1533 return &_mesa_texformat_alpha_float16;
1534 case GL_ALPHA32F_ARB:
1535 return &_mesa_texformat_alpha_float32;
1536 case GL_LUMINANCE16F_ARB:
1537 return &_mesa_texformat_luminance_float16;
1538 case GL_LUMINANCE32F_ARB:
1539 return &_mesa_texformat_luminance_float32;
1540 case GL_LUMINANCE_ALPHA16F_ARB:
1541 return &_mesa_texformat_luminance_alpha_float16;
1542 case GL_LUMINANCE_ALPHA32F_ARB:
1543 return &_mesa_texformat_luminance_alpha_float32;
1544 case GL_INTENSITY16F_ARB:
1545 return &_mesa_texformat_intensity_float16;
1546 case GL_INTENSITY32F_ARB:
1547 return &_mesa_texformat_intensity_float32;
1548 case GL_RGB16F_ARB:
1549 return &_mesa_texformat_rgb_float16;
1550 case GL_RGB32F_ARB:
1551 return &_mesa_texformat_rgb_float32;
1552 case GL_RGBA16F_ARB:
1553 return &_mesa_texformat_rgba_float16;
1554 case GL_RGBA32F_ARB:
1555 return &_mesa_texformat_rgba_float32;
1556 default:
1557 ; /* fallthrough */
1558 }
1559 }
1560
1561 if (ctx->Extensions.EXT_packed_depth_stencil) {
1562 switch (internalFormat) {
1563 case GL_DEPTH_STENCIL_EXT:
1564 case GL_DEPTH24_STENCIL8_EXT:
1565 return &_mesa_texformat_z24_s8;
1566 default:
1567 ; /* fallthrough */
1568 }
1569 }
1570
1571 #if FEATURE_EXT_texture_sRGB
1572 if (ctx->Extensions.EXT_texture_sRGB) {
1573 switch (internalFormat) {
1574 case GL_SRGB_EXT:
1575 case GL_SRGB8_EXT:
1576 return &_mesa_texformat_srgb8;
1577 case GL_SRGB_ALPHA_EXT:
1578 case GL_SRGB8_ALPHA8_EXT:
1579 return &_mesa_texformat_srgba8;
1580 case GL_SLUMINANCE_EXT:
1581 case GL_SLUMINANCE8_EXT:
1582 return &_mesa_texformat_sl8;
1583 case GL_SLUMINANCE_ALPHA_EXT:
1584 case GL_SLUMINANCE8_ALPHA8_EXT:
1585 return &_mesa_texformat_sla8;
1586 /* NOTE: not supporting any compression of sRGB at this time */
1587 case GL_COMPRESSED_SRGB_EXT:
1588 return &_mesa_texformat_srgb8;
1589 case GL_COMPRESSED_SRGB_ALPHA_EXT:
1590 return &_mesa_texformat_srgba8;
1591 case GL_COMPRESSED_SLUMINANCE_EXT:
1592 return &_mesa_texformat_sl8;
1593 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
1594 return &_mesa_texformat_sla8;
1595 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
1596 return &_mesa_texformat_srgb8;
1597 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
1598 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
1599 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
1600 return &_mesa_texformat_srgba8;
1601 default:
1602 ; /* fallthrough */
1603 }
1604 }
1605 #endif /* FEATURE_EXT_texture_sRGB */
1606
1607 _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
1608 return NULL;
1609 }
1610
1611
1612
1613 /**
1614 * Return datatype and number of components per texel for the
1615 * given gl_texture_format.
1616 */
1617 void
1618 _mesa_format_to_type_and_comps(const struct gl_texture_format *format,
1619 GLenum *datatype, GLuint *comps)
1620 {
1621 switch (format->MesaFormat) {
1622 case MESA_FORMAT_RGBA8888:
1623 case MESA_FORMAT_RGBA8888_REV:
1624 case MESA_FORMAT_ARGB8888:
1625 case MESA_FORMAT_ARGB8888_REV:
1626 *datatype = CHAN_TYPE;
1627 *comps = 4;
1628 return;
1629 case MESA_FORMAT_RGB888:
1630 case MESA_FORMAT_BGR888:
1631 *datatype = GL_UNSIGNED_BYTE;
1632 *comps = 3;
1633 return;
1634 case MESA_FORMAT_RGB565:
1635 case MESA_FORMAT_RGB565_REV:
1636 *datatype = GL_UNSIGNED_SHORT_5_6_5;
1637 *comps = 3;
1638 return;
1639
1640 case MESA_FORMAT_ARGB4444:
1641 case MESA_FORMAT_ARGB4444_REV:
1642 *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
1643 *comps = 4;
1644 return;
1645
1646 case MESA_FORMAT_ARGB1555:
1647 case MESA_FORMAT_ARGB1555_REV:
1648 *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
1649 *comps = 3;
1650 return;
1651
1652 case MESA_FORMAT_AL88:
1653 case MESA_FORMAT_AL88_REV:
1654 *datatype = GL_UNSIGNED_BYTE;
1655 *comps = 2;
1656 return;
1657 case MESA_FORMAT_RGB332:
1658 *datatype = GL_UNSIGNED_BYTE_3_3_2;
1659 *comps = 3;
1660 return;
1661
1662 case MESA_FORMAT_A8:
1663 case MESA_FORMAT_L8:
1664 case MESA_FORMAT_I8:
1665 case MESA_FORMAT_CI8:
1666 *datatype = GL_UNSIGNED_BYTE;
1667 *comps = 1;
1668 return;
1669
1670 case MESA_FORMAT_YCBCR:
1671 case MESA_FORMAT_YCBCR_REV:
1672 *datatype = GL_UNSIGNED_SHORT;
1673 *comps = 2;
1674 return;
1675
1676 case MESA_FORMAT_Z24_S8:
1677 *datatype = GL_UNSIGNED_INT;
1678 *comps = 1; /* XXX OK? */
1679 return;
1680
1681 case MESA_FORMAT_S8_Z24:
1682 *datatype = GL_UNSIGNED_INT;
1683 *comps = 1; /* XXX OK? */
1684 return;
1685
1686 case MESA_FORMAT_Z16:
1687 *datatype = GL_UNSIGNED_SHORT;
1688 *comps = 1;
1689 return;
1690
1691 case MESA_FORMAT_Z32:
1692 *datatype = GL_UNSIGNED_INT;
1693 *comps = 1;
1694 return;
1695
1696 case MESA_FORMAT_SRGB8:
1697 *datatype = GL_UNSIGNED_BYTE;
1698 *comps = 3;
1699 return;
1700 case MESA_FORMAT_SRGBA8:
1701 *datatype = GL_UNSIGNED_BYTE;
1702 *comps = 4;
1703 return;
1704 case MESA_FORMAT_SL8:
1705 *datatype = GL_UNSIGNED_BYTE;
1706 *comps = 1;
1707 return;
1708 case MESA_FORMAT_SLA8:
1709 *datatype = GL_UNSIGNED_BYTE;
1710 *comps = 2;
1711 return;
1712
1713 case MESA_FORMAT_RGB_FXT1:
1714 case MESA_FORMAT_RGBA_FXT1:
1715 case MESA_FORMAT_RGB_DXT1:
1716 case MESA_FORMAT_RGBA_DXT1:
1717 case MESA_FORMAT_RGBA_DXT3:
1718 case MESA_FORMAT_RGBA_DXT5:
1719 /* XXX generate error instead? */
1720 *datatype = GL_UNSIGNED_BYTE;
1721 *comps = 0;
1722 return;
1723
1724 case MESA_FORMAT_RGBA:
1725 *datatype = CHAN_TYPE;
1726 *comps = 4;
1727 return;
1728 case MESA_FORMAT_RGB:
1729 *datatype = CHAN_TYPE;
1730 *comps = 3;
1731 return;
1732 case MESA_FORMAT_LUMINANCE_ALPHA:
1733 *datatype = CHAN_TYPE;
1734 *comps = 2;
1735 return;
1736 case MESA_FORMAT_ALPHA:
1737 case MESA_FORMAT_LUMINANCE:
1738 case MESA_FORMAT_INTENSITY:
1739 *datatype = CHAN_TYPE;
1740 *comps = 1;
1741 return;
1742
1743 case MESA_FORMAT_RGBA_FLOAT32:
1744 *datatype = GL_FLOAT;
1745 *comps = 4;
1746 return;
1747 case MESA_FORMAT_RGBA_FLOAT16:
1748 *datatype = GL_HALF_FLOAT_ARB;
1749 *comps = 4;
1750 return;
1751 case MESA_FORMAT_RGB_FLOAT32:
1752 *datatype = GL_FLOAT;
1753 *comps = 3;
1754 return;
1755 case MESA_FORMAT_RGB_FLOAT16:
1756 *datatype = GL_HALF_FLOAT_ARB;
1757 *comps = 3;
1758 return;
1759 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
1760 *datatype = GL_FLOAT;
1761 *comps = 2;
1762 return;
1763 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
1764 *datatype = GL_HALF_FLOAT_ARB;
1765 *comps = 2;
1766 return;
1767 case MESA_FORMAT_ALPHA_FLOAT32:
1768 case MESA_FORMAT_LUMINANCE_FLOAT32:
1769 case MESA_FORMAT_INTENSITY_FLOAT32:
1770 *datatype = GL_FLOAT;
1771 *comps = 1;
1772 return;
1773 case MESA_FORMAT_ALPHA_FLOAT16:
1774 case MESA_FORMAT_LUMINANCE_FLOAT16:
1775 case MESA_FORMAT_INTENSITY_FLOAT16:
1776 *datatype = GL_HALF_FLOAT_ARB;
1777 *comps = 1;
1778 return;
1779
1780 default:
1781 _mesa_problem(NULL, "bad format in _mesa_format_to_type_and_comps");
1782 *datatype = 0;
1783 *comps = 1;
1784 }
1785 }