texformat.c revision 3c63452e64df7e10aa073c6c3b9492b1d7dabbb8
1/* $Id: texformat.c,v 1.17 2002/10/24 23:57:21 brianp Exp $ */
2
3/*
4 * Mesa 3-D graphics library
5 * Version:  3.5
6 *
7 * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 * Author:
27 *    Gareth Hughes <gareth@valinux.com>
28 */
29
30#include "glheader.h"
31#include "colormac.h"
32#include "context.h"
33#include "image.h"
34#include "imports.h"
35#include "mmath.h"
36#include "mtypes.h"
37#include "texformat.h"
38#include "teximage.h"
39#include "texstate.h"
40
41
42/* Texel fetch routines for all supported formats:
43 */
44#define DIM 1
45#include "texformat_tmp.h"
46
47#define DIM 2
48#include "texformat_tmp.h"
49
50#define DIM 3
51#include "texformat_tmp.h"
52
53/* Have to have this so the FetchTexel function pointer is never NULL.
54 */
55static void fetch_null_texel( const struct gl_texture_image *texImage,
56			      GLint i, GLint j, GLint k, GLvoid *texel )
57{
58   GLchan *rgba = (GLchan *) texel;
59   rgba[RCOMP] = 0;
60   rgba[GCOMP] = 0;
61   rgba[BCOMP] = 0;
62   rgba[ACOMP] = 0;
63}
64
65
66/* =============================================================
67 * Default GLchan-based formats:
68 */
69
70const struct gl_texture_format _mesa_texformat_rgba = {
71   MESA_FORMAT_RGBA,			/* MesaFormat */
72   GL_RGBA,				/* BaseFormat */
73   CHAN_BITS,				/* RedBits */
74   CHAN_BITS,				/* GreenBits */
75   CHAN_BITS,				/* BlueBits */
76   CHAN_BITS,				/* AlphaBits */
77   0,					/* LuminanceBits */
78   0,					/* IntensityBits */
79   0,					/* IndexBits */
80   0,					/* DepthBits */
81   4 * CHAN_BITS / 8,			/* TexelBytes */
82   fetch_1d_texel_rgba,			/* FetchTexel1D */
83   fetch_2d_texel_rgba,			/* FetchTexel2D */
84   fetch_3d_texel_rgba,			/* FetchTexel3D */
85};
86
87const struct gl_texture_format _mesa_texformat_rgb = {
88   MESA_FORMAT_RGB,			/* MesaFormat */
89   GL_RGB,				/* BaseFormat */
90   CHAN_BITS,				/* RedBits */
91   CHAN_BITS,				/* GreenBits */
92   CHAN_BITS,				/* BlueBits */
93   0,					/* AlphaBits */
94   0,					/* LuminanceBits */
95   0,					/* IntensityBits */
96   0,					/* IndexBits */
97   0,					/* DepthBits */
98   3 * CHAN_BITS / 8,			/* TexelBytes */
99   fetch_1d_texel_rgb,			/* FetchTexel1D */
100   fetch_2d_texel_rgb,			/* FetchTexel2D */
101   fetch_3d_texel_rgb,			/* FetchTexel3D */
102};
103
104const struct gl_texture_format _mesa_texformat_alpha = {
105   MESA_FORMAT_ALPHA,			/* MesaFormat */
106   GL_ALPHA,				/* BaseFormat */
107   0,					/* RedBits */
108   0,					/* GreenBits */
109   0,					/* BlueBits */
110   CHAN_BITS,				/* AlphaBits */
111   0,					/* LuminanceBits */
112   0,					/* IntensityBits */
113   0,					/* IndexBits */
114   0,					/* DepthBits */
115   CHAN_BITS / 8,			/* TexelBytes */
116   fetch_1d_texel_alpha,		/* FetchTexel1D */
117   fetch_2d_texel_alpha,		/* FetchTexel2D */
118   fetch_3d_texel_alpha,		/* FetchTexel3D */
119};
120
121const struct gl_texture_format _mesa_texformat_luminance = {
122   MESA_FORMAT_LUMINANCE,		/* MesaFormat */
123   GL_LUMINANCE,			/* BaseFormat */
124   0,					/* RedBits */
125   0,					/* GreenBits */
126   0,					/* BlueBits */
127   0,					/* AlphaBits */
128   CHAN_BITS,				/* LuminanceBits */
129   0,					/* IntensityBits */
130   0,					/* IndexBits */
131   0,					/* DepthBits */
132   CHAN_BITS / 8,			/* TexelBytes */
133   fetch_1d_texel_luminance,		/* FetchTexel1D */
134   fetch_2d_texel_luminance,		/* FetchTexel2D */
135   fetch_3d_texel_luminance,		/* FetchTexel3D */
136};
137
138const struct gl_texture_format _mesa_texformat_luminance_alpha = {
139   MESA_FORMAT_LUMINANCE_ALPHA,		/* MesaFormat */
140   GL_LUMINANCE_ALPHA,			/* BaseFormat */
141   0,					/* RedBits */
142   0,					/* GreenBits */
143   0,					/* BlueBits */
144   CHAN_BITS,				/* AlphaBits */
145   CHAN_BITS,				/* LuminanceBits */
146   0,					/* IntensityBits */
147   0,					/* IndexBits */
148   0,					/* DepthBits */
149   2 * CHAN_BITS / 8,			/* TexelBytes */
150   fetch_1d_texel_luminance_alpha,	/* FetchTexel1D */
151   fetch_2d_texel_luminance_alpha,	/* FetchTexel2D */
152   fetch_3d_texel_luminance_alpha,	/* FetchTexel3D */
153};
154
155const struct gl_texture_format _mesa_texformat_intensity = {
156   MESA_FORMAT_INTENSITY,		/* MesaFormat */
157   GL_INTENSITY,			/* BaseFormat */
158   0,					/* RedBits */
159   0,					/* GreenBits */
160   0,					/* BlueBits */
161   0,					/* AlphaBits */
162   0,					/* LuminanceBits */
163   CHAN_BITS,				/* IntensityBits */
164   0,					/* IndexBits */
165   0,					/* DepthBits */
166   CHAN_BITS / 8,			/* TexelBytes */
167   fetch_1d_texel_intensity,		/* FetchTexel1D */
168   fetch_2d_texel_intensity,		/* FetchTexel2D */
169   fetch_3d_texel_intensity,		/* FetchTexel3D */
170};
171
172const struct gl_texture_format _mesa_texformat_color_index = {
173   MESA_FORMAT_COLOR_INDEX,		/* MesaFormat */
174   GL_COLOR_INDEX,			/* BaseFormat */
175   0,					/* RedBits */
176   0,					/* GreenBits */
177   0,					/* BlueBits */
178   0,					/* AlphaBits */
179   0,					/* LuminanceBits */
180   0,					/* IntensityBits */
181   CHAN_BITS,				/* IndexBits */
182   0,					/* DepthBits */
183   CHAN_BITS / 8,			/* TexelBytes */
184   fetch_1d_texel_color_index,		/* FetchTexel1D */
185   fetch_2d_texel_color_index,		/* FetchTexel2D */
186   fetch_3d_texel_color_index,		/* FetchTexel3D */
187};
188
189const struct gl_texture_format _mesa_texformat_depth_component = {
190   MESA_FORMAT_DEPTH_COMPONENT,		/* MesaFormat */
191   GL_DEPTH_COMPONENT,			/* BaseFormat */
192   0,					/* RedBits */
193   0,					/* GreenBits */
194   0,					/* BlueBits */
195   0,					/* AlphaBits */
196   0,					/* LuminanceBits */
197   0,					/* IntensityBits */
198   0,					/* IndexBits */
199   sizeof(GLfloat) * 8,			/* DepthBits */
200   sizeof(GLfloat),			/* TexelBytes */
201   fetch_1d_texel_depth_component,	/* FetchTexel1D */
202   fetch_2d_texel_depth_component,	/* FetchTexel2D */
203   fetch_3d_texel_depth_component,	/* FetchTexel3D */
204};
205
206
207/* =============================================================
208 * Hardware formats:
209 */
210
211const struct gl_texture_format _mesa_texformat_rgba8888 = {
212   MESA_FORMAT_RGBA8888,		/* MesaFormat */
213   GL_RGBA,				/* BaseFormat */
214   8,					/* RedBits */
215   8,					/* GreenBits */
216   8,					/* BlueBits */
217   8,					/* AlphaBits */
218   0,					/* LuminanceBits */
219   0,					/* IntensityBits */
220   0,					/* IndexBits */
221   0,					/* DepthBits */
222   4,					/* TexelBytes */
223   fetch_1d_texel_rgba8888,		/* FetchTexel1D */
224   fetch_2d_texel_rgba8888,		/* FetchTexel2D */
225   fetch_3d_texel_rgba8888,		/* FetchTexel3D */
226};
227
228const struct gl_texture_format _mesa_texformat_argb8888 = {
229   MESA_FORMAT_ARGB8888,		/* MesaFormat */
230   GL_RGBA,				/* BaseFormat */
231   8,					/* RedBits */
232   8,					/* GreenBits */
233   8,					/* BlueBits */
234   8,					/* AlphaBits */
235   0,					/* LuminanceBits */
236   0,					/* IntensityBits */
237   0,					/* IndexBits */
238   0,					/* DepthBits */
239   4,					/* TexelBytes */
240   fetch_1d_texel_argb8888,		/* FetchTexel1D */
241   fetch_2d_texel_argb8888,		/* FetchTexel2D */
242   fetch_3d_texel_argb8888,		/* FetchTexel3D */
243};
244
245const struct gl_texture_format _mesa_texformat_rgb888 = {
246   MESA_FORMAT_RGB888,			/* MesaFormat */
247   GL_RGB,				/* BaseFormat */
248   8,					/* RedBits */
249   8,					/* GreenBits */
250   8,					/* BlueBits */
251   0,					/* AlphaBits */
252   0,					/* LuminanceBits */
253   0,					/* IntensityBits */
254   0,					/* IndexBits */
255   0,					/* DepthBits */
256   3,					/* TexelBytes */
257   fetch_1d_texel_rgb888,		/* FetchTexel1D */
258   fetch_2d_texel_rgb888,		/* FetchTexel2D */
259   fetch_3d_texel_rgb888,		/* FetchTexel3D */
260};
261
262const struct gl_texture_format _mesa_texformat_rgb565 = {
263   MESA_FORMAT_RGB565,			/* MesaFormat */
264   GL_RGB,				/* BaseFormat */
265   5,					/* RedBits */
266   6,					/* GreenBits */
267   5,					/* BlueBits */
268   0,					/* AlphaBits */
269   0,					/* LuminanceBits */
270   0,					/* IntensityBits */
271   0,					/* IndexBits */
272   0,					/* DepthBits */
273   2,					/* TexelBytes */
274   fetch_1d_texel_rgb565,		/* FetchTexel1D */
275   fetch_2d_texel_rgb565,		/* FetchTexel2D */
276   fetch_3d_texel_rgb565,		/* FetchTexel3D */
277};
278
279const struct gl_texture_format _mesa_texformat_argb4444 = {
280   MESA_FORMAT_ARGB4444,		/* MesaFormat */
281   GL_RGBA,				/* BaseFormat */
282   4,					/* RedBits */
283   4,					/* GreenBits */
284   4,					/* BlueBits */
285   4,					/* AlphaBits */
286   0,					/* LuminanceBits */
287   0,					/* IntensityBits */
288   0,					/* IndexBits */
289   0,					/* DepthBits */
290   2,					/* TexelBytes */
291   fetch_1d_texel_argb4444,		/* FetchTexel1D */
292   fetch_2d_texel_argb4444,		/* FetchTexel2D */
293   fetch_3d_texel_argb4444,		/* FetchTexel3D */
294};
295
296const struct gl_texture_format _mesa_texformat_argb1555 = {
297   MESA_FORMAT_ARGB1555,		/* MesaFormat */
298   GL_RGBA,				/* BaseFormat */
299   5,					/* RedBits */
300   5,					/* GreenBits */
301   5,					/* BlueBits */
302   1,					/* AlphaBits */
303   0,					/* LuminanceBits */
304   0,					/* IntensityBits */
305   0,					/* IndexBits */
306   0,					/* DepthBits */
307   2,					/* TexelBytes */
308   fetch_1d_texel_argb1555,		/* FetchTexel1D */
309   fetch_2d_texel_argb1555,		/* FetchTexel2D */
310   fetch_3d_texel_argb1555,		/* FetchTexel3D */
311};
312
313const struct gl_texture_format _mesa_texformat_al88 = {
314   MESA_FORMAT_AL88,			/* MesaFormat */
315   GL_LUMINANCE_ALPHA,			/* BaseFormat */
316   0,					/* RedBits */
317   0,					/* GreenBits */
318   0,					/* BlueBits */
319   8,					/* AlphaBits */
320   8,					/* LuminanceBits */
321   0,					/* IntensityBits */
322   0,					/* IndexBits */
323   0,					/* DepthBits */
324   2,					/* TexelBytes */
325   fetch_1d_texel_al88,			/* FetchTexel1D */
326   fetch_2d_texel_al88,			/* FetchTexel2D */
327   fetch_3d_texel_al88,			/* FetchTexel3D */
328};
329
330const struct gl_texture_format _mesa_texformat_rgb332 = {
331   MESA_FORMAT_RGB332,			/* MesaFormat */
332   GL_RGB,				/* BaseFormat */
333   3,					/* RedBits */
334   3,					/* GreenBits */
335   2,					/* BlueBits */
336   0,					/* AlphaBits */
337   0,					/* LuminanceBits */
338   0,					/* IntensityBits */
339   0,					/* IndexBits */
340   0,					/* DepthBits */
341   1,					/* TexelBytes */
342   fetch_1d_texel_rgb332,		/* FetchTexel1D */
343   fetch_2d_texel_rgb332,		/* FetchTexel2D */
344   fetch_3d_texel_rgb332,		/* FetchTexel3D */
345};
346
347const struct gl_texture_format _mesa_texformat_a8 = {
348   MESA_FORMAT_A8,			/* MesaFormat */
349   GL_ALPHA,				/* BaseFormat */
350   0,					/* RedBits */
351   0,					/* GreenBits */
352   0,					/* BlueBits */
353   8,					/* AlphaBits */
354   0,					/* LuminanceBits */
355   0,					/* IntensityBits */
356   0,					/* IndexBits */
357   0,					/* DepthBits */
358   1,					/* TexelBytes */
359   fetch_1d_texel_a8,			/* FetchTexel1D */
360   fetch_2d_texel_a8,			/* FetchTexel2D */
361   fetch_3d_texel_a8,			/* FetchTexel3D */
362};
363
364const struct gl_texture_format _mesa_texformat_l8 = {
365   MESA_FORMAT_L8,			/* MesaFormat */
366   GL_LUMINANCE,			/* BaseFormat */
367   0,					/* RedBits */
368   0,					/* GreenBits */
369   0,					/* BlueBits */
370   0,					/* AlphaBits */
371   8,					/* LuminanceBits */
372   0,					/* IntensityBits */
373   0,					/* IndexBits */
374   0,					/* DepthBits */
375   1,					/* TexelBytes */
376   fetch_1d_texel_l8,			/* FetchTexel1D */
377   fetch_2d_texel_l8,			/* FetchTexel2D */
378   fetch_3d_texel_l8,			/* FetchTexel3D */
379};
380
381const struct gl_texture_format _mesa_texformat_i8 = {
382   MESA_FORMAT_I8,			/* MesaFormat */
383   GL_INTENSITY,			/* BaseFormat */
384   0,					/* RedBits */
385   0,					/* GreenBits */
386   0,					/* BlueBits */
387   0,					/* AlphaBits */
388   0,					/* LuminanceBits */
389   8,					/* IntensityBits */
390   0,					/* IndexBits */
391   0,					/* DepthBits */
392   1,					/* TexelBytes */
393   fetch_1d_texel_i8,			/* FetchTexel1D */
394   fetch_2d_texel_i8,			/* FetchTexel2D */
395   fetch_3d_texel_i8,			/* FetchTexel3D */
396};
397
398const struct gl_texture_format _mesa_texformat_ci8 = {
399   MESA_FORMAT_CI8,			/* MesaFormat */
400   GL_COLOR_INDEX,			/* BaseFormat */
401   0,					/* RedBits */
402   0,					/* GreenBits */
403   0,					/* BlueBits */
404   0,					/* AlphaBits */
405   0,					/* LuminanceBits */
406   0,					/* IntensityBits */
407   8,					/* IndexBits */
408   0,					/* DepthBits */
409   1,					/* TexelBytes */
410   fetch_1d_texel_ci8,			/* FetchTexel1D */
411   fetch_2d_texel_ci8,			/* FetchTexel2D */
412   fetch_3d_texel_ci8,			/* FetchTexel3D */
413};
414
415const struct gl_texture_format _mesa_texformat_ycbcr = {
416   MESA_FORMAT_YCBCR,			/* MesaFormat */
417   GL_YCBCR_MESA,			/* BaseFormat */
418   0,					/* RedBits */
419   0,					/* GreenBits */
420   0,					/* BlueBits */
421   0,					/* AlphaBits */
422   0,					/* LuminanceBits */
423   0,					/* IntensityBits */
424   0,					/* IndexBits */
425   0,					/* DepthBits */
426   2,					/* TexelBytes */
427   fetch_1d_texel_ycbcr,		/* FetchTexel1D */
428   fetch_2d_texel_ycbcr,		/* FetchTexel2D */
429   fetch_3d_texel_ycbcr,		/* FetchTexel3D */
430};
431
432
433const struct gl_texture_format _mesa_texformat_ycbcr_rev = {
434   MESA_FORMAT_YCBCR_REV,		/* MesaFormat */
435   GL_YCBCR_MESA,			/* BaseFormat */
436   0,					/* RedBits */
437   0,					/* GreenBits */
438   0,					/* BlueBits */
439   0,					/* AlphaBits */
440   0,					/* LuminanceBits */
441   0,					/* IntensityBits */
442   0,					/* IndexBits */
443   0,					/* DepthBits */
444   2,					/* TexelBytes */
445   fetch_1d_texel_ycbcr_rev,		/* FetchTexel1D */
446   fetch_2d_texel_ycbcr_rev,		/* FetchTexel2D */
447   fetch_3d_texel_ycbcr_rev,		/* FetchTexel3D */
448};
449
450
451/* Big-endian */
452#if 0
453const struct gl_texture_format _mesa_texformat_abgr8888 = {
454   MESA_FORMAT_ABGR8888,		/* MesaFormat */
455   GL_RGBA,				/* BaseFormat */
456   GL_UNSIGNED_INT_8_8_8_8,		/* Type */
457   8,					/* RedBits */
458   8,					/* GreenBits */
459   8,					/* BlueBits */
460   8,					/* AlphaBits */
461   0,					/* LuminanceBits */
462   0,					/* IntensityBits */
463   0,					/* IndexBits */
464   0,					/* DepthBits */
465   4,					/* TexelBytes */
466   fetch_1d_texel_abgr8888,		/* FetchTexel1D */
467   fetch_2d_texel_abgr8888,		/* FetchTexel2D */
468   fetch_3d_texel_abgr8888,		/* FetchTexel3D */
469};
470
471const struct gl_texture_format _mesa_texformat_bgra8888 = {
472   MESA_FORMAT_BGRA8888,		/* MesaFormat */
473   GL_RGBA,				/* BaseFormat */
474   GL_UNSIGNED_INT_8_8_8_8,		/* Type */
475   8,					/* RedBits */
476   8,					/* GreenBits */
477   8,					/* BlueBits */
478   8,					/* AlphaBits */
479   0,					/* LuminanceBits */
480   0,					/* IntensityBits */
481   0,					/* IndexBits */
482   0,					/* DepthBits */
483   4,					/* TexelBytes */
484   fetch_1d_texel_bgra8888,		/* FetchTexel1D */
485   fetch_2d_texel_bgra8888,		/* FetchTexel2D */
486   fetch_3d_texel_bgra8888,		/* FetchTexel3D */
487};
488
489const struct gl_texture_format _mesa_texformat_bgr888 = {
490   MESA_FORMAT_BGR888,			/* MesaFormat */
491   GL_RGB,				/* BaseFormat */
492   GL_UNSIGNED_BYTE,			/* Type */
493   8,					/* RedBits */
494   8,					/* GreenBits */
495   8,					/* BlueBits */
496   0,					/* AlphaBits */
497   0,					/* LuminanceBits */
498   0,					/* IntensityBits */
499   0,					/* IndexBits */
500   0,					/* DepthBits */
501   3,					/* TexelBytes */
502   fetch_1d_texel_bgr888,		/* FetchTexel1D */
503   fetch_2d_texel_bgr888,		/* FetchTexel2D */
504   fetch_3d_texel_bgr888,		/* FetchTexel3D */
505};
506
507const struct gl_texture_format _mesa_texformat_bgr565 = {
508   MESA_FORMAT_BGR565,			/* MesaFormat */
509   GL_RGB,				/* BaseFormat */
510   GL_UNSIGNED_SHORT_5_6_5,		/* Type */
511   5,					/* RedBits */
512   6,					/* GreenBits */
513   5,					/* BlueBits */
514   0,					/* AlphaBits */
515   0,					/* LuminanceBits */
516   0,					/* IntensityBits */
517   0,					/* IndexBits */
518   0,					/* DepthBits */
519   2,					/* TexelBytes */
520   fetch_1d_texel_bgr565,		/* FetchTexel1D */
521   fetch_2d_texel_bgr565,		/* FetchTexel2D */
522   fetch_3d_texel_bgr565,		/* FetchTexel3D */
523};
524
525const struct gl_texture_format _mesa_texformat_bgra4444 = {
526   MESA_FORMAT_BGRA4444,		/* MesaFormat */
527   GL_RGBA,				/* BaseFormat */
528   GL_UNSIGNED_SHORT_4_4_4_4_REV,	/* Type */
529   4,					/* RedBits */
530   4,					/* GreenBits */
531   4,					/* BlueBits */
532   4,					/* AlphaBits */
533   0,					/* LuminanceBits */
534   0,					/* IntensityBits */
535   0,					/* IndexBits */
536   0,					/* DepthBits */
537   2,					/* TexelBytes */
538   fetch_1d_texel_bgra4444,		/* FetchTexel1D */
539   fetch_2d_texel_bgra4444,		/* FetchTexel2D */
540   fetch_3d_texel_bgra4444,		/* FetchTexel3D */
541};
542
543const struct gl_texture_format _mesa_texformat_bgra5551 = {
544   MESA_FORMAT_BGRA5551,		/* MesaFormat */
545   GL_RGBA,				/* BaseFormat */
546   GL_UNSIGNED_SHORT_1_5_5_5_REV,	/* Type */
547   5,					/* RedBits */
548   5,					/* GreenBits */
549   5,					/* BlueBits */
550   1,					/* AlphaBits */
551   0,					/* LuminanceBits */
552   0,					/* IntensityBits */
553   0,					/* IndexBits */
554   0,					/* DepthBits */
555   2,					/* TexelBytes */
556   fetch_1d_texel_bgra1555,		/* FetchTexel1D */
557   fetch_2d_texel_bgra1555,		/* FetchTexel2D */
558   fetch_3d_texel_bgra1555,		/* FetchTexel3D */
559};
560
561const struct gl_texture_format _mesa_texformat_la88 = {
562   MESA_FORMAT_LA88,			/* MesaFormat */
563   GL_LUMINANCE_ALPHA,			/* BaseFormat */
564   GL_UNSIGNED_BYTE,			/* Type */
565   0,					/* RedBits */
566   0,					/* GreenBits */
567   0,					/* BlueBits */
568   8,					/* AlphaBits */
569   8,					/* LuminanceBits */
570   0,					/* IntensityBits */
571   0,					/* IndexBits */
572   0,					/* DepthBits */
573   2,					/* TexelBytes */
574   fetch_1d_texel_la88,			/* FetchTexel1D */
575   fetch_2d_texel_la88,			/* FetchTexel2D */
576   fetch_3d_texel_la88,			/* FetchTexel3D */
577};
578
579const struct gl_texture_format _mesa_texformat_bgr233 = {
580   MESA_FORMAT_BGR233,			/* MesaFormat */
581   GL_RGB,				/* BaseFormat */
582   GL_UNSIGNED_BYTE_3_3_2,		/* Type */
583   3,					/* RedBits */
584   3,					/* GreenBits */
585   2,					/* BlueBits */
586   0,					/* AlphaBits */
587   0,					/* LuminanceBits */
588   0,					/* IntensityBits */
589   0,					/* IndexBits */
590   0,					/* DepthBits */
591   1,					/* TexelBytes */
592   fetch_1d_texel_bgr233,		/* FetchTexel1D */
593   fetch_2d_texel_bgr233,		/* FetchTexel2D */
594   fetch_3d_texel_bgr233,		/* FetchTexel3D */
595};
596#endif
597
598/* =============================================================
599 * Null format (useful for proxy textures):
600 */
601
602const struct gl_texture_format _mesa_null_texformat = {
603   -1,					/* MesaFormat */
604   0,					/* BaseFormat */
605   0,					/* RedBits */
606   0,					/* GreenBits */
607   0,					/* BlueBits */
608   0,					/* AlphaBits */
609   0,					/* LuminanceBits */
610   0,					/* IntensityBits */
611   0,					/* IndexBits */
612   0,					/* DepthBits */
613   0,					/* TexelBytes */
614   fetch_null_texel,			/* FetchTexel1D */
615   fetch_null_texel,			/* FetchTexel2D */
616   fetch_null_texel,			/* FetchTexel3D */
617};
618
619
620GLboolean
621_mesa_is_hardware_tex_format( const struct gl_texture_format *format )
622{
623   return (format->MesaFormat < MESA_FORMAT_RGBA);
624}
625
626
627/* Given an internal texture format (or 1, 2, 3, 4) return a pointer
628 * to a gl_texture_format which which to store the texture.
629 * This is called via ctx->Driver.ChooseTextureFormat().
630 * Hardware drivers typically override this function with a specialized
631 * version.
632 */
633const struct gl_texture_format *
634_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
635                         GLenum format, GLenum type )
636{
637   (void) format;
638   (void) type;
639
640   switch ( internalFormat ) {
641      /* GH: Bias towards GL_RGB, GL_RGBA texture formats.  This has
642       * got to be better than sticking them way down the end of this
643       * huge list.
644       */
645   case 4:				/* Quake3 uses this... */
646   case GL_RGBA:
647      return &_mesa_texformat_rgba;
648
649   case 3:				/* ... and this. */
650   case GL_RGB:
651      return &_mesa_texformat_rgb;
652
653      /* GH: Okay, keep checking as normal.  Still test for GL_RGB,
654       * GL_RGBA formats first.
655       */
656   case GL_RGBA2:
657   case GL_RGBA4:
658   case GL_RGB5_A1:
659   case GL_RGBA8:
660   case GL_RGB10_A2:
661   case GL_RGBA12:
662   case GL_RGBA16:
663      return &_mesa_texformat_rgba;
664
665   case GL_R3_G3_B2:
666   case GL_RGB4:
667   case GL_RGB5:
668   case GL_RGB8:
669   case GL_RGB10:
670   case GL_RGB12:
671   case GL_RGB16:
672      return &_mesa_texformat_rgb;
673
674   case GL_ALPHA:
675   case GL_ALPHA4:
676   case GL_ALPHA8:
677   case GL_ALPHA12:
678   case GL_ALPHA16:
679      return &_mesa_texformat_alpha;
680
681   case 1:
682   case GL_LUMINANCE:
683   case GL_LUMINANCE4:
684   case GL_LUMINANCE8:
685   case GL_LUMINANCE12:
686   case GL_LUMINANCE16:
687      return &_mesa_texformat_luminance;
688
689   case 2:
690   case GL_LUMINANCE_ALPHA:
691   case GL_LUMINANCE4_ALPHA4:
692   case GL_LUMINANCE6_ALPHA2:
693   case GL_LUMINANCE8_ALPHA8:
694   case GL_LUMINANCE12_ALPHA4:
695   case GL_LUMINANCE12_ALPHA12:
696   case GL_LUMINANCE16_ALPHA16:
697      return &_mesa_texformat_luminance_alpha;
698
699   case GL_INTENSITY:
700   case GL_INTENSITY4:
701   case GL_INTENSITY8:
702   case GL_INTENSITY12:
703   case GL_INTENSITY16:
704      return &_mesa_texformat_intensity;
705
706   case GL_COLOR_INDEX:
707   case GL_COLOR_INDEX1_EXT:
708   case GL_COLOR_INDEX2_EXT:
709   case GL_COLOR_INDEX4_EXT:
710   case GL_COLOR_INDEX8_EXT:
711   case GL_COLOR_INDEX12_EXT:
712   case GL_COLOR_INDEX16_EXT:
713      return &_mesa_texformat_color_index;
714
715   case GL_DEPTH_COMPONENT:
716   case GL_DEPTH_COMPONENT16_SGIX:
717   case GL_DEPTH_COMPONENT24_SGIX:
718   case GL_DEPTH_COMPONENT32_SGIX:
719      if (!ctx->Extensions.SGIX_depth_texture)
720	 _mesa_problem(ctx, "depth format without GL_SGIX_depth_texture");
721      return &_mesa_texformat_depth_component;
722
723   case GL_COMPRESSED_ALPHA_ARB:
724      if (!ctx->Extensions.ARB_texture_compression)
725	 _mesa_problem(ctx, "texture compression extension not enabled");
726      return &_mesa_texformat_alpha;
727   case GL_COMPRESSED_LUMINANCE_ARB:
728      if (!ctx->Extensions.ARB_texture_compression)
729	 _mesa_problem(ctx, "texture compression extension not enabled");
730      return &_mesa_texformat_luminance;
731   case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
732      if (!ctx->Extensions.ARB_texture_compression)
733	 _mesa_problem(ctx, "texture compression extension not enabled");
734      return &_mesa_texformat_luminance_alpha;
735   case GL_COMPRESSED_INTENSITY_ARB:
736      if (!ctx->Extensions.ARB_texture_compression)
737	 _mesa_problem(ctx, "texture compression extension not enabled");
738      return &_mesa_texformat_intensity;
739   case GL_COMPRESSED_RGB_ARB:
740      if (!ctx->Extensions.ARB_texture_compression)
741	 _mesa_problem(ctx, "texture compression extension not enabled");
742      return &_mesa_texformat_rgb;
743   case GL_COMPRESSED_RGBA_ARB:
744      if (!ctx->Extensions.ARB_texture_compression)
745	 _mesa_problem(ctx, "texture compression extension not enabled");
746      return &_mesa_texformat_rgba;
747
748   /* GL_MESA_ycrcr_texture */
749   case GL_YCBCR_MESA:
750      if (type == GL_UNSIGNED_SHORT_8_8_MESA)
751         return &_mesa_texformat_ycbcr;
752      else
753         return &_mesa_texformat_ycbcr_rev;
754
755   default:
756      _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
757      return NULL;
758   }
759}
760
761
762
763
764/*
765 * Return the base texture format for the given compressed format
766 * Called via ctx->Driver.BaseCompressedTexFormat().
767 * This function is used by software rasterizers.  Hardware drivers
768 * which support texture compression should not use this function but
769 * a specialized function instead.
770 */
771GLint
772_mesa_base_compressed_texformat(GLcontext *ctx, GLint intFormat)
773{
774   switch (intFormat) {
775   case GL_COMPRESSED_ALPHA_ARB:
776      return GL_ALPHA;
777   case GL_COMPRESSED_LUMINANCE_ARB:
778      return GL_LUMINANCE;
779   case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
780      return GL_LUMINANCE_ALPHA;
781   case GL_COMPRESSED_INTENSITY_ARB:
782      return GL_INTENSITY;
783   case GL_COMPRESSED_RGB_ARB:
784      return GL_RGB;
785   case GL_COMPRESSED_RGBA_ARB:
786      return GL_RGBA;
787   default:
788      return -1;  /* not a recognized compressed format */
789   }
790}
791