-/* $Id: texformat.c,v 1.7 2001/03/30 14:44:43 gareth Exp $ */
+/* $Id: texformat.c,v 1.17 2002/10/24 23:57:21 brianp Exp $ */
/*
* Mesa 3-D graphics library
* Gareth Hughes <gareth@valinux.com>
*/
-#ifdef PC_HEADER
-#include "all.h"
-#else
#include "glheader.h"
#include "colormac.h"
#include "context.h"
#include "image.h"
-#include "mem.h"
+#include "imports.h"
#include "mmath.h"
#include "mtypes.h"
#include "texformat.h"
#include "teximage.h"
#include "texstate.h"
-#include "swrast/s_span.h"
-#endif
/* Texel fetch routines for all supported formats:
const struct gl_texture_format _mesa_texformat_rgba = {
MESA_FORMAT_RGBA, /* MesaFormat */
- GL_RGBA, /* IntFormat */
- CHAN_TYPE, /* Type */
+ GL_RGBA, /* BaseFormat */
CHAN_BITS, /* RedBits */
CHAN_BITS, /* GreenBits */
CHAN_BITS, /* BlueBits */
const struct gl_texture_format _mesa_texformat_rgb = {
MESA_FORMAT_RGB, /* MesaFormat */
- GL_RGB, /* IntFormat */
- CHAN_TYPE, /* Type */
+ GL_RGB, /* BaseFormat */
CHAN_BITS, /* RedBits */
CHAN_BITS, /* GreenBits */
CHAN_BITS, /* BlueBits */
const struct gl_texture_format _mesa_texformat_alpha = {
MESA_FORMAT_ALPHA, /* MesaFormat */
- GL_ALPHA, /* IntFormat */
- CHAN_TYPE, /* Type */
+ GL_ALPHA, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
const struct gl_texture_format _mesa_texformat_luminance = {
MESA_FORMAT_LUMINANCE, /* MesaFormat */
- GL_LUMINANCE, /* IntFormat */
- CHAN_TYPE, /* Type */
+ GL_LUMINANCE, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
const struct gl_texture_format _mesa_texformat_luminance_alpha = {
MESA_FORMAT_LUMINANCE_ALPHA, /* MesaFormat */
- GL_LUMINANCE_ALPHA, /* IntFormat */
- CHAN_TYPE, /* Type */
+ GL_LUMINANCE_ALPHA, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
const struct gl_texture_format _mesa_texformat_intensity = {
MESA_FORMAT_INTENSITY, /* MesaFormat */
- GL_INTENSITY, /* IntFormat */
- CHAN_TYPE, /* Type */
+ GL_INTENSITY, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
const struct gl_texture_format _mesa_texformat_color_index = {
MESA_FORMAT_COLOR_INDEX, /* MesaFormat */
- GL_COLOR_INDEX, /* IntFormat */
- CHAN_TYPE, /* Type */
+ GL_COLOR_INDEX, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
const struct gl_texture_format _mesa_texformat_depth_component = {
MESA_FORMAT_DEPTH_COMPONENT, /* MesaFormat */
- GL_DEPTH_COMPONENT, /* IntFormat */
- GL_FLOAT, /* Type */
+ GL_DEPTH_COMPONENT, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
const struct gl_texture_format _mesa_texformat_rgba8888 = {
MESA_FORMAT_RGBA8888, /* MesaFormat */
- GL_RGBA, /* IntFormat */
- GL_UNSIGNED_INT_8_8_8_8, /* Type */
+ GL_RGBA, /* BaseFormat */
8, /* RedBits */
8, /* GreenBits */
8, /* BlueBits */
const struct gl_texture_format _mesa_texformat_argb8888 = {
MESA_FORMAT_ARGB8888, /* MesaFormat */
- GL_BGRA, /* IntFormat */
- GL_UNSIGNED_INT_8_8_8_8_REV, /* Type */
+ GL_RGBA, /* BaseFormat */
8, /* RedBits */
8, /* GreenBits */
8, /* BlueBits */
const struct gl_texture_format _mesa_texformat_rgb888 = {
MESA_FORMAT_RGB888, /* MesaFormat */
- GL_BGR, /* IntFormat */
- GL_UNSIGNED_BYTE, /* Type */
+ GL_RGB, /* BaseFormat */
8, /* RedBits */
8, /* GreenBits */
8, /* BlueBits */
const struct gl_texture_format _mesa_texformat_rgb565 = {
MESA_FORMAT_RGB565, /* MesaFormat */
- GL_RGB, /* IntFormat */
- GL_UNSIGNED_SHORT_5_6_5, /* Type */
+ GL_RGB, /* BaseFormat */
5, /* RedBits */
6, /* GreenBits */
5, /* BlueBits */
const struct gl_texture_format _mesa_texformat_argb4444 = {
MESA_FORMAT_ARGB4444, /* MesaFormat */
- GL_BGRA, /* IntFormat */
- GL_UNSIGNED_SHORT_4_4_4_4_REV, /* Type */
+ GL_RGBA, /* BaseFormat */
4, /* RedBits */
4, /* GreenBits */
4, /* BlueBits */
const struct gl_texture_format _mesa_texformat_argb1555 = {
MESA_FORMAT_ARGB1555, /* MesaFormat */
- GL_BGRA, /* IntFormat */
- GL_UNSIGNED_SHORT_1_5_5_5_REV, /* Type */
+ GL_RGBA, /* BaseFormat */
5, /* RedBits */
5, /* GreenBits */
5, /* BlueBits */
const struct gl_texture_format _mesa_texformat_al88 = {
MESA_FORMAT_AL88, /* MesaFormat */
- GL_LUMINANCE_ALPHA, /* IntFormat */
- GL_UNSIGNED_BYTE, /* Type */
+ GL_LUMINANCE_ALPHA, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
const struct gl_texture_format _mesa_texformat_rgb332 = {
MESA_FORMAT_RGB332, /* MesaFormat */
- GL_RGB, /* IntFormat */
- GL_UNSIGNED_BYTE_3_3_2, /* Type */
+ GL_RGB, /* BaseFormat */
3, /* RedBits */
3, /* GreenBits */
2, /* BlueBits */
const struct gl_texture_format _mesa_texformat_a8 = {
MESA_FORMAT_A8, /* MesaFormat */
- GL_ALPHA, /* IntFormat */
- GL_UNSIGNED_BYTE, /* Type */
+ GL_ALPHA, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
const struct gl_texture_format _mesa_texformat_l8 = {
MESA_FORMAT_L8, /* MesaFormat */
- GL_LUMINANCE, /* IntFormat */
- GL_UNSIGNED_BYTE, /* Type */
+ GL_LUMINANCE, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
const struct gl_texture_format _mesa_texformat_i8 = {
MESA_FORMAT_I8, /* MesaFormat */
- GL_INTENSITY, /* IntFormat */
- GL_UNSIGNED_BYTE, /* Type */
+ GL_INTENSITY, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
const struct gl_texture_format _mesa_texformat_ci8 = {
MESA_FORMAT_CI8, /* MesaFormat */
- GL_COLOR_INDEX, /* IntFormat */
- GL_UNSIGNED_BYTE, /* Type */
+ GL_COLOR_INDEX, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
fetch_3d_texel_ci8, /* FetchTexel3D */
};
+const struct gl_texture_format _mesa_texformat_ycbcr = {
+ MESA_FORMAT_YCBCR, /* MesaFormat */
+ GL_YCBCR_MESA, /* BaseFormat */
+ 0, /* RedBits */
+ 0, /* GreenBits */
+ 0, /* BlueBits */
+ 0, /* AlphaBits */
+ 0, /* LuminanceBits */
+ 0, /* IntensityBits */
+ 0, /* IndexBits */
+ 0, /* DepthBits */
+ 2, /* TexelBytes */
+ fetch_1d_texel_ycbcr, /* FetchTexel1D */
+ fetch_2d_texel_ycbcr, /* FetchTexel2D */
+ fetch_3d_texel_ycbcr, /* FetchTexel3D */
+};
+
+
+const struct gl_texture_format _mesa_texformat_ycbcr_rev = {
+ MESA_FORMAT_YCBCR_REV, /* MesaFormat */
+ GL_YCBCR_MESA, /* BaseFormat */
+ 0, /* RedBits */
+ 0, /* GreenBits */
+ 0, /* BlueBits */
+ 0, /* AlphaBits */
+ 0, /* LuminanceBits */
+ 0, /* IntensityBits */
+ 0, /* IndexBits */
+ 0, /* DepthBits */
+ 2, /* TexelBytes */
+ fetch_1d_texel_ycbcr_rev, /* FetchTexel1D */
+ fetch_2d_texel_ycbcr_rev, /* FetchTexel2D */
+ fetch_3d_texel_ycbcr_rev, /* FetchTexel3D */
+};
+
+
+/* Big-endian */
+#if 0
+const struct gl_texture_format _mesa_texformat_abgr8888 = {
+ MESA_FORMAT_ABGR8888, /* MesaFormat */
+ GL_RGBA, /* BaseFormat */
+ GL_UNSIGNED_INT_8_8_8_8, /* Type */
+ 8, /* RedBits */
+ 8, /* GreenBits */
+ 8, /* BlueBits */
+ 8, /* AlphaBits */
+ 0, /* LuminanceBits */
+ 0, /* IntensityBits */
+ 0, /* IndexBits */
+ 0, /* DepthBits */
+ 4, /* TexelBytes */
+ fetch_1d_texel_abgr8888, /* FetchTexel1D */
+ fetch_2d_texel_abgr8888, /* FetchTexel2D */
+ fetch_3d_texel_abgr8888, /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgra8888 = {
+ MESA_FORMAT_BGRA8888, /* MesaFormat */
+ GL_RGBA, /* BaseFormat */
+ GL_UNSIGNED_INT_8_8_8_8, /* Type */
+ 8, /* RedBits */
+ 8, /* GreenBits */
+ 8, /* BlueBits */
+ 8, /* AlphaBits */
+ 0, /* LuminanceBits */
+ 0, /* IntensityBits */
+ 0, /* IndexBits */
+ 0, /* DepthBits */
+ 4, /* TexelBytes */
+ fetch_1d_texel_bgra8888, /* FetchTexel1D */
+ fetch_2d_texel_bgra8888, /* FetchTexel2D */
+ fetch_3d_texel_bgra8888, /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgr888 = {
+ MESA_FORMAT_BGR888, /* MesaFormat */
+ GL_RGB, /* BaseFormat */
+ GL_UNSIGNED_BYTE, /* Type */
+ 8, /* RedBits */
+ 8, /* GreenBits */
+ 8, /* BlueBits */
+ 0, /* AlphaBits */
+ 0, /* LuminanceBits */
+ 0, /* IntensityBits */
+ 0, /* IndexBits */
+ 0, /* DepthBits */
+ 3, /* TexelBytes */
+ fetch_1d_texel_bgr888, /* FetchTexel1D */
+ fetch_2d_texel_bgr888, /* FetchTexel2D */
+ fetch_3d_texel_bgr888, /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgr565 = {
+ MESA_FORMAT_BGR565, /* MesaFormat */
+ GL_RGB, /* BaseFormat */
+ GL_UNSIGNED_SHORT_5_6_5, /* Type */
+ 5, /* RedBits */
+ 6, /* GreenBits */
+ 5, /* BlueBits */
+ 0, /* AlphaBits */
+ 0, /* LuminanceBits */
+ 0, /* IntensityBits */
+ 0, /* IndexBits */
+ 0, /* DepthBits */
+ 2, /* TexelBytes */
+ fetch_1d_texel_bgr565, /* FetchTexel1D */
+ fetch_2d_texel_bgr565, /* FetchTexel2D */
+ fetch_3d_texel_bgr565, /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgra4444 = {
+ MESA_FORMAT_BGRA4444, /* MesaFormat */
+ GL_RGBA, /* BaseFormat */
+ GL_UNSIGNED_SHORT_4_4_4_4_REV, /* Type */
+ 4, /* RedBits */
+ 4, /* GreenBits */
+ 4, /* BlueBits */
+ 4, /* AlphaBits */
+ 0, /* LuminanceBits */
+ 0, /* IntensityBits */
+ 0, /* IndexBits */
+ 0, /* DepthBits */
+ 2, /* TexelBytes */
+ fetch_1d_texel_bgra4444, /* FetchTexel1D */
+ fetch_2d_texel_bgra4444, /* FetchTexel2D */
+ fetch_3d_texel_bgra4444, /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgra5551 = {
+ MESA_FORMAT_BGRA5551, /* MesaFormat */
+ GL_RGBA, /* BaseFormat */
+ GL_UNSIGNED_SHORT_1_5_5_5_REV, /* Type */
+ 5, /* RedBits */
+ 5, /* GreenBits */
+ 5, /* BlueBits */
+ 1, /* AlphaBits */
+ 0, /* LuminanceBits */
+ 0, /* IntensityBits */
+ 0, /* IndexBits */
+ 0, /* DepthBits */
+ 2, /* TexelBytes */
+ fetch_1d_texel_bgra1555, /* FetchTexel1D */
+ fetch_2d_texel_bgra1555, /* FetchTexel2D */
+ fetch_3d_texel_bgra1555, /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_la88 = {
+ MESA_FORMAT_LA88, /* MesaFormat */
+ GL_LUMINANCE_ALPHA, /* BaseFormat */
+ GL_UNSIGNED_BYTE, /* Type */
+ 0, /* RedBits */
+ 0, /* GreenBits */
+ 0, /* BlueBits */
+ 8, /* AlphaBits */
+ 8, /* LuminanceBits */
+ 0, /* IntensityBits */
+ 0, /* IndexBits */
+ 0, /* DepthBits */
+ 2, /* TexelBytes */
+ fetch_1d_texel_la88, /* FetchTexel1D */
+ fetch_2d_texel_la88, /* FetchTexel2D */
+ fetch_3d_texel_la88, /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgr233 = {
+ MESA_FORMAT_BGR233, /* MesaFormat */
+ GL_RGB, /* BaseFormat */
+ GL_UNSIGNED_BYTE_3_3_2, /* Type */
+ 3, /* RedBits */
+ 3, /* GreenBits */
+ 2, /* BlueBits */
+ 0, /* AlphaBits */
+ 0, /* LuminanceBits */
+ 0, /* IntensityBits */
+ 0, /* IndexBits */
+ 0, /* DepthBits */
+ 1, /* TexelBytes */
+ fetch_1d_texel_bgr233, /* FetchTexel1D */
+ fetch_2d_texel_bgr233, /* FetchTexel2D */
+ fetch_3d_texel_bgr233, /* FetchTexel3D */
+};
+#endif
/* =============================================================
- * Null format:
+ * Null format (useful for proxy textures):
*/
const struct gl_texture_format _mesa_null_texformat = {
-1, /* MesaFormat */
- 0, /* IntFormat */
- 0, /* Type */
+ 0, /* BaseFormat */
0, /* RedBits */
0, /* GreenBits */
0, /* BlueBits */
};
+GLboolean
+_mesa_is_hardware_tex_format( const struct gl_texture_format *format )
+{
+ return (format->MesaFormat < MESA_FORMAT_RGBA);
+}
-/* Given an internal texture format or 1, 2, 3, 4 initialize the texture
- * image structure's default format and type information. Drivers will
- * initialize these fields accordingly if they override the default
- * storage format.
+
+/* Given an internal texture format (or 1, 2, 3, 4) return a pointer
+ * to a gl_texture_format which which to store the texture.
+ * This is called via ctx->Driver.ChooseTextureFormat().
+ * Hardware drivers typically override this function with a specialized
+ * version.
*/
-void _mesa_init_tex_format( GLcontext *ctx, GLenum internalFormat,
- struct gl_texture_image *texImage )
+const struct gl_texture_format *
+_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
+ GLenum format, GLenum type )
{
- const struct gl_texture_format *texFormat;
-
- /* Ask the driver for the base format, if it doesn't know, it will
- * return -1;
- */
- if ( ctx->Driver.BaseCompressedTexFormat ) {
- GLint format = 0; /* Silence compiler warning */
- format = (*ctx->Driver.BaseCompressedTexFormat)( ctx, format );
- if ( format >= 0 ) {
- internalFormat = format;
- }
- }
+ (void) format;
+ (void) type;
switch ( internalFormat ) {
/* GH: Bias towards GL_RGB, GL_RGBA texture formats. This has
*/
case 4: /* Quake3 uses this... */
case GL_RGBA:
- texFormat = &_mesa_texformat_rgba;
- break;
+ return &_mesa_texformat_rgba;
case 3: /* ... and this. */
case GL_RGB:
- texFormat = &_mesa_texformat_rgb;
- break;
+ return &_mesa_texformat_rgb;
/* GH: Okay, keep checking as normal. Still test for GL_RGB,
* GL_RGBA formats first.
case GL_RGB10_A2:
case GL_RGBA12:
case GL_RGBA16:
- texFormat = &_mesa_texformat_rgba;
- break;
+ return &_mesa_texformat_rgba;
case GL_R3_G3_B2:
case GL_RGB4:
case GL_RGB10:
case GL_RGB12:
case GL_RGB16:
- texFormat = &_mesa_texformat_rgb;
- break;
+ return &_mesa_texformat_rgb;
case GL_ALPHA:
case GL_ALPHA4:
case GL_ALPHA8:
case GL_ALPHA12:
case GL_ALPHA16:
- texFormat = &_mesa_texformat_alpha;
- break;
+ return &_mesa_texformat_alpha;
case 1:
case GL_LUMINANCE:
case GL_LUMINANCE8:
case GL_LUMINANCE12:
case GL_LUMINANCE16:
- texFormat = &_mesa_texformat_luminance;
- break;
+ return &_mesa_texformat_luminance;
case 2:
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE12_ALPHA4:
case GL_LUMINANCE12_ALPHA12:
case GL_LUMINANCE16_ALPHA16:
- texFormat = &_mesa_texformat_luminance_alpha;
- break;
+ return &_mesa_texformat_luminance_alpha;
case GL_INTENSITY:
case GL_INTENSITY4:
case GL_INTENSITY8:
case GL_INTENSITY12:
case GL_INTENSITY16:
- texFormat = &_mesa_texformat_intensity;
- break;
+ return &_mesa_texformat_intensity;
case GL_COLOR_INDEX:
case GL_COLOR_INDEX1_EXT:
case GL_COLOR_INDEX8_EXT:
case GL_COLOR_INDEX12_EXT:
case GL_COLOR_INDEX16_EXT:
- texFormat = &_mesa_texformat_color_index;
- break;
+ return &_mesa_texformat_color_index;
case GL_DEPTH_COMPONENT:
case GL_DEPTH_COMPONENT16_SGIX:
case GL_DEPTH_COMPONENT24_SGIX:
case GL_DEPTH_COMPONENT32_SGIX:
- if ( !ctx->Extensions.SGIX_depth_texture )
- _mesa_problem( ctx, "depth format without GL_SGIX_depth_texture" );
- texFormat = &_mesa_texformat_depth_component;
- break;
+ if (!ctx->Extensions.SGIX_depth_texture)
+ _mesa_problem(ctx, "depth format without GL_SGIX_depth_texture");
+ return &_mesa_texformat_depth_component;
+
+ case GL_COMPRESSED_ALPHA_ARB:
+ if (!ctx->Extensions.ARB_texture_compression)
+ _mesa_problem(ctx, "texture compression extension not enabled");
+ return &_mesa_texformat_alpha;
+ case GL_COMPRESSED_LUMINANCE_ARB:
+ if (!ctx->Extensions.ARB_texture_compression)
+ _mesa_problem(ctx, "texture compression extension not enabled");
+ return &_mesa_texformat_luminance;
+ case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
+ if (!ctx->Extensions.ARB_texture_compression)
+ _mesa_problem(ctx, "texture compression extension not enabled");
+ return &_mesa_texformat_luminance_alpha;
+ case GL_COMPRESSED_INTENSITY_ARB:
+ if (!ctx->Extensions.ARB_texture_compression)
+ _mesa_problem(ctx, "texture compression extension not enabled");
+ return &_mesa_texformat_intensity;
+ case GL_COMPRESSED_RGB_ARB:
+ if (!ctx->Extensions.ARB_texture_compression)
+ _mesa_problem(ctx, "texture compression extension not enabled");
+ return &_mesa_texformat_rgb;
+ case GL_COMPRESSED_RGBA_ARB:
+ if (!ctx->Extensions.ARB_texture_compression)
+ _mesa_problem(ctx, "texture compression extension not enabled");
+ return &_mesa_texformat_rgba;
+
+ /* GL_MESA_ycrcr_texture */
+ case GL_YCBCR_MESA:
+ if (type == GL_UNSIGNED_SHORT_8_8_MESA)
+ return &_mesa_texformat_ycbcr;
+ else
+ return &_mesa_texformat_ycbcr_rev;
default:
- _mesa_problem( ctx, "unexpected format in _mesa_init_tex_format" );
- return;
+ _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
+ return NULL;
}
+}
+
+
- texImage->TexFormat = texFormat;
+
+/*
+ * Return the base texture format for the given compressed format
+ * Called via ctx->Driver.BaseCompressedTexFormat().
+ * This function is used by software rasterizers. Hardware drivers
+ * which support texture compression should not use this function but
+ * a specialized function instead.
+ */
+GLint
+_mesa_base_compressed_texformat(GLcontext *ctx, GLint intFormat)
+{
+ switch (intFormat) {
+ case GL_COMPRESSED_ALPHA_ARB:
+ return GL_ALPHA;
+ case GL_COMPRESSED_LUMINANCE_ARB:
+ return GL_LUMINANCE;
+ case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
+ return GL_LUMINANCE_ALPHA;
+ case GL_COMPRESSED_INTENSITY_ARB:
+ return GL_INTENSITY;
+ case GL_COMPRESSED_RGB_ARB:
+ return GL_RGB;
+ case GL_COMPRESSED_RGBA_ARB:
+ return GL_RGBA;
+ default:
+ return -1; /* not a recognized compressed format */
+ }
}