diff options
| author | 2020-03-09 19:33:26 +0700 | |
|---|---|---|
| committer | 2020-04-05 10:31:26 +0700 | |
| commit | 6d235b8631697b81b08ee6f10f2fc79dc2956a50 (patch) | |
| tree | b37823bea3b0e818728b94063730524679f61740 | |
| parent | ci: Update to Windows Server 2019 and Visual Studio 2019 (diff) | |
| download | yuzu-6d235b8631697b81b08ee6f10f2fc79dc2956a50.tar.gz yuzu-6d235b8631697b81b08ee6f10f2fc79dc2956a50.tar.xz yuzu-6d235b8631697b81b08ee6f10f2fc79dc2956a50.zip | |
shader: implement SULD.D bits32
| -rw-r--r-- | src/video_core/shader/decode/image.cpp | 38 |
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 | } |