Merge pull request #3678 from wwylele/b15-fallback

gl_shader_decompiler: fallback to CPU shader on GS b15 access
This commit is contained in:
bunnei 2018-04-25 00:03:11 -04:00 committed by GitHub
commit ed42b4b0d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -345,8 +345,11 @@ private:
/// Generates code representing a bool uniform /// Generates code representing a bool uniform
std::string GetUniformBool(u32 index) const { std::string GetUniformBool(u32 index) const {
if (is_gs && index == 15) { if (is_gs && index == 15) {
// The uniform b15 is set to true after every geometry shader invocation. // In PICA geometry shader, b15 is set to true after every geometry shader invocation.
return "((gl_PrimitiveIDIn == 0) || uniforms.b[15])"; // 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) + "]"; 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); inputreg_getter, outputreg_getter, sanitize_mul, is_gs);
return generator.MoveShaderCode(); return generator.MoveShaderCode();
} catch (const DecompileFail& exception) { } 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; return boost::none;
} }
} }