r600/sfn: Ass support for image_samples
authorGert Wollny <gert.wollny@collabora.com>
Sat, 6 May 2023 07:20:55 +0000 (09:20 +0200)
committerGert Wollny <gert.wollny@collabora.com>
Sat, 6 May 2023 07:20:55 +0000 (09:20 +0200)
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8971

Fixes: 79ca456b4837 ("r600/sfn: rewrite NIR backend")
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22883>

src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp
src/gallium/drivers/r600/sfn/sfn_instr_mem.h

index f52ba40..c8982e0 100644 (file)
 
 #include "sfn_instr_mem.h"
 
+#include "nir_intrinsics.h"
 #include "nir_intrinsics_indices.h"
+#include "sfn_alu_defines.h"
+#include "sfn_instr_alu.h"
 #include "sfn_instr_fetch.h"
 #include "sfn_instr_tex.h"
 #include "sfn_shader.h"
+#include "sfn_virtualvalues.h"
 
 namespace r600 {
 
@@ -559,6 +563,8 @@ RatInstr::emit(nir_intrinsic_instr *intr, Shader& shader)
       return emit_image_load_or_atomic(intr, shader);
    case nir_intrinsic_image_size:
       return emit_image_size(intr, shader);
+   case nir_intrinsic_image_samples:
+      return emit_image_samples(intr, shader);
    case nir_intrinsic_get_ssbo_size:
       return emit_ssbo_size(intr, shader);
    default:
@@ -980,4 +986,35 @@ RatInstr::emit_image_size(nir_intrinsic_instr *intrin, Shader& shader)
    return true;
 }
 
+bool
+RatInstr::emit_image_samples(nir_intrinsic_instr *intrin, Shader& shader)
+{
+   auto& vf = shader.value_factory();
+
+   auto src = RegisterVec4(0, true, {4, 4, 4, 4});
+
+   auto tmp =  shader.value_factory().temp_vec4(pin_group);
+   auto dest =  shader.value_factory().dest(intrin->dest, 0, pin_free);
+
+   auto const_offset = nir_src_as_const_value(intrin->src[0]);
+   PRegister dyn_offset = nullptr;
+
+   int res_id = R600_IMAGE_REAL_RESOURCE_OFFSET + nir_intrinsic_range_base(intrin);
+   if (const_offset)
+      res_id += const_offset[0].u32;
+   else
+      dyn_offset = shader.emit_load_to_register(vf.src(intrin->src[0], 0));
+
+   shader.emit_instruction(new TexInstr(TexInstr::get_resinfo,
+                                        tmp,
+                                        {3, 7, 7, 7},
+                                        src,
+                                        0 /* ?? */,
+                                        res_id,
+                                        dyn_offset));
+
+   shader.emit_instruction(new AluInstr(op1_mov, dest, tmp[0], AluInstr::last_write));
+   return true;
+}
+
 } // namespace r600
index 5c05cc7..d2e1264 100644 (file)
@@ -175,6 +175,7 @@ private:
    static bool emit_image_store(nir_intrinsic_instr *intr, Shader& shader);
    static bool emit_image_load_or_atomic(nir_intrinsic_instr *intr, Shader& shader);
    static bool emit_image_size(nir_intrinsic_instr *intr, Shader& shader);
+   static bool emit_image_samples(nir_intrinsic_instr *intrin, Shader& shader);
 
    bool do_ready() const override;
    void do_print(std::ostream& os) const override;