On 29.09.2017 14:25, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

just don't propagate output reads
---
  src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 6 ++----
  1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp 
b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 50a71e4..2d62213 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -4940,20 +4940,21 @@ glsl_to_tgsi_visitor::copy_propagate(void)
/* If this is a copy, add it to the ACP. */
        if (inst->op == TGSI_OPCODE_MOV &&
            inst->dst[0].file == PROGRAM_TEMPORARY &&
            !(inst->dst[0].file == inst->src[0].file &&
               inst->dst[0].index == inst->src[0].index) &&
            !inst->dst[0].reladdr &&
            !inst->dst[0].reladdr2 &&
            !inst->saturate &&
            inst->src[0].file != PROGRAM_ARRAY &&
+          inst->src[0].file != PROGRAM_OUTPUT &&

Did you check shader-db effects of this? We only really need this restriction on TCS. Though I guess radeonsi is actually one of the least affected drivers thanks to LLVM.

Cheers,
Nicolai


            !inst->src[0].reladdr &&
            !inst->src[0].reladdr2 &&
            !inst->src[0].negate &&
            !inst->src[0].abs) {
           for (int i = 0; i < 4; i++) {
              if (inst->dst[0].writemask & (1 << i)) {
                 acp[4 * inst->dst[0].index + i] = inst;
                 acp_level[4 * inst->dst[0].index + i] = level;
              }
           }
@@ -6595,24 +6596,21 @@ get_mesa_program_tgsi(struct gl_context *ctx,
                  last_writes[i]);
        ralloc_free(first_writes);
        ralloc_free(first_reads);
        ralloc_free(last_writes);
        ralloc_free(last_reads);
     }
  #endif
/* Perform optimizations on the instructions in the glsl_to_tgsi_visitor. */
     v->simplify_cmp();
-
-   if (shader->Stage != MESA_SHADER_TESS_CTRL &&
-       shader->Stage != MESA_SHADER_TESS_EVAL)
-      v->copy_propagate();
+   v->copy_propagate();
while (v->eliminate_dead_code()); v->merge_two_dsts();
     if (!skip_merge_registers)
        v->merge_registers();
     v->renumber_registers();
/* Write the END instruction. */
     v->emit_asm(NULL, TGSI_OPCODE_END);



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to