summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2018-12-20 22:42:47 -0300
committerGravatar ReinUsesLisp2019-01-15 17:54:49 -0300
commit864e8f55cf48bc6c8ad95c35cbe9217449936662 (patch)
tree7d1c58e41f74a2b77b57348e5088f88e422a2aab /src
parentshader_ir: Add register getter (diff)
downloadyuzu-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.cpp21
-rw-r--r--src/video_core/shader/shader_ir.h4
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
57Node 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
67Node 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
57Node ShaderIR::GetPredicate(u64 pred_, bool negated) { 78Node 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