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; } }