Allow glTexImage1/2/3D to specify width/height/depth = 0.
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 12 Sep 2003 15:03:12 +0000 (15:03 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 12 Sep 2003 15:03:12 +0000 (15:03 +0000)
This allows texture state to be resettable to default state.
Not allowed according to the spec, but allowed by all other OpenGL libs.

src/mesa/main/teximage.c
src/mesa/main/texobj.c
src/mesa/main/texstate.c
src/mesa/main/texstore.c

index 90f03322373d240a8a783d66cc2ea38015906886..e10b75b0b3c5f68f75e07e091f7db44d2131b33c 100644 (file)
@@ -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;
    }
index 6edb7e65655afbfb1e8b390d9efbf76927acd383..08c59a0854d1881db3b190e9eb8ab9c6f69a3acb 100644 (file)
@@ -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 = ??? */
index 133b957aa56b8c31d55512cbf2512a7e801aced3..95009a23a5c7c34c90de8a3a67b86273a78df710 100644 (file)
@@ -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)
index 16dd320e8275ed7ee111656c5df3785a5c7668f8..5a564fbc15358ea320cb5ab93354299bcb31d243 100644 (file)
@@ -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);