summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/common
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2017-10-11 00:18:38 -0700
committerKenneth Graunke <[email protected]>2017-10-12 17:22:42 -0700
commit32fcced7b479cb7acf43305481cc23a0b04b051c (patch)
tree3eaa7dbe006d14d9c6541c562c99974673805043 /src/mesa/drivers/common
parenta576c148cd77b3abf44cd673c36bc737dfbedc10 (diff)
meta: Unset the textures_used_by_txf bitfield.
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 <[email protected]>
Diffstat (limited to 'src/mesa/drivers/common')
-rw-r--r--src/mesa/drivers/common/meta.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
index 73143842485..bae04bea516 100644
--- a/src/mesa/drivers/common/meta.c
+++ b/src/mesa/drivers/common/meta.c
@@ -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;