mesa: Fix CopyTex{Sub,}Image error checks for integer vs non-integer.
authorEric Anholt <eric@anholt.net>
Fri, 20 Jan 2012 21:43:11 +0000 (13:43 -0800)
committerEric Anholt <eric@anholt.net>
Wed, 25 Jan 2012 00:37:10 +0000 (16:37 -0800)
Fixes Intel oglconform negative.typeFormatMismatch.copyteximage.

NOTE: This is a candidate for the 8.0 branch.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/mesa/main/teximage.c

index 39732522c55133f544bbe964d94cdbc8c67c521e..c64b10b04463685b406acb4efbaa34a0cf84ef04 100644 (file)
@@ -1938,6 +1938,24 @@ copytexture_error_check( struct gl_context *ctx, GLuint dimensions,
       return GL_TRUE;
    }
 
+   /* From the EXT_texture_integer spec:
+    *
+    *     "INVALID_OPERATION is generated by CopyTexImage* and CopyTexSubImage*
+    *      if the texture internalformat is an integer format and the read color
+    *      buffer is not an integer format, or if the internalformat is not an
+    *      integer format and the read color buffer is an integer format."
+    */
+   if (_mesa_is_color_format(internalFormat)) {
+      struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
+
+      if (_mesa_is_integer_format(rb->InternalFormat) !=
+         _mesa_is_integer_format(internalFormat)) {
+        _mesa_error(ctx, GL_INVALID_OPERATION,
+                    "glCopyTexImage%dD(integer vs non-integer)", dimensions);
+        return GL_TRUE;
+      }
+   }
+
    /* Do size, level checking */
    sizeOK = (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB)
       ? (width == height) : 1;
@@ -2153,16 +2171,21 @@ copytexsubimage_error_check2( struct gl_context *ctx, GLuint dimensions,
       return GL_TRUE;
    }
 
-   /* If copying into an integer texture, the source buffer must also be
-    * integer-valued.
+   /* From the EXT_texture_integer spec:
+    *
+    *     "INVALID_OPERATION is generated by CopyTexImage* and CopyTexSubImage*
+    *      if the texture internalformat is an integer format and the read color
+    *      buffer is not an integer format, or if the internalformat is not an
+    *      integer format and the read color buffer is an integer format."
     */
-   if (_mesa_is_format_integer_color(teximage->TexFormat)) {
+   if (_mesa_is_color_format(teximage->InternalFormat)) {
       struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
-      if (!_mesa_is_format_integer_color(rb->Format)) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glCopyTexSubImage%dD(source buffer is not integer format)",
-                  dimensions);
-         return GL_TRUE;
+
+      if (_mesa_is_format_integer_color(rb->Format) !=
+         _mesa_is_format_integer_color(teximage->TexFormat)) {
+        _mesa_error(ctx, GL_INVALID_OPERATION,
+                    "glCopyTexImage%dD(integer vs non-integer)", dimensions);
+        return GL_TRUE;
       }
    }