mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-22 20:06:54 +02:00
shader: read lane 0 in V_READFIRSTLANE when EXEC is zero instead of an undefined lane
This commit is contained in:
@@ -23006,6 +23006,38 @@ TestCase ScalarZeroBitOps() {
|
||||
return test;
|
||||
}
|
||||
|
||||
// V_READFIRSTLANE reads the first EXEC lane, or lane 0 when EXEC is zero; v1 = 100 + lane.
|
||||
TestCase VectorReadFirstLaneExecMasks(u32 wave_size) {
|
||||
using O = ShaderOpcode;
|
||||
TestCase test;
|
||||
test.name = wave_size == 32 ? "VectorReadFirstLaneExecMasksWave32"
|
||||
: "VectorReadFirstLaneExecMasksWave64";
|
||||
auto &code = test.code;
|
||||
AppendVMovU32(&code, 1, 100);
|
||||
code.push_back(EncodeVop2(0x25, 1, Vgpr(0), 1));
|
||||
code.push_back(EncodeSop1(0x04, 10, 126)); // s_mov_b64 s[10:11], exec
|
||||
const uint64_t masks[] = {0, 1ull << 5, 0x80000000ull, 1ull << 32, 1ull << 63, 0xffff000000000000ull};
|
||||
for (const uint64_t mask : masks) {
|
||||
if (wave_size == 32 && mask > UINT32_MAX) continue;
|
||||
AppendSMovLiteral(&code, 126, u32(mask));
|
||||
if (wave_size == 64) AppendSMovLiteral(&code, 127, u32(mask >> 32));
|
||||
code.push_back(EncodeVop1(0x02, 20, Vgpr(1)));
|
||||
code.push_back(EncodeSop1(0x04, 126, 10));
|
||||
AppendStoreSgpr(&code, 20, u32(test.expected.size()));
|
||||
test.expected.push_back(100 + (mask == 0 ? 0 : std::countr_zero(mask)));
|
||||
}
|
||||
AppendEnd(&code);
|
||||
test.initial.resize(test.expected.size());
|
||||
test.opcodes = {O::V_MOV_B32, O::V_ADD_NC_U32, O::S_MOV_B32, O::S_MOV_B64,
|
||||
O::V_READFIRSTLANE_B32, O::BUFFER_STORE_DWORD, O::S_ENDPGM};
|
||||
test.compute_info.wave_size = wave_size;
|
||||
test.compute_info.threads_num[0] = wave_size;
|
||||
test.compute_info.threads_num[1] = test.compute_info.threads_num[2] = 1;
|
||||
test.compute_info.thread_ids_num = 1;
|
||||
test.has_compute_info = true;
|
||||
return test;
|
||||
}
|
||||
|
||||
TestCase ScalarSextMasks(u32 bits, u32 wave_size) {
|
||||
using O = ShaderOpcode;
|
||||
TestCase test;
|
||||
@@ -43094,6 +43126,8 @@ std::vector<TestCase> MakeCases() {
|
||||
cases.push_back(VectorDppRowShare(64));
|
||||
cases.push_back(VectorDppMirrorAndRotate(32));
|
||||
cases.push_back(VectorDppMirrorAndRotate(64));
|
||||
cases.push_back(VectorReadFirstLaneExecMasks(32));
|
||||
cases.push_back(VectorReadFirstLaneExecMasks(64));
|
||||
cases.push_back(ComputeWave64Minimum(false));
|
||||
cases.push_back(ComputeWave64Minimum(true));
|
||||
AddCase(VectorDppBankMaskPreservesDestination);
|
||||
@@ -49186,6 +49220,8 @@ int main(int argc, char **argv) {
|
||||
RunCase(&vulkan, VectorDppRowShare(64));
|
||||
RunCase(&vulkan, VectorDppMirrorAndRotate(32));
|
||||
RunCase(&vulkan, VectorDppMirrorAndRotate(64));
|
||||
RunCase(&vulkan, VectorReadFirstLaneExecMasks(32));
|
||||
RunCase(&vulkan, VectorReadFirstLaneExecMasks(64));
|
||||
RunCase(&vulkan, VectorDppBankMaskPreservesDestination());
|
||||
RunCase(&vulkan, VectorDppBoundsControlZeroPreservesDestination());
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user