summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brian.paul@tungstengraphics.com>2003-09-12 15:03:12 +0000
committerBrian Paul <brian.paul@tungstengraphics.com>2003-09-12 15:03:12 +0000
commit973da83f6237b5af4a9ee77f32fdfa5c04ecabc8 (patch)
treef5fe8c25f0c960dc26ac958ca96fe41658a3e55e
parent5c480a4887aaca56bd70bde91bddbc13f71e721e (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.c12
-rw-r--r--src/mesa/main/texobj.c10
-rw-r--r--src/mesa/main/texstate.c4
-rw-r--r--src/mesa/main/texstore.c6
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);