i965: Allow the blorp blit between BGR and RGB
authorNeil Roberts <neil@linux.intel.com>
Mon, 23 Jun 2014 16:43:08 +0000 (17:43 +0100)
committerNeil Roberts <neil@linux.intel.com>
Mon, 23 Jun 2014 18:59:40 +0000 (19:59 +0100)
Previously the blorp blitter would only be used if the format is identical or
there is only a difference between whether there is an alpha component or not.
This patch makes it also allow the blorp blitter if the only difference is the
ordering of the RGB components (ie, RGB or BGR).

This is particularly useful since commit 61e264f4fcdba3623 because Mesa now
prefers RGB ordering for textures but the window system buffers are still
created as BGR. That means that the blorp blitter won't be used for the
(probably) common case of blitting from a texture to the window system buffer.

This doesn't cause any regressions in the FBO piglit tests on Haswell. On
Sandybridge it causes the fbo-blit-stretch test to fail but that is only
because it was failing anyway before the above commit and that commit hid the
problem.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=68365
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_blorp_blit.cpp

index 118af2735050e247a2dd5418d1c86526e8ebea29..d7f5f7dbd4fea49e0b7b832af97c369dc61e85bb 100644 (file)
@@ -119,21 +119,35 @@ do_blorp_blit(struct brw_context *brw, GLbitfield buffer_bit,
    dst_irb->need_downsample = true;
 }
 
+static bool
+format_is_rgba_or_rgbx_byte(mesa_format format)
+{
+   switch (format) {
+   case MESA_FORMAT_B8G8R8X8_UNORM:
+   case MESA_FORMAT_B8G8R8A8_UNORM:
+   case MESA_FORMAT_R8G8B8X8_UNORM:
+   case MESA_FORMAT_R8G8B8A8_UNORM:
+      return true;
+   default:
+      return false;
+   }
+}
+
 static bool
 color_formats_match(mesa_format src_format, mesa_format dst_format)
 {
    mesa_format linear_src_format = _mesa_get_srgb_format_linear(src_format);
    mesa_format linear_dst_format = _mesa_get_srgb_format_linear(dst_format);
 
-   /* Normally, we require the formats to be equal.  However, we also support
+   /* Normally, we require the formats to be equal. However, we also support
     * blitting from ARGB to XRGB (discarding alpha), and from XRGB to ARGB
-    * (overriding alpha to 1.0 via blending).
+    * (overriding alpha to 1.0 via blending) as well as swizzling between BGR
+    * and RGB.
     */
-   return linear_src_format == linear_dst_format ||
-          (linear_src_format == MESA_FORMAT_B8G8R8X8_UNORM &&
-           linear_dst_format == MESA_FORMAT_B8G8R8A8_UNORM) ||
-          (linear_src_format == MESA_FORMAT_B8G8R8A8_UNORM &&
-           linear_dst_format == MESA_FORMAT_B8G8R8X8_UNORM);
+
+   return (linear_src_format == linear_dst_format ||
+           (format_is_rgba_or_rgbx_byte(linear_src_format) &&
+            format_is_rgba_or_rgbx_byte(linear_dst_format)));
 }
 
 static bool