diff options
| author | MatÃas Locatti <42481638+goldenx86@users.noreply.github.com> | 2023-06-12 16:50:59 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-06-12 16:50:59 -0300 |
| commit | 28e1429daf96889fa8d0b05c8f24dfeaa6f6881d (patch) | |
| tree | 5676f2516f33f855a02df13e89d401c8067fae21 /src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp | |
| parent | d40c8428a0a9a5dc6677fff4bc830cc10b42f885 (diff) | |
| parent | b646ac2908ba7c12e0d61b8b9fac23f9a358f44e (diff) | |
Merge pull request #10699 from liamwhite/conditional-barrier
shader_recompiler: remove barriers in conditional control flow when device lacks support
Diffstat (limited to 'src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp')
| -rw-r--r-- | src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp b/src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp new file mode 100644 index 0000000000..c3ed27f4f2 --- /dev/null +++ b/src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "shader_recompiler/frontend/ir/program.h" +#include "shader_recompiler/ir_opt/passes.h" + +namespace Shader::Optimization { + +void ConditionalBarrierPass(IR::Program& program) { + s32 conditional_control_flow_count{0}; + s32 conditional_return_count{0}; + for (IR::AbstractSyntaxNode& node : program.syntax_list) { + switch (node.type) { + case IR::AbstractSyntaxNode::Type::If: + case IR::AbstractSyntaxNode::Type::Loop: + conditional_control_flow_count++; + break; + case IR::AbstractSyntaxNode::Type::EndIf: + case IR::AbstractSyntaxNode::Type::Repeat: + conditional_control_flow_count--; + break; + case IR::AbstractSyntaxNode::Type::Unreachable: + case IR::AbstractSyntaxNode::Type::Return: + if (conditional_control_flow_count > 0) { + conditional_return_count++; + } + break; + case IR::AbstractSyntaxNode::Type::Block: + for (IR::Inst& inst : node.data.block->Instructions()) { + if ((conditional_control_flow_count > 0 || conditional_return_count > 0) && + inst.GetOpcode() == IR::Opcode::Barrier) { + LOG_WARNING(Shader, "Barrier within conditional control flow"); + inst.ReplaceOpcode(IR::Opcode::Identity); + } + } + break; + default: + break; + } + } + ASSERT(conditional_control_flow_count == 0); +} + +} // namespace Shader::Optimization |
