i965/blorp: Fix sRGB MSAA resolves.
authorPaul Berry <stereotype441@gmail.com>
Mon, 24 Sep 2012 12:38:32 +0000 (05:38 -0700)
committerPaul Berry <stereotype441@gmail.com>
Tue, 25 Sep 2012 00:03:36 +0000 (17:03 -0700)
Commit e2249e8c4d06a85d6389ba1689e15d7e29aa4dff (i965/blorp: Add
support for blits between SRGB and linear formats) changed blorp to
always configure surface states for in linear format (even if the
underlying surface is sRGB).  This allowed sRGB-to-linear and
linear-to-sRGB blits to occur without causing the image to be
inappropriately brightened or darkened.

However, it broke sRGB MSAA resolves, since they rely on the
destination buffer format being sRGB in order to ensure that samples
are averaged together in sRGB-correct fashion.

This patch fixes the problem by instead configuring the source buffer
to use the *same* format as the destination buffer.  This ensures that
the image won't be brightened or darkened, but preserves proper sRGB
averaging.

Fixes piglit tests "EXT_framebuffer_multisample/accuracy srgb".

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=55265

NOTE: This is a candidate for stable release branches.

Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-and-tested-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_blorp.cpp
src/mesa/drivers/dri/i965/brw_blorp_blit.cpp

index 54b3cebcdb6384d1fe1b9f490e0f0f71e7151565..77b9f8fb3c92e6f21e58c2e5d08a64e53324607a 100644 (file)
@@ -95,15 +95,13 @@ brw_blorp_surface_info::set(struct brw_context *brw,
       this->brw_surfaceformat = BRW_SURFACEFORMAT_R8G8_UNORM;
       break;
    default:
-      /* Blorp blits don't support any sort of format conversion, so we can
-       * safely assume that the same format is being used for the source and
-       * destination.  Therefore the format must be supported as a render
-       * target, even if this is the source image.  So we can convert to a
-       * surface format using brw->render_target_format.
+      /* Blorp blits don't support any sort of format conversion (except
+       * between sRGB and linear), so we can safely assume that the format is
+       * supported as a render target, even if this is the source image.  So
+       * we can convert to a surface format using brw->render_target_format.
        */
-      gl_format linear_format = _mesa_get_srgb_format_linear(mt->format);
-      assert(brw->format_supported_as_render_target[linear_format]);
-      this->brw_surfaceformat = brw->render_target_format[linear_format];
+      assert(brw->format_supported_as_render_target[mt->format]);
+      this->brw_surfaceformat = brw->render_target_format[mt->format];
       break;
    }
 }
index 034c7019573ef11304bc7ba9d9faadc9c4428a8d..e8604e70195f6eae846b06dcc9ab97c5da0782ad 100644 (file)
@@ -1641,6 +1641,19 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw,
    src.set(brw, src_mt, src_level, src_layer);
    dst.set(brw, dst_mt, dst_level, dst_layer);
 
+   /* If we are blitting from sRGB to linear or vice versa, we still want the
+    * blit to be a direct copy, so we need source and destination to use the
+    * same format.  However, we want the destination sRGB/linear state to be
+    * correct (so that sRGB blending is used when doing an MSAA resolve to an
+    * sRGB surface, and linear blending is used when doing an MSAA resolve to
+    * a linear surface).  Since blorp blits don't support any format
+    * conversion (except between sRGB and linear), we can accomplish this by
+    * simply setting up the source to use the same format as the destination.
+    */
+   assert(_mesa_get_srgb_format_linear(src_mt->format) ==
+          _mesa_get_srgb_format_linear(dst_mt->format));
+   src.brw_surfaceformat = dst.brw_surfaceformat;
+
    use_wm_prog = true;
    memset(&wm_prog_key, 0, sizeof(wm_prog_key));