diff options
| -rw-r--r-- | src/video_core/shader/decode/memory.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/video_core/shader/decode/memory.cpp b/src/video_core/shader/decode/memory.cpp index 2321a37a2..6eb36b1e7 100644 --- a/src/video_core/shader/decode/memory.cpp +++ b/src/video_core/shader/decode/memory.cpp | |||
| @@ -116,13 +116,25 @@ u32 ShaderIR::DecodeMemory(BasicBlock& bb, const BasicBlock& code, u32 pc) { | |||
| 116 | 116 | ||
| 117 | switch (instr.ldst_sl.type.Value()) { | 117 | switch (instr.ldst_sl.type.Value()) { |
| 118 | case Tegra::Shader::StoreType::Bits32: | 118 | case Tegra::Shader::StoreType::Bits32: |
| 119 | SetRegister(bb, instr.gpr0, GetLmem(0)); | 119 | case Tegra::Shader::StoreType::Bits64: |
| 120 | break; | 120 | case Tegra::Shader::StoreType::Bits128: { |
| 121 | case Tegra::Shader::StoreType::Bits64: { | 121 | const u32 count = [&]() { |
| 122 | SetTemporal(bb, 0, GetLmem(0)); | 122 | switch (instr.ldst_sl.type.Value()) { |
| 123 | SetTemporal(bb, 1, GetLmem(4)); | 123 | case Tegra::Shader::StoreType::Bits32: |
| 124 | SetRegister(bb, instr.gpr0, GetTemporal(0)); | 124 | return 1; |
| 125 | SetRegister(bb, instr.gpr0.Value() + 1, GetTemporal(1)); | 125 | case Tegra::Shader::StoreType::Bits64: |
| 126 | return 2; | ||
| 127 | case Tegra::Shader::StoreType::Bits128: | ||
| 128 | return 4; | ||
| 129 | default: | ||
| 130 | UNREACHABLE(); | ||
| 131 | return 0; | ||
| 132 | } | ||
| 133 | }(); | ||
| 134 | for (u32 i = 0; i < count; ++i) | ||
| 135 | SetTemporal(bb, i, GetLmem(i * 4)); | ||
| 136 | for (u32 i = 0; i < count; ++i) | ||
| 137 | SetRegister(bb, instr.gpr0.Value() + i, GetTemporal(i)); | ||
| 126 | break; | 138 | break; |
| 127 | } | 139 | } |
| 128 | default: | 140 | default: |