i965: Respect GL_TEXTURE_SRGB_DECODE_EXT in GenerateMipmaps()
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 29 Oct 2018 22:29:10 +0000 (15:29 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 30 Oct 2018 19:59:53 +0000 (12:59 -0700)
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 <tapani.palli@intel.com>
src/mesa/drivers/dri/i965/brw_generate_mipmap.c

index 32c2933f721824c28c532bf663ba8229638bd3a2..4125ae6e11c445a5da1359e8c3d24adf17488f89 100644 (file)
@@ -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);
       }
    }
 }