[Mesa-dev] [PATCH 1/2] glsl: extract function for record comparisons

Matt Turner mattst88 at gmail.com
Tue Jan 21 14:03:59 PST 2014


On Tue, Nov 26, 2013 at 3:15 PM, Grigori Goronzy <greg at chown.ath.cx> wrote:
> ---
>  src/glsl/glsl_types.cpp | 61 +++++++++++++++++++++++++++----------------------
>  src/glsl/glsl_types.h   |  7 ++++++
>  2 files changed, 41 insertions(+), 27 deletions(-)
>
> diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
> index f740130..6c9727e 100644
> --- a/src/glsl/glsl_types.cpp
> +++ b/src/glsl/glsl_types.cpp
> @@ -447,6 +447,39 @@ glsl_type::get_array_instance(const glsl_type *base, unsigned array_size)
>  }
>
>
> +bool
> +glsl_type::record_compare(const glsl_type *b) const
> +{
> +   if (this->length != b->length)
> +      return false;
> +
> +   if (this->interface_packing != b->interface_packing)
> +      return false;
> +
> +   for (unsigned i = 0; i < this->length; i++) {
> +      if (this->fields.structure[i].type != b->fields.structure[i].type)
> +        return false;
> +      if (strcmp(this->fields.structure[i].name,
> +                b->fields.structure[i].name) != 0)
> +        return false;
> +      if (this->fields.structure[i].row_major
> +         != b->fields.structure[i].row_major)
> +        return false;
> +      if (this->fields.structure[i].location
> +          != b->fields.structure[i].location)
> +         return false;
> +      if (this->fields.structure[i].interpolation
> +          != b->fields.structure[i].interpolation)
> +         return false;
> +      if (this->fields.structure[i].centroid
> +          != b->fields.structure[i].centroid)
> +         return false;
> +   }
> +
> +   return true;
> +}
> +
> +
>  int
>  glsl_type::record_key_compare(const void *a, const void *b)
>  {
> @@ -459,33 +492,7 @@ glsl_type::record_key_compare(const void *a, const void *b)
>     if (strcmp(key1->name, key2->name) != 0)
>        return 1;
>
> -   if (key1->length != key2->length)
> -      return 1;
> -
> -   if (key1->interface_packing != key2->interface_packing)
> -      return 1;
> -
> -   for (unsigned i = 0; i < key1->length; i++) {
> -      if (key1->fields.structure[i].type != key2->fields.structure[i].type)
> -        return 1;
> -      if (strcmp(key1->fields.structure[i].name,
> -                key2->fields.structure[i].name) != 0)
> -        return 1;
> -      if (key1->fields.structure[i].row_major
> -         != key2->fields.structure[i].row_major)
> -        return 1;
> -      if (key1->fields.structure[i].location
> -          != key2->fields.structure[i].location)
> -         return 1;
> -      if (key1->fields.structure[i].interpolation
> -          != key2->fields.structure[i].interpolation)
> -         return 1;
> -      if (key1->fields.structure[i].centroid
> -          != key2->fields.structure[i].centroid)
> -         return 1;
> -   }
> -
> -   return 0;
> +   return !key1->record_compare(key2);
>  }
>
>
> diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
> index 96eee5e..dcc98e0 100644
> --- a/src/glsl/glsl_types.h
> +++ b/src/glsl/glsl_types.h
> @@ -542,6 +542,13 @@ struct glsl_type {
>      */
>     int sampler_coordinate_components() const;
>
> +   /**
> +    * Compare a record type against another record type.
> +    *
> +    * This is useful for matching record types declared across shader stages.
> +    */
> +   bool record_compare(const glsl_type *b) const;
> +
>  private:
>     /**
>      * ralloc context for all glsl_type allocations
> --
> 1.8.1.2

I rebased it and massaged the commit messages a little and pushed these patches.

Thanks!
Matt


More information about the mesa-dev mailing list