Module: Mesa Branch: main Commit: 515ed4f4f9404e5d1d9c775fb7760b06abbc852e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=515ed4f4f9404e5d1d9c775fb7760b06abbc852e
Author: Jason Ekstrand <[email protected]> Date: Tue May 10 13:29:00 2022 -0500 lavapipe: Set images_used in lvp_lower_pipeline_layout This mirrors what we do for textures. Also, the current code is busted because it sets it based on var->data.binding which lvp_lower_pipeline_layout will change so it can get out-of-sync. Reviewed-by: Dave Airlie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16435> --- .../frontends/lavapipe/lvp_lower_vulkan_resource.c | 72 ++++++++++++++++++++++ src/gallium/frontends/lavapipe/lvp_pipeline.c | 1 - 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c b/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c index a7fb9ccb782..afc200c57a3 100644 --- a/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c +++ b/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c @@ -36,6 +36,22 @@ lower_vulkan_resource_index(const nir_instr *instr, const void *data_cb) case nir_intrinsic_vulkan_resource_reindex: case nir_intrinsic_load_vulkan_descriptor: case nir_intrinsic_get_ssbo_size: + case nir_intrinsic_image_deref_sparse_load: + case nir_intrinsic_image_deref_load: + case nir_intrinsic_image_deref_store: + case nir_intrinsic_image_deref_atomic_add: + case nir_intrinsic_image_deref_atomic_imin: + case nir_intrinsic_image_deref_atomic_umin: + case nir_intrinsic_image_deref_atomic_imax: + case nir_intrinsic_image_deref_atomic_umax: + case nir_intrinsic_image_deref_atomic_and: + case nir_intrinsic_image_deref_atomic_or: + case nir_intrinsic_image_deref_atomic_xor: + case nir_intrinsic_image_deref_atomic_exchange: + case nir_intrinsic_image_deref_atomic_comp_swap: + case nir_intrinsic_image_deref_atomic_fadd: + case nir_intrinsic_image_deref_size: + case nir_intrinsic_image_deref_samples: return true; default: return false; @@ -224,6 +240,43 @@ static void lower_vri_instr_tex(struct nir_builder *b, } } +static void lower_vri_intrin_image(struct nir_builder *b, + nir_intrinsic_instr *intrin, void *data_cb) +{ + struct lvp_pipeline_layout *layout = data_cb; + gl_shader_stage stage = b->shader->info.stage; + + nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]); + nir_variable *var = nir_deref_instr_get_variable(deref); + unsigned desc_set_idx = var->data.descriptor_set; + unsigned binding_idx = var->data.binding; + struct lvp_descriptor_set_binding_layout *binding = + &layout->set[desc_set_idx].layout->binding[binding_idx]; + + int value = 0; + for (unsigned s = 0; s < desc_set_idx; s++) { + if (!layout->set[s].layout) + continue; + value += layout->set[s].layout->stage[stage].image_count; + } + value += binding->stage[stage].image_index; + + if (deref->deref_type == nir_deref_type_array) { + assert(glsl_type_is_array(var->type)); + assert(value >= 0); + if (nir_src_is_const(deref->arr.index)) { + value += nir_src_as_uint(deref->arr.index); + BITSET_SET(b->shader->info.images_used, value); + } else { + unsigned size = glsl_get_aoa_size(var->type); + BITSET_SET_RANGE(b->shader->info.images_used, + value, value + size - 1); + } + } else { + BITSET_SET(b->shader->info.images_used, value); + } +} + static nir_ssa_def *lower_vri_instr(struct nir_builder *b, nir_instr *instr, void *data_cb) { @@ -250,6 +303,25 @@ static nir_ssa_def *lower_vri_instr(struct nir_builder *b, return NULL; } + case nir_intrinsic_image_deref_sparse_load: + case nir_intrinsic_image_deref_load: + case nir_intrinsic_image_deref_store: + case nir_intrinsic_image_deref_atomic_add: + case nir_intrinsic_image_deref_atomic_imin: + case nir_intrinsic_image_deref_atomic_umin: + case nir_intrinsic_image_deref_atomic_imax: + case nir_intrinsic_image_deref_atomic_umax: + case nir_intrinsic_image_deref_atomic_and: + case nir_intrinsic_image_deref_atomic_or: + case nir_intrinsic_image_deref_atomic_xor: + case nir_intrinsic_image_deref_atomic_exchange: + case nir_intrinsic_image_deref_atomic_comp_swap: + case nir_intrinsic_image_deref_atomic_fadd: + case nir_intrinsic_image_deref_size: + case nir_intrinsic_image_deref_samples: + lower_vri_intrin_image(b, intrin, data_cb); + return NULL; + default: return NULL; } diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index 84267988e44..3283540dca9 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -589,7 +589,6 @@ set_image_access(struct lvp_pipeline *pipeline, nir_shader *nir, const unsigned size = glsl_type_is_array(var->type) ? glsl_get_aoa_size(var->type) : 1; unsigned mask = ((1ull << MAX2(size, 1)) - 1) << var->data.binding; - nir->info.images_used[0] |= mask; if (reads) pipeline->access[nir->info.stage].images_read |= mask; if (writes)
