r600/sfn: Fix location for reading cube array image dimensions
authorGert Wollny <gert.wollny@collabora.com>
Tue, 15 Nov 2022 11:50:00 +0000 (12:50 +0100)
committerMarge Bot <emma+marge@anholt.net>
Wed, 16 Nov 2022 17:22:04 +0000 (17:22 +0000)
Fixes: 79ca456b4837b3bc21cf9ef3c03c505c4b4909f6
        r600/sfn: rewrite NIR backend

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19755>

src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp
src/gallium/drivers/r600/sfn/sfn_shader.cpp
src/gallium/drivers/r600/sfn/sfn_shader.h
src/gallium/drivers/r600/sfn/sfn_shader_cs.cpp
src/gallium/drivers/r600/sfn/sfn_shader_cs.h
src/gallium/drivers/r600/sfn/sfn_shader_fs.cpp
src/gallium/drivers/r600/sfn/sfn_shader_fs.h

index 99f00ab..457ee01 100644 (file)
@@ -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],
index 1283b31..d4fe00f 100644 (file)
@@ -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;
index 3f38247..e02c981 100644 (file)
@@ -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,
index b19640d..26b0fdb 100644 (file)
@@ -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)
 {
 }
 
index 49bb321..f57e06b 100644 (file)
@@ -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<PRegister, 3> m_local_invocation_id{nullptr};
 
    PRegister m_zero_register{0};
+   int m_image_size_const_offset{0};
 };
 
 } // namespace r600
index c1f34ca..2b72847 100644 (file)
@@ -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)
 {
 }
 
index 8c97e77..9b90e9e 100644 (file)
@@ -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 {