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

Tapani Pälli tapani.palli at intel.com
Mon Jan 11 21:59:48 PST 2016



On 01/12/2016 12:30 AM, Timothy Arceri wrote:
> On Mon, 2016-01-11 at 08:24 +0200, Tapani Pälli wrote:
>>
>> On 01/08/2016 11:32 AM, Tapani Pälli wrote:
>>>
>>>
>>> On 01/08/2016 11:17 AM, Timothy Arceri wrote:
>>>> 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;
>
> This should be:
>
> entries_total += var->type->uniform_locations();
>
> Otherwise AoA and structs will not be counted correctly.

ah I had forgotten about uniform_locations(), thanks!

>
>>>>> +
>>>>> +         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;
>>>
>>> That function can't currently fail and it does not know the max no
>>> of
>>> uniforms so it was easier to plug here. I can move it there but it
>>> requires changing the function signature a bit, I guess not that
>>> big
>>> deal though.
>>
>> I've made a version that counts used locations only at
>> link_assign_uniform_locations(). Problem with that is that it happens
>> too late. With the test case an uniform array gets optimized away
>> (since
>> it's not used in the shader, however as it is using explicit
>> location,
>> those locations must be reserved), therefore this happens too late.
>> IMO
>> we must do this calculation as the my first proposal did it.
>
> Hmm, sure they must be reserved but if they are inactive I don't think
> there is anything in the spec that disallows using the location for
> varyings that don't have an explicit location.

I don't think overlap between these matter as these are distinct 
resources, used for different things.

> Anyways its not a big deal I guess, if you fix up the issue above you
> can have.
>
> Reviewed-by: Timothy Arceri <timothy.arceri at collabora.com>

Thanks for the review!

// Tapani


More information about the mesa-dev mailing list