From 35d6e290e4119e020e8072ce4ad97bc4e9cd269b Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Tue, 15 Nov 2022 12:50:00 +0100 Subject: [PATCH] r600/sfn: Fix location for reading cube array image dimensions Fixes: 79ca456b4837b3bc21cf9ef3c03c505c4b4909f6 r600/sfn: rewrite NIR backend Signed-off-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp | 2 +- src/gallium/drivers/r600/sfn/sfn_shader.cpp | 2 +- src/gallium/drivers/r600/sfn/sfn_shader.h | 2 ++ src/gallium/drivers/r600/sfn/sfn_shader_cs.cpp | 5 +++-- src/gallium/drivers/r600/sfn/sfn_shader_cs.h | 5 ++++- src/gallium/drivers/r600/sfn/sfn_shader_fs.cpp | 3 ++- src/gallium/drivers/r600/sfn/sfn_shader_fs.h | 3 +++ 7 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp index 99f00ab..457ee01 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp @@ -899,7 +899,7 @@ RatInstr::emit_image_size(nir_intrinsic_instr *intrin, Shader& shader) shader.set_flag(Shader::sh_txs_cube_array_comp); if (const_offset) { - unsigned lookup_resid = const_offset[0].u32; + unsigned lookup_resid = const_offset[0].u32 + shader.image_size_const_offset(); shader.emit_instruction( new AluInstr(op1_mov, dest[2], diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.cpp b/src/gallium/drivers/r600/sfn/sfn_shader.cpp index 1283b31..d4fe00f 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader.cpp @@ -455,7 +455,7 @@ Shader::translate_from_nir(nir_shader *nir, break; case MESA_SHADER_KERNEL: case MESA_SHADER_COMPUTE: - shader = new ComputeShader(key); + shader = new ComputeShader(key, BITSET_COUNT(nir->info.samplers_used)); break; default: return nullptr; diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.h b/src/gallium/drivers/r600/sfn/sfn_shader.h index 3f38247..e02c981 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.h +++ b/src/gallium/drivers/r600/sfn/sfn_shader.h @@ -243,6 +243,8 @@ public: PRegister emit_load_to_register(PVirtualValue src); + virtual unsigned image_size_const_offset() { return 0;} + protected: enum ESlots { es_face, diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_cs.cpp b/src/gallium/drivers/r600/sfn/sfn_shader_cs.cpp index b19640d..26b0fdb 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader_cs.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader_cs.cpp @@ -30,8 +30,9 @@ namespace r600 { -ComputeShader::ComputeShader(UNUSED const r600_shader_key& key): - Shader("CS", 0) +ComputeShader::ComputeShader(UNUSED const r600_shader_key& key, int num_samplers): + Shader("CS", 0), + m_image_size_const_offset(num_samplers) { } diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_cs.h b/src/gallium/drivers/r600/sfn/sfn_shader_cs.h index 49bb321..f57e06b 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader_cs.h +++ b/src/gallium/drivers/r600/sfn/sfn_shader_cs.h @@ -33,7 +33,9 @@ namespace r600 { class ComputeShader : public Shader { public: - ComputeShader(const r600_shader_key& key); + ComputeShader(const r600_shader_key& key, int num_samplers); + + unsigned image_size_const_offset() override { return m_image_size_const_offset;} private: bool do_scan_instruction(nir_instr *instr) override; @@ -61,6 +63,7 @@ private: std::array m_local_invocation_id{nullptr}; PRegister m_zero_register{0}; + int m_image_size_const_offset{0}; }; } // namespace r600 diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_fs.cpp b/src/gallium/drivers/r600/sfn/sfn_shader_fs.cpp index c1f34ca..2b72847 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader_fs.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader_fs.cpp @@ -51,7 +51,8 @@ FragmentShader::FragmentShader(const r600_shader_key& key): m_pos_input(127, false), m_fs_write_all(false), m_apply_sample_mask(key.ps.apply_sample_id_mask), - m_rat_base(key.ps.nr_cbufs) + m_rat_base(key.ps.nr_cbufs), + m_image_size_const_offset(key.ps.image_size_const_offset) { } diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_fs.h b/src/gallium/drivers/r600/sfn/sfn_shader_fs.h index 8c97e77..9b90e9e 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader_fs.h +++ b/src/gallium/drivers/r600/sfn/sfn_shader_fs.h @@ -39,6 +39,8 @@ public: bool process_stage_intrinsic(nir_intrinsic_instr *intr) override; + unsigned image_size_const_offset() override { return m_image_size_const_offset;} + protected: static const int s_max_interpolators = 6; bool interpolators_used(int i) const { return m_interpolators_used.test(i); } @@ -91,6 +93,7 @@ private: int m_rat_base{0}; int m_pos_driver_loc{0}; int m_face_driver_loc{0}; + int m_image_size_const_offset{0}; }; class FragmentShaderR600 : public FragmentShader { -- 2.7.4