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