[Mesa-dev] [PATCH 06/16] mesa: fix active sampler conflict validation

Samuel Iglesias Gonsálvez siglesias at igalia.com
Tue Jul 21 01:03:45 PDT 2015


Reviewed-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>

On 18/07/15 03:25, Timothy Arceri wrote:
> The type stored in gl_uniform_storage is the type of a single array
> element not the array type so size was always 1.
> 
> V2: Dont validate sampler units pointing to 0
> ---
>  src/mesa/main/uniform_query.cpp | 20 +++++++++++++-------
>  1 file changed, 13 insertions(+), 7 deletions(-)
> 
> diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
> index 680ba16..036530e 100644
> --- a/src/mesa/main/uniform_query.cpp
> +++ b/src/mesa/main/uniform_query.cpp
> @@ -1026,18 +1026,23 @@ _mesa_sampler_uniforms_pipeline_are_valid(struct gl_pipeline_object *pipeline)
>        for (unsigned i = 0; i < shProg[idx]->NumUniformStorage; i++) {
>           const struct gl_uniform_storage *const storage =
>              &shProg[idx]->UniformStorage[i];
> -         const glsl_type *const t = (storage->type->is_array())
> -            ? storage->type->fields.array : storage->type;
>  
> -         if (!t->is_sampler())
> +         if (!storage->type->is_sampler())
>              continue;
>  
>           active_samplers++;
>  
> -         const unsigned count = MAX2(1, storage->type->array_size());
> +         const unsigned count = MAX2(1, storage->array_elements);
>           for (unsigned j = 0; j < count; j++) {
>              const unsigned unit = storage->storage[j].i;
>  
> +            /* FIXME: Samplers are initialized to 0 and Mesa doesn't do a
> +             * great job of eliminating unused uniforms currently so for now
> +             * don't throw an error if two sampler types both point to 0.
> +             */
> +            if (unit == 0)
> +               continue;
> +
>              /* The types of the samplers associated with a particular texture
>               * unit must be an exact match.  Page 74 (page 89 of the PDF) of
>               * the OpenGL 3.3 core spec says:
> @@ -1047,13 +1052,14 @@ _mesa_sampler_uniforms_pipeline_are_valid(struct gl_pipeline_object *pipeline)
>               *     program object."
>               */
>              if (unit_types[unit] == NULL) {
> -               unit_types[unit] = t;
> -            } else if (unit_types[unit] != t) {
> +               unit_types[unit] = storage->type;
> +            } else if (unit_types[unit] != storage->type) {
>                 pipeline->InfoLog =
>                    ralloc_asprintf(pipeline,
>                                    "Texture unit %d is accessed both as %s "
>                                    "and %s",
> -                                  unit, unit_types[unit]->name, t->name);
> +                                  unit, unit_types[unit]->name,
> +                                  storage->type->name);
>                 return false;
>              }
>           }
> 


More information about the mesa-dev mailing list