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:
@@ -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;
|
||||
|
Reference in New Issue
Block a user