From 1106e2499eeddee8b34c1dd1f3bf6d98377c53f6 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 6 Jun 2023 19:26:02 -0400 Subject: [PATCH] agx: Lower buffer images Similar to buffer reads, we need to implement buffer images as 2D images with fixed width and some lowering code. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/compiler/agx_nir_lower_texture.c | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/asahi/compiler/agx_nir_lower_texture.c b/src/asahi/compiler/agx_nir_lower_texture.c index a9dd5147193..ed450bc392c 100644 --- a/src/asahi/compiler/agx_nir_lower_texture.c +++ b/src/asahi/compiler/agx_nir_lower_texture.c @@ -694,6 +694,23 @@ image_texel_address(nir_builder *b, nir_intrinsic_instr *intr) return nir_iadd(b, base, nir_u2u64(b, total_B)); } +static bool +lower_buffer_image(nir_builder *b, nir_intrinsic_instr *intr) +{ + if (nir_intrinsic_image_dim(intr) != GLSL_SAMPLER_DIM_BUF) + return false; + + nir_ssa_def *coord_vector = intr->src[1].ssa; + nir_ssa_def *coord = nir_channel(b, coord_vector, 0); + + /* Lower the buffer load/store to a 2D image load/store, matching the 2D + * texture/PBE descriptor the driver supplies for buffer images. + */ + nir_ssa_def *coord2d = coords_for_buffer_texture(b, coord); + nir_src_rewrite_ssa(&intr->src[1], nir_pad_vector(b, coord2d, 4)); + nir_intrinsic_set_image_dim(intr, GLSL_SAMPLER_DIM_2D); + return true; +} static bool lower_images(nir_builder *b, nir_instr *instr, UNUSED void *data) @@ -705,6 +722,12 @@ lower_images(nir_builder *b, nir_instr *instr, UNUSED void *data) b->cursor = nir_before_instr(instr); switch (intr->intrinsic) { + case nir_intrinsic_image_load: + case nir_intrinsic_image_store: + case nir_intrinsic_bindless_image_load: + case nir_intrinsic_bindless_image_store: + return lower_buffer_image(b, intr); + case nir_intrinsic_image_size: case nir_intrinsic_bindless_image_size: nir_ssa_def_rewrite_uses(