gl_shader_decompiler: fallback to CPU shader on GS b15 access

This commit is contained in:
wwylele 2018-04-20 21:42:05 +03:00
parent c8d4ca8915
commit e56128683c

View file

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