Remove all traces of CULL_MASK_ACTIVE.
[mesa.git] / src / mesa / main / texformat.c
1 /* $Id: texformat.c,v 1.7 2001/03/30 14:44:43 gareth 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 #ifdef PC_HEADER
31 #include "all.h"
32 #else
33 #include "glheader.h"
34 #include "colormac.h"
35 #include "context.h"
36 #include "image.h"
37 #include "mem.h"
38 #include "mmath.h"
39 #include "mtypes.h"
40 #include "texformat.h"
41 #include "teximage.h"
42 #include "texstate.h"
43 #include "swrast/s_span.h"
44 #endif
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 /* Have to have this so the FetchTexel function pointer is never NULL.
59 */
60 static void fetch_null_texel( const struct gl_texture_image *texImage,
61 GLint i, GLint j, GLint k, GLvoid *texel )
62 {
63 GLchan *rgba = (GLchan *) texel;
64 rgba[RCOMP] = 0;
65 rgba[GCOMP] = 0;
66 rgba[BCOMP] = 0;
67 rgba[ACOMP] = 0;
68 }
69
70
71 /* =============================================================
72 * Default GLchan-based formats:
73 */
74
75 const struct gl_texture_format _mesa_texformat_rgba = {
76 MESA_FORMAT_RGBA, /* MesaFormat */
77 GL_RGBA, /* IntFormat */
78 CHAN_TYPE, /* Type */
79 CHAN_BITS, /* RedBits */
80 CHAN_BITS, /* GreenBits */
81 CHAN_BITS, /* BlueBits */
82 CHAN_BITS, /* AlphaBits */
83 0, /* LuminanceBits */
84 0, /* IntensityBits */
85 0, /* IndexBits */
86 0, /* DepthBits */
87 4 * CHAN_BITS / 8, /* TexelBytes */
88 fetch_1d_texel_rgba, /* FetchTexel1D */
89 fetch_2d_texel_rgba, /* FetchTexel2D */
90 fetch_3d_texel_rgba, /* FetchTexel3D */
91 };
92
93 const struct gl_texture_format _mesa_texformat_rgb = {
94 MESA_FORMAT_RGB, /* MesaFormat */
95 GL_RGB, /* IntFormat */
96 CHAN_TYPE, /* Type */
97 CHAN_BITS, /* RedBits */
98 CHAN_BITS, /* GreenBits */
99 CHAN_BITS, /* BlueBits */
100 0, /* AlphaBits */
101 0, /* LuminanceBits */
102 0, /* IntensityBits */
103 0, /* IndexBits */
104 0, /* DepthBits */
105 3 * CHAN_BITS / 8, /* TexelBytes */
106 fetch_1d_texel_rgb, /* FetchTexel1D */
107 fetch_2d_texel_rgb, /* FetchTexel2D */
108 fetch_3d_texel_rgb, /* FetchTexel3D */
109 };
110
111 const struct gl_texture_format _mesa_texformat_alpha = {
112 MESA_FORMAT_ALPHA, /* MesaFormat */
113 GL_ALPHA, /* IntFormat */
114 CHAN_TYPE, /* Type */
115 0, /* RedBits */
116 0, /* GreenBits */
117 0, /* BlueBits */
118 CHAN_BITS, /* AlphaBits */
119 0, /* LuminanceBits */
120 0, /* IntensityBits */
121 0, /* IndexBits */
122 0, /* DepthBits */
123 CHAN_BITS / 8, /* TexelBytes */
124 fetch_1d_texel_alpha, /* FetchTexel1D */
125 fetch_2d_texel_alpha, /* FetchTexel2D */
126 fetch_3d_texel_alpha, /* FetchTexel3D */
127 };
128
129 const struct gl_texture_format _mesa_texformat_luminance = {
130 MESA_FORMAT_LUMINANCE, /* MesaFormat */
131 GL_LUMINANCE, /* IntFormat */
132 CHAN_TYPE, /* Type */
133 0, /* RedBits */
134 0, /* GreenBits */
135 0, /* BlueBits */
136 0, /* AlphaBits */
137 CHAN_BITS, /* LuminanceBits */
138 0, /* IntensityBits */
139 0, /* IndexBits */
140 0, /* DepthBits */
141 CHAN_BITS / 8, /* TexelBytes */
142 fetch_1d_texel_luminance, /* FetchTexel1D */
143 fetch_2d_texel_luminance, /* FetchTexel2D */
144 fetch_3d_texel_luminance, /* FetchTexel3D */
145 };
146
147 const struct gl_texture_format _mesa_texformat_luminance_alpha = {
148 MESA_FORMAT_LUMINANCE_ALPHA, /* MesaFormat */
149 GL_LUMINANCE_ALPHA, /* IntFormat */
150 CHAN_TYPE, /* Type */
151 0, /* RedBits */
152 0, /* GreenBits */
153 0, /* BlueBits */
154 CHAN_BITS, /* AlphaBits */
155 CHAN_BITS, /* LuminanceBits */
156 0, /* IntensityBits */
157 0, /* IndexBits */
158 0, /* DepthBits */
159 2 * CHAN_BITS / 8, /* TexelBytes */
160 fetch_1d_texel_luminance_alpha, /* FetchTexel1D */
161 fetch_2d_texel_luminance_alpha, /* FetchTexel2D */
162 fetch_3d_texel_luminance_alpha, /* FetchTexel3D */
163 };
164
165 const struct gl_texture_format _mesa_texformat_intensity = {
166 MESA_FORMAT_INTENSITY, /* MesaFormat */
167 GL_INTENSITY, /* IntFormat */
168 CHAN_TYPE, /* Type */
169 0, /* RedBits */
170 0, /* GreenBits */
171 0, /* BlueBits */
172 0, /* AlphaBits */
173 0, /* LuminanceBits */
174 CHAN_BITS, /* IntensityBits */
175 0, /* IndexBits */
176 0, /* DepthBits */
177 CHAN_BITS / 8, /* TexelBytes */
178 fetch_1d_texel_intensity, /* FetchTexel1D */
179 fetch_2d_texel_intensity, /* FetchTexel2D */
180 fetch_3d_texel_intensity, /* FetchTexel3D */
181 };
182
183 const struct gl_texture_format _mesa_texformat_color_index = {
184 MESA_FORMAT_COLOR_INDEX, /* MesaFormat */
185 GL_COLOR_INDEX, /* IntFormat */
186 CHAN_TYPE, /* Type */
187 0, /* RedBits */
188 0, /* GreenBits */
189 0, /* BlueBits */
190 0, /* AlphaBits */
191 0, /* LuminanceBits */
192 0, /* IntensityBits */
193 CHAN_BITS, /* IndexBits */
194 0, /* DepthBits */
195 CHAN_BITS / 8, /* TexelBytes */
196 fetch_1d_texel_color_index, /* FetchTexel1D */
197 fetch_2d_texel_color_index, /* FetchTexel2D */
198 fetch_3d_texel_color_index, /* FetchTexel3D */
199 };
200
201 const struct gl_texture_format _mesa_texformat_depth_component = {
202 MESA_FORMAT_DEPTH_COMPONENT, /* MesaFormat */
203 GL_DEPTH_COMPONENT, /* IntFormat */
204 GL_FLOAT, /* Type */
205 0, /* RedBits */
206 0, /* GreenBits */
207 0, /* BlueBits */
208 0, /* AlphaBits */
209 0, /* LuminanceBits */
210 0, /* IntensityBits */
211 0, /* IndexBits */
212 sizeof(GLfloat) * 8, /* DepthBits */
213 sizeof(GLfloat), /* TexelBytes */
214 fetch_1d_texel_depth_component, /* FetchTexel1D */
215 fetch_2d_texel_depth_component, /* FetchTexel2D */
216 fetch_3d_texel_depth_component, /* FetchTexel3D */
217 };
218
219
220 /* =============================================================
221 * Hardware formats:
222 */
223
224 const struct gl_texture_format _mesa_texformat_rgba8888 = {
225 MESA_FORMAT_RGBA8888, /* MesaFormat */
226 GL_RGBA, /* IntFormat */
227 GL_UNSIGNED_INT_8_8_8_8, /* Type */
228 8, /* RedBits */
229 8, /* GreenBits */
230 8, /* BlueBits */
231 8, /* AlphaBits */
232 0, /* LuminanceBits */
233 0, /* IntensityBits */
234 0, /* IndexBits */
235 0, /* DepthBits */
236 4, /* TexelBytes */
237 fetch_1d_texel_rgba8888, /* FetchTexel1D */
238 fetch_2d_texel_rgba8888, /* FetchTexel2D */
239 fetch_3d_texel_rgba8888, /* FetchTexel3D */
240 };
241
242 const struct gl_texture_format _mesa_texformat_argb8888 = {
243 MESA_FORMAT_ARGB8888, /* MesaFormat */
244 GL_BGRA, /* IntFormat */
245 GL_UNSIGNED_INT_8_8_8_8_REV, /* Type */
246 8, /* RedBits */
247 8, /* GreenBits */
248 8, /* BlueBits */
249 8, /* AlphaBits */
250 0, /* LuminanceBits */
251 0, /* IntensityBits */
252 0, /* IndexBits */
253 0, /* DepthBits */
254 4, /* TexelBytes */
255 fetch_1d_texel_argb8888, /* FetchTexel1D */
256 fetch_2d_texel_argb8888, /* FetchTexel2D */
257 fetch_3d_texel_argb8888, /* FetchTexel3D */
258 };
259
260 const struct gl_texture_format _mesa_texformat_rgb888 = {
261 MESA_FORMAT_RGB888, /* MesaFormat */
262 GL_BGR, /* IntFormat */
263 GL_UNSIGNED_BYTE, /* Type */
264 8, /* RedBits */
265 8, /* GreenBits */
266 8, /* BlueBits */
267 0, /* AlphaBits */
268 0, /* LuminanceBits */
269 0, /* IntensityBits */
270 0, /* IndexBits */
271 0, /* DepthBits */
272 3, /* TexelBytes */
273 fetch_1d_texel_rgb888, /* FetchTexel1D */
274 fetch_2d_texel_rgb888, /* FetchTexel2D */
275 fetch_3d_texel_rgb888, /* FetchTexel3D */
276 };
277
278 const struct gl_texture_format _mesa_texformat_rgb565 = {
279 MESA_FORMAT_RGB565, /* MesaFormat */
280 GL_RGB, /* IntFormat */
281 GL_UNSIGNED_SHORT_5_6_5, /* Type */
282 5, /* RedBits */
283 6, /* GreenBits */
284 5, /* BlueBits */
285 0, /* AlphaBits */
286 0, /* LuminanceBits */
287 0, /* IntensityBits */
288 0, /* IndexBits */
289 0, /* DepthBits */
290 2, /* TexelBytes */
291 fetch_1d_texel_rgb565, /* FetchTexel1D */
292 fetch_2d_texel_rgb565, /* FetchTexel2D */
293 fetch_3d_texel_rgb565, /* FetchTexel3D */
294 };
295
296 const struct gl_texture_format _mesa_texformat_argb4444 = {
297 MESA_FORMAT_ARGB4444, /* MesaFormat */
298 GL_BGRA, /* IntFormat */
299 GL_UNSIGNED_SHORT_4_4_4_4_REV, /* Type */
300 4, /* RedBits */
301 4, /* GreenBits */
302 4, /* BlueBits */
303 4, /* AlphaBits */
304 0, /* LuminanceBits */
305 0, /* IntensityBits */
306 0, /* IndexBits */
307 0, /* DepthBits */
308 2, /* TexelBytes */
309 fetch_1d_texel_argb4444, /* FetchTexel1D */
310 fetch_2d_texel_argb4444, /* FetchTexel2D */
311 fetch_3d_texel_argb4444, /* FetchTexel3D */
312 };
313
314 const struct gl_texture_format _mesa_texformat_argb1555 = {
315 MESA_FORMAT_ARGB1555, /* MesaFormat */
316 GL_BGRA, /* IntFormat */
317 GL_UNSIGNED_SHORT_1_5_5_5_REV, /* Type */
318 5, /* RedBits */
319 5, /* GreenBits */
320 5, /* BlueBits */
321 1, /* AlphaBits */
322 0, /* LuminanceBits */
323 0, /* IntensityBits */
324 0, /* IndexBits */
325 0, /* DepthBits */
326 2, /* TexelBytes */
327 fetch_1d_texel_argb1555, /* FetchTexel1D */
328 fetch_2d_texel_argb1555, /* FetchTexel2D */
329 fetch_3d_texel_argb1555, /* FetchTexel3D */
330 };
331
332 const struct gl_texture_format _mesa_texformat_al88 = {
333 MESA_FORMAT_AL88, /* MesaFormat */
334 GL_LUMINANCE_ALPHA, /* IntFormat */
335 GL_UNSIGNED_BYTE, /* Type */
336 0, /* RedBits */
337 0, /* GreenBits */
338 0, /* BlueBits */
339 8, /* AlphaBits */
340 8, /* LuminanceBits */
341 0, /* IntensityBits */
342 0, /* IndexBits */
343 0, /* DepthBits */
344 2, /* TexelBytes */
345 fetch_1d_texel_al88, /* FetchTexel1D */
346 fetch_2d_texel_al88, /* FetchTexel2D */
347 fetch_3d_texel_al88, /* FetchTexel3D */
348 };
349
350 const struct gl_texture_format _mesa_texformat_rgb332 = {
351 MESA_FORMAT_RGB332, /* MesaFormat */
352 GL_RGB, /* IntFormat */
353 GL_UNSIGNED_BYTE_3_3_2, /* Type */
354 3, /* RedBits */
355 3, /* GreenBits */
356 2, /* BlueBits */
357 0, /* AlphaBits */
358 0, /* LuminanceBits */
359 0, /* IntensityBits */
360 0, /* IndexBits */
361 0, /* DepthBits */
362 1, /* TexelBytes */
363 fetch_1d_texel_rgb332, /* FetchTexel1D */
364 fetch_2d_texel_rgb332, /* FetchTexel2D */
365 fetch_3d_texel_rgb332, /* FetchTexel3D */
366 };
367
368 const struct gl_texture_format _mesa_texformat_a8 = {
369 MESA_FORMAT_A8, /* MesaFormat */
370 GL_ALPHA, /* IntFormat */
371 GL_UNSIGNED_BYTE, /* Type */
372 0, /* RedBits */
373 0, /* GreenBits */
374 0, /* BlueBits */
375 8, /* AlphaBits */
376 0, /* LuminanceBits */
377 0, /* IntensityBits */
378 0, /* IndexBits */
379 0, /* DepthBits */
380 1, /* TexelBytes */
381 fetch_1d_texel_a8, /* FetchTexel1D */
382 fetch_2d_texel_a8, /* FetchTexel2D */
383 fetch_3d_texel_a8, /* FetchTexel3D */
384 };
385
386 const struct gl_texture_format _mesa_texformat_l8 = {
387 MESA_FORMAT_L8, /* MesaFormat */
388 GL_LUMINANCE, /* IntFormat */
389 GL_UNSIGNED_BYTE, /* Type */
390 0, /* RedBits */
391 0, /* GreenBits */
392 0, /* BlueBits */
393 0, /* AlphaBits */
394 8, /* LuminanceBits */
395 0, /* IntensityBits */
396 0, /* IndexBits */
397 0, /* DepthBits */
398 1, /* TexelBytes */
399 fetch_1d_texel_l8, /* FetchTexel1D */
400 fetch_2d_texel_l8, /* FetchTexel2D */
401 fetch_3d_texel_l8, /* FetchTexel3D */
402 };
403
404 const struct gl_texture_format _mesa_texformat_i8 = {
405 MESA_FORMAT_I8, /* MesaFormat */
406 GL_INTENSITY, /* IntFormat */
407 GL_UNSIGNED_BYTE, /* Type */
408 0, /* RedBits */
409 0, /* GreenBits */
410 0, /* BlueBits */
411 0, /* AlphaBits */
412 0, /* LuminanceBits */
413 8, /* IntensityBits */
414 0, /* IndexBits */
415 0, /* DepthBits */
416 1, /* TexelBytes */
417 fetch_1d_texel_i8, /* FetchTexel1D */
418 fetch_2d_texel_i8, /* FetchTexel2D */
419 fetch_3d_texel_i8, /* FetchTexel3D */
420 };
421
422 const struct gl_texture_format _mesa_texformat_ci8 = {
423 MESA_FORMAT_CI8, /* MesaFormat */
424 GL_COLOR_INDEX, /* IntFormat */
425 GL_UNSIGNED_BYTE, /* Type */
426 0, /* RedBits */
427 0, /* GreenBits */
428 0, /* BlueBits */
429 0, /* AlphaBits */
430 0, /* LuminanceBits */
431 0, /* IntensityBits */
432 8, /* IndexBits */
433 0, /* DepthBits */
434 1, /* TexelBytes */
435 fetch_1d_texel_ci8, /* FetchTexel1D */
436 fetch_2d_texel_ci8, /* FetchTexel2D */
437 fetch_3d_texel_ci8, /* FetchTexel3D */
438 };
439
440
441 /* =============================================================
442 * Null format:
443 */
444
445 const struct gl_texture_format _mesa_null_texformat = {
446 -1, /* MesaFormat */
447 0, /* IntFormat */
448 0, /* Type */
449 0, /* RedBits */
450 0, /* GreenBits */
451 0, /* BlueBits */
452 0, /* AlphaBits */
453 0, /* LuminanceBits */
454 0, /* IntensityBits */
455 0, /* IndexBits */
456 0, /* DepthBits */
457 0, /* TexelBytes */
458 fetch_null_texel, /* FetchTexel1D */
459 fetch_null_texel, /* FetchTexel2D */
460 fetch_null_texel, /* FetchTexel3D */
461 };
462
463
464
465 /* Given an internal texture format or 1, 2, 3, 4 initialize the texture
466 * image structure's default format and type information. Drivers will
467 * initialize these fields accordingly if they override the default
468 * storage format.
469 */
470 void _mesa_init_tex_format( GLcontext *ctx, GLenum internalFormat,
471 struct gl_texture_image *texImage )
472 {
473 const struct gl_texture_format *texFormat;
474
475 /* Ask the driver for the base format, if it doesn't know, it will
476 * return -1;
477 */
478 if ( ctx->Driver.BaseCompressedTexFormat ) {
479 GLint format = 0; /* Silence compiler warning */
480 format = (*ctx->Driver.BaseCompressedTexFormat)( ctx, format );
481 if ( format >= 0 ) {
482 internalFormat = format;
483 }
484 }
485
486 switch ( internalFormat ) {
487 /* GH: Bias towards GL_RGB, GL_RGBA texture formats. This has
488 * got to be better than sticking them way down the end of this
489 * huge list.
490 */
491 case 4: /* Quake3 uses this... */
492 case GL_RGBA:
493 texFormat = &_mesa_texformat_rgba;
494 break;
495
496 case 3: /* ... and this. */
497 case GL_RGB:
498 texFormat = &_mesa_texformat_rgb;
499 break;
500
501 /* GH: Okay, keep checking as normal. Still test for GL_RGB,
502 * GL_RGBA formats first.
503 */
504 case GL_RGBA2:
505 case GL_RGBA4:
506 case GL_RGB5_A1:
507 case GL_RGBA8:
508 case GL_RGB10_A2:
509 case GL_RGBA12:
510 case GL_RGBA16:
511 texFormat = &_mesa_texformat_rgba;
512 break;
513
514 case GL_R3_G3_B2:
515 case GL_RGB4:
516 case GL_RGB5:
517 case GL_RGB8:
518 case GL_RGB10:
519 case GL_RGB12:
520 case GL_RGB16:
521 texFormat = &_mesa_texformat_rgb;
522 break;
523
524 case GL_ALPHA:
525 case GL_ALPHA4:
526 case GL_ALPHA8:
527 case GL_ALPHA12:
528 case GL_ALPHA16:
529 texFormat = &_mesa_texformat_alpha;
530 break;
531
532 case 1:
533 case GL_LUMINANCE:
534 case GL_LUMINANCE4:
535 case GL_LUMINANCE8:
536 case GL_LUMINANCE12:
537 case GL_LUMINANCE16:
538 texFormat = &_mesa_texformat_luminance;
539 break;
540
541 case 2:
542 case GL_LUMINANCE_ALPHA:
543 case GL_LUMINANCE4_ALPHA4:
544 case GL_LUMINANCE6_ALPHA2:
545 case GL_LUMINANCE8_ALPHA8:
546 case GL_LUMINANCE12_ALPHA4:
547 case GL_LUMINANCE12_ALPHA12:
548 case GL_LUMINANCE16_ALPHA16:
549 texFormat = &_mesa_texformat_luminance_alpha;
550 break;
551
552 case GL_INTENSITY:
553 case GL_INTENSITY4:
554 case GL_INTENSITY8:
555 case GL_INTENSITY12:
556 case GL_INTENSITY16:
557 texFormat = &_mesa_texformat_intensity;
558 break;
559
560 case GL_COLOR_INDEX:
561 case GL_COLOR_INDEX1_EXT:
562 case GL_COLOR_INDEX2_EXT:
563 case GL_COLOR_INDEX4_EXT:
564 case GL_COLOR_INDEX8_EXT:
565 case GL_COLOR_INDEX12_EXT:
566 case GL_COLOR_INDEX16_EXT:
567 texFormat = &_mesa_texformat_color_index;
568 break;
569
570 case GL_DEPTH_COMPONENT:
571 case GL_DEPTH_COMPONENT16_SGIX:
572 case GL_DEPTH_COMPONENT24_SGIX:
573 case GL_DEPTH_COMPONENT32_SGIX:
574 if ( !ctx->Extensions.SGIX_depth_texture )
575 _mesa_problem( ctx, "depth format without GL_SGIX_depth_texture" );
576 texFormat = &_mesa_texformat_depth_component;
577 break;
578
579 default:
580 _mesa_problem( ctx, "unexpected format in _mesa_init_tex_format" );
581 return;
582 }
583
584 texImage->TexFormat = texFormat;
585 }