r600/sfn: Override VPM if access in helpers is requested
authorGert Wollny <gert.wollny@collabora.com>
Wed, 31 Aug 2022 10:50:38 +0000 (12:50 +0200)
committerMarge Bot <emma+marge@anholt.net>
Thu, 1 Sep 2022 08:55:07 +0000 (08:55 +0000)
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18343>

src/gallium/drivers/r600/sfn/sfn_assembler.cpp
src/gallium/drivers/r600/sfn/sfn_instr.h
src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp
src/gallium/drivers/r600/sfn/sfn_shader.cpp

index 265c6ca..a942f38 100644 (file)
@@ -887,9 +887,13 @@ void AssamblerVisitor::visit(const ControlFlowInstr& instr)
    case ControlFlowInstr::cf_endif:
       emit_endif();
       break;
-   case ControlFlowInstr::cf_loop_begin:
-      emit_loop_begin(instr.has_instr_flag(Instr::vpm));
+   case ControlFlowInstr::cf_loop_begin: {
+      bool use_vpm = m_shader->processor_type == PIPE_SHADER_FRAGMENT &&
+            instr.has_instr_flag(Instr::vpm) &&
+            !instr.has_instr_flag(Instr::helper);
+      emit_loop_begin(use_vpm);
       break;
+   }
    case ControlFlowInstr::cf_loop_end:
       emit_loop_end();
       break;
index d3beb8f..237efe2 100644 (file)
@@ -69,6 +69,7 @@ public:
       vpm,
       force_cf,
       ack_rat_return_write,
+      helper,
       nflags
       };
 
index 376075d..7eb01a9 100644 (file)
@@ -701,6 +701,9 @@ bool RatInstr::emit_image_store(nir_intrinsic_instr *intrin, Shader& shader)
                              image_offset, 1, 0xf, 0);
 
    store->set_ack();
+   if (nir_intrinsic_access(intrin) & ACCESS_INCLUDE_HELPERS)
+      store->set_instr_flag(Instr::helper);
+
    shader.emit_instruction(store);
    return true;
 }
index c0a6856..62c5462 100644 (file)
@@ -1071,16 +1071,20 @@ void Shader::InstructionChain::visit(ScratchIOInstr *instr)
 void Shader::InstructionChain::visit(GDSInstr *instr)
 {
    apply(instr, &last_gds_instr);
+   Instr::Flags flag = instr->has_instr_flag(Instr::helper) ?
+                          Instr::helper: Instr::vpm;
    for (auto& loop : this_shader->m_loops) {
-      loop->set_instr_flag(Instr::vpm);
+      loop->set_instr_flag(flag);
    }
 }
 
 void Shader::InstructionChain::visit(RatInstr *instr)
 {
    apply(instr, &last_ssbo_instr);
+   Instr::Flags flag = instr->has_instr_flag(Instr::helper) ?
+                          Instr::helper: Instr::vpm;
    for (auto& loop : this_shader->m_loops) {
-      loop->set_instr_flag(Instr::vpm);
+      loop->set_instr_flag(flag);
    }
 
    if (prepare_mem_barrier)