On Fri, 2016-01-08 at 08:20 +0200, Tapani Pälli wrote: > Linker missed a check for situation where we exceed max amount of > uniform locations with explicit + implicit locations. Patch adds this > check to already existing iteration over uniforms in linker. > > Fixes following CTS test: > ES31-CTS.explicit_uniform_location.uniform-loc-negative-link-max > -num-of-locations > > Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> > --- > src/glsl/linker.cpp | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp > index 7a18523..ef23b36 100644 > --- a/src/glsl/linker.cpp > +++ b/src/glsl/linker.cpp > @@ -3130,6 +3130,7 @@ check_explicit_uniform_locations(struct > gl_context *ctx, > return; > } > > + unsigned entries_total = 0; > for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { > struct gl_shader *sh = prog->_LinkedShaders[i]; > > @@ -3138,8 +3139,12 @@ check_explicit_uniform_locations(struct > gl_context *ctx, > > foreach_in_list(ir_instruction, node, sh->ir) { > ir_variable *var = node->as_variable(); > - if (var && (var->data.mode == ir_var_uniform && > - var->data.explicit_location)) { > + if (!var || var->data.mode != ir_var_uniform) > + continue; > + > + entries_total += var->type->is_array() ? var->type->length > : 1; > + > + if (var->data.explicit_location) { > bool ret; > if (var->type->is_subroutine()) > ret = reserve_subroutine_explicit_locations(prog, sh, > var); > @@ -3153,6 +3158,14 @@ check_explicit_uniform_locations(struct > gl_context *ctx, > } > } > > + /* Verify that total amount of entries for explicit and implicit > locations > + * is less than MAX_UNIFORM_LOCATIONS. > + */ > + if (entries_total >= ctx > ->Const.MaxUserAssignableUniformLocations) { > + linker_error(prog, "count of uniform locations >= > MAX_UNIFORM_LOCATIONS" > + "(%u >= %u)", entries_total, > + ctx->Const.MaxUserAssignableUniformLocations); > + }
I think this check would be better in link_assign_uniform_locations() because check_explicit_uniform_locations() is called before arrays are resized via update_array_sizes() Also in link_assign_uniform_locations() there is already a count of uniform locations. See: const unsigned num_uniforms = uniform_size.num_active_uniforms; > delete uniform_map; > } > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev