diff options
Diffstat (limited to 'src/video_core')
| -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) {      return Immediate(instr.alu.GetImm20_32());  } +Node ShaderIR::GetConstBuffer(u64 index_, u64 offset_) { +    const auto index = static_cast<u32>(index_); +    const auto offset = static_cast<u32>(offset_); + +    const auto [entry, is_new] = used_cbufs.try_emplace(index); +    entry->second.MarkAsUsed(offset); + +    return StoreNode(CbufNode(index, Immediate(offset))); +} + +Node ShaderIR::GetConstBufferIndirect(u64 index_, u64 offset_, Node node) { +    const auto index = static_cast<u32>(index_); +    const auto offset = static_cast<u32>(offset_); + +    const auto [entry, is_new] = used_cbufs.try_emplace(index); +    entry->second.MarkAsUsedIndirect(); + +    const Node final_offset = Operation(OperationCode::UAdd, NO_PRECISE, node, Immediate(offset)); +    return StoreNode(CbufNode(index, final_offset)); +} +  Node ShaderIR::GetPredicate(u64 pred_, bool negated) {      const auto pred = static_cast<Pred>(pred_);      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:      Node GetImmediate19(Tegra::Shader::Instruction instr);      /// Generates a node representing a 32-bit immediate value      Node GetImmediate32(Tegra::Shader::Instruction instr); +    /// Generates a node representing a constant buffer +    Node GetConstBuffer(u64 index, u64 offset); +    /// Generates a node representing a constant buffer with a variadic offset +    Node GetConstBufferIndirect(u64 index, u64 offset, Node node);      /// Generates a node for a passed predicate. It can be optionally negated      Node GetPredicate(u64 pred, bool negated = false);      /// Generates a predicate node for an immediate true or false value  | 
