nir/glsl: gather bitmask of images used by program
authorTapani Pälli <tapani.palli@intel.com>
Wed, 19 Feb 2020 06:33:04 +0000 (08:33 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 16 Mar 2020 10:34:21 +0000 (10:34 +0000)
In a similar fashion as commit f5c7df4dc95 does for textures.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4080>

src/compiler/glsl/gl_nir_lower_samplers_as_deref.c
src/compiler/shader_info.h
src/mesa/state_tracker/st_glsl_to_nir.cpp

index dde858f9cfc15c86e4cede3087ca21d09c6c577d..a0a5f018ad72e1be202d757bafddf5558186e80d 100644 (file)
@@ -118,6 +118,21 @@ remove_struct_derefs_prep(nir_deref_instr **p, char **name,
    }
 }
 
+static void
+record_images_used(struct shader_info *info,
+                   nir_deref_instr *deref)
+{
+   nir_variable *var = nir_deref_instr_get_variable(deref);
+
+   /* 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;
+
+   info->images_used |= mask;
+}
+
+
 static nir_deref_instr *
 lower_deref(nir_builder *b, struct lower_samplers_as_deref_state *state,
             nir_deref_instr *deref)
@@ -286,6 +301,9 @@ lower_intrinsic(nir_intrinsic_instr *instr,
       b->cursor = nir_before_instr(&instr->instr);
       nir_deref_instr *deref =
          lower_deref(b, state, nir_src_as_deref(instr->src[0]));
+
+      record_images_used(&state->shader->info, deref);
+
       /* don't lower bindless: */
       if (!deref)
          return false;
index 4510ce33fb6712b0f91f2cadf7677359db304336..19a963d62f3a5fc87396ad62f68485fbee9d2a4a 100644 (file)
@@ -140,6 +140,9 @@ typedef struct shader_info {
    /** Bitfield of which textures are used by texelFetch() */
    uint32_t textures_used_by_txf;
 
+   /** Bitfield of which images are used */
+   uint32_t images_used;
+
    /* SPV_KHR_float_controls: execution mode for floating point ops */
    uint16_t float_controls_execution_mode;
 
index d23719d49e8a738b9e6f88ea996463d905c01015..405600828734bfe36b0cf5d9d1f082d1d0507200 100644 (file)
@@ -889,6 +889,7 @@ st_nir_lower_samplers(struct pipe_screen *screen, nir_shader *nir,
    if (prog) {
       prog->info.textures_used = nir->info.textures_used;
       prog->info.textures_used_by_txf = nir->info.textures_used_by_txf;
+      prog->info.images_used = nir->info.images_used;
    }
 }