summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2020-01-13 16:09:10 +1100
committerMarge Bot <[email protected]>2020-01-23 01:02:25 +0000
commitd3a4d1775e5e8b193c2c3dc1ab550e6855e158f1 (patch)
tree4a2546049f8e447fa9ec8d1022d58da450ab855b
parente5b3cf433e8b0e31e257a8e1216b6f8c08f7e780 (diff)
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 <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3468>
-rw-r--r--src/compiler/glsl/gl_nir_link_uniforms.c17
1 files changed, 13 insertions, 4 deletions
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)