diff options
author | Liam <byteslice@airmail.cc> | 2022-10-02 23:32:54 +0200 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2022-10-02 23:32:54 +0200 |
commit | ae7062d5225bb486a7325398a639c27ec6098a97 (patch) | |
tree | 692a5c63016a7b50b55ee131798aa9526ac6a9b5 /src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp | |
parent | Merge pull request #8955 from german77/amiibo-rewrite (diff) | |
download | yuzu-ae7062d5225bb486a7325398a639c27ec6098a97.tar yuzu-ae7062d5225bb486a7325398a639c27ec6098a97.tar.gz yuzu-ae7062d5225bb486a7325398a639c27ec6098a97.tar.bz2 yuzu-ae7062d5225bb486a7325398a639c27ec6098a97.tar.lz yuzu-ae7062d5225bb486a7325398a639c27ec6098a97.tar.xz yuzu-ae7062d5225bb486a7325398a639c27ec6098a97.tar.zst yuzu-ae7062d5225bb486a7325398a639c27ec6098a97.zip |
Diffstat (limited to 'src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp')
-rw-r--r-- | src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index b5c08d611..7e8f37563 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp @@ -13,9 +13,6 @@ namespace Shader::Backend::GLASM { namespace { void GetCbuf(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, ScalarU32 offset, std::string_view size) { - if (!binding.IsImmediate()) { - throw NotImplementedException("Indirect constant buffer loading"); - } const Register ret{ctx.reg_alloc.Define(inst)}; if (offset.type == Type::U32) { // Avoid reading arrays out of bounds, matching hardware's behavior @@ -24,7 +21,27 @@ void GetCbuf(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, ScalarU return; } } - ctx.Add("LDC.{} {},c{}[{}];", size, ret, binding.U32(), offset); + + if (binding.IsImmediate()) { + ctx.Add("LDC.{} {},c{}[{}];", size, ret, binding.U32(), offset); + return; + } + + const ScalarU32 idx{ctx.reg_alloc.Consume(binding)}; + for (u32 i = 0; i < Info::MAX_INDIRECT_CBUFS; i++) { + ctx.Add("SEQ.S.CC RC.x,{},{};" + "IF NE.x;" + "LDC.{} {},c{}[{}];", + idx, i, size, ret, i, offset); + + if (i != Info::MAX_INDIRECT_CBUFS - 1) { + ctx.Add("ELSE;"); + } + } + + for (u32 i = 0; i < Info::MAX_INDIRECT_CBUFS; i++) { + ctx.Add("ENDIF;"); + } } bool IsInputArray(Stage stage) { |