|
|
|
@ -129,9 +129,11 @@ std::size_t CalculateProgramSize(const GLShader::ProgramCode& program) { |
|
|
|
|
|
|
|
/// Hashes one (or two) program streams
|
|
|
|
u64 GetUniqueIdentifier(Maxwell::ShaderProgram program_type, const ProgramCode& code, |
|
|
|
const ProgramCode& code_b) { |
|
|
|
u64 unique_identifier = |
|
|
|
Common::CityHash64(reinterpret_cast<const char*>(code.data()), CalculateProgramSize(code)); |
|
|
|
const ProgramCode& code_b, std::size_t size_a = 0, std::size_t size_b = 0) { |
|
|
|
if (size_a == 0) { |
|
|
|
size_a = CalculateProgramSize(code); |
|
|
|
} |
|
|
|
u64 unique_identifier = Common::CityHash64(reinterpret_cast<const char*>(code.data()), size_a); |
|
|
|
if (program_type != Maxwell::ShaderProgram::VertexA) { |
|
|
|
return unique_identifier; |
|
|
|
} |
|
|
|
@ -140,8 +142,11 @@ u64 GetUniqueIdentifier(Maxwell::ShaderProgram program_type, const ProgramCode& |
|
|
|
std::size_t seed = 0; |
|
|
|
boost::hash_combine(seed, unique_identifier); |
|
|
|
|
|
|
|
const u64 identifier_b = Common::CityHash64(reinterpret_cast<const char*>(code_b.data()), |
|
|
|
CalculateProgramSize(code_b)); |
|
|
|
if (size_b == 0) { |
|
|
|
size_b = CalculateProgramSize(code_b); |
|
|
|
} |
|
|
|
const u64 identifier_b = |
|
|
|
Common::CityHash64(reinterpret_cast<const char*>(code_b.data()), size_b); |
|
|
|
boost::hash_combine(seed, identifier_b); |
|
|
|
return static_cast<u64>(seed); |
|
|
|
} |
|
|
|
@ -150,14 +155,17 @@ u64 GetUniqueIdentifier(Maxwell::ShaderProgram program_type, const ProgramCode& |
|
|
|
GLShader::ProgramResult CreateProgram(const Device& device, Maxwell::ShaderProgram program_type, |
|
|
|
ProgramCode program_code, ProgramCode program_code_b) { |
|
|
|
GLShader::ShaderSetup setup(program_code); |
|
|
|
setup.program.size_a = CalculateProgramSize(program_code); |
|
|
|
setup.program.size_b = 0; |
|
|
|
if (program_type == Maxwell::ShaderProgram::VertexA) { |
|
|
|
// VertexB is always enabled, so when VertexA is enabled, we have two vertex shaders.
|
|
|
|
// Conventional HW does not support this, so we combine VertexA and VertexB into one
|
|
|
|
// stage here.
|
|
|
|
setup.SetProgramB(program_code_b); |
|
|
|
setup.program.size_b = CalculateProgramSize(program_code_b); |
|
|
|
} |
|
|
|
setup.program.unique_identifier = |
|
|
|
GetUniqueIdentifier(program_type, program_code, program_code_b); |
|
|
|
setup.program.unique_identifier = GetUniqueIdentifier( |
|
|
|
program_type, program_code, program_code_b, setup.program.size_a, setup.program.size_b); |
|
|
|
|
|
|
|
switch (program_type) { |
|
|
|
case Maxwell::ShaderProgram::VertexA: |
|
|
|
|