i965: Check base format to determine whether to use tiled memcpy
authorNeil Roberts <neil@linux.intel.com>
Thu, 19 Nov 2015 14:06:08 +0000 (15:06 +0100)
committerNeil Roberts <neil@linux.intel.com>
Thu, 10 Dec 2015 11:03:49 +0000 (11:03 +0000)
The tiled memcpy doesn't work for copying from RGBX to RGBA because it
doesn't override the alpha component to 1.0. Commit 2cebaac479d4 added
a check to disable it for RGBX formats by looking at the TexFormat.
However a lot of the rest of the code base is written with the
assumption that an RGBA texture can be used internally to implement a
GL_RGB texture. If that is done then this check breaks. This patch
makes it instead check the base format of the texture which I think
more directly matches the intention.

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/mesa/drivers/dri/i965/intel_pixel_read.c
src/mesa/drivers/dri/i965/intel_tex_image.c

index 347f88077eade2f9e7c1065cf9f38f10c71323e4..10d14623fe1fe5d0ddec3530c3c455625ff8b01e 100644 (file)
@@ -134,10 +134,11 @@ intel_readpixels_tiled_memcpy(struct gl_context * ctx,
       return false;
 
    /* We can't handle copying from RGBX or BGRX because the tiled_memcpy
-    * function doesn't set the last channel to 1.
+    * function doesn't set the last channel to 1. Note this checks BaseFormat
+    * rather than TexFormat in case the RGBX format is being simulated with an
+    * RGBA format.
     */
-   if (rb->Format == MESA_FORMAT_B8G8R8X8_UNORM ||
-       rb->Format == MESA_FORMAT_R8G8B8X8_UNORM)
+   if (rb->_BaseFormat == GL_RGB)
       return false;
 
    if (!intel_get_memcpy(rb->Format, format, type, &mem_copy, &cpp,
index 393ab48d9f7b3973e613824e548df7a74e697b07..5d32a4ce650cbe45f3596e0e5fe68418b9afb038 100644 (file)
@@ -398,10 +398,11 @@ intel_gettexsubimage_tiled_memcpy(struct gl_context *ctx,
       return false;
 
    /* We can't handle copying from RGBX or BGRX because the tiled_memcpy
-    * function doesn't set the last channel to 1.
+    * function doesn't set the last channel to 1. Note this checks BaseFormat
+    * rather than TexFormat in case the RGBX format is being simulated with an
+    * RGBA format.
     */
-   if (texImage->TexFormat == MESA_FORMAT_B8G8R8X8_UNORM ||
-       texImage->TexFormat == MESA_FORMAT_R8G8B8X8_UNORM)
+   if (texImage->_BaseFormat == GL_RGB)
       return false;
 
    if (!intel_get_memcpy(texImage->TexFormat, format, type, &mem_copy, &cpp,