mesa: additional glReadPixels error checks for GL_EXT_texture_integer
authorBrian Paul <brianp@vmware.com>
Tue, 26 Oct 2010 01:07:33 +0000 (19:07 -0600)
committerBrian Paul <brianp@vmware.com>
Tue, 26 Oct 2010 01:21:55 +0000 (19:21 -0600)
src/mesa/main/readpix.c

index e2ce264..ad27d11 100644 (file)
@@ -28,6 +28,7 @@
 #include "context.h"
 #include "readpix.h"
 #include "framebuffer.h"
+#include "formats.h"
 #include "image.h"
 #include "state.h"
 
@@ -185,6 +186,20 @@ _mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,
       return;
    }
 
+   /* Check that the destination format and source buffer are both
+    * integer-valued or both non-integer-valued.
+    */
+   if (ctx->Extensions.EXT_texture_integer && _mesa_is_color_format(format)) {
+      const struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
+      const GLboolean srcInteger = _mesa_is_format_integer(rb->Format);
+      const GLboolean dstInteger = _mesa_is_integer_format(format);
+      if (dstInteger != srcInteger) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "glReadPixels(integer / non-integer format mismatch");
+         return;
+      }
+   }
+
    if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
       _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
                   "glReadPixels(incomplete framebuffer)" );