summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-09-25 14:34:08 -0400
committerGravatar FernandoS272019-10-04 18:52:56 -0400
commit507a9c6a402d6ee277e0a8f0cda57d04526c05dd (patch)
tree903a4b0e4528d3cccb848b5fa4adf97c7cf61d9b /src/video_core
parentvk_shader_decompiler: Clean code and be const correct. (diff)
downloadyuzu-507a9c6a402d6ee277e0a8f0cda57d04526c05dd.tar.gz
yuzu-507a9c6a402d6ee277e0a8f0cda57d04526c05dd.tar.xz
yuzu-507a9c6a402d6ee277e0a8f0cda57d04526c05dd.zip
vk_shader_decompiler: Correct Branches inside conditionals.
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/renderer_vulkan/vk_shader_decompiler.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index 4bc7da198..2b55a3727 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -650,7 +650,11 @@ private:
650 VisitBasicBlock(conditional->GetCode()); 650 VisitBasicBlock(conditional->GetCode());
651 --conditional_nest_count; 651 --conditional_nest_count;
652 652
653 Emit(OpBranch(skip_label)); 653 if (inside_branch == 0) {
654 Emit(OpBranch(skip_label));
655 } else {
656 inside_branch--;
657 }
654 Emit(skip_label); 658 Emit(skip_label);
655 return {}; 659 return {};
656 660
@@ -1014,6 +1018,7 @@ private:
1014 1018
1015 Emit(OpStore(jmp_to, Constant(t_uint, target->GetValue()))); 1019 Emit(OpStore(jmp_to, Constant(t_uint, target->GetValue())));
1016 Emit(OpBranch(continue_label)); 1020 Emit(OpBranch(continue_label));
1021 inside_branch = conditional_nest_count;
1017 if (conditional_nest_count == 0) { 1022 if (conditional_nest_count == 0) {
1018 Emit(OpLabel()); 1023 Emit(OpLabel());
1019 } 1024 }
@@ -1025,6 +1030,7 @@ private:
1025 1030
1026 Emit(OpStore(jmp_to, op_a)); 1031 Emit(OpStore(jmp_to, op_a));
1027 Emit(OpBranch(continue_label)); 1032 Emit(OpBranch(continue_label));
1033 inside_branch = conditional_nest_count;
1028 if (conditional_nest_count == 0) { 1034 if (conditional_nest_count == 0) {
1029 Emit(OpLabel()); 1035 Emit(OpLabel());
1030 } 1036 }
@@ -1055,6 +1061,7 @@ private:
1055 Emit(OpStore(flow_stack_top, previous)); 1061 Emit(OpStore(flow_stack_top, previous));
1056 Emit(OpStore(jmp_to, target)); 1062 Emit(OpStore(jmp_to, target));
1057 Emit(OpBranch(continue_label)); 1063 Emit(OpBranch(continue_label));
1064 inside_branch = conditional_nest_count;
1058 if (conditional_nest_count == 0) { 1065 if (conditional_nest_count == 0) {
1059 Emit(OpLabel()); 1066 Emit(OpLabel());
1060 } 1067 }
@@ -1114,6 +1121,7 @@ private:
1114 1121
1115 Id Exit(Operation operation) { 1122 Id Exit(Operation operation) {
1116 PreExit(); 1123 PreExit();
1124 inside_branch = conditional_nest_count;
1117 if (conditional_nest_count > 0) { 1125 if (conditional_nest_count > 0) {
1118 Emit(OpReturn()); 1126 Emit(OpReturn());
1119 } else { 1127 } else {
@@ -1127,6 +1135,7 @@ private:
1127 } 1135 }
1128 1136
1129 Id Discard(Operation operation) { 1137 Id Discard(Operation operation) {
1138 inside_branch = conditional_nest_count;
1130 if (conditional_nest_count > 0) { 1139 if (conditional_nest_count > 0) {
1131 Emit(OpKill()); 1140 Emit(OpKill());
1132 } else { 1141 } else {
@@ -1536,6 +1545,7 @@ private:
1536 const ShaderStage stage; 1545 const ShaderStage stage;
1537 const Tegra::Shader::Header header; 1546 const Tegra::Shader::Header header;
1538 u64 conditional_nest_count{}; 1547 u64 conditional_nest_count{};
1548 u64 inside_branch{};
1539 1549
1540 const Id t_void = Name(TypeVoid(), "void"); 1550 const Id t_void = Name(TypeVoid(), "void");
1541 1551