summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Nguyen Dac Nam2020-03-09 19:33:26 +0700
committerGravatar namkazy2020-04-05 10:31:26 +0700
commit6d235b8631697b81b08ee6f10f2fc79dc2956a50 (patch)
treeb37823bea3b0e818728b94063730524679f61740
parentci: Update to Windows Server 2019 and Visual Studio 2019 (diff)
downloadyuzu-6d235b8631697b81b08ee6f10f2fc79dc2956a50.tar.gz
yuzu-6d235b8631697b81b08ee6f10f2fc79dc2956a50.tar.xz
yuzu-6d235b8631697b81b08ee6f10f2fc79dc2956a50.zip
shader: implement SULD.D bits32
-rw-r--r--src/video_core/shader/decode/image.cpp38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/video_core/shader/decode/image.cpp b/src/video_core/shader/decode/image.cpp
index d2fe4ec5d..02bfef524 100644
--- a/src/video_core/shader/decode/image.cpp
+++ b/src/video_core/shader/decode/image.cpp
@@ -53,7 +53,6 @@ u32 ShaderIR::DecodeImage(NodeBlock& bb, u32 pc) {
53 53
54 switch (opcode->get().GetId()) { 54 switch (opcode->get().GetId()) {
55 case OpCode::Id::SULD: { 55 case OpCode::Id::SULD: {
56 UNIMPLEMENTED_IF(instr.suldst.mode != Tegra::Shader::SurfaceDataMode::P);
57 UNIMPLEMENTED_IF(instr.suldst.out_of_bounds_store != 56 UNIMPLEMENTED_IF(instr.suldst.out_of_bounds_store !=
58 Tegra::Shader::OutOfBoundsStore::Ignore); 57 Tegra::Shader::OutOfBoundsStore::Ignore);
59 58
@@ -62,17 +61,34 @@ u32 ShaderIR::DecodeImage(NodeBlock& bb, u32 pc) {
62 : GetBindlessImage(instr.gpr39, type)}; 61 : GetBindlessImage(instr.gpr39, type)};
63 image.MarkRead(); 62 image.MarkRead();
64 63
65 u32 indexer = 0; 64 if (instr.suldst.mode == Tegra::Shader::SurfaceDataMode::P) {
66 for (u32 element = 0; element < 4; ++element) { 65 u32 indexer = 0;
67 if (!instr.suldst.IsComponentEnabled(element)) { 66 for (u32 element = 0; element < 4; ++element) {
68 continue; 67 if (!instr.suldst.IsComponentEnabled(element)) {
68 continue;
69 }
70 MetaImage meta{image, {}, element};
71 Node value = Operation(OperationCode::ImageLoad, meta, GetCoordinates(type));
72 SetTemporary(bb, indexer++, std::move(value));
73 }
74 for (u32 i = 0; i < indexer; ++i) {
75 SetRegister(bb, instr.gpr0.Value() + i, GetTemporary(i));
76 }
77 } else if (instr.suldst.mode == Tegra::Shader::SurfaceDataMode::D_BA) {
78 UNIMPLEMENTED_IF(instr.suldst.GetStoreDataLayout() != StoreType::Bits32);
79
80 switch (instr.suldst.GetStoreDataLayout()) {
81 case StoreType::Bits32: {
82 MetaImage meta{image, {}, {}};
83 Node value = Operation(OperationCode::ImageLoad, meta, GetCoordinates(type));
84 SetTemporary(bb, 0, std::move(value));
85 SetRegister(bb, instr.gpr0.Value(), GetTemporary(0));
86 break;
87 }
88 default:
89 UNREACHABLE();
90 break;
69 } 91 }
70 MetaImage meta{image, {}, element};
71 Node value = Operation(OperationCode::ImageLoad, meta, GetCoordinates(type));
72 SetTemporary(bb, indexer++, std::move(value));
73 }
74 for (u32 i = 0; i < indexer; ++i) {
75 SetRegister(bb, instr.gpr0.Value() + i, GetTemporary(i));
76 } 92 }
77 break; 93 break;
78 } 94 }