Mesa (main): zink: add a compiler pass to scan for shader image use
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Nov 19 13:29:24 UTC 2021
Module: Mesa
Branch: main
Commit: 22d9d0f8b52293920f00cb59b9c5a50391832a07
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=22d9d0f8b52293920f00cb59b9c5a50391832a07
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Thu Nov 18 16:27:36 2021 -0500
zink: add a compiler pass to scan for shader image use
other frontends and internal shaders won't set this
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13864>
---
src/gallium/drivers/zink/zink_compiler.c | 46 ++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index ea1fa0533c2..c49e4d6bde5 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -1701,6 +1701,50 @@ lower_1d_shadow(nir_shader *shader)
return found;
}
+static void
+scan_nir(nir_shader *shader)
+{
+ nir_foreach_function(function, shader) {
+ if (!function->impl)
+ continue;
+ nir_foreach_block_safe(block, function->impl) {
+ nir_foreach_instr_safe(instr, block) {
+ if (instr->type != nir_instr_type_intrinsic)
+ continue;
+ nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
+ if (intr->intrinsic == nir_intrinsic_image_deref_load ||
+ intr->intrinsic == nir_intrinsic_image_deref_store ||
+ intr->intrinsic == nir_intrinsic_image_deref_atomic_add ||
+ intr->intrinsic == nir_intrinsic_image_deref_atomic_imin ||
+ intr->intrinsic == nir_intrinsic_image_deref_atomic_umin ||
+ intr->intrinsic == nir_intrinsic_image_deref_atomic_imax ||
+ intr->intrinsic == nir_intrinsic_image_deref_atomic_umax ||
+ intr->intrinsic == nir_intrinsic_image_deref_atomic_and ||
+ intr->intrinsic == nir_intrinsic_image_deref_atomic_or ||
+ intr->intrinsic == nir_intrinsic_image_deref_atomic_xor ||
+ intr->intrinsic == nir_intrinsic_image_deref_atomic_exchange ||
+ intr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap ||
+ intr->intrinsic == nir_intrinsic_image_deref_atomic_fadd ||
+ intr->intrinsic == nir_intrinsic_image_deref_size ||
+ intr->intrinsic == nir_intrinsic_image_deref_samples ||
+ intr->intrinsic == nir_intrinsic_image_deref_format ||
+ intr->intrinsic == nir_intrinsic_image_deref_order) {
+
+ nir_variable *var =
+ nir_deref_instr_get_variable(nir_src_as_deref(intr->src[0]));
+
+ /* 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;
+
+ shader->info.images_used |= mask;
+ }
+ }
+ }
+ }
+}
+
struct zink_shader *
zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
const struct pipe_stream_output_info *so_info)
@@ -1781,6 +1825,8 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
if (has_bindless_io)
NIR_PASS_V(nir, lower_bindless_io);
+ scan_nir(nir);
+
foreach_list_typed_reverse_safe(nir_variable, var, node, &nir->variables) {
if (_nir_shader_variable_has_mode(var, nir_var_uniform |
nir_var_image |
More information about the mesa-commit
mailing list