gl_shader_decompiler: fallback to CPU shader on GS b15 access
This commit is contained in:
		@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user