diff options
| author | 2019-09-25 14:34:08 -0400 | |
|---|---|---|
| committer | 2019-10-04 18:52:56 -0400 | |
| commit | 507a9c6a402d6ee277e0a8f0cda57d04526c05dd (patch) | |
| tree | 903a4b0e4528d3cccb848b5fa4adf97c7cf61d9b /src/video_core | |
| parent | vk_shader_decompiler: Clean code and be const correct. (diff) | |
| download | yuzu-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.cpp | 12 |
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 | ||