[Mesa-dev] [PATCH 2/2] mesa: check if resource backed by buffer in property queries

Eduardo Lima Mitev elima at igalia.com
Fri Oct 30 08:35:23 PDT 2015


Patch is,

Reviewed-by: Eduardo Lima Mitev <elima at igalia.com>

On 10/30/2015 01:30 PM, Tapani Pälli wrote:
> Patch fixes broken behaviour of queries for following properties, from
> ARB_program_interface_query specification:
> 
> GL_OFFSET:
> 
>    "For active variables not backed by a buffer object, an offset of
>    -1 is written to <params>."
> 
> GL_ARRAY_STRIDE:
> 
>    "For active variables not declared as an array of basic types, zero
>    is written to <params>.  For active variables not backed by a buffer
>    object, -1 is written to <params>, regardless of the variable type."
> 
> GL_MATRIX_STRIDE:
> 
>    "For active variables not declared as a matrix or array of matrices,
>    zero is written to <params>.  For active variables not backed by a
>    buffer object, -1 is written to <params>, regardless of the variable
>    type."
> 
> These queries may come from GetActiveUniformsiv or GetProgramResourceiv.
> Patch implements little helper to do 'backed by buffer' check and returns
> appropriate values.
> 
> Fixes following CTS test:
>    ES31-CTS.shader_atomic_counters.basic-program-query
> 
> No Piglit regressions.
> 
> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> ---
>  src/mesa/main/shader_query.cpp | 40 +++++++++++++++++++++++++++++++++++-----
>  1 file changed, 35 insertions(+), 5 deletions(-)
> 
> diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
> index dd51bba..b214691 100644
> --- a/src/mesa/main/shader_query.cpp
> +++ b/src/mesa/main/shader_query.cpp
> @@ -1105,6 +1105,26 @@ invalid_operation:
>     return 0;
>  }
>  
> +/**
> + * Helper that returns if given resource is backed by a buffer object,
> + * either UBO, SSBO or atomic counter buffer.
> + */
> +static bool
> +backed_by_buffer_object(struct gl_program_resource *res)
> +{
> +   switch (res->Type) {
> +   case GL_BUFFER_VARIABLE:
> +      return true;
> +   case GL_UNIFORM:
> +      if (RESOURCE_UNI(res)->block_index != -1 ||
> +          RESOURCE_UNI(res)->atomic_buffer_index != -1 ||
> +          RESOURCE_UNI(res)->is_shader_storage)
> +         return true;
> +   default:
> +      return false;
> +   }
> +}
> +
>  unsigned
>  _mesa_program_resource_prop(struct gl_shader_program *shProg,
>                              struct gl_program_resource *res, GLuint index,
> @@ -1171,20 +1191,30 @@ _mesa_program_resource_prop(struct gl_shader_program *shProg,
>        }
>     case GL_OFFSET:
>        VALIDATE_TYPE_2(GL_UNIFORM, GL_BUFFER_VARIABLE);
> -      *val = RESOURCE_UNI(res)->offset;
> +      *val = backed_by_buffer_object(res) ? RESOURCE_UNI(res)->offset : -1;
>        return 1;
>     case GL_BLOCK_INDEX:
>        VALIDATE_TYPE_2(GL_UNIFORM, GL_BUFFER_VARIABLE);
>        *val = RESOURCE_UNI(res)->block_index;
>        return 1;
> -   case GL_ARRAY_STRIDE:
> +   case GL_ARRAY_STRIDE: {
>        VALIDATE_TYPE_2(GL_UNIFORM, GL_BUFFER_VARIABLE);
> -      *val = RESOURCE_UNI(res)->array_stride;
> +      bool backed = backed_by_buffer_object(res);
> +      if (backed && RESOURCE_UNI(res)->array_elements == 0)
> +         *val = 0;
> +      else
> +         *val = backed ? RESOURCE_UNI(res)->array_stride : -1;
>        return 1;
> -   case GL_MATRIX_STRIDE:
> +   }
> +   case GL_MATRIX_STRIDE: {
>        VALIDATE_TYPE_2(GL_UNIFORM, GL_BUFFER_VARIABLE);
> -      *val = RESOURCE_UNI(res)->matrix_stride;
> +         bool backed = backed_by_buffer_object(res);
> +         if (backed && !RESOURCE_UNI(res)->type->is_matrix())
> +            *val = 0;
> +         else
> +            *val = backed ? RESOURCE_UNI(res)->matrix_stride : -1;
>        return 1;
> +   }
>     case GL_IS_ROW_MAJOR:
>        VALIDATE_TYPE_2(GL_UNIFORM, GL_BUFFER_VARIABLE);
>        *val = RESOURCE_UNI(res)->row_major;
> 



More information about the mesa-dev mailing list