shader: implement SULD.D bits32

This commit is contained in:
Nguyen Dac Nam 2020-03-09 19:33:26 +07:00 committed by namkazy
parent 59e75f4372
commit 6d235b8631
1 changed files with 27 additions and 11 deletions

View File

@ -53,7 +53,6 @@ u32 ShaderIR::DecodeImage(NodeBlock& bb, u32 pc) {
switch (opcode->get().GetId()) { switch (opcode->get().GetId()) {
case OpCode::Id::SULD: { case OpCode::Id::SULD: {
UNIMPLEMENTED_IF(instr.suldst.mode != Tegra::Shader::SurfaceDataMode::P);
UNIMPLEMENTED_IF(instr.suldst.out_of_bounds_store != UNIMPLEMENTED_IF(instr.suldst.out_of_bounds_store !=
Tegra::Shader::OutOfBoundsStore::Ignore); Tegra::Shader::OutOfBoundsStore::Ignore);
@ -62,17 +61,34 @@ u32 ShaderIR::DecodeImage(NodeBlock& bb, u32 pc) {
: GetBindlessImage(instr.gpr39, type)}; : GetBindlessImage(instr.gpr39, type)};
image.MarkRead(); image.MarkRead();
u32 indexer = 0; if (instr.suldst.mode == Tegra::Shader::SurfaceDataMode::P) {
for (u32 element = 0; element < 4; ++element) { u32 indexer = 0;
if (!instr.suldst.IsComponentEnabled(element)) { for (u32 element = 0; element < 4; ++element) {
continue; if (!instr.suldst.IsComponentEnabled(element)) {
continue;
}
MetaImage meta{image, {}, element};
Node value = Operation(OperationCode::ImageLoad, meta, GetCoordinates(type));
SetTemporary(bb, indexer++, std::move(value));
}
for (u32 i = 0; i < indexer; ++i) {
SetRegister(bb, instr.gpr0.Value() + i, GetTemporary(i));
}
} else if (instr.suldst.mode == Tegra::Shader::SurfaceDataMode::D_BA) {
UNIMPLEMENTED_IF(instr.suldst.GetStoreDataLayout() != StoreType::Bits32);
switch (instr.suldst.GetStoreDataLayout()) {
case StoreType::Bits32: {
MetaImage meta{image, {}, {}};
Node value = Operation(OperationCode::ImageLoad, meta, GetCoordinates(type));
SetTemporary(bb, 0, std::move(value));
SetRegister(bb, instr.gpr0.Value(), GetTemporary(0));
break;
}
default:
UNREACHABLE();
break;
} }
MetaImage meta{image, {}, element};
Node value = Operation(OperationCode::ImageLoad, meta, GetCoordinates(type));
SetTemporary(bb, indexer++, std::move(value));
}
for (u32 i = 0; i < indexer; ++i) {
SetRegister(bb, instr.gpr0.Value() + i, GetTemporary(i));
} }
break; break;
} }