diff options
| author | 2018-12-20 22:42:47 -0300 | |
|---|---|---|
| committer | 2019-01-15 17:54:49 -0300 | |
| commit | 864e8f55cf48bc6c8ad95c35cbe9217449936662 (patch) | |
| tree | 7d1c58e41f74a2b77b57348e5088f88e422a2aab /src | |
| parent | shader_ir: Add register getter (diff) | |
| download | yuzu-864e8f55cf48bc6c8ad95c35cbe9217449936662.tar.gz yuzu-864e8f55cf48bc6c8ad95c35cbe9217449936662.tar.xz yuzu-864e8f55cf48bc6c8ad95c35cbe9217449936662.zip | |
shader_ir: Add constant buffer getters
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/shader/shader_ir.cpp | 21 | ||||
| -rw-r--r-- | src/video_core/shader/shader_ir.h | 4 |
2 files changed, 25 insertions, 0 deletions
diff --git a/src/video_core/shader/shader_ir.cpp b/src/video_core/shader/shader_ir.cpp index ff4e462f2..3bc9f72f5 100644 --- a/src/video_core/shader/shader_ir.cpp +++ b/src/video_core/shader/shader_ir.cpp | |||
| @@ -54,6 +54,27 @@ Node ShaderIR::GetImmediate32(Instruction instr) { | |||
| 54 | return Immediate(instr.alu.GetImm20_32()); | 54 | return Immediate(instr.alu.GetImm20_32()); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | Node ShaderIR::GetConstBuffer(u64 index_, u64 offset_) { | ||
| 58 | const auto index = static_cast<u32>(index_); | ||
| 59 | const auto offset = static_cast<u32>(offset_); | ||
| 60 | |||
| 61 | const auto [entry, is_new] = used_cbufs.try_emplace(index); | ||
| 62 | entry->second.MarkAsUsed(offset); | ||
| 63 | |||
| 64 | return StoreNode(CbufNode(index, Immediate(offset))); | ||
| 65 | } | ||
| 66 | |||
| 67 | Node ShaderIR::GetConstBufferIndirect(u64 index_, u64 offset_, Node node) { | ||
| 68 | const auto index = static_cast<u32>(index_); | ||
| 69 | const auto offset = static_cast<u32>(offset_); | ||
| 70 | |||
| 71 | const auto [entry, is_new] = used_cbufs.try_emplace(index); | ||
| 72 | entry->second.MarkAsUsedIndirect(); | ||
| 73 | |||
| 74 | const Node final_offset = Operation(OperationCode::UAdd, NO_PRECISE, node, Immediate(offset)); | ||
| 75 | return StoreNode(CbufNode(index, final_offset)); | ||
| 76 | } | ||
| 77 | |||
| 57 | Node ShaderIR::GetPredicate(u64 pred_, bool negated) { | 78 | Node ShaderIR::GetPredicate(u64 pred_, bool negated) { |
| 58 | const auto pred = static_cast<Pred>(pred_); | 79 | const auto pred = static_cast<Pred>(pred_); |
| 59 | if (pred != Pred::UnusedIndex && pred != Pred::NeverExecute) { | 80 | if (pred != Pred::UnusedIndex && pred != Pred::NeverExecute) { |
diff --git a/src/video_core/shader/shader_ir.h b/src/video_core/shader/shader_ir.h index 30b75c3ed..4e786a344 100644 --- a/src/video_core/shader/shader_ir.h +++ b/src/video_core/shader/shader_ir.h | |||
| @@ -616,6 +616,10 @@ private: | |||
| 616 | Node GetImmediate19(Tegra::Shader::Instruction instr); | 616 | Node GetImmediate19(Tegra::Shader::Instruction instr); |
| 617 | /// Generates a node representing a 32-bit immediate value | 617 | /// Generates a node representing a 32-bit immediate value |
| 618 | Node GetImmediate32(Tegra::Shader::Instruction instr); | 618 | Node GetImmediate32(Tegra::Shader::Instruction instr); |
| 619 | /// Generates a node representing a constant buffer | ||
| 620 | Node GetConstBuffer(u64 index, u64 offset); | ||
| 621 | /// Generates a node representing a constant buffer with a variadic offset | ||
| 622 | Node GetConstBufferIndirect(u64 index, u64 offset, Node node); | ||
| 619 | /// Generates a node for a passed predicate. It can be optionally negated | 623 | /// Generates a node for a passed predicate. It can be optionally negated |
| 620 | Node GetPredicate(u64 pred, bool negated = false); | 624 | Node GetPredicate(u64 pred, bool negated = false); |
| 621 | /// Generates a predicate node for an immediate true or false value | 625 | /// Generates a predicate node for an immediate true or false value |