intel: Improve the test for readpixels blit path format checking.
authorEric Anholt <eric@anholt.net>
Mon, 28 Jan 2013 06:44:17 +0000 (17:44 +1100)
committerEric Anholt <eric@anholt.net>
Wed, 6 Mar 2013 00:02:38 +0000 (16:02 -0800)
We were allowing things like copying RG1616 to a user's ARGB8888
format, while we were denying anything that wasn't ARGB8888 or
RGB565.

Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
src/mesa/drivers/dri/intel/intel_pixel.c
src/mesa/drivers/dri/intel/intel_pixel.h
src/mesa/drivers/dri/intel/intel_pixel_read.c

index bc705105d4d965d1aa01826483693d506ac94324..f58cb855e60bb6b03c03291b5ba82c191261e020 100644 (file)
@@ -123,38 +123,6 @@ intel_check_blit_fragment_ops(struct gl_context * ctx, bool src_alpha_is_one)
    return true;
 }
 
-/* The intel_region struct doesn't really do enough to capture the
- * format of the pixels in the region.  For now this code assumes that
- * the region is a display surface and hence is either ARGB8888 or
- * RGB565.
- * XXX FBO: If we'd pass in the intel_renderbuffer instead of region, we'd
- * know the buffer's pixel format.
- *
- * \param format  as given to glDraw/ReadPixels
- * \param type  as given to glDraw/ReadPixels
- */
-bool
-intel_check_blit_format(struct intel_region * region,
-                        GLenum format, GLenum type)
-{
-   if (region->cpp == 4 &&
-       (type == GL_UNSIGNED_INT_8_8_8_8_REV ||
-        type == GL_UNSIGNED_BYTE) && format == GL_BGRA) {
-      return true;
-   }
-
-   if (region->cpp == 2 &&
-       type == GL_UNSIGNED_SHORT_5_6_5_REV && format == GL_BGR) {
-      return true;
-   }
-
-   DBG("%s: bad format for blit (cpp %d, type %s format %s)\n",
-       __FUNCTION__, region->cpp,
-       _mesa_lookup_enum_by_nr(type), _mesa_lookup_enum_by_nr(format));
-
-   return false;
-}
-
 void
 intelInitPixelFuncs(struct dd_function_table *functions)
 {
index 0438fca0acbdc8b4c094b546d6b0d9e23a428cd0..7578e6f0addcf943930e04846f17ecc5c3313e8b 100644 (file)
@@ -34,10 +34,6 @@ void intelInitPixelFuncs(struct dd_function_table *functions);
 bool intel_check_blit_fragment_ops(struct gl_context * ctx,
                                        bool src_alpha_is_one);
 
-bool intel_check_blit_format(struct intel_region *region,
-                                  GLenum format, GLenum type);
-
-
 void intelReadPixels(struct gl_context * ctx,
                      GLint x, GLint y,
                      GLsizei width, GLsizei height,
index 08f19eafe9d2c22cea23e862f3a14fc3a6ebfbc4..6b715d0af61ca137ee1989d27a1a540074debc24 100644 (file)
@@ -39,6 +39,8 @@
 #include "intel_context.h"
 #include "intel_blit.h"
 #include "intel_buffers.h"
+#include "intel_fbo.h"
+#include "intel_mipmap_tree.h"
 #include "intel_regions.h"
 #include "intel_pixel.h"
 #include "intel_buffer_objects.h"
@@ -94,9 +96,12 @@ do_blit_readpixels(struct gl_context * ctx,
       return false;
    }
 
+   struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
+   struct intel_renderbuffer *irb = intel_renderbuffer(rb);
 
    if (ctx->_ImageTransferState ||
-       !intel_check_blit_format(src, format, type)) {
+       !_mesa_format_matches_format_and_type(irb->mt->format, format, type,
+                                             false)) {
       DBG("%s - bad format for blit\n", __FUNCTION__);
       return false;
    }