texformat.c revision 090e212c0c5e54156c3c33f7eecdfe01398a7222
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 */
47static INLINE GLfloat
48nonlinear_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 */
89static 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
100static 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
111static 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
141const 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
165const 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
189const 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
213const 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
237const 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
261const 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
288const 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
312const 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
336const 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
360const 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
386const 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
410const 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
434const 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
458const 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
482const 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
506const 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
530const 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
554const 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
578const 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
602const 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
626const 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
650const 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
682const 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
706const 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
730const 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
754const 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
778const 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
802const 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
826const 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
850const 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
874const 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
898const 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
922const 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
946const 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
970const 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
994const 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
1018const 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
1042const 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
1066const 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
1090const 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
1114const 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
1138const 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
1162const 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
1186const 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
1210const 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
1234const 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
1258const 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
1289const 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 */
1331const 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 */
1613void
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}
1788