From 05a3eba09462a3a63802bcc87fa82dae36ad7a27 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Sat, 6 May 2023 09:20:55 +0200 Subject: [PATCH] r600/sfn: Ass support for image_samples Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8971 Fixes: 79ca456b4837 ("r600/sfn: rewrite NIR backend") Signed-off-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp | 37 ++++++++++++++++++++++++++ src/gallium/drivers/r600/sfn/sfn_instr_mem.h | 1 + 2 files changed, 38 insertions(+) diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp index f52ba40..c8982e0 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp @@ -26,10 +26,14 @@ #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 diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_mem.h b/src/gallium/drivers/r600/sfn/sfn_instr_mem.h index 5c05cc7..d2e1264 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_mem.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr_mem.h @@ -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; -- 2.7.4