diff --git a/src/amd/common/nir/ac_nir_lower_resinfo.c b/src/amd/common/nir/ac_nir_lower_resinfo.c index eafa3ba9b8b..c56e25c7bb5 100644 --- a/src/amd/common/nir/ac_nir_lower_resinfo.c +++ b/src/amd/common/nir/ac_nir_lower_resinfo.c @@ -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); diff --git a/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c b/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c index c5c6a9726ef..a8d00566876 100644 --- a/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c +++ b/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c @@ -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: diff --git a/src/gallium/drivers/radeonsi/si_nir_lower_resource.c b/src/gallium/drivers/radeonsi/si_nir_lower_resource.c index c425cd5f528..e8fb46dfcc0 100644 --- a/src/gallium/drivers/radeonsi/si_nir_lower_resource.c +++ b/src/gallium/drivers/radeonsi/si_nir_lower_resource.c @@ -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: