From cdb88f67dc291ccf1f4e9f0a33d4e266710b20a6 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 20 Jan 2021 18:49:26 -0600 Subject: [PATCH] anv/apply_pipeline_layout: Refactor descriptor chasing code This makes things a bit more generic for use in the next commit. Reviewed-by: Kenneth Graunke Reviewed-by: Caio Marcelo de Oliveira Filho Part-of: --- .../vulkan/anv_nir_apply_pipeline_layout.c | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c index 24db401331a..aaf85694da6 100644 --- a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c +++ b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c @@ -150,7 +150,7 @@ get_used_bindings(UNUSED nir_builder *_b, nir_instr *instr, void *_state) return false; } -static bool +static nir_intrinsic_instr * find_descriptor_for_index_src(nir_src src, struct apply_pipeline_layout_state *state) { @@ -160,7 +160,16 @@ find_descriptor_for_index_src(nir_src src, intrin = nir_src_as_intrinsic(intrin->src[0]); if (!intrin || intrin->intrinsic != nir_intrinsic_vulkan_resource_index) - return false; + return NULL; + + return intrin; +} + +static bool +descriptor_has_bti(nir_intrinsic_instr *intrin, + struct apply_pipeline_layout_state *state) +{ + assert(intrin->intrinsic == nir_intrinsic_vulkan_resource_index); uint32_t set = nir_intrinsic_desc_set(intrin); uint32_t binding = nir_intrinsic_binding(intrin); @@ -170,7 +179,7 @@ find_descriptor_for_index_src(nir_src src, return surface_index < MAX_BINDING_TABLE_SIZE; } -static bool +static nir_intrinsic_instr * nir_deref_find_descriptor(nir_deref_instr *deref, struct apply_pipeline_layout_state *state) { @@ -270,7 +279,8 @@ try_lower_direct_buffer_intrinsic(nir_builder *b, if (nir_intrinsic_access(intrin) & ACCESS_NON_UNIFORM) return false; - if (!nir_deref_find_descriptor(deref, state)) + nir_intrinsic_instr *desc = nir_deref_find_descriptor(deref, state); + if (desc == NULL || !descriptor_has_bti(desc, state)) return false; nir_ssa_def *addr = build_index_offset_for_deref(b, deref, state); @@ -314,7 +324,9 @@ lower_direct_buffer_instr(nir_builder *b, nir_instr *instr, void *_state) /* The get_ssbo_size intrinsic always just takes a * index/reindex intrinsic. */ - if (!find_descriptor_for_index_src(intrin->src[0], state)) + nir_intrinsic_instr *desc = + find_descriptor_for_index_src(intrin->src[0], state); + if (desc == NULL || !descriptor_has_bti(desc, state)) return false; nir_ssa_def *index =