glsl: gather uniform dereference info before main linking loop
authorTimothy Arceri <tarceri@itsqueeze.com>
Tue, 5 May 2020 04:22:04 +0000 (14:22 +1000)
committerMarge Bot <eric+marge@anholt.net>
Wed, 3 Jun 2020 10:34:22 +0000 (10:34 +0000)
We want to gather information for all stages here before the main
linking loop. In the following patch we will use to information
to reduce the size of uniform arrays where possible.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4910>

src/compiler/glsl/gl_nir_link_uniforms.c

index ce6c852fc1d4e44023c58833235d5dfa289511e7..9806da393abd7bb8f6ee16e1d037ded06c694fde 100644 (file)
@@ -642,7 +642,7 @@ struct nir_link_uniforms_state {
    int top_level_array_stride;
 
    struct type_tree_entry *current_type;
-   struct hash_table *referenced_uniforms;
+   struct hash_table *referenced_uniforms[MESA_SHADER_STAGES];
    struct hash_table *uniform_hash;
 };
 
@@ -947,7 +947,7 @@ find_and_update_named_uniform_storage(struct gl_context *ctx,
 
          const struct glsl_type *type_no_array = glsl_without_array(type);
          struct hash_entry *entry =
-            _mesa_hash_table_search(state->referenced_uniforms,
+            _mesa_hash_table_search(state->referenced_uniforms[stage],
                                     state->current_var);
          if (entry != NULL ||
              glsl_get_base_type(type_no_array) == GLSL_TYPE_SUBROUTINE)
@@ -1330,7 +1330,7 @@ nir_link_uniform(struct gl_context *ctx,
       uniform->top_level_array_stride = state->top_level_array_stride;
 
       struct hash_entry *entry =
-         _mesa_hash_table_search(state->referenced_uniforms,
+         _mesa_hash_table_search(state->referenced_uniforms[stage],
                                  state->current_var);
       if (entry != NULL ||
           glsl_get_base_type(type_no_array) == GLSL_TYPE_SUBROUTINE)
@@ -1505,6 +1505,23 @@ gl_nir_link_uniforms(struct gl_context *ctx,
    prog->data->UniformStorage = NULL;
    prog->data->NumUniformStorage = 0;
 
+   /* Iterate through all linked shaders */
+   struct nir_link_uniforms_state state = {0,};
+
+   /* Gather information on uniform use */
+   for (unsigned stage = 0; stage < MESA_SHADER_STAGES; stage++) {
+      struct gl_linked_shader *sh = prog->_LinkedShaders[stage];
+      if (!sh)
+         continue;
+
+      state.referenced_uniforms[stage] =
+         _mesa_hash_table_create(NULL, _mesa_hash_pointer,
+                                 _mesa_key_pointer_equal);
+
+      nir_shader *nir = sh->Program->nir;
+      add_var_use_shader(nir, state.referenced_uniforms[stage]);
+   }
+
    /* Count total number of uniforms and allocate storage */
    unsigned storage_size = 0;
    if (!prog->data->spirv) {
@@ -1543,7 +1560,6 @@ gl_nir_link_uniforms(struct gl_context *ctx,
    }
 
    /* Iterate through all linked shaders */
-   struct nir_link_uniforms_state state = {0,};
    state.uniform_hash = _mesa_hash_table_create(NULL, _mesa_hash_string,
                                                 _mesa_key_string_equal);
 
@@ -1555,9 +1571,6 @@ gl_nir_link_uniforms(struct gl_context *ctx,
       nir_shader *nir = sh->Program->nir;
       assert(nir);
 
-      state.referenced_uniforms =
-         _mesa_hash_table_create(NULL, _mesa_hash_pointer,
-                                 _mesa_key_pointer_equal);
       state.next_bindless_image_index = 0;
       state.next_bindless_sampler_index = 0;
       state.next_image_index = 0;
@@ -1570,8 +1583,6 @@ gl_nir_link_uniforms(struct gl_context *ctx,
       state.shader_shadow_samplers = 0;
       state.params = fill_parameters ? sh->Program->Parameters : NULL;
 
-      add_var_use_shader(nir, state.referenced_uniforms);
-
       nir_foreach_variable(var, &nir->uniforms) {
          state.current_var = var;
          state.current_ifc_type = NULL;
@@ -1667,7 +1678,7 @@ gl_nir_link_uniforms(struct gl_context *ctx,
                         buffer_block_index = i;
 
                      struct hash_entry *entry =
-                        _mesa_hash_table_search(state.referenced_uniforms, var);
+                        _mesa_hash_table_search(state.referenced_uniforms[shader_type], var);
                      if (entry) {
                         struct uniform_array_info *ainfo =
                            (struct uniform_array_info *) entry->data;
@@ -1682,7 +1693,7 @@ gl_nir_link_uniforms(struct gl_context *ctx,
                      buffer_block_index = i;
 
                      struct hash_entry *entry =
-                        _mesa_hash_table_search(state.referenced_uniforms, var);
+                        _mesa_hash_table_search(state.referenced_uniforms[shader_type], var);
                      if (entry)
                         blocks[i].stageref |= 1U << shader_type;
 
@@ -1745,7 +1756,7 @@ gl_nir_link_uniforms(struct gl_context *ctx,
                      location = j;
 
                      struct hash_entry *entry =
-                        _mesa_hash_table_search(state.referenced_uniforms, var);
+                        _mesa_hash_table_search(state.referenced_uniforms[shader_type], var);
                      if (entry)
                         blocks[i].stageref |= 1U << shader_type;
 
@@ -1802,7 +1813,7 @@ gl_nir_link_uniforms(struct gl_context *ctx,
             return false;
       }
 
-      _mesa_hash_table_destroy(state.referenced_uniforms, NULL);
+      _mesa_hash_table_destroy(state.referenced_uniforms[shader_type], NULL);
 
       if (state.num_shader_samplers >
           ctx->Const.Program[shader_type].MaxTextureImageUnits) {