New glTexImage code.

The gl_texture_format struct now has a StoreTexImageFunc that's called
by glTex[Sub]Image[123]D to convert the user's texture data into the
specific texture format layout.  Now it's much easier to add new texture
formats (like the 16/32-bit floating point formats).
The texutil.[ch] and texutil_tmp.h files are obsolete.
This commit is contained in:
Brian Paul
2004-04-22 00:27:31 +00:00
parent 05a6f2fd48
commit f959f6e1dc
22 changed files with 3275 additions and 539 deletions

View File

@@ -199,103 +199,124 @@ _mesa_base_tex_format( GLcontext *ctx, GLint internalFormat )
case GL_RGBA12:
case GL_RGBA16:
return GL_RGBA;
case GL_COLOR_INDEX:
case GL_COLOR_INDEX1_EXT:
case GL_COLOR_INDEX2_EXT:
case GL_COLOR_INDEX4_EXT:
case GL_COLOR_INDEX8_EXT:
case GL_COLOR_INDEX12_EXT:
case GL_COLOR_INDEX16_EXT:
if (ctx->Extensions.EXT_paletted_texture)
return GL_COLOR_INDEX;
else
return -1;
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)
return GL_DEPTH_COMPONENT;
else
return -1;
/* GL_ARB_texture_compression */
case GL_COMPRESSED_ALPHA:
if (ctx->Extensions.ARB_texture_compression)
return GL_ALPHA;
else
return -1;
case GL_COMPRESSED_LUMINANCE:
if (ctx->Extensions.ARB_texture_compression)
return GL_LUMINANCE;
else
return -1;
case GL_COMPRESSED_LUMINANCE_ALPHA:
if (ctx->Extensions.ARB_texture_compression)
return GL_LUMINANCE_ALPHA;
else
return -1;
case GL_COMPRESSED_INTENSITY:
if (ctx->Extensions.ARB_texture_compression)
return GL_INTENSITY;
else
return -1;
case GL_COMPRESSED_RGB:
if (ctx->Extensions.ARB_texture_compression)
return GL_RGB;
else
return -1;
case GL_COMPRESSED_RGBA:
if (ctx->Extensions.ARB_texture_compression)
return GL_RGBA;
else
return -1;
case GL_COMPRESSED_RGB_FXT1_3DFX:
if (ctx->Extensions.TDFX_texture_compression_FXT1)
return GL_RGB;
else
return -1;
case GL_COMPRESSED_RGBA_FXT1_3DFX:
if (ctx->Extensions.TDFX_texture_compression_FXT1)
return GL_RGBA;
else
return -1;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
if (ctx->Extensions.EXT_texture_compression_s3tc)
return GL_RGB;
else
return -1;
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
if (ctx->Extensions.EXT_texture_compression_s3tc)
return GL_RGBA;
else
return -1;
case GL_RGB_S3TC:
case GL_RGB4_S3TC:
if (ctx->Extensions.S3_s3tc)
return GL_RGB;
else
return -1;
case GL_RGBA_S3TC:
case GL_RGBA4_S3TC:
if (ctx->Extensions.S3_s3tc)
return GL_RGBA;
else
return -1;
case GL_YCBCR_MESA:
if (ctx->Extensions.MESA_ycbcr_texture)
return GL_YCBCR_MESA;
else
return -1;
/* XXX add float texture formats here */
default:
return -1; /* error */
; /* fallthrough */
}
if (ctx->Extensions.EXT_paletted_texture) {
switch (internalFormat) {
case GL_COLOR_INDEX:
case GL_COLOR_INDEX1_EXT:
case GL_COLOR_INDEX2_EXT:
case GL_COLOR_INDEX4_EXT:
case GL_COLOR_INDEX8_EXT:
case GL_COLOR_INDEX12_EXT:
case GL_COLOR_INDEX16_EXT:
return GL_COLOR_INDEX;
default:
; /* fallthrough */
}
}
if (ctx->Extensions.SGIX_depth_texture) {
switch (internalFormat) {
case GL_DEPTH_COMPONENT:
case GL_DEPTH_COMPONENT16_SGIX:
case GL_DEPTH_COMPONENT24_SGIX:
case GL_DEPTH_COMPONENT32_SGIX:
return GL_DEPTH_COMPONENT;
default:
; /* fallthrough */
}
}
if (ctx->Extensions.ARB_texture_compression) {
switch (internalFormat) {
case GL_COMPRESSED_ALPHA:
return GL_ALPHA;
case GL_COMPRESSED_LUMINANCE:
return GL_LUMINANCE;
case GL_COMPRESSED_LUMINANCE_ALPHA:
return GL_LUMINANCE_ALPHA;
case GL_COMPRESSED_INTENSITY:
return GL_INTENSITY;
case GL_COMPRESSED_RGB:
return GL_RGB;
case GL_COMPRESSED_RGBA:
return GL_RGBA;
default:
; /* fallthrough */
}
}
if (ctx->Extensions.TDFX_texture_compression_FXT1) {
switch (internalFormat) {
case GL_COMPRESSED_RGB_FXT1_3DFX:
return GL_RGB;
case GL_COMPRESSED_RGBA_FXT1_3DFX:
return GL_RGBA;
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
return GL_RGB;
default:
; /* fallthrough */
}
}
if (ctx->Extensions.EXT_texture_compression_s3tc) {
switch (internalFormat) {
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
return GL_RGBA;
default:
; /* fallthrough */
}
}
if (ctx->Extensions.S3_s3tc) {
switch (internalFormat) {
case GL_RGB_S3TC:
case GL_RGB4_S3TC:
return GL_RGB;
case GL_RGBA_S3TC:
case GL_RGBA4_S3TC:
return GL_RGBA;
default:
; /* fallthrough */
}
}
if (ctx->Extensions.MESA_ycbcr_texture) {
if (internalFormat == GL_YCBCR_MESA)
return GL_YCBCR_MESA;
}
if (ctx->Extensions.ARB_texture_float) {
switch (internalFormat) {
case GL_ALPHA16F_ARB:
case GL_ALPHA32F_ARB:
return GL_ALPHA;
case GL_RGBA16F_ARB:
case GL_RGBA32F_ARB:
return GL_RGBA;
case GL_RGB16F_ARB:
case GL_RGB32F_ARB:
return GL_RGB;
case GL_INTENSITY16F_ARB:
case GL_INTENSITY32F_ARB:
return GL_INTENSITY;
case GL_LUMINANCE16F_ARB:
case GL_LUMINANCE32F_ARB:
return GL_LUMINANCE;
case GL_LUMINANCE_ALPHA16F_ARB:
case GL_LUMINANCE_ALPHA32F_ARB:
return GL_LUMINANCE_ALPHA;
default:
; /* nothing */
}
}
return -1; /* error */
}
@@ -351,7 +372,19 @@ is_color_format(GLenum internalFormat)
case GL_RGB10_A2:
case GL_RGBA12:
case GL_RGBA16:
/* XXX add float texture formats here */
/* float texture formats */
case GL_ALPHA16F_ARB:
case GL_ALPHA32F_ARB:
case GL_LUMINANCE16F_ARB:
case GL_LUMINANCE32F_ARB:
case GL_LUMINANCE_ALPHA16F_ARB:
case GL_LUMINANCE_ALPHA32F_ARB:
case GL_INTENSITY16F_ARB:
case GL_INTENSITY32F_ARB:
case GL_RGB16F_ARB:
case GL_RGB32F_ARB:
case GL_RGBA16F_ARB:
case GL_RGBA32F_ARB:
return GL_TRUE;
case GL_YCBCR_MESA: /* not considered to be RGB */
default:
@@ -1241,7 +1274,7 @@ texture_error_check( GLcontext *ctx, GLenum target,
}
/* Check incoming image format and type */
if (!_mesa_is_legal_format_and_type(format, type)) {
if (!_mesa_is_legal_format_and_type(ctx, format, type)) {
/* Yes, generate GL_INVALID_OPERATION, not GL_INVALID_ENUM, if there
* is a type/format mismatch. See 1.2 spec page 94, sec 3.6.4.
*/
@@ -1449,7 +1482,7 @@ subtexture_error_check( GLcontext *ctx, GLuint dimensions,
}
}
if (!_mesa_is_legal_format_and_type(format, type)) {
if (!_mesa_is_legal_format_and_type(ctx, format, type)) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glTexSubImage%dD(format or type)", dimensions);
return GL_TRUE;