summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2021-04-02 06:17:47 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:25 +0200
commitb4a5e767d0a60d44c77460bd3a4062c5f69fb6c7 (patch)
treee365fabb301fba40c7a8e25b072ce59d15105e1d
parentvulkan: Serialize pipelines on a separate thread (diff)
downloadyuzu-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.cpp2
-rw-r--r--src/shader_recompiler/frontend/maxwell/control_flow.cpp10
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{