From 2fd930f95bdcc356cb50272f82c6509055254564 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 25 Jul 2022 09:42:44 -0400 Subject: [PATCH] lavapipe: use correct offset calculation for flagging ssbo/image write access var->data.binding has no relation to the actual index of the resource, which must be separately calculated based on the layout Reviewed-by: Dave Airlie Part-of: --- src/gallium/frontends/lavapipe/lvp_pipeline.c | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index 6b64878ec12..392d94f7f8e 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -684,8 +684,17 @@ set_image_access(struct lvp_pipeline *pipeline, nir_shader *nir, bool reads, bool writes) { nir_variable *var = nir_intrinsic_get_var(instr, 0); + /* calculate the variable's offset in the layout */ + unsigned value = 0; + const struct lvp_descriptor_set_binding_layout *binding = + get_binding_layout(pipeline->layout, var->data.descriptor_set, var->data.binding); + for (unsigned s = 0; s < var->data.descriptor_set; s++) { + if (pipeline->layout->vk.set_layouts[s]) + value += get_set_layout(pipeline->layout, s)->stage[nir->info.stage].image_count; + } + value += binding->stage[nir->info.stage].image_index; 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; + unsigned mask = BITFIELD_MASK(MAX2(size, 1)) << value; if (reads) pipeline->access[nir->info.stage].images_read |= mask; @@ -709,10 +718,18 @@ set_buffer_access(struct lvp_pipeline *pipeline, nir_shader *nir, } if (var->data.mode != nir_var_mem_ssbo) return; + /* calculate the variable's offset in the layout */ + unsigned value = 0; + const struct lvp_descriptor_set_binding_layout *binding = + get_binding_layout(pipeline->layout, var->data.descriptor_set, var->data.binding); + for (unsigned s = 0; s < var->data.descriptor_set; s++) { + if (pipeline->layout->vk.set_layouts[s]) + value += get_set_layout(pipeline->layout, s)->stage[nir->info.stage].shader_buffer_count; + } + value += binding->stage[nir->info.stage].shader_buffer_index; /* Structs have been lowered already, so get_aoa_size is sufficient. */ 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; - + unsigned mask = BITFIELD_MASK(MAX2(size, 1)) << value; pipeline->access[nir->info.stage].buffers_written |= mask; }