[Mesa-dev] [PATCH 6/7] i965/blorp: Rework sRGB override behavior.
Ian Romanick
idr at freedesktop.org
Tue Oct 8 11:34:20 PDT 2013
On 10/07/2013 04:31 PM, Kenneth Graunke wrote:
> 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 at whitecape.org>
> ---
> src/mesa/drivers/dri/i965/brw_blorp.cpp | 10 ++++++----
> src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 14 +++++++++-----
> 2 files changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp.cpp b/src/mesa/drivers/dri/i965/brw_blorp.cpp
> index c59bb66..91df346 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp.cpp
> @@ -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);
> }
This is at least the second time this code block has appeared. inline
member function?
> break;
> }
> + }
> }
>
>
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> index f581871..2427085 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> @@ -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));
>
More information about the mesa-dev
mailing list