From e56128683c71404a64c1910c92dc59c5b48426b6 Mon Sep 17 00:00:00 2001
From: wwylele <wwylele@gmail.com>
Date: Fri, 20 Apr 2018 21:42:05 +0300
Subject: [PATCH] gl_shader_decompiler: fallback to CPU shader on GS b15 access

---
 src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index cac646b5d..6261a4710 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -345,8 +345,11 @@ private:
     /// Generates code representing a bool uniform
     std::string GetUniformBool(u32 index) const {
         if (is_gs && index == 15) {
-            // The uniform b15 is set to true after every geometry shader invocation.
-            return "((gl_PrimitiveIDIn == 0) || uniforms.b[15])";
+            // In PICA geometry shader, b15 is set to true after every geometry shader invocation.
+            // Accessing b15 usually indicates that the program relies on register value
+            // preservation across invocation (and therefore it uses b15 to determine whether to
+            // initialize the registers), which cannot be implemented in GL shaders.
+            throw DecompileFail("b15 access in geometry shader");
         }
         return "uniforms.b[" + std::to_string(index) + "]";
     }
@@ -918,7 +921,7 @@ boost::optional<std::string> DecompileProgram(const ProgramCode& program_code,
                                 inputreg_getter, outputreg_getter, sanitize_mul, is_gs);
         return generator.MoveShaderCode();
     } catch (const DecompileFail& exception) {
-        LOG_ERROR(HW_GPU, "Shader decompilation failed: %s", exception.what());
+        LOG_INFO(HW_GPU, "Shader decompilation failed: %s", exception.what());
         return boost::none;
     }
 }