If GL_FRAMEBUFFER_SRGB is enabled when writing to an SRGB-capable framebuffer then the color will be converted from linear to SRGB before being written. There is no chance for the hardware to do this itself because it can't modify the clear color that is programmed in the surface state so it seems pretty clear that the driver should be handling this itself.
Note that this wasn't a problem before Gen9 because previously we were only able to do fast clears to 0 or 1 and those values are the same in linear and SRGB space. --- I noticed this after posting the patch series but I think it belongs in this series because it only causes a problem once we enable fast clears for MSRTs. I made a test case to demonstrate this here: http://patchwork.freedesktop.org/patch/66222/ I tried to think what other similar problems there could be such as whether we need to clamp the values to [0,1] for normalised formats. However this seems to just work so I guess the sampler hardware does look at the surface format enough to determine it needs to clamp the clear color. It's a bit odd what the sampler does and doesn't do with the fast clear color. I made a test case for this as well: http://patchwork.freedesktop.org/patch/66223/ Annoyingly it doesn't clamp the value correctly for GL_R11F_G11F_B10F_EXT. That format is floating-point but it has no signed bits so I think it should clamp to a minimum of 0. I have a github branch with all of my SKL fast clear patches here: https://github.com/bpeel/mesa/commits/skl-fast-clear src/mesa/drivers/dri/i965/brw_meta_fast_clear.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c index 1b2ea42..f1920b2 100644 --- a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c +++ b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c @@ -41,6 +41,8 @@ #include "main/api_validate.h" #include "main/state.h" +#include "util/format_srgb.h" + #include "vbo/vbo_context.h" #include "drivers/common/meta.h" @@ -424,6 +426,15 @@ set_fast_clear_color(struct brw_context *brw, override_color.f[3] = 1.0f; } + /* Handle linear→SRGB conversion */ + if (brw->ctx.Color.sRGBEnabled && + _mesa_get_srgb_format_linear(mt->format) != mt->format) { + for (int i = 0; i < 3; i++) { + override_color.f[i] = + util_format_linear_to_srgb_float(override_color.f[i]); + } + } + if (brw->gen >= 9) { mt->gen9_fast_clear_color = override_color; } else { -- 1.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev