[Mesa-dev] [PATCH 20/23] glsl/linker: Count and check image resources.

Francisco Jerez currojerez at riseup.net
Thu Dec 12 08:32:16 PST 2013


Paul Berry <stereotype441 at gmail.com> writes:

> On 26 November 2013 00:02, Francisco Jerez <currojerez at riseup.net> wrote:
>
>> ---
>>  src/glsl/link_uniforms.cpp | 13 +++++++++++-
>>  src/glsl/linker.cpp        | 50
>> ++++++++++++++++++++++++++++++++++++++++++++++
>>  2 files changed, 62 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp
>> index 0a15739..c75a38c 100644
>> --- a/src/glsl/link_uniforms.cpp
>> +++ b/src/glsl/link_uniforms.cpp
>> @@ -240,7 +240,8 @@ class count_uniform_size : public
>> program_resource_visitor {
>>  public:
>>     count_uniform_size(struct string_to_uint_map *map)
>>        : num_active_uniforms(0), num_values(0), num_shader_samplers(0),
>> -       num_shader_uniform_components(0), is_ubo_var(false), map(map)
>> +        num_shader_images(0), num_shader_uniform_components(0),
>> +        is_ubo_var(false), map(map)
>>     {
>>        /* empty */
>>     }
>> @@ -248,6 +249,7 @@ public:
>>     void start_shader()
>>     {
>>        this->num_shader_samplers = 0;
>> +      this->num_shader_images = 0;
>>        this->num_shader_uniform_components = 0;
>>     }
>>
>> @@ -277,6 +279,11 @@ public:
>>     unsigned num_shader_samplers;
>>
>>     /**
>> +    * Number of images used
>> +    */
>> +   unsigned num_shader_images;
>> +
>> +   /**
>>      * Number of uniforms used in the current shader
>>      */
>>     unsigned num_shader_uniform_components;
>> @@ -303,6 +310,9 @@ private:
>>        if (type->contains_sampler()) {
>>          this->num_shader_samplers +=
>>             type->is_array() ? type->array_size() : 1;
>> +      } else if (type->contains_image()) {
>> +         this->num_shader_images += values;
>> +         this->num_shader_uniform_components += values;
>>
>
> How come images contribute to num_shader_uniform_components but samplers
> don't?  There should be a comment explaining this difference.
>
>
>>        } else {
>>          /* Accumulate the total number of uniform slots used by this
>> shader.
>>           * Note that samplers do not count against this limit because they
>> @@ -782,6 +792,7 @@ link_assign_uniform_locations(struct gl_shader_program
>> *prog)
>>        }
>>
>>        sh->num_samplers = uniform_size.num_shader_samplers;
>> +      sh->NumImages = uniform_size.num_shader_images;
>>        sh->num_uniform_components =
>> uniform_size.num_shader_uniform_components;
>>
>>        sh->num_combined_uniform_components = sh->num_uniform_components;
>> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
>> index fac186a..86a0cae 100644
>> --- a/src/glsl/linker.cpp
>> +++ b/src/glsl/linker.cpp
>> @@ -1980,6 +1980,55 @@ check_resources(struct gl_context *ctx, struct
>> gl_shader_program *prog)
>>     }
>>  }
>>
>> +/**
>> + * Validate shader image resources.
>> + */
>> +static void
>> +check_image_resources(struct gl_context *ctx, struct gl_shader_program
>> *prog)
>> +{
>> +   STATIC_ASSERT(MESA_SHADER_TYPES == 3);
>> +   static const char *const shader_names[MESA_SHADER_TYPES] = {
>> +      "vertex", "geometry", "fragment"
>> +   };
>>
>
> Use _mesa_glsl_shader_target_name() instead of hardcoding this array.
>

Neither of the _mesa_glsl_shader_target_name() overloads accept a
gl_shader_type as argument, the first one takes a GLenum, the second one
takes a _mesa_glsl_parser_targets enumerant -- Yes, the enum values
happen to match Mesa's gl_shader_type, but...

>
>> +   const unsigned max_images[MESA_SHADER_TYPES] = {
>> +      ctx->Const.VertexProgram.MaxImageUniforms,
>> +      ctx->Const.GeometryProgram.MaxImageUniforms,
>> +      ctx->Const.FragmentProgram.MaxImageUniforms
>> +   };
>>
>
> Rather than doing STATIC_ASSERT(MESA_SHADER_TYPES == 3), I think this would
> be slightly cleaner, since it will be more obvious what needs fixing if the
> assertion ever fires:
>
>    const unsigned max_images[] = {
>       ctx->Const.VertexProgram.MaxImageUniforms,
>       ctx->Const.GeometryProgram.MaxImageUniforms,
>       ctx->Const.FragmentProgram.MaxImageUniforms
>    };
>    STATIC_ASSERT(Elements(max_images) == MESA_SHADER_TYPES);
>
>
> With those changes, the patch is:
>
> Reviewed-by: Paul Berry <stereotype441 at gmail.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 229 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131212/c3f5287d/attachment.pgp>


More information about the mesa-dev mailing list