mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 10:56:58 +02:00
shader: support DS_READ_U16_D16_HI (#356)
Decode the high-half D16 LDS read and route it through the existing unsigned-short load lowering. Represent the destination as a high-half partial write so the low 16 bits of the VGPR remain intact. Add captured-instruction decode coverage and a Vulkan execution regression that verifies the preserved half. Co-authored-by: SueryRD <the.ai.tester2@gmail.com>
This commit is contained in:
@@ -12018,6 +12018,7 @@ CoverageClass ClassifyOpcode(ShaderOpcode opcode,
|
||||
case Opcode::DS_READ_I16:
|
||||
case Opcode::DS_READ_U16:
|
||||
case Opcode::DS_READ_U16_D16:
|
||||
case Opcode::DS_READ_U16_D16_HI:
|
||||
case Opcode::DS_READ2_B32:
|
||||
case Opcode::DS_READ_B32:
|
||||
case Opcode::DS_READ_B64:
|
||||
@@ -18038,6 +18039,33 @@ TestCase DsReadU16D16CapturedPreservesHighHalf() {
|
||||
return test;
|
||||
}
|
||||
|
||||
TestCase DsReadU16D16HiCapturedPreservesLowHalf() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
std::vector<u32> code;
|
||||
AppendVMovU32(&code, 1, 0);
|
||||
AppendVMovLiteral(&code, 2, 0x89abcdefu);
|
||||
code.push_back(EncodeDs0(0x0d));
|
||||
code.push_back(EncodeDs1(0, 2, 1)); // ds_write_b32 v2, v1
|
||||
|
||||
AppendVMovLiteral(&code, 5, 0x12345678u);
|
||||
AppendVMovU32(&code, 6, 0);
|
||||
code.push_back(0xda9c0000u);
|
||||
code.push_back(0x05000006u); // captured ds_read_u16_d16_hi v5, v6
|
||||
|
||||
AppendStoreVgpr(&code, 5, 0);
|
||||
AppendEnd(&code);
|
||||
|
||||
TestCase test{"DsReadU16D16HiCapturedPreservesLowHalf",
|
||||
code,
|
||||
std::vector<u32>(1, 0),
|
||||
{0xcdef5678u},
|
||||
{O::V_MOV_B32, O::DS_WRITE_B32, O::DS_READ_U16_D16_HI,
|
||||
O::BUFFER_STORE_DWORD, O::S_ENDPGM}};
|
||||
test.decoded_counts = {{"DS_READ_U16_D16_HI", 1}};
|
||||
return test;
|
||||
}
|
||||
|
||||
TestCase DsReadWrite2Variants() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
@@ -20556,6 +20584,7 @@ std::vector<TestCase> MakeCases() {
|
||||
AddCase(FlatStoreVariants);
|
||||
AddCase(DsReadWriteVariants);
|
||||
AddCase(DsReadU16D16CapturedPreservesHighHalf);
|
||||
AddCase(DsReadU16D16HiCapturedPreservesLowHalf);
|
||||
AddCase(DsAppendConsumeUsesEncodedLdsSelector);
|
||||
AddCase(DsAppendUsesEncodedGdsSelector);
|
||||
AddCase(DsGdsSubdwordAndAtomicWrites);
|
||||
|
||||
@@ -4099,6 +4099,15 @@ void TestNewShaderDecoderArchitecture() {
|
||||
Check(boot.opcode == Opcode::DS_SWIZZLE_B32 && boot.offset == 0xc480u,
|
||||
"DS decoder rejected a captured boot-shader instruction");
|
||||
|
||||
const uint32_t d16_hi_ds[] = {0xda9c0000u, 0x05000006u};
|
||||
Instruction d16_hi;
|
||||
Check(DecodeInstruction(d16_hi_ds, 0u, d16_hi, &error), error.c_str());
|
||||
Check(d16_hi.opcode == Opcode::DS_READ_U16_D16_HI &&
|
||||
d16_hi.src_count == 1u && d16_hi.data_bits == 16u &&
|
||||
d16_hi.dst.reg == 5u && d16_hi.dst.sdwa_sel == 5u &&
|
||||
d16_hi.dst.sdwa_dst_unused == 2u && d16_hi.src0.reg == 6u,
|
||||
"DS decoder rejected the captured high-half D16 read");
|
||||
|
||||
constexpr uint32_t packed_source_selectors[][2] = {
|
||||
{0xcc0e0000u, 0x0c0a0300u}, // Source 0: instruction bit 59.
|
||||
{0xcc0e0000u, 0x140a0300u}, // Source 1: instruction bit 60.
|
||||
|
||||
Reference in New Issue
Block a user