diff options
author | Matías Locatti <42481638+goldenx86@users.noreply.github.com> | 2023-06-12 21:50:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-12 21:50:59 +0200 |
commit | 42b2bc204f13966fd08af07dd08448bbefe14afa (patch) | |
tree | 5676f2516f33f855a02df13e89d401c8067fae21 /src/shader_recompiler/ir_opt | |
parent | Merge pull request #10693 from liamwhite/f64-to-f32 (diff) | |
parent | shader_recompiler: remove barriers in conditional control flow when device lacks support (diff) | |
download | yuzu-42b2bc204f13966fd08af07dd08448bbefe14afa.tar yuzu-42b2bc204f13966fd08af07dd08448bbefe14afa.tar.gz yuzu-42b2bc204f13966fd08af07dd08448bbefe14afa.tar.bz2 yuzu-42b2bc204f13966fd08af07dd08448bbefe14afa.tar.lz yuzu-42b2bc204f13966fd08af07dd08448bbefe14afa.tar.xz yuzu-42b2bc204f13966fd08af07dd08448bbefe14afa.tar.zst yuzu-42b2bc204f13966fd08af07dd08448bbefe14afa.zip |
Diffstat (limited to 'src/shader_recompiler/ir_opt')
-rw-r--r-- | src/shader_recompiler/ir_opt/conditional_barrier_pass.cpp | 44 | ||||
-rw-r--r-- | src/shader_recompiler/ir_opt/passes.h | 1 |
2 files changed, 45 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 000000000..c3ed27f4f --- /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 diff --git a/src/shader_recompiler/ir_opt/passes.h b/src/shader_recompiler/ir_opt/passes.h index 53606b78d..629d18fa1 100644 --- a/src/shader_recompiler/ir_opt/passes.h +++ b/src/shader_recompiler/ir_opt/passes.h @@ -13,6 +13,7 @@ struct HostTranslateInfo; namespace Shader::Optimization { void CollectShaderInfoPass(Environment& env, IR::Program& program); +void ConditionalBarrierPass(IR::Program& program); void ConstantPropagationPass(Environment& env, IR::Program& program); void DeadCodeEliminationPass(IR::Program& program); void GlobalMemoryToStorageBufferPass(IR::Program& program); |