[Mesa-dev] [PATCH] glsl: track total amount of uniform locations used

Timothy Arceri t_arceri at yahoo.com.au
Fri Jan 8 01:17:54 PST 2016


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.palli at 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;
>  }
>  


More information about the mesa-dev mailing list