Mesa (main): lavapipe: Set images_used in lvp_lower_pipeline_layout
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu May 12 02:03:44 UTC 2022
Module: Mesa
Branch: main
Commit: 515ed4f4f9404e5d1d9c775fb7760b06abbc852e
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=515ed4f4f9404e5d1d9c775fb7760b06abbc852e
Author: Jason Ekstrand <jason.ekstrand at collabora.com>
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 <airlied at redhat.com>
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)
More information about the mesa-commit
mailing list