From e56128683c71404a64c1910c92dc59c5b48426b6 Mon Sep 17 00:00:00 2001 From: wwylele 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 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; } }