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;
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;
}
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)