[Mesa-dev] [PATCH v2] main: buffer array variables can have array size of 0 if they are unsized

Samuel Iglesias Gonsálvez siglesias at igalia.com
Tue Oct 6 23:39:17 PDT 2015



On 07/10/15 01:19, Timothy Arceri wrote:
> On Tue, 2015-10-06 at 15:07 +0200, Samuel Iglesias Gonsálvez wrote:
>> On 06/10/15 12:59, Timothy Arceri wrote:
>>> On Tue, 2015-10-06 at 10:08 +0200, Samuel Iglesias Gonsalvez wrote:
>>>> From ARB_program_query_interface:
>>>>
>>>>   For the property ARRAY_SIZE, a single integer identifying the
>>>> number of
>>>>   active array elements of an active variable is written to
>>>> <params>.
>>>> The
>>>>   array size returned is in units of the type associated with the
>>>> property
>>>>   TYPE. For active variables not corresponding to an array of
>>>> basic
>>>> types,
>>>>   the value one is written to <params>. If the variable is a
>>>> shader
>>>>   storage block member in an array with no declared size, the
>>>> value
>>>> zero
>>>>   is written to <params>.
>>>>
>>>> v2:
>>>>
>>>> - Unsized arrays of arrays have an array size different than zero
>>>>
>>>> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
>>>> ---
>>>>  src/mesa/main/shader_query.cpp | 6 +++++-
>>>>  1 file changed, 5 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/src/mesa/main/shader_query.cpp
>>>> b/src/mesa/main/shader_query.cpp
>>>> index dfc39f6..17076b8 100644
>>>> --- a/src/mesa/main/shader_query.cpp
>>>> +++ b/src/mesa/main/shader_query.cpp
>>>> @@ -1304,8 +1304,12 @@ _mesa_program_resource_prop(struct
>>>> gl_shader_program *shProg,
>>>>        switch (res->Type) {
>>>>        case GL_UNIFORM:
>>>>        case GL_BUFFER_VARIABLE:
>>>> +         if (RESOURCE_UNI(res)->is_shader_storage &&
>>>> +             RESOURCE_UNI(res)->is_unsized_array)
>>>> +            *val = RESOURCE_UNI(res)->array_elements;
>>>
>>> You don't need RESOURCE_UNI(res)->is_unsized_array here anymore
>>> right? 
>>>
>>
>> I still needed it here: this rule only applies to unsized arrays. The
>> rest of variables need the MAX2(...) because active variables not
>> corresponding to an array of basic types should write the value one
>> in
>> '*val'.
> 
> Right I forgot about types not being an array. My concern is adding yet
> another field to the uniform storage struct. IMO it already contains
> too many fields, since this is something that hangs around in memory
> for every uniform we should probably make at least some effort to keep
> it as small as possible.
> 
> I haven't tested it but I think you could use (RESOURCE_UNI(res)
> ->array_stride > 0) as a test of whether the buffer is an array. So
> here you could have:
> 
>   if (RESOURCE_UNI(res)->is_shader_storage &&                   
>       RESOURCE_UNI(res)->array_stride > 0)
> 
> And in the patch you linked to [0] you would have:
> 
>    case GL_BUFFER_VARIABLE:
>       if (RESOURCE_UNI(res)->array_stride > 0 &&
>           RESOURCE_UNI(res)->array_elements == 0)
>          return 1;
>       else
>          return RESOURCE_UNI(res)->array_elements;
> 
> You also might want some comments to go with it but what do you think
> about this approach?
> 

Yes, I like it. Using array_stride > 0 to detect if the buffer variable
is an array seems to be a good idea. I will prepare a new version of the
patches with that changed.

Thanks,

Sam

>>
>> If I remove it from here (just for testing), hundreds of dEQP GLES31
>> tests start to fail
>> (dEQP-GLES31.functional.ssbo.layout.single_basic_type.*.*).
>>
>> RESOURCE_UNI(res)->is_unsized_array is also needed in "main: consider
>> that unsized arrays have at least one active element" [0].
>>
>> Sam
>>
>> [0] http://lists.freedesktop.org/archives/mesa-dev/2015-October/09603
>> 8.html
>>
>>> RESOURCE_UNI(res)->is_shader_storage is all you need so you can
>>> also
>>> drop the patch that adds is_unsized_array to the uniform storage
>>> struct
>>>
>>> With that change: Reviewed-by: Timothy Arceri <
>>> t_arceri at yahoo.com.au>
>>>
>>>
>>>> +         else
>>>>              *val = MAX2(RESOURCE_UNI(res)->array_elements, 1);
>>>> -            return 1;
>>>> +         return 1;
>>>>        case GL_PROGRAM_INPUT:
>>>>        case GL_PROGRAM_OUTPUT:
>>>>           *val = MAX2(_mesa_program_resource_array_size(res), 1);
>>>
> 


More information about the mesa-dev mailing list