rsx: Program cache fixes

- Reorganize storage hash vs ucode hash
- Scan for actual fragment program start in case leading NOPed code precedes the actual instructions
-- e.g FEAR2 Demo has over 32k of padding before actual program code that messes up hashes
This commit is contained in:
kd-11 2017-12-02 18:20:52 +03:00
parent f5145943b2
commit 90c2324e47
5 changed files with 66 additions and 12 deletions

View file

@ -1348,8 +1348,11 @@ namespace rsx
const u32 program_location = (shader_program & 0x3) - 1;
const u32 program_offset = (shader_program & ~0x3);
result.offset = program_offset;
result.addr = vm::base(rsx::get_address(program_offset, program_location));
auto program_start = program_hash_util::fragment_program_utils::get_fragment_program_start(result.addr);
result.addr = ((u8*)result.addr + program_start);
result.offset = program_offset + program_start;
result.valid = true;
result.ctrl = rsx::method_registers.shader_control() & (CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS | CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT);
result.unnormalized_coords = 0;
@ -1454,8 +1457,11 @@ namespace rsx
const u32 program_location = (shader_program & 0x3) - 1;
const u32 program_offset = (shader_program & ~0x3);
result.offset = program_offset;
result.addr = vm::base(rsx::get_address(program_offset, program_location));
auto program_start = program_hash_util::fragment_program_utils::get_fragment_program_start(result.addr);
result.addr = ((u8*)result.addr + program_start);
result.offset = program_offset + program_start;
result.valid = true;
result.ctrl = rsx::method_registers.shader_control() & (CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS | CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT);
result.unnormalized_coords = 0;