diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2021-04-02 06:17:47 +0200 |
---|---|---|
committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-07-23 03:51:25 +0200 |
commit | b4a5e767d0a60d44c77460bd3a4062c5f69fb6c7 (patch) | |
tree | e365fabb301fba40c7a8e25b072ce59d15105e1d | |
parent | vulkan: Serialize pipelines on a separate thread (diff) | |
download | yuzu-b4a5e767d0a60d44c77460bd3a4062c5f69fb6c7.tar yuzu-b4a5e767d0a60d44c77460bd3a4062c5f69fb6c7.tar.gz yuzu-b4a5e767d0a60d44c77460bd3a4062c5f69fb6c7.tar.bz2 yuzu-b4a5e767d0a60d44c77460bd3a4062c5f69fb6c7.tar.lz yuzu-b4a5e767d0a60d44c77460bd3a4062c5f69fb6c7.tar.xz yuzu-b4a5e767d0a60d44c77460bd3a4062c5f69fb6c7.tar.zst yuzu-b4a5e767d0a60d44c77460bd3a4062c5f69fb6c7.zip |
-rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv.cpp | 2 | ||||
-rw-r--r-- | src/shader_recompiler/frontend/maxwell/control_flow.cpp | 10 |
2 files changed, 12 insertions, 0 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index 9dc769307..b8e3b8527 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp @@ -56,6 +56,8 @@ ArgType Arg(EmitContext& ctx, const IR::Value& arg) { return arg.Label(); } else if constexpr (std::is_same_v<ArgType, IR::Attribute>) { return arg.Attribute(); + } else if constexpr (std::is_same_v<ArgType, IR::Reg>) { + return arg.Reg(); } } diff --git a/src/shader_recompiler/frontend/maxwell/control_flow.cpp b/src/shader_recompiler/frontend/maxwell/control_flow.cpp index 784f9df8a..ac8707847 100644 --- a/src/shader_recompiler/frontend/maxwell/control_flow.cpp +++ b/src/shader_recompiler/frontend/maxwell/control_flow.cpp @@ -486,6 +486,16 @@ Block* CFG::AddLabel(Block* block, Stack stack, Location pc, FunctionId function } if (const auto it{function.blocks.find(pc, Compare{})}; it != function.blocks.end()) { // Block already exists and it has been visited + if (function.blocks.begin() != it) { + // Check if the previous node is the virtual variant of the label + // This won't exist if a virtual node is not needed or it hasn't been visited + // If it hasn't been visited and a virtual node is needed, this will still behave as + // expected because the node impersonated with its virtual node. + const auto prev{std::prev(it)}; + if (it->begin.Virtual() == prev->begin) { + return &*prev; + } + } return &*it; } Block* const new_block{block_pool.Create(Block{ |