From f5cbe1f9b86e0300e62350089847b6d7c62517dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolai=20H=C3=A4hnle?= Date: Fri, 22 Sep 2017 16:59:08 +0200 Subject: [PATCH] st/glsl_to_tgsi: fix conditional assignments to packed shader outputs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Overriding the default (no-op) swizzle is clearly counter-productive, since the whole point is putting the destination register as one of the source operands so that it remains unmodified when the assignment condition is false. Fragment depth and stencil outputs are a special case due to how their source swizzles are manipulated in translate_src when compiling to TGSI. Fixes dEQP-GLES2.functional.shaders.conditionals.if.*_vertex Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Marek Olšák Tested-by: Dieter Nützel (cherry picked from commit 8ea7d3a5c8ea0c530d7f66a9bdd0fb12c59418bc) --- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index d1e1916df00..e17f445c252 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -3143,7 +3143,15 @@ glsl_to_tgsi_visitor::emit_block_mov(ir_assignment *ir, const struct glsl_type * r->type = type->base_type; if (cond) { st_src_reg l_src = st_src_reg(*l); - l_src.swizzle = swizzle_for_size(type->vector_elements); + + if (l_src.file == PROGRAM_OUTPUT && + this->prog->Target == GL_FRAGMENT_PROGRAM_ARB && + (l_src.index == FRAG_RESULT_DEPTH || l_src.index == FRAG_RESULT_STENCIL)) { + /* This is a special case because the source swizzles will be shifted + * later to account for the difference between GLSL (where they're + * plain floats) and TGSI (where they're Z and Y components). */ + l_src.swizzle = SWIZZLE_XXXX; + } if (native_integers) { emit_asm(ir, TGSI_OPCODE_UCMP, *l, *cond,