From 41d78f9ed7ebbdd8bd10268635e9bc883a8ffc33 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 11 Feb 2019 22:39:45 -0600 Subject: [PATCH] intel/fs: Bail in optimize_extract_to_float if we have modifiers This fixes a bug in runscape where we were optimizing x >> 16 to an extract and then negating and converting to float. The NIR to fs pass was dropping the negate on the floor breaking a geometry shader and causing it to render nothing. Fixes: 1f862e923cb "i965/fs: Optimize float conversions of byte/word..." Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109601 Tested-by: Lionel Landwerlin Reviewed-by: Matt Turner (cherry picked from commit 367b0ede4d9115aba772d6e46ec73642761f7ff6) [Emil: resolve trivial conflicts] Signed-off-by: Emil Velikov Conflicts: src/intel/compiler/brw_fs_nir.cpp --- src/intel/compiler/brw_fs_nir.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index c33394d10d4..f471f1ce0a2 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -511,6 +511,15 @@ fs_visitor::optimize_extract_to_float(nir_alu_instr *instr, src0->op != nir_op_extract_i8 && src0->op != nir_op_extract_i16) return false; + /* If either opcode has source modifiers, bail. + * + * TODO: We can potentially handle source modifiers if both of the opcodes + * we're combining are signed integers. + */ + if (instr->src[0].abs || instr->src[0].negate || + src0->src[0].abs || src0->src[0].negate) + return false; + nir_const_value *element = nir_src_as_const_value(src0->src[1].src); assert(element != NULL);