aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/shader/shader_ir.cpp
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2018-12-20 22:42:47 -0300
committerReinUsesLisp <reinuseslisp@airmail.cc>2019-01-15 17:54:49 -0300
commit864e8f55cf48bc6c8ad95c35cbe9217449936662 (patch)
tree7d1c58e41f74a2b77b57348e5088f88e422a2aab /src/video_core/shader/shader_ir.cpp
parent5e639bfcf6d764714cc9814fc47142ca85f889cf (diff)
shader_ir: Add constant buffer getters
Diffstat (limited to 'src/video_core/shader/shader_ir.cpp')
-rw-r--r--src/video_core/shader/shader_ir.cpp21
1 files changed, 21 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) {