amd: lower get_ssbo_size in ac_nir_lower_resinfo

The code for lowering get_ssbo_size will be different in future chips,
so do it in common code to reduce duplication in the future.

Lower get_ssbo_size to ssbo_descriptor_amd + nir_channel.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38097>
This commit is contained in:
Marek Olšák 2025-09-20 08:07:29 -04:00 committed by Marge Bot
parent 3e2c11597a
commit 9125e34372
3 changed files with 22 additions and 19 deletions

View file

@ -235,16 +235,25 @@ lower_query_size(nir_builder *b, nir_def *desc, nir_src *lod,
static bool lower_resinfo(nir_builder *b, nir_instr *instr, void *data)
{
enum amd_gfx_level gfx_level = *(enum amd_gfx_level*)data;
nir_def *result = NULL, *dst = NULL;
nir_def *result = NULL;
if (instr->type == nir_instr_type_intrinsic) {
if (instr->type == nir_instr_type_intrinsic &&
nir_instr_as_intrinsic(instr)->intrinsic == nir_intrinsic_get_ssbo_size) {
/* Lower get_ssbo_size to ssbo_descriptor_amd. */
nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
b->cursor = nir_before_instr(instr);
nir_def *desc = nir_ssbo_descriptor_amd(b, intr->src[0].ssa,
.access = nir_intrinsic_access(intr));
result = nir_channel(b, desc, 2);
} else if (instr->type == nir_instr_type_intrinsic) {
nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
const struct glsl_type *type;
enum glsl_sampler_dim dim;
bool is_array;
nir_def *desc = NULL;
dst = &intr->def;
b->cursor = nir_before_instr(instr);
switch (intr->intrinsic) {
@ -306,7 +315,6 @@ static bool lower_resinfo(nir_builder *b, nir_instr *instr, void *data)
nir_def *desc = NULL;
nir_src *lod = NULL;
dst = &tex->def;
b->cursor = nir_before_instr(instr);
switch (tex->op) {
@ -365,6 +373,7 @@ static bool lower_resinfo(nir_builder *b, nir_instr *instr, void *data)
if (!result)
return false;
nir_def *dst = nir_instr_def(instr);
assert(dst->bit_size == 32 || dst->bit_size == 16);
if (dst->bit_size == 16)
result = nir_u2u16(b, result);

View file

@ -166,25 +166,22 @@ load_buffer_descriptor(nir_builder *b, apply_layout_state *state, nir_def *rsrc,
}
static void
visit_get_ssbo_size(nir_builder *b, apply_layout_state *state, nir_intrinsic_instr *intrin)
visit_ssbo_descriptor_amd(nir_builder *b, apply_layout_state *state, nir_intrinsic_instr *intrin)
{
nir_def *rsrc = intrin->src[0].ssa;
nir_def *desc;
nir_def *size;
if (nir_intrinsic_access(intrin) & ACCESS_NON_UNIFORM) {
nir_def *ptr = nir_iadd(b, nir_channel(b, rsrc, 0), nir_channel(b, rsrc, 1));
ptr = nir_iadd_imm(b, ptr, 8);
ptr = convert_pointer_to_64_bit(b, state, ptr);
size = nir_load_global(b, 4, 32, ptr, .access = ACCESS_NON_WRITEABLE | ACCESS_CAN_REORDER, .align_mul = 16,
.align_offset = 4);
desc = nir_load_global(b, 4, 32, ptr, .access = ACCESS_NON_WRITEABLE | ACCESS_CAN_REORDER, .align_mul = 16);
} else {
/* load the entire descriptor so it can be CSE'd */
nir_def *ptr = convert_pointer_to_64_bit(b, state, nir_channel(b, rsrc, 0));
nir_def *desc = ac_nir_load_smem(b, 4, ptr, nir_channel(b, rsrc, 1), 4, 0);
size = nir_channel(b, desc, 2);
desc = ac_nir_load_smem(b, 4, ptr, nir_channel(b, rsrc, 1), 4, 0);
}
nir_def_replace(&intrin->def, size);
nir_def_replace(&intrin->def, desc);
}
static nir_def *
@ -399,8 +396,8 @@ apply_layout_to_intrin(nir_builder *b, apply_layout_state *state, nir_intrinsic_
rsrc = load_buffer_descriptor(b, state, intrin->src[1].ssa, nir_intrinsic_access(intrin));
nir_src_rewrite(&intrin->src[1], rsrc);
break;
case nir_intrinsic_get_ssbo_size:
visit_get_ssbo_size(b, state, intrin);
case nir_intrinsic_ssbo_descriptor_amd:
visit_ssbo_descriptor_amd(b, state, intrin);
break;
case nir_intrinsic_image_deref_load:
case nir_intrinsic_image_deref_sparse_load:

View file

@ -313,12 +313,9 @@ static bool lower_resource_intrinsic(nir_builder *b, nir_intrinsic_instr *intrin
nir_instr_remove(&intrin->instr);
break;
}
case nir_intrinsic_get_ssbo_size: {
case nir_intrinsic_ssbo_descriptor_amd: {
assert(!(nir_intrinsic_access(intrin) & ACCESS_NON_UNIFORM));
nir_def *desc = load_ssbo_desc(b, &intrin->src[0], s);
nir_def *size = nir_channel(b, desc, 2);
nir_def_replace(&intrin->def, size);
nir_def_replace(&intrin->def, load_ssbo_desc(b, &intrin->src[0], s));
break;
}
case nir_intrinsic_image_deref_load: