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