mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 07:20:10 +01:00
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:
parent
3e2c11597a
commit
9125e34372
3 changed files with 22 additions and 19 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue