[Mesa-dev] [PATCH 11/12] mesa/sso: Add _mesa_sampler_uniforms_pipeline_are_valid

Ian Romanick idr at freedesktop.org
Fri Mar 14 18:04:56 PDT 2014


On 03/05/2014 02:27 AM, Ian Romanick wrote:
> From: Gregory Hainaut <gregory.hainaut at gmail.com>
> 
> This is much like _mesa_sampler_uniforms_are_valid, but it operates
> across an entire pipeline object.
> 
> This function differs from _mesa_sampler_uniforms_are_valid in that it
> directly creates the gl_pipeline_object::InfoLog instead of writing to
> some temporary buffer.
> 
> This was originally included in another patch, but it was split out by
> Ian Romanick.
> 
> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/mesa/main/uniform_query.cpp | 77 +++++++++++++++++++++++++++++++++++++++++
>  src/mesa/main/uniforms.h        |  2 ++
>  2 files changed, 79 insertions(+)
> 
> diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
> index 7b375c0..35acabb 100644
> --- a/src/mesa/main/uniform_query.cpp
> +++ b/src/mesa/main/uniform_query.cpp
> @@ -1088,3 +1088,80 @@ _mesa_sampler_uniforms_are_valid(const struct gl_shader_program *shProg,
>  
>     return true;
>  }
> +
> +extern "C" bool
> +_mesa_sampler_uniforms_pipeline_are_valid(struct gl_pipeline_object *pipeline)
> +{
> +   /* Section 2.11.11 (Shader Execution), subheading "Validation," of the
> +    * OpenGL 4.1 spec says:
> +    *
> +    *     "[INVALID_OPERATION] is generated by any command that transfers
> +    *     vertices to the GL if:
> +    *
> +    *         ...
> +    *
> +    *         - Any two active samplers in the current program object are of
> +    *           different types, but refer to the same texture image unit.
> +    *
> +    *         - The number of active samplers in the program exceeds the
> +    *           maximum number of texture image units allowed."
> +    */
> +   unsigned active_samplers = 0;
> +   const struct gl_shader_program **shProg =
> +      (const struct gl_shader_program **) pipeline->CurrentProgram;
> +
> +   const glsl_type *unit_types[MAX_COMBINED_TEXTURE_IMAGE_UNITS];
> +   memset(unit_types, 0, sizeof(unit_types));
> +
> +   for (unsigned idx = 0; idx < ARRAY_SIZE(shProg); idx++) {

This is the bug that caused the additional test case failure mentioned
in my last reply to patch 12.  Can you see the problem? :)

With this fixed, _mesa_ValidProgramPipeline is no worse than
_mesa_ValidateProgram.  Is that sufficient for now?  I plan to fix both
in a follow-up...

> +      if (!shProg[idx])
> +         continue;
> +
> +      for (unsigned i = 0; i < shProg[idx]->NumUserUniformStorage; 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())
> +            continue;
> +
> +         active_samplers++;
> +
> +         const unsigned count = MAX2(1, storage->type->array_size());
> +         for (unsigned j = 0; j < count; j++) {
> +            const unsigned unit = storage->storage[j].i;
> +
> +            /* 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:
> +             *
> +             *     "It is not allowed to have variables of different sampler
> +             *     types pointing to the same texture image unit within a
> +             *     program object."
> +             */
> +            if (unit_types[unit] == NULL) {
> +               unit_types[unit] = t;
> +            } else if (unit_types[unit] != t) {
> +               pipeline->InfoLog =
> +                  ralloc_asprintf(pipeline,
> +                                  "Texture unit %d is accessed both as %s "
> +                                  "and %s",
> +                                  unit, unit_types[unit]->name, t->name);
> +               return false;
> +            }
> +         }
> +      }
> +   }
> +
> +   if (active_samplers > MAX_COMBINED_TEXTURE_IMAGE_UNITS) {
> +      pipeline->InfoLog =
> +         ralloc_asprintf(pipeline,
> +                         "the number of active samplers %d exceed the "
> +                         "maximum %d",
> +                         active_samplers, MAX_COMBINED_TEXTURE_IMAGE_UNITS);
> +      return false;
> +   }
> +
> +   return true;
> +}
> diff --git a/src/mesa/main/uniforms.h b/src/mesa/main/uniforms.h
> index bd50fd9..af955c17 100644
> --- a/src/mesa/main/uniforms.h
> +++ b/src/mesa/main/uniforms.h
> @@ -300,6 +300,8 @@ _mesa_update_shader_textures_used(struct gl_shader_program *shProg,
>  extern bool
>  _mesa_sampler_uniforms_are_valid(const struct gl_shader_program *shProg,
>  				 char *errMsg, size_t errMsgLength);
> +extern bool
> +_mesa_sampler_uniforms_pipeline_are_valid(struct gl_pipeline_object *);
>  
>  extern const struct gl_program_parameter *
>  get_uniform_parameter(struct gl_shader_program *shProg, GLint index);
> 



More information about the mesa-dev mailing list