From: Timothy Arceri Date: Mon, 13 Jan 2020 05:09:10 +0000 (+1100) Subject: glsl: count uniform components and storage better in nir linking X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d3a4d1775e5e8b193c2c3dc1ab550e6855e158f1;p=mesa.git glsl: count uniform components and storage better in nir linking 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 Part-of: --- diff --git a/src/compiler/glsl/gl_nir_link_uniforms.c b/src/compiler/glsl/gl_nir_link_uniforms.c index 97bd57fc2b8..1a6a4fc07a6 100644 --- a/src/compiler/glsl/gl_nir_link_uniforms.c +++ b/src/compiler/glsl/gl_nir_link_uniforms.c @@ -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)