mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-29 06:16:55 +01:00
shader: support S_QUADMASK_B32
This commit is contained in:
@@ -23748,6 +23748,46 @@ TestCase ScalarNotB64UpdatesScc() {
|
||||
O::S_ENDPGM}};
|
||||
}
|
||||
|
||||
TestCase ScalarQuadmaskB32(u32 wave_size) {
|
||||
using O = ShaderOpcode;
|
||||
TestCase test;
|
||||
test.name = wave_size == 32 ? "ScalarQuadmaskB32Wave32" : "ScalarQuadmaskB32Wave64";
|
||||
test.initial = {0, 0xffffffffu, 0x80000011u, 0x01010101u};
|
||||
for (u32 bit = 0; bit < 32; ++bit) test.initial.push_back(1u << bit);
|
||||
test.expected = test.initial;
|
||||
auto &code = test.code;
|
||||
for (u32 i = 0; i < test.initial.size(); ++i) {
|
||||
u32 quads = 0;
|
||||
for (u32 q = 0; q < 8; ++q) {
|
||||
if ((test.initial[i] >> (4 * q)) & 15u) quads |= 1u << q;
|
||||
}
|
||||
AppendVMovU32(&code, 30, i * sizeof(u32));
|
||||
AppendBufferLoadDword(&code, 2, 30);
|
||||
for (u32 dst : {12u, 106u}) {
|
||||
code.push_back(EncodeVop1(0x02, dst, Vgpr(2)));
|
||||
AppendSMovLiteral(&code, dst + 1, 0xdeadbeefu);
|
||||
code.push_back(EncodeSopc(0x06, InlineU32(quads == 0), InlineU32(1)));
|
||||
code.push_back(EncodeSop1(0x2c, dst, dst));
|
||||
code.push_back(EncodeSop2(0x0a, 14, InlineU32(1), InlineU32(0)));
|
||||
AppendStoreSgpr(&code, dst, static_cast<u32>(test.expected.size()));
|
||||
AppendStoreSgpr(&code, dst + 1, static_cast<u32>(test.expected.size()) + 1);
|
||||
AppendStoreSgpr(&code, 14, static_cast<u32>(test.expected.size()) + 2);
|
||||
test.expected.insert(test.expected.end(), {quads, 0xdeadbeefu, quads != 0});
|
||||
}
|
||||
}
|
||||
code.push_back(EncodeSop1(0x2c, 12, 255));
|
||||
code.push_back(0x000f000fu);
|
||||
AppendStoreSgpr(&code, 12, static_cast<u32>(test.expected.size()));
|
||||
test.expected.push_back(0x11u);
|
||||
AppendEnd(&code);
|
||||
test.opcodes = {O::S_QUADMASK_B32, O::S_CMP_EQ_U32, O::S_CSELECT_B32, O::S_MOV_B32,
|
||||
O::V_READFIRSTLANE_B32, O::V_MOV_B32, O::BUFFER_LOAD_DWORD,
|
||||
O::BUFFER_STORE_DWORD, O::S_ENDPGM};
|
||||
test.compute_info.wave_size = wave_size;
|
||||
test.has_compute_info = true;
|
||||
return test;
|
||||
}
|
||||
|
||||
TestCase ScalarQuadmaskB64() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
@@ -46047,6 +46087,8 @@ std::vector<TestCase> MakeCases() {
|
||||
AddCase(ScalarCompareOps);
|
||||
AddCase(ScalarShiftAddAndMaskOps);
|
||||
AddCase(ScalarNotB64UpdatesScc);
|
||||
cases.push_back(ScalarQuadmaskB32(32));
|
||||
cases.push_back(ScalarQuadmaskB32(64));
|
||||
AddCase(ScalarQuadmaskB64);
|
||||
AddCase(ScalarFlbitI32B64Gpu);
|
||||
AddCase(ScalarFlbitI32B32Gpu);
|
||||
@@ -52562,6 +52604,13 @@ int main(int argc, char **argv) {
|
||||
std::setvbuf(stdout, nullptr, _IONBF, 0);
|
||||
EnsureConfigInitialized();
|
||||
CheckLeastRecentlyUsedCacheOrdering();
|
||||
if (argc == 2 && std::strcmp(argv[1], "--quadmask-only") == 0) {
|
||||
VulkanHarness vulkan;
|
||||
RunCase(&vulkan, ScalarQuadmaskB32(32));
|
||||
RunCase(&vulkan, ScalarQuadmaskB32(64));
|
||||
RunCase(&vulkan, ScalarQuadmaskB64());
|
||||
return 0;
|
||||
}
|
||||
if (argc == 2 && std::strcmp(argv[1], "--vop3-conversions-only") == 0) {
|
||||
VulkanHarness vulkan;
|
||||
RunCase(&vulkan, Vop3FloatConversions(32));
|
||||
|
||||
Reference in New Issue
Block a user