diff options
Diffstat (limited to 'src/shader_recompiler/backend')
5 files changed, 23 insertions, 14 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm.cpp b/src/shader_recompiler/backend/glasm/emit_glasm.cpp index 1419207e8..3b0176bf6 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm.cpp | |||
| @@ -175,7 +175,7 @@ bool IsReference(IR::Inst& inst) { | |||
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | void PrecolorInst(IR::Inst& phi) { | 177 | void PrecolorInst(IR::Inst& phi) { |
| 178 | // Insert phi moves before references to avoid overwritting other phis | 178 | // Insert phi moves before references to avoid overwriting other phis |
| 179 | const size_t num_args{phi.NumArgs()}; | 179 | const size_t num_args{phi.NumArgs()}; |
| 180 | for (size_t i = 0; i < num_args; ++i) { | 180 | for (size_t i = 0; i < num_args; ++i) { |
| 181 | IR::Block& phi_block{*phi.PhiBlock(i)}; | 181 | IR::Block& phi_block{*phi.PhiBlock(i)}; |
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 ee0b0f53d..0a7d42dda 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 { | |||
| 13 | namespace { | 13 | namespace { |
| 14 | void GetCbuf(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, ScalarU32 offset, | 14 | void GetCbuf(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, ScalarU32 offset, |
| 15 | std::string_view size) { | 15 | std::string_view size) { |
| 16 | if (!binding.IsImmediate()) { | ||
| 17 | throw NotImplementedException("Indirect constant buffer loading"); | ||
| 18 | } | ||
| 19 | const Register ret{ctx.reg_alloc.Define(inst)}; | 16 | const Register ret{ctx.reg_alloc.Define(inst)}; |
| 20 | if (offset.type == Type::U32) { | 17 | if (offset.type == Type::U32) { |
| 21 | // Avoid reading arrays out of bounds, matching hardware's behavior | 18 | // 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 | |||
| 24 | return; | 21 | return; |
| 25 | } | 22 | } |
| 26 | } | 23 | } |
| 27 | ctx.Add("LDC.{} {},c{}[{}];", size, ret, binding.U32(), offset); | 24 | |
| 25 | if (binding.IsImmediate()) { | ||
| 26 | ctx.Add("LDC.{} {},c{}[{}];", size, ret, binding.U32(), offset); | ||
| 27 | return; | ||
| 28 | } | ||
| 29 | |||
| 30 | const ScalarU32 idx{ctx.reg_alloc.Consume(binding)}; | ||
| 31 | for (u32 i = 0; i < Info::MAX_INDIRECT_CBUFS; i++) { | ||
| 32 | ctx.Add("SEQ.S.CC RC.x,{},{};" | ||
| 33 | "IF NE.x;" | ||
| 34 | "LDC.{} {},c{}[{}];", | ||
| 35 | idx, i, size, ret, i, offset); | ||
| 36 | |||
| 37 | if (i != Info::MAX_INDIRECT_CBUFS - 1) { | ||
| 38 | ctx.Add("ELSE;"); | ||
| 39 | } | ||
| 40 | } | ||
| 41 | |||
| 42 | for (u32 i = 0; i < Info::MAX_INDIRECT_CBUFS; i++) { | ||
| 43 | ctx.Add("ENDIF;"); | ||
| 44 | } | ||
| 28 | } | 45 | } |
| 29 | 46 | ||
| 30 | bool IsInputArray(Stage stage) { | 47 | bool IsInputArray(Stage stage) { |
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp index 7094d8e42..1f4ffdd62 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp | |||
| @@ -5,10 +5,6 @@ | |||
| 5 | #include "shader_recompiler/backend/glasm/glasm_emit_context.h" | 5 | #include "shader_recompiler/backend/glasm/glasm_emit_context.h" |
| 6 | #include "shader_recompiler/frontend/ir/value.h" | 6 | #include "shader_recompiler/frontend/ir/value.h" |
| 7 | 7 | ||
| 8 | #ifdef _MSC_VER | ||
| 9 | #pragma warning(disable : 4100) | ||
| 10 | #endif | ||
| 11 | |||
| 12 | namespace Shader::Backend::GLASM { | 8 | namespace Shader::Backend::GLASM { |
| 13 | 9 | ||
| 14 | #define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__) | 10 | #define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__) |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl.cpp b/src/shader_recompiler/backend/glsl/emit_glsl.cpp index 76c18e488..e8a4390f6 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl.cpp | |||
| @@ -101,7 +101,7 @@ bool IsReference(IR::Inst& inst) { | |||
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | void PrecolorInst(IR::Inst& phi) { | 103 | void PrecolorInst(IR::Inst& phi) { |
| 104 | // Insert phi moves before references to avoid overwritting other phis | 104 | // Insert phi moves before references to avoid overwriting other phis |
| 105 | const size_t num_args{phi.NumArgs()}; | 105 | const size_t num_args{phi.NumArgs()}; |
| 106 | for (size_t i = 0; i < num_args; ++i) { | 106 | for (size_t i = 0; i < num_args; ++i) { |
| 107 | IR::Block& phi_block{*phi.PhiBlock(i)}; | 107 | IR::Block& phi_block{*phi.PhiBlock(i)}; |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp index b03a8ba1e..9f1ed95a4 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp | |||
| @@ -7,10 +7,6 @@ | |||
| 7 | #include "shader_recompiler/backend/glsl/glsl_emit_context.h" | 7 | #include "shader_recompiler/backend/glsl/glsl_emit_context.h" |
| 8 | #include "shader_recompiler/frontend/ir/value.h" | 8 | #include "shader_recompiler/frontend/ir/value.h" |
| 9 | 9 | ||
| 10 | #ifdef _MSC_VER | ||
| 11 | #pragma warning(disable : 4100) | ||
| 12 | #endif | ||
| 13 | |||
| 14 | namespace Shader::Backend::GLSL { | 10 | namespace Shader::Backend::GLSL { |
| 15 | 11 | ||
| 16 | void EmitGetRegister(EmitContext& ctx) { | 12 | void EmitGetRegister(EmitContext& ctx) { |