i965/blorp: Rework sRGB override behavior.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 7 Oct 2013 19:44:01 +0000 (12:44 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 9 Oct 2013 23:36:50 +0000 (16:36 -0700)
The previous code for sRGB overrides assumes that the source and
destination formats are equal, other than the color space.  This won't
be feasible when we add support for format conversions.

Here are a few cases, and how the old code handled them:

1.  RGB8 -> SRGB8, MSAA     ==>   SRGB8 -> SRGB8
2.  RGB8 -> SRGB8, single   ==>    RGB8 -> RGB8
3. SRGB8 ->  RGB8, MSAA     ==>    RGB8 -> RGB8
4. SRGB8 ->  RGB8, single   ==>   SRGB8 -> SRGB8

Apparently, preserving the behavior of #1 is important.  When doing a
multisample to single-sample resolve, blending the samples together in
an sRGB correct fashion results in a noticably higher quality image.
It also is necessary to pass Piglit's EXT_framebuffer_multisample
accuracy color tests.

Paul, Eric, Anuj, and I talked about this, and aren't sure that it
matters in the other cases.

This patch preserves the behavior of #1, but otherwise reverts to
doing everything in linear space, changing the behavior of case #4.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
src/mesa/drivers/dri/i965/brw_blorp.cpp
src/mesa/drivers/dri/i965/brw_blorp_blit.cpp

index c59bb663a7619861dfd336c543e0317480699d4b..91df346b887cf6e050dcac20dd3a84c3ce5fa2de 100644 (file)
@@ -104,15 +104,17 @@ brw_blorp_surface_info::set(struct brw_context *brw,
    case MESA_FORMAT_Z16:
       this->brw_surfaceformat = BRW_SURFACEFORMAT_R16_UNORM;
       break;
-   default:
+   default: {
+      gl_format linear_format = _mesa_get_srgb_format_linear(mt->format);
       if (is_render_target) {
-         assert(brw->format_supported_as_render_target[mt->format]);
-         this->brw_surfaceformat = brw->render_target_format[mt->format];
+         assert(brw->format_supported_as_render_target[linear_format]);
+         this->brw_surfaceformat = brw->render_target_format[linear_format];
       } else {
-         this->brw_surfaceformat = brw_format_for_mesa_format(mt->format);
+         this->brw_surfaceformat = brw_format_for_mesa_format(linear_format);
       }
       break;
    }
+   }
 }
 
 
index ec70217f2c67e275160005b6fd471c06ed81e746..999a317b82724ef1027a93739767dfa653c94b4b 100644 (file)
@@ -2077,13 +2077,17 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw,
     * proprietary OpenGL driver also follow this approach. So, we choose to
     * follow it in our driver.
     *
-    * Following if-else block takes care of this exception made for
-    * multisampled resolves.
+    * When multisampling, if the source and destination formats are equal
+    * (aside from the color space), we choose to blit in sRGB space to get
+    * this higher quality image.
     */
-   if (src.num_samples > 1)
+   if (src.num_samples > 1 &&
+       _mesa_get_format_color_encoding(dst_mt->format) == GL_SRGB &&
+       _mesa_get_srgb_format_linear(src_mt->format) ==
+       _mesa_get_srgb_format_linear(dst_mt->format)) {
+      dst.brw_surfaceformat = brw_format_for_mesa_format(dst_mt->format);
       src.brw_surfaceformat = dst.brw_surfaceformat;
-   else
-      dst.brw_surfaceformat = src.brw_surfaceformat;
+   }
 
    use_wm_prog = true;
    memset(&wm_prog_key, 0, sizeof(wm_prog_key));