glsl: Add simple vector type accessor helpers.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 18 Jun 2013 11:22:30 +0000 (04:22 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 26 Jun 2013 18:25:12 +0000 (11:25 -0700)
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.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/glsl/glsl_types.cpp
src/glsl/glsl_types.h

index df9c5d36f0b0b1dea091d4a15644e7f2cb6c00f7..a5491c58a47e2f6a9cf852ffe47372ff4dc7ee89 100644 (file)
@@ -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];
+}
+
+
+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)
 {
index 31e3dd253f0ecb02eebda7e66ccdd0b7aee41de8..665af8bf29d22378ddd02140aec28d106d7bf048 100644 (file)
@@ -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