[Mesa-dev] [PATCH 1/4] glsl: Add simple vector type accessor helpers.

Ian Romanick idr at freedesktop.org
Tue Jun 18 06:47:20 PDT 2013


On 06/18/2013 04:22 AM, Kenneth Graunke wrote:
> This patch introduces new functions to quickly grab a pointer to a
> vector type.  For example:
>
>     glsl_type::bvec(4)   returns   glsl_type::bvec4_type
>     glsl_type::ivec(3)   returns   glsl_type::ivec3_type
>     glsl_type::uvec(2)   returns   glsl_type::uvec2_type
>     glsl_type::vec(1)    returns   glsl_type::float_type
>
> This is less wordy than glsl_type::get_instance(GLSL_TYPE_BOOL, 4, 1),
> which can help avoid extra word wrapping.

One thing that's annoying about this code is that we have so many ways 
to get at types.  You can get them from a symbol table, you can get them 
from the direct pointers, you can get them from pointer math, or you can 
get them from get_instance.  I'm not sure replacing one with another 
makes it much better.

I remember considering having separate overloads of get_instance for 
vectors and matrices.  I don't recall why I didn't do it that way.

> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>   src/glsl/glsl_types.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++++++
>   src/glsl/glsl_types.h   |  9 +++++++++
>   2 files changed, 61 insertions(+)
>
> diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
> index df9c5d3..a5491c5 100644
> --- a/src/glsl/glsl_types.cpp
> +++ b/src/glsl/glsl_types.cpp
> @@ -534,6 +534,58 @@ glsl_type::glsl_type(const glsl_type *array, unsigned length) :
>   }
>
>
> +const glsl_type *const
> +glsl_type::vec(unsigned components)
> +{
> +   if (components == 0 || components > 4)
> +      return error_type;
> +
> +   static const glsl_type *const ts[] = {
> +      float_type, vec2_type, vec3_type, vec4_type
> +   };
> +   return ts[components - 1];

We could just embed this code in get_instance.  That seems better than 
adding new methods that are only used in method that's part of the same 
class.

> +}
> +
> +
> +const glsl_type *const
> +glsl_type::ivec(unsigned components)
> +{
> +   if (components == 0 || components > 4)
> +      return error_type;
> +
> +   static const glsl_type *const ts[] = {
> +      int_type, ivec2_type, ivec3_type, ivec4_type
> +   };
> +   return ts[components - 1];
> +}
> +
> +
> +const glsl_type *const
> +glsl_type::uvec(unsigned components)
> +{
> +   if (components == 0 || components > 4)
> +      return error_type;
> +
> +   static const glsl_type *const ts[] = {
> +      uint_type, uvec2_type, uvec3_type, uvec4_type
> +   };
> +   return ts[components - 1];
> +}
> +
> +
> +const glsl_type *const
> +glsl_type::bvec(unsigned components)
> +{
> +   if (components == 0 || components > 4)
> +      return error_type;
> +
> +   static const glsl_type *const ts[] = {
> +      bool_type, bvec2_type, bvec3_type, bvec4_type
> +   };
> +   return ts[components - 1];
> +}
> +
> +
>   const glsl_type *
>   glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns)
>   {
> diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
> index 31e3dd2..665af8b 100644
> --- a/src/glsl/glsl_types.h
> +++ b/src/glsl/glsl_types.h
> @@ -187,6 +187,15 @@ struct glsl_type {
>      static const glsl_type *const mat4_type;
>      /*@}*/
>
> +   /**
> +    * Convenience accessors for vector types (shorter than get_instance()).
> +    * @{
> +    */
> +   static const glsl_type *const vec(unsigned components);
> +   static const glsl_type *const ivec(unsigned components);
> +   static const glsl_type *const uvec(unsigned components);
> +   static const glsl_type *const bvec(unsigned components);
> +   /**@}*/
>
>      /**
>       * For numeric and boolean derrived types returns the basic scalar type
>



More information about the mesa-dev mailing list