diff options
author | Brian Paul <brian.paul@tungstengraphics.com> | 2003-09-12 15:03:12 +0000 |
---|---|---|
committer | Brian Paul <brian.paul@tungstengraphics.com> | 2003-09-12 15:03:12 +0000 |
commit | 973da83f6237b5af4a9ee77f32fdfa5c04ecabc8 (patch) | |
tree | f5fe8c25f0c960dc26ac958ca96fe41658a3e55e | |
parent | 5c480a4887aaca56bd70bde91bddbc13f71e721e (diff) |
Allow glTexImage1/2/3D to specify width/height/depth = 0.
This allows texture state to be resettable to default state.
Not allowed according to the spec, but allowed by all other OpenGL libs.
-rw-r--r-- | src/mesa/main/teximage.c | 12 | ||||
-rw-r--r-- | src/mesa/main/texobj.c | 10 | ||||
-rw-r--r-- | src/mesa/main/texstate.c | 4 | ||||
-rw-r--r-- | src/mesa/main/texstore.c | 6 |
4 files changed, 21 insertions, 11 deletions
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 90f0332237..e10b75b0b3 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -105,7 +105,7 @@ static void PrintTexture(GLcontext *ctx, const struct gl_texture_image *img) /* * Compute floor(log_base_2(n)). - * If n <= 0 return -1. + * If n < 0 return -1. */ static int logbase2( int n ) @@ -113,9 +113,11 @@ logbase2( int n ) GLint i = 1; GLint log2 = 0; - if (n <= 0) { + if (n < 0) return -1; - } + + if (n == 0) + return 0; while ( n > i ) { i *= 2; @@ -1094,10 +1096,10 @@ texture_error_check( GLcontext *ctx, GLenum target, return GL_TRUE; } - if (width < 1 || height < 1 || depth < 1) { + if (width < 0 || height < 0 || depth < 0) { if (!isProxy) { _mesa_error(ctx, GL_INVALID_VALUE, - "glTexImage%dD(width, height or depth < 1)", dimensions); + "glTexImage%dD(width, height or depth < 0)", dimensions); } return GL_TRUE; } diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 6edb7e6565..08c59a0854 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -310,6 +310,15 @@ _mesa_test_texobj_completeness( const GLcontext *ctx, return; } + /* Check width/height/depth for zero */ + if (t->Image[baseLevel]->Width == 0 || + t->Image[baseLevel]->Height == 0 || + t->Image[baseLevel]->Depth == 0) { + incomplete(t, "texture width = 0"); + t->Complete = GL_FALSE; + return; + } + /* Compute _MaxLevel */ if (t->Target == GL_TEXTURE_1D) { maxLog2 = t->Image[baseLevel]->WidthLog2; @@ -559,7 +568,6 @@ _mesa_test_texobj_completeness( const GLcontext *ctx, } else if (t->Target == GL_TEXTURE_RECTANGLE_NV) { /* XXX special checking? */ - } else { /* Target = ??? */ diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index 133b957aa5..95009a23a5 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -2716,6 +2716,7 @@ update_texture_state( GLcontext *ctx ) struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; GLuint enableBits; + texUnit->_Current = NULL; texUnit->_ReallyEnabled = 0; texUnit->_GenFlags = 0; @@ -2789,8 +2790,7 @@ update_texture_state( GLcontext *ctx ) } if (!texUnit->_ReallyEnabled) { - texUnit->_Current = NULL; - continue; + continue; } if (texUnit->_ReallyEnabled) diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c index 16dd320e82..5a564fbc15 100644 --- a/src/mesa/main/texstore.c +++ b/src/mesa/main/texstore.c @@ -195,9 +195,9 @@ transfer_teximage(GLcontext *ctx, GLuint dimensions, texDestFormat == GL_COLOR_INDEX || texDestFormat == GL_DEPTH_COMPONENT); ASSERT(texDestAddr); - ASSERT(srcWidth >= 1); - ASSERT(srcHeight >= 1); - ASSERT(srcDepth >= 1); + ASSERT(srcWidth >= 0); + ASSERT(srcHeight >= 0); + ASSERT(srcDepth >= 0); ASSERT(dstXoffset >= 0); ASSERT(dstYoffset >= 0); ASSERT(dstZoffset >= 0); |