Subversion Repositories shark

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
55 pj 1
/* $Id: texformat.c,v 1.1 2003-02-28 11:42:04 pj 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
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
 */
55
static 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
 
70
const 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
 
87
const 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
 
104
const 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
 
121
const 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
 
138
const 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
 
155
const 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
 
172
const 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
 
189
const 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
 
211
const 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
 
228
const 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
 
245
const 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
 
262
const 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
 
279
const 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
 
296
const 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
 
313
const 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
 
330
const 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
 
347
const 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
 
364
const 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
 
381
const 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
 
398
const 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
 
415
const 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
 
433
const 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
453
const 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
 
471
const 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
 
489
const 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
 
507
const 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
 
525
const 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
 
543
const 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
 
561
const 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
 
579
const 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
 
602
const 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
 
620
GLboolean
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
 */
633
const 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
 */
771
GLint
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
}