glsl: count uniform components and storage better in nir linking
authorTimothy Arceri <tarceri@itsqueeze.com>
Mon, 13 Jan 2020 05:09:10 +0000 (16:09 +1100)
committerMarge Bot <eric+marge@anholt.net>
Thu, 23 Jan 2020 01:02:25 +0000 (01:02 +0000)
This helps avoid incorrect validation error when linking glsl
shaders and avoids assigning uniform storage slots that will
never be used.

Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3468>

src/compiler/glsl/gl_nir_link_uniforms.c

index 97bd57fc2b8492c3a02d25be85358ac47736ceaa..1a6a4fc07a6b91b28c53c264a5db48b70f2c6c0a 100644 (file)
@@ -601,6 +601,7 @@ nir_link_uniform(struct gl_context *ctx,
       uniform->num_compatible_subroutines = 0;
 
       unsigned entries = MAX2(1, uniform->array_elements);
+      unsigned values = glsl_get_component_slots(type);
 
       if (glsl_type_is_sampler(type_no_array)) {
          int sampler_index =
@@ -621,6 +622,8 @@ nir_link_uniform(struct gl_context *ctx,
             state->shader_samplers_used |= 1U << i;
             state->shader_shadow_samplers |= shadow << i;
          }
+
+         state->num_values += values;
       } else if (glsl_type_is_image(type_no_array)) {
          /* @FIXME: image_index should match that of the same image
           * uniform in other shaders. This means we need to match image
@@ -649,11 +652,17 @@ nir_link_uniform(struct gl_context *ctx,
               i++) {
             stage_program->sh.ImageAccess[i] = access;
          }
-      }
 
-      unsigned values = glsl_get_component_slots(type);
-      state->num_shader_uniform_components += values;
-      state->num_values += values;
+         if (!uniform->is_shader_storage) {
+            state->num_shader_uniform_components += values;
+            state->num_values += values;
+         }
+      } else {
+         if (!state->var_is_in_block) {
+            state->num_shader_uniform_components += values;
+            state->num_values += values;
+         }
+      }
 
       if (uniform->remap_location != UNMAPPED_UNIFORM_LOC &&
           state->max_uniform_location < uniform->remap_location + entries)