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