texformat.c revision 63b5b8eaff13b671fc1c749741f57fd7ed5890f8
1/*
2 * Mesa 3-D graphics library
3 * Version:  6.5
4 *
5 * Copyright (C) 1999-2005  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
41/* Texel fetch routines for all supported formats
42 */
43#define DIM 1
44#include "texformat_tmp.h"
45
46#define DIM 2
47#include "texformat_tmp.h"
48
49#define DIM 3
50#include "texformat_tmp.h"
51
52/**
53 * Null texel fetch function.
54 *
55 * Have to have this so the FetchTexel function pointer is never NULL.
56 */
57static void fetch_null_texel( const struct gl_texture_image *texImage,
58			      GLint i, GLint j, GLint k, GLchan *texel )
59{
60   (void) texImage; (void) i; (void) j; (void) k;
61   texel[RCOMP] = 0;
62   texel[GCOMP] = 0;
63   texel[BCOMP] = 0;
64   texel[ACOMP] = 0;
65   _mesa_warning(NULL, "fetch_null_texel() called!");
66}
67
68static void fetch_null_texelf( const struct gl_texture_image *texImage,
69                               GLint i, GLint j, GLint k, GLfloat *texel )
70{
71   (void) texImage; (void) i; (void) j; (void) k;
72   texel[RCOMP] = 0.0;
73   texel[GCOMP] = 0.0;
74   texel[BCOMP] = 0.0;
75   texel[ACOMP] = 0.0;
76   _mesa_warning(NULL, "fetch_null_texelf() called!");
77}
78
79static void store_null_texel(struct gl_texture_image *texImage,
80                             GLint i, GLint j, GLint k, const void *texel)
81{
82   /* no-op */
83}
84
85
86/**
87 * Notes about the predefined gl_texture_formats:
88 *
89 * 1. There are 1D, 2D and 3D functions for fetching texels from texture
90 *    images, returning both GLchan values and GLfloat values.  (six
91 *    functions in total)
92 *    You don't have to provide both the GLchan and GLfloat functions;
93 *    just one or the other is OK.  Mesa will use an "adaptor" to convert
94 *    between GLchan/GLfloat when needed.
95 *    Since the adaptors have small performance penalty, we provide both
96 *    GLchan and GLfloat functions for some common formats like RGB, RGBA.
97 */
98
99
100/***************************************************************/
101/** \name Default GLchan-based formats */
102/*@{*/
103
104const struct gl_texture_format _mesa_texformat_rgba = {
105   MESA_FORMAT_RGBA,			/* MesaFormat */
106   GL_RGBA,				/* BaseFormat */
107   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
108   CHAN_BITS,				/* RedBits */
109   CHAN_BITS,				/* GreenBits */
110   CHAN_BITS,				/* BlueBits */
111   CHAN_BITS,				/* AlphaBits */
112   0,					/* LuminanceBits */
113   0,					/* IntensityBits */
114   0,					/* IndexBits */
115   0,					/* DepthBits */
116   4 * sizeof(GLchan),			/* TexelBytes */
117   _mesa_texstore_rgba,			/* StoreTexImageFunc */
118   fetch_texel_1d_rgba,			/* FetchTexel1D */
119   fetch_texel_2d_rgba,			/* FetchTexel2D */
120   fetch_texel_3d_rgba,			/* FetchTexel3D */
121   fetch_texel_1d_f_rgba,		/* FetchTexel1Df */
122   fetch_texel_2d_f_rgba,		/* FetchTexel2Df */
123   fetch_texel_3d_f_rgba,		/* FetchTexel3Df */
124   store_texel_rgba			/* StoreTexel */
125};
126
127const struct gl_texture_format _mesa_texformat_rgb = {
128   MESA_FORMAT_RGB,			/* MesaFormat */
129   GL_RGB,				/* BaseFormat */
130   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
131   CHAN_BITS,				/* RedBits */
132   CHAN_BITS,				/* GreenBits */
133   CHAN_BITS,				/* BlueBits */
134   0,					/* AlphaBits */
135   0,					/* LuminanceBits */
136   0,					/* IntensityBits */
137   0,					/* IndexBits */
138   0,					/* DepthBits */
139   3 * sizeof(GLchan),			/* TexelBytes */
140   _mesa_texstore_rgba,/*yes*/		/* StoreTexImageFunc */
141   fetch_texel_1d_rgb,			/* FetchTexel1D */
142   fetch_texel_2d_rgb,			/* FetchTexel2D */
143   fetch_texel_3d_rgb,			/* FetchTexel3D */
144   fetch_texel_1d_f_rgb,		/* FetchTexel1Df */
145   fetch_texel_2d_f_rgb,		/* FetchTexel2Df */
146   fetch_texel_3d_f_rgb,		/* FetchTexel3Df */
147   store_texel_rgb			/* StoreTexel */
148};
149
150const struct gl_texture_format _mesa_texformat_alpha = {
151   MESA_FORMAT_ALPHA,			/* MesaFormat */
152   GL_ALPHA,				/* BaseFormat */
153   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
154   0,					/* RedBits */
155   0,					/* GreenBits */
156   0,					/* BlueBits */
157   CHAN_BITS,				/* AlphaBits */
158   0,					/* LuminanceBits */
159   0,					/* IntensityBits */
160   0,					/* IndexBits */
161   0,					/* DepthBits */
162   sizeof(GLchan),			/* TexelBytes */
163   _mesa_texstore_rgba,/*yes*/		/* StoreTexImageFunc */
164   fetch_texel_1d_alpha,		/* FetchTexel1D */
165   fetch_texel_2d_alpha,		/* FetchTexel2D */
166   fetch_texel_3d_alpha,		/* FetchTexel3D */
167   NULL,				/* FetchTexel1Df */
168   NULL,				/* FetchTexel2Df */
169   NULL,				/* FetchTexel3Df */
170   store_texel_alpha			/* StoreTexel */
171};
172
173const struct gl_texture_format _mesa_texformat_luminance = {
174   MESA_FORMAT_LUMINANCE,		/* MesaFormat */
175   GL_LUMINANCE,			/* BaseFormat */
176   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
177   0,					/* RedBits */
178   0,					/* GreenBits */
179   0,					/* BlueBits */
180   0,					/* AlphaBits */
181   CHAN_BITS,				/* LuminanceBits */
182   0,					/* IntensityBits */
183   0,					/* IndexBits */
184   0,					/* DepthBits */
185   sizeof(GLchan),			/* TexelBytes */
186   _mesa_texstore_rgba,/*yes*/		/* StoreTexImageFunc */
187   fetch_texel_1d_luminance,		/* FetchTexel1D */
188   fetch_texel_2d_luminance,		/* FetchTexel2D */
189   fetch_texel_3d_luminance,		/* FetchTexel3D */
190   NULL,				/* FetchTexel1Df */
191   NULL,				/* FetchTexel2Df */
192   NULL,				/* FetchTexel3Df */
193   store_texel_luminance		/* StoreTexel */
194};
195
196const struct gl_texture_format _mesa_texformat_luminance_alpha = {
197   MESA_FORMAT_LUMINANCE_ALPHA,		/* MesaFormat */
198   GL_LUMINANCE_ALPHA,			/* BaseFormat */
199   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
200   0,					/* RedBits */
201   0,					/* GreenBits */
202   0,					/* BlueBits */
203   CHAN_BITS,				/* AlphaBits */
204   CHAN_BITS,				/* LuminanceBits */
205   0,					/* IntensityBits */
206   0,					/* IndexBits */
207   0,					/* DepthBits */
208   2 * sizeof(GLchan),			/* TexelBytes */
209   _mesa_texstore_rgba,/*yes*/		/* StoreTexImageFunc */
210   fetch_texel_1d_luminance_alpha,	/* FetchTexel1D */
211   fetch_texel_2d_luminance_alpha,	/* FetchTexel2D */
212   fetch_texel_3d_luminance_alpha,	/* FetchTexel3D */
213   NULL,				/* FetchTexel1Df */
214   NULL,				/* FetchTexel2Df */
215   NULL,				/* FetchTexel3Df */
216   store_texel_luminance_alpha		/* StoreTexel */
217};
218
219const struct gl_texture_format _mesa_texformat_intensity = {
220   MESA_FORMAT_INTENSITY,		/* MesaFormat */
221   GL_INTENSITY,			/* BaseFormat */
222   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
223   0,					/* RedBits */
224   0,					/* GreenBits */
225   0,					/* BlueBits */
226   0,					/* AlphaBits */
227   0,					/* LuminanceBits */
228   CHAN_BITS,				/* IntensityBits */
229   0,					/* IndexBits */
230   0,					/* DepthBits */
231   sizeof(GLchan),			/* TexelBytes */
232   _mesa_texstore_rgba,/*yes*/		/* StoreTexImageFunc */
233   fetch_texel_1d_intensity,		/* FetchTexel1D */
234   fetch_texel_2d_intensity,		/* FetchTexel2D */
235   fetch_texel_3d_intensity,		/* FetchTexel3D */
236   NULL,				/* FetchTexel1Df */
237   NULL,				/* FetchTexel2Df */
238   NULL,				/* FetchTexel3Df */
239   store_texel_intensity		/* StoreTexel */
240};
241
242const struct gl_texture_format _mesa_texformat_depth_component_float32 = {
243   MESA_FORMAT_DEPTH_COMPONENT_FLOAT32,	/* MesaFormat */
244   GL_DEPTH_COMPONENT,			/* BaseFormat */
245   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
246   0,					/* RedBits */
247   0,					/* GreenBits */
248   0,					/* BlueBits */
249   0,					/* AlphaBits */
250   0,					/* LuminanceBits */
251   0,					/* IntensityBits */
252   0,					/* IndexBits */
253   sizeof(GLfloat) * 8,			/* DepthBits */
254   sizeof(GLfloat),			/* TexelBytes */
255   _mesa_texstore_depth_component_float32,/* StoreTexImageFunc */
256   NULL,				/* FetchTexel1D */
257   NULL,				/* FetchTexel1D */
258   NULL,				/* FetchTexel1D */
259   fetch_texel_1d_f_depth_component_f32,/* FetchTexel1Df */
260   fetch_texel_2d_f_depth_component_f32,/* FetchTexel2Df */
261   fetch_texel_3d_f_depth_component_f32,/* FetchTexel3Df */
262   store_texel_depth_component_f32	/* StoreTexel */
263};
264
265const struct gl_texture_format _mesa_texformat_depth_component16 = {
266   MESA_FORMAT_DEPTH_COMPONENT16,	/* MesaFormat */
267   GL_DEPTH_COMPONENT,			/* BaseFormat */
268   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
269   0,					/* RedBits */
270   0,					/* GreenBits */
271   0,					/* BlueBits */
272   0,					/* AlphaBits */
273   0,					/* LuminanceBits */
274   0,					/* IntensityBits */
275   0,					/* IndexBits */
276   sizeof(GLushort) * 8,		/* DepthBits */
277   sizeof(GLushort),			/* TexelBytes */
278   _mesa_texstore_depth_component16,	/* StoreTexImageFunc */
279   NULL,				/* FetchTexel1D */
280   NULL,				/* FetchTexel1D */
281   NULL,				/* FetchTexel1D */
282   fetch_texel_1d_f_depth_component16,	/* FetchTexel1Df */
283   fetch_texel_2d_f_depth_component16,	/* FetchTexel2Df */
284   fetch_texel_3d_f_depth_component16,	/* FetchTexel3Df */
285   store_texel_depth_component16	/* StoreTexel */
286};
287
288const struct gl_texture_format _mesa_texformat_rgba_float32 = {
289   MESA_FORMAT_RGBA_FLOAT32,		/* MesaFormat */
290   GL_RGBA,				/* BaseFormat */
291   GL_FLOAT,				/* DataType */
292   8 * sizeof(GLfloat),			/* RedBits */
293   8 * sizeof(GLfloat),			/* GreenBits */
294   8 * sizeof(GLfloat),			/* BlueBits */
295   8 * sizeof(GLfloat),			/* AlphaBits */
296   0,					/* LuminanceBits */
297   0,					/* IntensityBits */
298   0,					/* IndexBits */
299   0,					/* DepthBits */
300   4 * sizeof(GLfloat),			/* TexelBytes */
301   _mesa_texstore_rgba_float32,		/* StoreTexImageFunc */
302   NULL,				/* FetchTexel1D */
303   NULL,				/* FetchTexel1D */
304   NULL,				/* FetchTexel1D */
305   fetch_texel_1d_f_rgba_f32,		/* FetchTexel1Df */
306   fetch_texel_2d_f_rgba_f32,		/* FetchTexel2Df */
307   fetch_texel_3d_f_rgba_f32,		/* FetchTexel3Df */
308   store_texel_rgba_f32			/* StoreTexel */
309};
310
311const struct gl_texture_format _mesa_texformat_rgba_float16 = {
312   MESA_FORMAT_RGBA_FLOAT16,		/* MesaFormat */
313   GL_RGBA,				/* BaseFormat */
314   GL_FLOAT,				/* DataType */
315   8 * sizeof(GLhalfARB),		/* RedBits */
316   8 * sizeof(GLhalfARB),		/* GreenBits */
317   8 * sizeof(GLhalfARB),		/* BlueBits */
318   8 * sizeof(GLhalfARB),		/* AlphaBits */
319   0,					/* LuminanceBits */
320   0,					/* IntensityBits */
321   0,					/* IndexBits */
322   0,					/* DepthBits */
323   4 * sizeof(GLhalfARB),		/* TexelBytes */
324   _mesa_texstore_rgba_float16,		/* StoreTexImageFunc */
325   NULL,				/* FetchTexel1D */
326   NULL,				/* FetchTexel1D */
327   NULL,				/* FetchTexel1D */
328   fetch_texel_1d_f_rgba_f16,		/* FetchTexel1Df */
329   fetch_texel_2d_f_rgba_f16,		/* FetchTexel2Df */
330   fetch_texel_3d_f_rgba_f16,		/* FetchTexel3Df */
331   store_texel_rgba_f16			/* StoreTexel */
332};
333
334const struct gl_texture_format _mesa_texformat_rgb_float32 = {
335   MESA_FORMAT_RGB_FLOAT32,		/* MesaFormat */
336   GL_RGB,				/* BaseFormat */
337   GL_FLOAT,				/* DataType */
338   8 * sizeof(GLfloat),			/* RedBits */
339   8 * sizeof(GLfloat),			/* GreenBits */
340   8 * sizeof(GLfloat),			/* BlueBits */
341   0,					/* AlphaBits */
342   0,					/* LuminanceBits */
343   0,					/* IntensityBits */
344   0,					/* IndexBits */
345   0,					/* DepthBits */
346   3 * sizeof(GLfloat),			/* TexelBytes */
347   _mesa_texstore_rgba_float32,/*yes*/	/* StoreTexImageFunc */
348   NULL,				/* FetchTexel1D */
349   NULL,				/* FetchTexel1D */
350   NULL,				/* FetchTexel1D */
351   fetch_texel_1d_f_rgb_f32,		/* FetchTexel1Df */
352   fetch_texel_2d_f_rgb_f32,		/* FetchTexel2Df */
353   fetch_texel_3d_f_rgb_f32,		/* FetchTexel3Df */
354   store_texel_rgb_f32			/* StoreTexel */
355};
356
357const struct gl_texture_format _mesa_texformat_rgb_float16 = {
358   MESA_FORMAT_RGB_FLOAT16,		/* MesaFormat */
359   GL_RGB,				/* BaseFormat */
360   GL_FLOAT,				/* DataType */
361   8 * sizeof(GLhalfARB),		/* RedBits */
362   8 * sizeof(GLhalfARB),		/* GreenBits */
363   8 * sizeof(GLhalfARB),		/* BlueBits */
364   0,					/* AlphaBits */
365   0,					/* LuminanceBits */
366   0,					/* IntensityBits */
367   0,					/* IndexBits */
368   0,					/* DepthBits */
369   3 * sizeof(GLhalfARB),		/* TexelBytes */
370   _mesa_texstore_rgba_float16,/*yes*/	/* StoreTexImageFunc */
371   NULL,				/* FetchTexel1D */
372   NULL,				/* FetchTexel1D */
373   NULL,				/* FetchTexel1D */
374   fetch_texel_1d_f_rgb_f16,		/* FetchTexel1Df */
375   fetch_texel_2d_f_rgb_f16,		/* FetchTexel2Df */
376   fetch_texel_3d_f_rgb_f16,		/* FetchTexel3Df */
377   store_texel_rgb_f16			/* StoreTexel */
378};
379
380const struct gl_texture_format _mesa_texformat_alpha_float32 = {
381   MESA_FORMAT_ALPHA_FLOAT32,		/* MesaFormat */
382   GL_ALPHA,				/* BaseFormat */
383   GL_FLOAT,				/* DataType */
384   0,					/* RedBits */
385   0,					/* GreenBits */
386   0,					/* BlueBits */
387   8 * sizeof(GLfloat),			/* AlphaBits */
388   0,					/* LuminanceBits */
389   0,					/* IntensityBits */
390   0,					/* IndexBits */
391   0,					/* DepthBits */
392   1 * sizeof(GLfloat),			/* TexelBytes */
393   _mesa_texstore_rgba_float32,/*yes*/	/* StoreTexImageFunc */
394   NULL,				/* FetchTexel1D */
395   NULL,				/* FetchTexel1D */
396   NULL,				/* FetchTexel1D */
397   fetch_texel_1d_f_alpha_f32,		/* FetchTexel1Df */
398   fetch_texel_2d_f_alpha_f32,		/* FetchTexel2Df */
399   fetch_texel_3d_f_alpha_f32,		/* FetchTexel3Df */
400   store_texel_alpha_f32		/* StoreTexel */
401};
402
403const struct gl_texture_format _mesa_texformat_alpha_float16 = {
404   MESA_FORMAT_ALPHA_FLOAT16,		/* MesaFormat */
405   GL_ALPHA,				/* BaseFormat */
406   GL_FLOAT,				/* DataType */
407   0,					/* RedBits */
408   0,					/* GreenBits */
409   0,					/* BlueBits */
410   8 * sizeof(GLhalfARB),		/* AlphaBits */
411   0,					/* LuminanceBits */
412   0,					/* IntensityBits */
413   0,					/* IndexBits */
414   0,					/* DepthBits */
415   1 * sizeof(GLhalfARB),		/* TexelBytes */
416   _mesa_texstore_rgba_float16,/*yes*/	/* StoreTexImageFunc */
417   NULL,				/* FetchTexel1D */
418   NULL,				/* FetchTexel1D */
419   NULL,				/* FetchTexel1D */
420   fetch_texel_1d_f_alpha_f16,		/* FetchTexel1Df */
421   fetch_texel_2d_f_alpha_f16,		/* FetchTexel2Df */
422   fetch_texel_3d_f_alpha_f16,		/* FetchTexel3Df */
423   store_texel_alpha_f16		/* StoreTexel */
424};
425
426const struct gl_texture_format _mesa_texformat_luminance_float32 = {
427   MESA_FORMAT_LUMINANCE_FLOAT32,	/* MesaFormat */
428   GL_LUMINANCE,			/* BaseFormat */
429   GL_FLOAT,				/* DataType */
430   0,					/* RedBits */
431   0,					/* GreenBits */
432   0,					/* BlueBits */
433   0,					/* AlphaBits */
434   8 * sizeof(GLfloat),			/* LuminanceBits */
435   0,					/* IntensityBits */
436   0,					/* IndexBits */
437   0,					/* DepthBits */
438   1 * sizeof(GLfloat),			/* TexelBytes */
439   _mesa_texstore_rgba_float32,/*yes*/	/* StoreTexImageFunc */
440   NULL,				/* FetchTexel1D */
441   NULL,				/* FetchTexel2D */
442   NULL,				/* FetchTexel3D */
443   fetch_texel_1d_f_luminance_f32,	/* FetchTexel1Df */
444   fetch_texel_2d_f_luminance_f32,	/* FetchTexel2Df */
445   fetch_texel_3d_f_luminance_f32,	/* FetchTexel3Df */
446   store_texel_luminance_f32		/* StoreTexel */
447};
448
449const struct gl_texture_format _mesa_texformat_luminance_float16 = {
450   MESA_FORMAT_LUMINANCE_FLOAT16,	/* MesaFormat */
451   GL_LUMINANCE,			/* BaseFormat */
452   GL_FLOAT,				/* DataType */
453   0,					/* RedBits */
454   0,					/* GreenBits */
455   0,					/* BlueBits */
456   0,					/* AlphaBits */
457   8 * sizeof(GLhalfARB),		/* LuminanceBits */
458   0,					/* IntensityBits */
459   0,					/* IndexBits */
460   0,					/* DepthBits */
461   1 * sizeof(GLhalfARB),		/* TexelBytes */
462   _mesa_texstore_rgba_float16,/*yes*/	/* StoreTexImageFunc */
463   NULL,				/* FetchTexel1D */
464   NULL,				/* FetchTexel2D */
465   NULL,				/* FetchTexel3D */
466   fetch_texel_1d_f_luminance_f16,	/* FetchTexel1Df */
467   fetch_texel_2d_f_luminance_f16,	/* FetchTexel2Df */
468   fetch_texel_3d_f_luminance_f16,	/* FetchTexel3Df */
469   store_texel_luminance_f16		/* StoreTexel */
470};
471
472const struct gl_texture_format _mesa_texformat_luminance_alpha_float32 = {
473   MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32,	/* MesaFormat */
474   GL_LUMINANCE_ALPHA,			/* BaseFormat */
475   GL_FLOAT,				/* DataType */
476   0,					/* RedBits */
477   0,					/* GreenBits */
478   0,					/* BlueBits */
479   8 * sizeof(GLfloat),			/* AlphaBits */
480   8 * sizeof(GLfloat),			/* LuminanceBits */
481   0,					/* IntensityBits */
482   0,					/* IndexBits */
483   0,					/* DepthBits */
484   2 * sizeof(GLfloat),			/* TexelBytes */
485   _mesa_texstore_rgba_float32,		/* StoreTexImageFunc */
486   NULL,				/* FetchTexel1D */
487   NULL,				/* FetchTexel2D */
488   NULL,				/* FetchTexel3D */
489   fetch_texel_1d_f_luminance_alpha_f32,/* FetchTexel1Df */
490   fetch_texel_2d_f_luminance_alpha_f32,/* FetchTexel2Df */
491   fetch_texel_3d_f_luminance_alpha_f32,/* FetchTexel3Df */
492   store_texel_luminance_alpha_f32	/* StoreTexel */
493};
494
495const struct gl_texture_format _mesa_texformat_luminance_alpha_float16 = {
496   MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,	/* MesaFormat */
497   GL_LUMINANCE_ALPHA,			/* BaseFormat */
498   GL_FLOAT,				/* DataType */
499   0,					/* RedBits */
500   0,					/* GreenBits */
501   0,					/* BlueBits */
502   8 * sizeof(GLhalfARB),		/* AlphaBits */
503   8 * sizeof(GLhalfARB),		/* LuminanceBits */
504   0,					/* IntensityBits */
505   0,					/* IndexBits */
506   0,					/* DepthBits */
507   2 * sizeof(GLhalfARB),		/* TexelBytes */
508   _mesa_texstore_rgba_float16,		/* StoreTexImageFunc */
509   NULL,				/* FetchTexel1D */
510   NULL,				/* FetchTexel2D */
511   NULL,				/* FetchTexel3D */
512   fetch_texel_1d_f_luminance_alpha_f16,/* FetchTexel1Df */
513   fetch_texel_2d_f_luminance_alpha_f16,/* FetchTexel2Df */
514   fetch_texel_3d_f_luminance_alpha_f16,/* FetchTexel3Df */
515   store_texel_luminance_alpha_f16	/* StoreTexel */
516};
517
518const struct gl_texture_format _mesa_texformat_intensity_float32 = {
519   MESA_FORMAT_INTENSITY_FLOAT32,	/* MesaFormat */
520   GL_INTENSITY,			/* BaseFormat */
521   GL_FLOAT,				/* DataType */
522   0,					/* RedBits */
523   0,					/* GreenBits */
524   0,					/* BlueBits */
525   0,					/* AlphaBits */
526   0,					/* LuminanceBits */
527   8 * sizeof(GLfloat),			/* IntensityBits */
528   0,					/* IndexBits */
529   0,					/* DepthBits */
530   1 * sizeof(GLfloat),			/* TexelBytes */
531   _mesa_texstore_rgba_float32,/*yes*/	/* StoreTexImageFunc */
532   NULL,				/* FetchTexel1D */
533   NULL,				/* FetchTexel2D */
534   NULL,				/* FetchTexel3D */
535   fetch_texel_1d_f_intensity_f32,	/* FetchTexel1Df */
536   fetch_texel_2d_f_intensity_f32,	/* FetchTexel2Df */
537   fetch_texel_3d_f_intensity_f32,	/* FetchTexel3Df */
538   store_texel_intensity_f32		/* StoreTexel */
539};
540
541const struct gl_texture_format _mesa_texformat_intensity_float16 = {
542   MESA_FORMAT_INTENSITY_FLOAT16,	/* MesaFormat */
543   GL_INTENSITY,			/* BaseFormat */
544   GL_FLOAT,				/* DataType */
545   0,					/* RedBits */
546   0,					/* GreenBits */
547   0,					/* BlueBits */
548   0,					/* AlphaBits */
549   0,					/* LuminanceBits */
550   8 * sizeof(GLhalfARB),		/* IntensityBits */
551   0,					/* IndexBits */
552   0,					/* DepthBits */
553   1 * sizeof(GLhalfARB),		/* TexelBytes */
554   _mesa_texstore_rgba_float16,/*yes*/	/* StoreTexImageFunc */
555   NULL,				/* FetchTexel1D */
556   NULL,				/* FetchTexel2D */
557   NULL,				/* FetchTexel3D */
558   fetch_texel_1d_f_intensity_f16,	/* FetchTexel1Df */
559   fetch_texel_2d_f_intensity_f16,	/* FetchTexel2Df */
560   fetch_texel_3d_f_intensity_f16,	/* FetchTexel3Df */
561   store_texel_intensity_f16		/* StoreTexel */
562};
563
564
565/*@}*/
566
567
568/***************************************************************/
569/** \name Hardware formats */
570/*@{*/
571
572const struct gl_texture_format _mesa_texformat_rgba8888 = {
573   MESA_FORMAT_RGBA8888,		/* MesaFormat */
574   GL_RGBA,				/* BaseFormat */
575   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
576   8,					/* RedBits */
577   8,					/* GreenBits */
578   8,					/* BlueBits */
579   8,					/* AlphaBits */
580   0,					/* LuminanceBits */
581   0,					/* IntensityBits */
582   0,					/* IndexBits */
583   0,					/* DepthBits */
584   4,					/* TexelBytes */
585   _mesa_texstore_rgba8888,		/* StoreTexImageFunc */
586   fetch_texel_1d_rgba8888,		/* FetchTexel1D */
587   fetch_texel_2d_rgba8888,		/* FetchTexel2D */
588   fetch_texel_3d_rgba8888,		/* FetchTexel3D */
589   NULL,				/* FetchTexel1Df */
590   NULL,				/* FetchTexel2Df */
591   NULL,				/* FetchTexel3Df */
592   store_texel_rgba8888			/* StoreTexel */
593};
594
595const struct gl_texture_format _mesa_texformat_rgba8888_rev = {
596   MESA_FORMAT_RGBA8888_REV,		/* MesaFormat */
597   GL_RGBA,				/* BaseFormat */
598   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
599   8,					/* RedBits */
600   8,					/* GreenBits */
601   8,					/* BlueBits */
602   8,					/* AlphaBits */
603   0,					/* LuminanceBits */
604   0,					/* IntensityBits */
605   0,					/* IndexBits */
606   0,					/* DepthBits */
607   4,					/* TexelBytes */
608   _mesa_texstore_rgba8888,		/* StoreTexImageFunc */
609   fetch_texel_1d_rgba8888_rev,		/* FetchTexel1D */
610   fetch_texel_2d_rgba8888_rev,		/* FetchTexel2D */
611   fetch_texel_3d_rgba8888_rev,		/* FetchTexel3D */
612   NULL,				/* FetchTexel1Df */
613   NULL,				/* FetchTexel2Df */
614   NULL,				/* FetchTexel3Df */
615   store_texel_rgba8888_rev		/* StoreTexel */
616};
617
618const struct gl_texture_format _mesa_texformat_argb8888 = {
619   MESA_FORMAT_ARGB8888,		/* MesaFormat */
620   GL_RGBA,				/* BaseFormat */
621   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
622   8,					/* RedBits */
623   8,					/* GreenBits */
624   8,					/* BlueBits */
625   8,					/* AlphaBits */
626   0,					/* LuminanceBits */
627   0,					/* IntensityBits */
628   0,					/* IndexBits */
629   0,					/* DepthBits */
630   4,					/* TexelBytes */
631   _mesa_texstore_argb8888,		/* StoreTexImageFunc */
632   fetch_texel_1d_argb8888,		/* FetchTexel1D */
633   fetch_texel_2d_argb8888,		/* FetchTexel2D */
634   fetch_texel_3d_argb8888,		/* FetchTexel3D */
635   NULL,				/* FetchTexel1Df */
636   NULL,				/* FetchTexel2Df */
637   NULL,				/* FetchTexel3Df */
638   store_texel_argb8888			/* StoreTexel */
639};
640
641const struct gl_texture_format _mesa_texformat_argb8888_rev = {
642   MESA_FORMAT_ARGB8888_REV,		/* MesaFormat */
643   GL_RGBA,				/* BaseFormat */
644   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
645   8,					/* RedBits */
646   8,					/* GreenBits */
647   8,					/* BlueBits */
648   8,					/* AlphaBits */
649   0,					/* LuminanceBits */
650   0,					/* IntensityBits */
651   0,					/* IndexBits */
652   0,					/* DepthBits */
653   4,					/* TexelBytes */
654   _mesa_texstore_argb8888,		/* StoreTexImageFunc */
655   fetch_texel_1d_argb8888_rev,		/* FetchTexel1D */
656   fetch_texel_2d_argb8888_rev,		/* FetchTexel2D */
657   fetch_texel_3d_argb8888_rev,		/* FetchTexel3D */
658   NULL,				/* FetchTexel1Df */
659   NULL,				/* FetchTexel2Df */
660   NULL,				/* FetchTexel3Df */
661   store_texel_argb8888_rev		/* StoreTexel */
662};
663
664const struct gl_texture_format _mesa_texformat_rgb888 = {
665   MESA_FORMAT_RGB888,			/* MesaFormat */
666   GL_RGB,				/* BaseFormat */
667   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
668   8,					/* RedBits */
669   8,					/* GreenBits */
670   8,					/* BlueBits */
671   0,					/* AlphaBits */
672   0,					/* LuminanceBits */
673   0,					/* IntensityBits */
674   0,					/* IndexBits */
675   0,					/* DepthBits */
676   3,					/* TexelBytes */
677   _mesa_texstore_rgb888,		/* StoreTexImageFunc */
678   fetch_texel_1d_rgb888,		/* FetchTexel1D */
679   fetch_texel_2d_rgb888,		/* FetchTexel2D */
680   fetch_texel_3d_rgb888,		/* FetchTexel3D */
681   NULL,				/* FetchTexel1Df */
682   NULL,				/* FetchTexel2Df */
683   NULL,				/* FetchTexel3Df */
684   store_texel_rgb888			/* StoreTexel */
685};
686
687const struct gl_texture_format _mesa_texformat_bgr888 = {
688   MESA_FORMAT_BGR888,			/* MesaFormat */
689   GL_RGB,				/* BaseFormat */
690   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
691   8,					/* RedBits */
692   8,					/* GreenBits */
693   8,					/* BlueBits */
694   0,					/* AlphaBits */
695   0,					/* LuminanceBits */
696   0,					/* IntensityBits */
697   0,					/* IndexBits */
698   0,					/* DepthBits */
699   3,					/* TexelBytes */
700   _mesa_texstore_bgr888,		/* StoreTexImageFunc */
701   fetch_texel_1d_bgr888,		/* FetchTexel1D */
702   fetch_texel_2d_bgr888,		/* FetchTexel2D */
703   fetch_texel_3d_bgr888,		/* FetchTexel3D */
704   NULL,				/* FetchTexel1Df */
705   NULL,				/* FetchTexel2Df */
706   NULL,				/* FetchTexel3Df */
707   store_texel_bgr888			/* StoreTexel */
708};
709
710const struct gl_texture_format _mesa_texformat_rgb565 = {
711   MESA_FORMAT_RGB565,			/* MesaFormat */
712   GL_RGB,				/* BaseFormat */
713   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
714   5,					/* RedBits */
715   6,					/* GreenBits */
716   5,					/* BlueBits */
717   0,					/* AlphaBits */
718   0,					/* LuminanceBits */
719   0,					/* IntensityBits */
720   0,					/* IndexBits */
721   0,					/* DepthBits */
722   2,					/* TexelBytes */
723   _mesa_texstore_rgb565,		/* StoreTexImageFunc */
724   fetch_texel_1d_rgb565,		/* FetchTexel1D */
725   fetch_texel_2d_rgb565,		/* FetchTexel2D */
726   fetch_texel_3d_rgb565,		/* FetchTexel3D */
727   NULL,				/* FetchTexel1Df */
728   NULL,				/* FetchTexel2Df */
729   NULL,				/* FetchTexel3Df */
730   store_texel_rgb565			/* StoreTexel */
731};
732
733const struct gl_texture_format _mesa_texformat_rgb565_rev = {
734   MESA_FORMAT_RGB565_REV,		/* MesaFormat */
735   GL_RGB,				/* BaseFormat */
736   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
737   5,					/* RedBits */
738   6,					/* GreenBits */
739   5,					/* BlueBits */
740   0,					/* AlphaBits */
741   0,					/* LuminanceBits */
742   0,					/* IntensityBits */
743   0,					/* IndexBits */
744   0,					/* DepthBits */
745   2,					/* TexelBytes */
746   _mesa_texstore_rgb565,		/* StoreTexImageFunc */
747   fetch_texel_1d_rgb565_rev,		/* FetchTexel1D */
748   fetch_texel_2d_rgb565_rev,		/* FetchTexel2D */
749   fetch_texel_3d_rgb565_rev,		/* FetchTexel3D */
750   NULL,				/* FetchTexel1Df */
751   NULL,				/* FetchTexel2Df */
752   NULL,				/* FetchTexel3Df */
753   store_texel_rgb565_rev		/* StoreTexel */
754};
755
756const struct gl_texture_format _mesa_texformat_argb4444 = {
757   MESA_FORMAT_ARGB4444,		/* MesaFormat */
758   GL_RGBA,				/* BaseFormat */
759   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
760   4,					/* RedBits */
761   4,					/* GreenBits */
762   4,					/* BlueBits */
763   4,					/* AlphaBits */
764   0,					/* LuminanceBits */
765   0,					/* IntensityBits */
766   0,					/* IndexBits */
767   0,					/* DepthBits */
768   2,					/* TexelBytes */
769   _mesa_texstore_argb4444,		/* StoreTexImageFunc */
770   fetch_texel_1d_argb4444,		/* FetchTexel1D */
771   fetch_texel_2d_argb4444,		/* FetchTexel2D */
772   fetch_texel_3d_argb4444,		/* FetchTexel3D */
773   NULL,				/* FetchTexel1Df */
774   NULL,				/* FetchTexel2Df */
775   NULL,				/* FetchTexel3Df */
776   store_texel_argb4444			/* StoreTexel */
777};
778
779const struct gl_texture_format _mesa_texformat_argb4444_rev = {
780   MESA_FORMAT_ARGB4444_REV,		/* MesaFormat */
781   GL_RGBA,				/* BaseFormat */
782   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
783   4,					/* RedBits */
784   4,					/* GreenBits */
785   4,					/* BlueBits */
786   4,					/* AlphaBits */
787   0,					/* LuminanceBits */
788   0,					/* IntensityBits */
789   0,					/* IndexBits */
790   0,					/* DepthBits */
791   2,					/* TexelBytes */
792   _mesa_texstore_argb4444,		/* StoreTexImageFunc */
793   fetch_texel_1d_argb4444_rev,		/* FetchTexel1D */
794   fetch_texel_2d_argb4444_rev,		/* FetchTexel2D */
795   fetch_texel_3d_argb4444_rev,		/* FetchTexel3D */
796   NULL,				/* FetchTexel1Df */
797   NULL,				/* FetchTexel2Df */
798   NULL,				/* FetchTexel3Df */
799   store_texel_argb4444_rev		/* StoreTexel */
800};
801
802const struct gl_texture_format _mesa_texformat_argb1555 = {
803   MESA_FORMAT_ARGB1555,		/* MesaFormat */
804   GL_RGBA,				/* BaseFormat */
805   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
806   5,					/* RedBits */
807   5,					/* GreenBits */
808   5,					/* BlueBits */
809   1,					/* AlphaBits */
810   0,					/* LuminanceBits */
811   0,					/* IntensityBits */
812   0,					/* IndexBits */
813   0,					/* DepthBits */
814   2,					/* TexelBytes */
815   _mesa_texstore_argb1555,		/* StoreTexImageFunc */
816   fetch_texel_1d_argb1555,		/* FetchTexel1D */
817   fetch_texel_2d_argb1555,		/* FetchTexel2D */
818   fetch_texel_3d_argb1555,		/* FetchTexel3D */
819   NULL,				/* FetchTexel1Df */
820   NULL,				/* FetchTexel2Df */
821   NULL,				/* FetchTexel3Df */
822   store_texel_argb1555			/* StoreTexel */
823};
824
825const struct gl_texture_format _mesa_texformat_argb1555_rev = {
826   MESA_FORMAT_ARGB1555_REV,		/* MesaFormat */
827   GL_RGBA,				/* BaseFormat */
828   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
829   5,					/* RedBits */
830   5,					/* GreenBits */
831   5,					/* BlueBits */
832   1,					/* AlphaBits */
833   0,					/* LuminanceBits */
834   0,					/* IntensityBits */
835   0,					/* IndexBits */
836   0,					/* DepthBits */
837   2,					/* TexelBytes */
838   _mesa_texstore_argb1555,		/* StoreTexImageFunc */
839   fetch_texel_1d_argb1555_rev,		/* FetchTexel1D */
840   fetch_texel_2d_argb1555_rev,		/* FetchTexel2D */
841   fetch_texel_3d_argb1555_rev,		/* FetchTexel3D */
842   NULL,				/* FetchTexel1Df */
843   NULL,				/* FetchTexel2Df */
844   NULL,				/* FetchTexel3Df */
845   store_texel_argb1555_rev		/* StoreTexel */
846};
847
848const struct gl_texture_format _mesa_texformat_al88 = {
849   MESA_FORMAT_AL88,			/* MesaFormat */
850   GL_LUMINANCE_ALPHA,			/* BaseFormat */
851   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
852   0,					/* RedBits */
853   0,					/* GreenBits */
854   0,					/* BlueBits */
855   8,					/* AlphaBits */
856   8,					/* LuminanceBits */
857   0,					/* IntensityBits */
858   0,					/* IndexBits */
859   0,					/* DepthBits */
860   2,					/* TexelBytes */
861   _mesa_texstore_al88,			/* StoreTexImageFunc */
862   fetch_texel_1d_al88,			/* FetchTexel1D */
863   fetch_texel_2d_al88,			/* FetchTexel2D */
864   fetch_texel_3d_al88,			/* FetchTexel3D */
865   NULL,				/* FetchTexel1Df */
866   NULL,				/* FetchTexel2Df */
867   NULL,				/* FetchTexel3Df */
868   store_texel_al88			/* StoreTexel */
869};
870
871const struct gl_texture_format _mesa_texformat_al88_rev = {
872   MESA_FORMAT_AL88_REV,		/* MesaFormat */
873   GL_LUMINANCE_ALPHA,			/* BaseFormat */
874   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
875   0,					/* RedBits */
876   0,					/* GreenBits */
877   0,					/* BlueBits */
878   8,					/* AlphaBits */
879   8,					/* LuminanceBits */
880   0,					/* IntensityBits */
881   0,					/* IndexBits */
882   0,					/* DepthBits */
883   2,					/* TexelBytes */
884   _mesa_texstore_al88,			/* StoreTexImageFunc */
885   fetch_texel_1d_al88_rev,		/* FetchTexel1D */
886   fetch_texel_2d_al88_rev,		/* FetchTexel2D */
887   fetch_texel_3d_al88_rev,		/* FetchTexel3D */
888   NULL,				/* FetchTexel1Df */
889   NULL,				/* FetchTexel2Df */
890   NULL,				/* FetchTexel3Df */
891   store_texel_al88_rev			/* StoreTexel */
892};
893
894const struct gl_texture_format _mesa_texformat_rgb332 = {
895   MESA_FORMAT_RGB332,			/* MesaFormat */
896   GL_RGB,				/* BaseFormat */
897   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
898   3,					/* RedBits */
899   3,					/* GreenBits */
900   2,					/* BlueBits */
901   0,					/* AlphaBits */
902   0,					/* LuminanceBits */
903   0,					/* IntensityBits */
904   0,					/* IndexBits */
905   0,					/* DepthBits */
906   1,					/* TexelBytes */
907   _mesa_texstore_rgb332,		/* StoreTexImageFunc */
908   fetch_texel_1d_rgb332,		/* FetchTexel1D */
909   fetch_texel_2d_rgb332,		/* FetchTexel2D */
910   fetch_texel_3d_rgb332,		/* FetchTexel3D */
911   NULL,				/* FetchTexel1Df */
912   NULL,				/* FetchTexel2Df */
913   NULL,				/* FetchTexel3Df */
914   store_texel_rgb332			/* StoreTexel */
915};
916
917const struct gl_texture_format _mesa_texformat_a8 = {
918   MESA_FORMAT_A8,			/* MesaFormat */
919   GL_ALPHA,				/* BaseFormat */
920   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
921   0,					/* RedBits */
922   0,					/* GreenBits */
923   0,					/* BlueBits */
924   8,					/* AlphaBits */
925   0,					/* LuminanceBits */
926   0,					/* IntensityBits */
927   0,					/* IndexBits */
928   0,					/* DepthBits */
929   1,					/* TexelBytes */
930   _mesa_texstore_a8,			/* StoreTexImageFunc */
931   fetch_texel_1d_a8,			/* FetchTexel1D */
932   fetch_texel_2d_a8,			/* FetchTexel2D */
933   fetch_texel_3d_a8,			/* FetchTexel3D */
934   NULL,				/* FetchTexel1Df */
935   NULL,				/* FetchTexel2Df */
936   NULL,				/* FetchTexel3Df */
937   store_texel_a8			/* StoreTexel */
938};
939
940const struct gl_texture_format _mesa_texformat_l8 = {
941   MESA_FORMAT_L8,			/* MesaFormat */
942   GL_LUMINANCE,			/* BaseFormat */
943   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
944   0,					/* RedBits */
945   0,					/* GreenBits */
946   0,					/* BlueBits */
947   0,					/* AlphaBits */
948   8,					/* LuminanceBits */
949   0,					/* IntensityBits */
950   0,					/* IndexBits */
951   0,					/* DepthBits */
952   1,					/* TexelBytes */
953   _mesa_texstore_a8,/*yes*/		/* StoreTexImageFunc */
954   fetch_texel_1d_l8,			/* FetchTexel1D */
955   fetch_texel_2d_l8,			/* FetchTexel2D */
956   fetch_texel_3d_l8,			/* FetchTexel3D */
957   NULL,				/* FetchTexel1Df */
958   NULL,				/* FetchTexel2Df */
959   NULL,				/* FetchTexel3Df */
960   store_texel_l8			/* StoreTexel */
961};
962
963const struct gl_texture_format _mesa_texformat_i8 = {
964   MESA_FORMAT_I8,			/* MesaFormat */
965   GL_INTENSITY,			/* BaseFormat */
966   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
967   0,					/* RedBits */
968   0,					/* GreenBits */
969   0,					/* BlueBits */
970   0,					/* AlphaBits */
971   0,					/* LuminanceBits */
972   8,					/* IntensityBits */
973   0,					/* IndexBits */
974   0,					/* DepthBits */
975   1,					/* TexelBytes */
976   _mesa_texstore_a8,/*yes*/		/* StoreTexImageFunc */
977   fetch_texel_1d_i8,			/* FetchTexel1D */
978   fetch_texel_2d_i8,			/* FetchTexel2D */
979   fetch_texel_3d_i8,			/* FetchTexel3D */
980   NULL,				/* FetchTexel1Df */
981   NULL,				/* FetchTexel2Df */
982   NULL,				/* FetchTexel3Df */
983   store_texel_i8			/* StoreTexel */
984};
985
986const struct gl_texture_format _mesa_texformat_ci8 = {
987   MESA_FORMAT_CI8,			/* MesaFormat */
988   GL_COLOR_INDEX,			/* BaseFormat */
989   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
990   0,					/* RedBits */
991   0,					/* GreenBits */
992   0,					/* BlueBits */
993   0,					/* AlphaBits */
994   0,					/* LuminanceBits */
995   0,					/* IntensityBits */
996   8,					/* IndexBits */
997   0,					/* DepthBits */
998   1,					/* TexelBytes */
999   _mesa_texstore_ci8,			/* StoreTexImageFunc */
1000   fetch_texel_1d_ci8,			/* FetchTexel1D */
1001   fetch_texel_2d_ci8,			/* FetchTexel2D */
1002   fetch_texel_3d_ci8,			/* FetchTexel3D */
1003   NULL,				/* FetchTexel1Df */
1004   NULL,				/* FetchTexel2Df */
1005   NULL,				/* FetchTexel3Df */
1006   store_texel_ci8			/* StoreTexel */
1007};
1008
1009const struct gl_texture_format _mesa_texformat_ycbcr = {
1010   MESA_FORMAT_YCBCR,			/* MesaFormat */
1011   GL_YCBCR_MESA,			/* BaseFormat */
1012   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
1013   0,					/* RedBits */
1014   0,					/* GreenBits */
1015   0,					/* BlueBits */
1016   0,					/* AlphaBits */
1017   0,					/* LuminanceBits */
1018   0,					/* IntensityBits */
1019   0,					/* IndexBits */
1020   0,					/* DepthBits */
1021   2,					/* TexelBytes */
1022   _mesa_texstore_ycbcr,		/* StoreTexImageFunc */
1023   fetch_texel_1d_ycbcr,		/* FetchTexel1D */
1024   fetch_texel_2d_ycbcr,		/* FetchTexel2D */
1025   fetch_texel_3d_ycbcr,		/* FetchTexel3D */
1026   NULL,				/* FetchTexel1Df */
1027   NULL,				/* FetchTexel2Df */
1028   NULL,				/* FetchTexel3Df */
1029   store_texel_ycbcr			/* StoreTexel */
1030};
1031
1032const struct gl_texture_format _mesa_texformat_ycbcr_rev = {
1033   MESA_FORMAT_YCBCR_REV,		/* MesaFormat */
1034   GL_YCBCR_MESA,			/* BaseFormat */
1035   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */
1036   0,					/* RedBits */
1037   0,					/* GreenBits */
1038   0,					/* BlueBits */
1039   0,					/* AlphaBits */
1040   0,					/* LuminanceBits */
1041   0,					/* IntensityBits */
1042   0,					/* IndexBits */
1043   0,					/* DepthBits */
1044   2,					/* TexelBytes */
1045   _mesa_texstore_ycbcr,		/* StoreTexImageFunc */
1046   fetch_texel_1d_ycbcr_rev,		/* FetchTexel1D */
1047   fetch_texel_2d_ycbcr_rev,		/* FetchTexel2D */
1048   fetch_texel_3d_ycbcr_rev,		/* FetchTexel3D */
1049   NULL,				/* FetchTexel1Df */
1050   NULL,				/* FetchTexel2Df */
1051   NULL,				/* FetchTexel3Df */
1052   store_texel_ycbcr_rev		/* StoreTexel */
1053};
1054
1055/*@}*/
1056
1057
1058/***************************************************************/
1059/** \name Null format (useful for proxy textures) */
1060/*@{*/
1061
1062const struct gl_texture_format _mesa_null_texformat = {
1063   -1,					/* MesaFormat */
1064   0,					/* BaseFormat */
1065   GL_NONE,				/* DataType */
1066   0,					/* RedBits */
1067   0,					/* GreenBits */
1068   0,					/* BlueBits */
1069   0,					/* AlphaBits */
1070   0,					/* LuminanceBits */
1071   0,					/* IntensityBits */
1072   0,					/* IndexBits */
1073   0,					/* DepthBits */
1074   0,					/* TexelBytes */
1075   NULL,				/* StoreTexImageFunc */
1076   fetch_null_texel,			/* FetchTexel1D */
1077   fetch_null_texel,			/* FetchTexel2D */
1078   fetch_null_texel,			/* FetchTexel3D */
1079   fetch_null_texelf,			/* FetchTexel1Df */
1080   fetch_null_texelf,			/* FetchTexel2Df */
1081   fetch_null_texelf,			/* FetchTexel3Df */
1082   store_null_texel			/* StoreTexel */
1083};
1084
1085/*@}*/
1086
1087
1088/**
1089 * Choose an appropriate texture format given the format, type and
1090 * internalFormat parameters passed to glTexImage().
1091 *
1092 * \param ctx  the GL context.
1093 * \param internalFormat  user's prefered internal texture format.
1094 * \param format  incoming image pixel format.
1095 * \param type  incoming image data type.
1096 *
1097 * \return a pointer to a gl_texture_format object which describes the
1098 * choosen texture format, or NULL on failure.
1099 *
1100 * This is called via dd_function_table::ChooseTextureFormat.  Hardware drivers
1101 * will typically override this function with a specialized version.
1102 */
1103const struct gl_texture_format *
1104_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
1105                         GLenum format, GLenum type )
1106{
1107   (void) format;
1108   (void) type;
1109
1110   switch (internalFormat) {
1111      /* RGBA formats */
1112      case 4:
1113      case GL_RGBA:
1114      case GL_RGB10_A2:
1115      case GL_RGBA12:
1116      case GL_RGBA16:
1117         return &_mesa_texformat_rgba;
1118      case GL_RGBA8:
1119         return &_mesa_texformat_rgba8888;
1120      case GL_RGB5_A1:
1121         return &_mesa_texformat_argb1555;
1122      case GL_RGBA2:
1123         return &_mesa_texformat_argb4444_rev; /* just to test another format*/
1124      case GL_RGBA4:
1125         return &_mesa_texformat_argb4444;
1126
1127      /* RGB formats */
1128      case 3:
1129      case GL_RGB:
1130      case GL_RGB10:
1131      case GL_RGB12:
1132      case GL_RGB16:
1133         return &_mesa_texformat_rgb;
1134      case GL_RGB8:
1135         return &_mesa_texformat_rgb888;
1136      case GL_R3_G3_B2:
1137         return &_mesa_texformat_rgb332;
1138      case GL_RGB4:
1139         return &_mesa_texformat_rgb565_rev; /* just to test another format */
1140      case GL_RGB5:
1141         return &_mesa_texformat_rgb565;
1142
1143      /* Alpha formats */
1144      case GL_ALPHA:
1145      case GL_ALPHA4:
1146      case GL_ALPHA12:
1147      case GL_ALPHA16:
1148         return &_mesa_texformat_alpha;
1149      case GL_ALPHA8:
1150         return &_mesa_texformat_a8;
1151
1152      /* Luminance formats */
1153      case 1:
1154      case GL_LUMINANCE:
1155      case GL_LUMINANCE4:
1156      case GL_LUMINANCE12:
1157      case GL_LUMINANCE16:
1158         return &_mesa_texformat_luminance;
1159      case GL_LUMINANCE8:
1160         return &_mesa_texformat_l8;
1161
1162      /* Luminance/Alpha formats */
1163      case 2:
1164      case GL_LUMINANCE_ALPHA:
1165      case GL_LUMINANCE4_ALPHA4:
1166      case GL_LUMINANCE6_ALPHA2:
1167      case GL_LUMINANCE12_ALPHA4:
1168      case GL_LUMINANCE12_ALPHA12:
1169      case GL_LUMINANCE16_ALPHA16:
1170         return &_mesa_texformat_luminance_alpha;
1171      case GL_LUMINANCE8_ALPHA8:
1172         return &_mesa_texformat_al88;
1173
1174      case GL_INTENSITY:
1175      case GL_INTENSITY4:
1176      case GL_INTENSITY12:
1177      case GL_INTENSITY16:
1178         return &_mesa_texformat_intensity;
1179      case GL_INTENSITY8:
1180         return &_mesa_texformat_i8;
1181
1182      case GL_COLOR_INDEX:
1183      case GL_COLOR_INDEX1_EXT:
1184      case GL_COLOR_INDEX2_EXT:
1185      case GL_COLOR_INDEX4_EXT:
1186      case GL_COLOR_INDEX12_EXT:
1187      case GL_COLOR_INDEX16_EXT:
1188      case GL_COLOR_INDEX8_EXT:
1189         return &_mesa_texformat_ci8;
1190
1191      default:
1192         ; /* fallthrough */
1193   }
1194
1195   if (ctx->Extensions.SGIX_depth_texture ||
1196       ctx->Extensions.ARB_depth_texture) {
1197      switch (internalFormat) {
1198         case GL_DEPTH_COMPONENT:
1199         case GL_DEPTH_COMPONENT24_SGIX:
1200         case GL_DEPTH_COMPONENT32_SGIX:
1201            return &_mesa_texformat_depth_component_float32;
1202         case GL_DEPTH_COMPONENT16_SGIX:
1203            return &_mesa_texformat_depth_component16;
1204         default:
1205            ; /* fallthrough */
1206      }
1207   }
1208
1209   if (ctx->Extensions.ARB_texture_compression) {
1210      switch (internalFormat) {
1211         case GL_COMPRESSED_ALPHA_ARB:
1212            return &_mesa_texformat_alpha;
1213         case GL_COMPRESSED_LUMINANCE_ARB:
1214            return &_mesa_texformat_luminance;
1215         case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
1216            return &_mesa_texformat_luminance_alpha;
1217         case GL_COMPRESSED_INTENSITY_ARB:
1218            return &_mesa_texformat_intensity;
1219         case GL_COMPRESSED_RGB_ARB:
1220            if (ctx->Extensions.TDFX_texture_compression_FXT1)
1221               return &_mesa_texformat_rgb_fxt1;
1222            else if (ctx->Extensions.EXT_texture_compression_s3tc ||
1223                     ctx->Extensions.S3_s3tc)
1224               return &_mesa_texformat_rgb_dxt1;
1225            else
1226               return &_mesa_texformat_rgb;
1227         case GL_COMPRESSED_RGBA_ARB:
1228            if (ctx->Extensions.TDFX_texture_compression_FXT1)
1229               return &_mesa_texformat_rgba_fxt1;
1230            else if (ctx->Extensions.EXT_texture_compression_s3tc ||
1231                     ctx->Extensions.S3_s3tc)
1232               return &_mesa_texformat_rgba_dxt3; /* Not rgba_dxt1, see spec */
1233            else
1234               return &_mesa_texformat_rgba;
1235         default:
1236            ; /* fallthrough */
1237      }
1238   }
1239
1240   if (ctx->Extensions.MESA_ycbcr_texture) {
1241      if (internalFormat == GL_YCBCR_MESA) {
1242         if (type == GL_UNSIGNED_SHORT_8_8_MESA)
1243            return &_mesa_texformat_ycbcr;
1244         else
1245            return &_mesa_texformat_ycbcr_rev;
1246      }
1247   }
1248
1249   if (ctx->Extensions.TDFX_texture_compression_FXT1) {
1250      switch (internalFormat) {
1251         case GL_COMPRESSED_RGB_FXT1_3DFX:
1252            return &_mesa_texformat_rgb_fxt1;
1253         case GL_COMPRESSED_RGBA_FXT1_3DFX:
1254            return &_mesa_texformat_rgba_fxt1;
1255         default:
1256            ; /* fallthrough */
1257      }
1258   }
1259
1260   if (ctx->Extensions.EXT_texture_compression_s3tc) {
1261      switch (internalFormat) {
1262         case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1263            return &_mesa_texformat_rgb_dxt1;
1264         case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1265            return &_mesa_texformat_rgba_dxt1;
1266         case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
1267            return &_mesa_texformat_rgba_dxt3;
1268         case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
1269            return &_mesa_texformat_rgba_dxt5;
1270         default:
1271            ; /* fallthrough */
1272      }
1273   }
1274
1275   if (ctx->Extensions.S3_s3tc) {
1276      switch (internalFormat) {
1277         case GL_RGB_S3TC:
1278         case GL_RGB4_S3TC:
1279            return &_mesa_texformat_rgb_dxt1;
1280         case GL_RGBA_S3TC:
1281         case GL_RGBA4_S3TC:
1282            return &_mesa_texformat_rgba_dxt3;
1283         default:
1284            ; /* fallthrough */
1285      }
1286   }
1287
1288   if (ctx->Extensions.ARB_texture_float) {
1289      switch (internalFormat) {
1290         case GL_ALPHA16F_ARB:
1291            return &_mesa_texformat_alpha_float16;
1292         case GL_ALPHA32F_ARB:
1293            return &_mesa_texformat_alpha_float32;
1294         case GL_LUMINANCE16F_ARB:
1295            return &_mesa_texformat_luminance_float16;
1296         case GL_LUMINANCE32F_ARB:
1297            return &_mesa_texformat_luminance_float32;
1298         case GL_LUMINANCE_ALPHA16F_ARB:
1299            return &_mesa_texformat_luminance_alpha_float16;
1300         case GL_LUMINANCE_ALPHA32F_ARB:
1301            return &_mesa_texformat_luminance_alpha_float32;
1302         case GL_INTENSITY16F_ARB:
1303            return &_mesa_texformat_intensity_float16;
1304         case GL_INTENSITY32F_ARB:
1305            return &_mesa_texformat_intensity_float32;
1306         case GL_RGB16F_ARB:
1307            return &_mesa_texformat_rgb_float16;
1308         case GL_RGB32F_ARB:
1309            return &_mesa_texformat_rgb_float32;
1310         case GL_RGBA16F_ARB:
1311            return &_mesa_texformat_rgba_float16;
1312         case GL_RGBA32F_ARB:
1313            return &_mesa_texformat_rgba_float32;
1314         default:
1315            ; /* fallthrough */
1316      }
1317   }
1318
1319   _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
1320   return NULL;
1321}
1322