summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2004-06-10 20:46:23 +0000
committerBrian Paul <[email protected]>2004-06-10 20:46:23 +0000
commit601df9c742939c1f77de489561fe3e1d02f49618 (patch)
treed996a8dfb5e13aaf31472b7574c58c6ac3b165d4
parent13ad04719e292a2bee7e1b3155da74a97921c035 (diff)
Additional error checking for glTexImageXD.
Only allow 1D and 2D GL_DEPTH_COMPONENT textures. Make sure internal format and user format are in same catagory.
-rw-r--r--src/mesa/main/teximage.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index 355a50bb9a6..54cc73dce80 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -1294,16 +1294,25 @@ texture_error_check( GLcontext *ctx, GLenum target,
return GL_TRUE;
}
- if (format == GL_YCBCR_MESA || internalFormat == GL_YCBCR_MESA) {
+ /* make sure internal format and format basically agree */
+ if ((is_color_format(internalFormat) != is_color_format(format)) ||
+ (is_index_format(internalFormat) != is_index_format(format)) ||
+ (is_depth_format(internalFormat) != is_depth_format(format)) ||
+ (is_ycbcr_format(internalFormat) != is_ycbcr_format(format))) {
+ if (!isProxy)
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glTexImage(internalFormat/format)");
+ return GL_TRUE;
+ }
+
+ /* additional checks for ycbcr textures */
+ if (internalFormat == GL_YCBCR_MESA) {
ASSERT(ctx->Extensions.MESA_ycbcr_texture);
- if (format != GL_YCBCR_MESA ||
- internalFormat != GL_YCBCR_MESA ||
- (type != GL_UNSIGNED_SHORT_8_8_MESA &&
- type != GL_UNSIGNED_SHORT_8_8_REV_MESA)) {
+ if (type != GL_UNSIGNED_SHORT_8_8_MESA &&
+ type != GL_UNSIGNED_SHORT_8_8_REV_MESA) {
char message[100];
_mesa_sprintf(message,
- "glTexImage%d(format/type/internalFormat YCBCR mismatch",
- dimensions);
+ "glTexImage%d(format/type YCBCR mismatch", dimensions);
_mesa_error(ctx, GL_INVALID_ENUM, message);
return GL_TRUE; /* error */
}
@@ -1327,6 +1336,21 @@ texture_error_check( GLcontext *ctx, GLenum target,
}
}
+ /* additional checks for depth textures */
+ if (_mesa_base_tex_format(ctx, internalFormat) == GL_DEPTH_COMPONENT) {
+ /* Only 1D and 2D textures supported */
+ if (target != GL_TEXTURE_1D &&
+ target != GL_PROXY_TEXTURE_1D &&
+ target != GL_TEXTURE_2D &&
+ target != GL_PROXY_TEXTURE_2D) {
+ if (!isProxy)
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glTexImage(target/internalFormat)");
+ return GL_TRUE;
+ }
+ }
+
+ /* additional checks for compressed textures */
if (is_compressed_format(ctx, internalFormat)) {
if (target == GL_TEXTURE_2D || target == GL_PROXY_TEXTURE_2D) {
/* OK */