From 507a9c6a402d6ee277e0a8f0cda57d04526c05dd Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Wed, 25 Sep 2019 14:34:08 -0400
Subject: [PATCH] vk_shader_decompiler: Correct Branches inside conditionals.

---
 .../renderer_vulkan/vk_shader_decompiler.cpp         | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index 4bc7da198e..2b55a3727a 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:
             VisitBasicBlock(conditional->GetCode());
             --conditional_nest_count;
 
-            Emit(OpBranch(skip_label));
+            if (inside_branch == 0) {
+                Emit(OpBranch(skip_label));
+            } else {
+                inside_branch--;
+            }
             Emit(skip_label);
             return {};
 
@@ -1014,6 +1018,7 @@ private:
 
         Emit(OpStore(jmp_to, Constant(t_uint, target->GetValue())));
         Emit(OpBranch(continue_label));
+        inside_branch = conditional_nest_count;
         if (conditional_nest_count == 0) {
             Emit(OpLabel());
         }
@@ -1025,6 +1030,7 @@ private:
 
         Emit(OpStore(jmp_to, op_a));
         Emit(OpBranch(continue_label));
+        inside_branch = conditional_nest_count;
         if (conditional_nest_count == 0) {
             Emit(OpLabel());
         }
@@ -1055,6 +1061,7 @@ private:
         Emit(OpStore(flow_stack_top, previous));
         Emit(OpStore(jmp_to, target));
         Emit(OpBranch(continue_label));
+        inside_branch = conditional_nest_count;
         if (conditional_nest_count == 0) {
             Emit(OpLabel());
         }
@@ -1114,6 +1121,7 @@ private:
 
     Id Exit(Operation operation) {
         PreExit();
+        inside_branch = conditional_nest_count;
         if (conditional_nest_count > 0) {
             Emit(OpReturn());
         } else {
@@ -1127,6 +1135,7 @@ private:
     }
 
     Id Discard(Operation operation) {
+        inside_branch = conditional_nest_count;
         if (conditional_nest_count > 0) {
             Emit(OpKill());
         } else {
@@ -1536,6 +1545,7 @@ private:
     const ShaderStage stage;
     const Tegra::Shader::Header header;
     u64 conditional_nest_count{};
+    u64 inside_branch{};
 
     const Id t_void = Name(TypeVoid(), "void");