From: Kenneth Graunke Date: Mon, 29 Oct 2018 22:29:10 +0000 (-0700) Subject: i965: Respect GL_TEXTURE_SRGB_DECODE_EXT in GenerateMipmaps() X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=337a808062c756b474ee80a9ac04b5a3dbbeb67e;p=mesa.git i965: Respect GL_TEXTURE_SRGB_DECODE_EXT in GenerateMipmaps() Apparently, we're supposed to look at the texture object's built-in sampler object's sRGB decode setting in order to decide whether to decode/downsample/re-encode, or simply downsample as-is. Previously, I had always done the decoding/encoding. Fixes SKQP's Skia_Unit_Tests.SRGBMipMaps test. Reviewed-by: Tapani Pälli --- diff --git a/src/mesa/drivers/dri/i965/brw_generate_mipmap.c b/src/mesa/drivers/dri/i965/brw_generate_mipmap.c index 32c2933f721..4125ae6e11c 100644 --- a/src/mesa/drivers/dri/i965/brw_generate_mipmap.c +++ b/src/mesa/drivers/dri/i965/brw_generate_mipmap.c @@ -105,6 +105,23 @@ brw_generate_mipmap(struct gl_context *ctx, GLenum target, last_layer = base_size->array_len - 1; } + /* The GL_EXT_texture_sRGB_decode extension's issues section says: + * + * "10) How is mipmap generation of sRGB textures affected by the + * TEXTURE_SRGB_DECODE_EXT parameter? + * + * RESOLVED: When the TEXTURE_SRGB_DECODE parameter is DECODE_EXT + * for an sRGB texture, mipmap generation should decode sRGB texels + * to a linear RGB color space, perform downsampling, then encode + * back to an sRGB color space. (Issue 24 in the EXT_texture_sRGB + * specification provides a rationale for why.) When the parameter + * is SKIP_DECODE_EXT instead, mipmap generation skips the encode + * and decode steps during mipmap generation. By skipping the + * encode and decode steps, sRGB mipmap generation should match + * the mipmap generation for a non-sRGB texture." + */ + bool do_srgb = tex_obj->Sampler.sRGBDecode == GL_DECODE_EXT; + for (unsigned dst_level = base_level + 1; dst_level <= last_level; dst_level++) { @@ -121,7 +138,7 @@ brw_generate_mipmap(struct gl_context *ctx, GLenum target, minify(base_size->width, dst_level), minify(base_size->height, dst_level), GL_LINEAR, false, false, - true, true); + do_srgb, do_srgb); } } }