mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 10:56:58 +02:00
shader: preserve RDNA2 DLC coherence for flat address loads
This commit is contained in:
@@ -29596,6 +29596,41 @@ TestCase TBufferStoreVariants() {
|
||||
O::S_ENDPGM}};
|
||||
}
|
||||
|
||||
TestCase FlatLoadDlcCaptured(u32 wave_size) {
|
||||
using O = ShaderOpcode;
|
||||
TestCase test;
|
||||
test.name = wave_size == 64 ? "FlatLoadDlcCapturedWave64" : "FlatLoadDlcCapturedWave32";
|
||||
auto &code = test.code;
|
||||
code.push_back(EncodeSop1(0x04, 126, InlineU32(1)));
|
||||
AppendVMovU32(&code, 4, 0);
|
||||
AppendVMovU32(&code, 5, 31);
|
||||
// PPSA04288 CS 05b58beb842bacbf:0x638, FLAT_LOAD_DWORDX2 v[0:1], v[4:5] DLC.
|
||||
code.insert(code.end(), {0xdc341000u, 0x007d0004u});
|
||||
AppendStoreVgpr(&code, 0, 0);
|
||||
AppendStoreVgpr(&code, 1, 1);
|
||||
// The descriptor store aliases the physical address read by the next load.
|
||||
AppendStoreVgpr(&code, 1, 8);
|
||||
code.push_back(0xbbfd0000u); // S_WAITCNT_VSCNT null, 0.
|
||||
code.insert(code.end(), {0xdc341000u, 0x007d0004u});
|
||||
AppendStoreVgpr(&code, 0, 2);
|
||||
AppendStoreVgpr(&code, 1, 3);
|
||||
AppendEnd(&code);
|
||||
test.initial = {0, 0, 0, 0, 0, 0, 0, 0, 0x11223344u, 0x55667788u};
|
||||
test.expected = {0x11223344u, 0x55667788u, 0x55667788u, 0x55667788u,
|
||||
0, 0, 0, 0, 0x55667788u, 0x55667788u};
|
||||
test.bda_mappings = {{0x1f00000000ull, 32}};
|
||||
test.opcodes = {O::S_MOV_B64, O::V_MOV_B32, O::FLAT_LOAD_DWORDX2,
|
||||
O::BUFFER_STORE_DWORD, O::S_WAITCNT_VSCNT, O::S_ENDPGM};
|
||||
test.required_spirv = {"OpDecorate %buffers Coherent", " 0 Coherent", "Volatile|Aligned 4"};
|
||||
test.decoded_counts = {{"dlc=1", 2}};
|
||||
test.compute_info.threads_num[0] = wave_size;
|
||||
test.compute_info.threads_num[1] = 1;
|
||||
test.compute_info.threads_num[2] = 1;
|
||||
test.compute_info.wave_size = wave_size;
|
||||
test.has_compute_info = true;
|
||||
return test;
|
||||
}
|
||||
|
||||
TestCase FlatLoadVariants() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
@@ -35312,6 +35347,8 @@ std::vector<TestCase> MakeCases() {
|
||||
AddCase(TBufferStoreFormatXy88IntegerComponents);
|
||||
AddCase(TBufferLoadFormatXy88IntegerComponents);
|
||||
AddCase(TBufferStoreVariants);
|
||||
cases.push_back(FlatLoadDlcCaptured(32));
|
||||
cases.push_back(FlatLoadDlcCaptured(64));
|
||||
AddCase(FlatLoadVariants);
|
||||
AddCase(FlatSubdwordLoadsApplyByteOffset);
|
||||
cases.push_back(GlobalLoadShortD16Captured(32));
|
||||
@@ -40678,6 +40715,8 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
if (argc == 2 && std::strcmp(argv[1], "--flat-d16-only") == 0) {
|
||||
VulkanHarness vulkan;
|
||||
RunCase(&vulkan, FlatLoadDlcCaptured(32));
|
||||
RunCase(&vulkan, FlatLoadDlcCaptured(64));
|
||||
RunCase(&vulkan, GlobalLoadShortD16Captured(32));
|
||||
RunCase(&vulkan, GlobalLoadShortD16Captured(64));
|
||||
RunCase(&vulkan, FlatLoadShortD16AddressSegments());
|
||||
|
||||
Reference in New Issue
Block a user