diff --git a/.pick_status.json b/.pick_status.json index bfb6ce9bc3f..03da6829c7a 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -34,7 +34,7 @@ "description": "r600/sfn: Use dependecies to order barriers and LDS/RAT instructions", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "fe881bf0976cf5799afba52911cdf6df45e8641f", "notes": null diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.cpp b/src/gallium/drivers/r600/sfn/sfn_shader.cpp index 7af0000f45b..495df1f73b6 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader.cpp @@ -1364,6 +1364,22 @@ void Shader::InstructionChain::visit(AluInstr *instr) } } } + + if (instr->has_lds_access()) { + last_lds_access = instr; + if (last_group_barrier) + instr->add_required_instr(last_group_barrier); + } + + if (!instr->has_alu_flag(alu_is_lds) && + instr->opcode() == op0_group_barrier) { + last_group_barrier = instr; + if (last_lds_access) + instr->add_required_instr(last_group_barrier); + if (last_ssbo_instr) + instr->add_required_instr(last_ssbo_instr); + } + } void @@ -1402,6 +1418,9 @@ Shader::InstructionChain::visit(RatInstr *instr) if (last_kill_instr) instr->add_required_instr(last_kill_instr); + + if (last_group_barrier) + instr->add_required_instr(last_group_barrier); } void @@ -1464,13 +1483,9 @@ Shader::emit_group_barrier(nir_intrinsic_instr *intr) { assert(m_control_flow_depth == 0); (void)intr; - /* Put barrier into it's own block, so that optimizers and the - * scheduler don't move code */ - start_new_block(0); auto op = new AluInstr(op0_group_barrier, 0); op->set_alu_flag(alu_last_instr); emit_instruction(op); - start_new_block(0); return true; } diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.h b/src/gallium/drivers/r600/sfn/sfn_shader.h index 9b442bdab04..8b340ca2649 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.h +++ b/src/gallium/drivers/r600/sfn/sfn_shader.h @@ -413,6 +413,8 @@ private: Instr *last_gds_instr{nullptr}; Instr *last_ssbo_instr{nullptr}; Instr *last_kill_instr{nullptr}; + Instr *last_lds_access{nullptr}; + Instr *last_group_barrier{nullptr}; std::unordered_map last_alu_with_indirect_reg; bool prepare_mem_barrier{false}; };