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

Timothy Arceri t_arceri at yahoo.com.au
Wed Oct 7 15:32:25 PDT 2015


On Wed, 2015-10-07 at 09:21 +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
> 
> v3:
> - Arrays and unsized arrays will have an array_stride > 0. Use it
>   instead of is_unsized_array flag (Timothy).
> 
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>

Reviewed-by: Timothy Arceri <t_arceri at yahoo.com.au>

> ---
>  src/mesa/main/shader_query.cpp | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/src/mesa/main/shader_query.cpp
> b/src/mesa/main/shader_query.cpp
> index 3748b10..3bf4311 100644
> --- a/src/mesa/main/shader_query.cpp
> +++ b/src/mesa/main/shader_query.cpp
> @@ -1306,8 +1306,15 @@ _mesa_program_resource_prop(struct
> gl_shader_program *shProg,
>        switch (res->Type) {
>        case GL_UNIFORM:
>        case GL_BUFFER_VARIABLE:
> +         /* Test if a buffer variable is an array or an unsized
> array.
> +          * Unsized arrays return zero as array size.
> +          */
> +         if (RESOURCE_UNI(res)->is_shader_storage &&
> +             RESOURCE_UNI(res)->array_stride > 0)
> +            *val = RESOURCE_UNI(res)->array_elements;
> +         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