On 26.09.2017 20:34, Ian Romanick wrote:
I'm hoping to land my patch series that removes ir_assignment::condition
either today or tomorrow.  I believe that series deletes all of this
code... but this patch would still be useful for stable.

Yep, that series is much appreciated. If it weren't for stable, I would have just waited :)

Cheers,
Nicolai


On 09/26/2017 07:42 AM, Nicolai Hähnle wrote:
From: Nicolai Hähnle <nicolai.haeh...@amd.com>

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-sta...@lists.freedesktop.org
---
  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 f4870a1c606..0daf5a14285 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -2890,21 +2890,29 @@ glsl_to_tgsi_visitor::emit_block_mov(ir_assignment *ir, 
const struct glsl_type *
        }
        return;
     }
assert(type->is_scalar() || type->is_vector()); l->type = type->base_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,
                cond_swap ? l_src : *r,
                cond_swap ? *r : l_src);
        } else {
           emit_asm(ir, TGSI_OPCODE_CMP, *l, *cond,
                cond_swap ? l_src : *r,
                cond_swap ? *r : l_src);
        }



_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to