r600/sfn: Ass support for image_samples

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8971

Fixes: 79ca456b48 ("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>
This commit is contained in:
Gert Wollny
2023-05-06 09:20:55 +02:00
parent 19961f8195
commit 05a3eba094
2 changed files with 38 additions and 0 deletions
@@ -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
@@ -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;