meta: Unset the textures_used_by_txf bitfield.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 11 Oct 2017 07:18:38 +0000 (00:18 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 13 Oct 2017 00:22:42 +0000 (17:22 -0700)
Drivers that use Meta are happily using blitting data using texelFetch
and GL_SKIP_DECODE_EXT, but the GL_EXT_texture_sRGB spec unfortunately
makes GL_SKIP_DECODE_EXT not necessarily work with texelFetch.

As a hack, just unset the texture_used_by_txf bitfield so we can
continue with the old desired behavior.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/common/meta.c

index 73143842485d4836b4eb85f8e9789c5772d7eb80..bae04bea516e6736d1d1b000cd82d9ccc9ef73b1 100644 (file)
@@ -87,6 +87,7 @@
 #include "main/glformats.h"
 #include "util/bitscan.h"
 #include "util/ralloc.h"
+#include "compiler/nir/nir.h"
 
 /** Return offset in bytes of the field within a vertex struct */
 #define OFFSET(FIELD) ((void *) offsetof(struct vertex, FIELD))
@@ -195,6 +196,18 @@ _mesa_meta_compile_and_link_program(struct gl_context *ctx,
 
    _mesa_meta_link_program_with_debug(ctx, sh_prog);
 
+   struct gl_program *fp =
+      sh_prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program;
+
+   /* texelFetch() can break GL_SKIP_DECODE_EXT, but many meta passes want
+    * to use both together; pretend that we're not using texelFetch to hack
+    * around this bad interaction.  This is a bit fragile as it may break
+    * if you re-run the pass that gathers this info, but we probably won't...
+    */
+   fp->info.textures_used_by_txf = 0;
+   if (fp->nir)
+      fp->nir->info.textures_used_by_txf = 0;
+
    _mesa_meta_use_program(ctx, sh_prog);
 
    *out_sh_prog = sh_prog;