[Mesa-dev] [PATCH 9/9] glsl: Add constuctors for the common cases of glsl_struct_field

Francisco Jerez currojerez at riseup.net
Thu Jul 30 07:31:03 PDT 2015


Ian Romanick <idr at freedesktop.org> writes:

> From: Ian Romanick <ian.d.romanick at intel.com>
>
> Fixes a giant pile of GCC warnings:
>
> builtin_types.cpp:60:1: warning: missing initializer for member 'glsl_struct_field::stream' [-Wmissing-field-initializers]
>
> I had to add a default constructor because a non-default constructor
> was added.  Otherwise the only constructor would be the one with
> parameters, and all the plases like
>
>     glsl_struct_field foo;
>
> would fail to compile.
>
> I wanted to do this in two patches.  All of the initializers of
> glsl_struct_field structures had to be converted to use the
> constructor because C++ apparently forces you to do one or the other:
>
> builtin_types.cpp:61:1: error: could not convert '{glsl_type::float_type, "near", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0, -1}' from '<brace-enclosed initializer list>' to 'glsl_struct_field'
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> Cc: Francisco Jerez <currojerez at riseup.net>
>
> Perhaps there's some other C++ way that I don't know.

There is a way for an initializer list to be interpreted as a
constructor call, but it's C++11 :).

> ---
>  src/glsl/builtin_types.cpp         | 74 +++++++++++++++++++-------------------
>  src/glsl/glsl_types.h              | 13 +++++++
>  src/glsl/tests/general_ir_test.cpp | 12 ++-----
>  src/glsl/tests/varyings_test.cpp   | 10 +-----
>  4 files changed, 53 insertions(+), 56 deletions(-)
>
> diff --git a/src/glsl/builtin_types.cpp b/src/glsl/builtin_types.cpp
> index d92e2eb..ffbc5e6 100644
> --- a/src/glsl/builtin_types.cpp
> +++ b/src/glsl/builtin_types.cpp
> @@ -54,64 +54,64 @@
>        &glsl_type::_struct_##NAME##_type;
>  
>  static const struct glsl_struct_field gl_DepthRangeParameters_fields[] = {
> -   { glsl_type::float_type, "near", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "far",  -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "diff", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> +   glsl_struct_field(glsl_type::float_type, "near"),
> +   glsl_struct_field(glsl_type::float_type, "far"),
> +   glsl_struct_field(glsl_type::float_type, "diff"),
>  };
>  
>  static const struct glsl_struct_field gl_PointParameters_fields[] = {
> -   { glsl_type::float_type, "size", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "sizeMin", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "sizeMax", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "fadeThresholdSize", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "distanceConstantAttenuation", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "distanceLinearAttenuation", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "distanceQuadraticAttenuation", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> +   glsl_struct_field(glsl_type::float_type, "size"),
> +   glsl_struct_field(glsl_type::float_type, "sizeMin"),
> +   glsl_struct_field(glsl_type::float_type, "sizeMax"),
> +   glsl_struct_field(glsl_type::float_type, "fadeThresholdSize"),
> +   glsl_struct_field(glsl_type::float_type, "distanceConstantAttenuation"),
> +   glsl_struct_field(glsl_type::float_type, "distanceLinearAttenuation"),
> +   glsl_struct_field(glsl_type::float_type, "distanceQuadraticAttenuation"),
>  };
>  
>  static const struct glsl_struct_field gl_MaterialParameters_fields[] = {
> -   { glsl_type::vec4_type, "emission", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::vec4_type, "ambient", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::vec4_type, "diffuse", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::vec4_type, "specular", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "shininess", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> +   glsl_struct_field(glsl_type::vec4_type, "emission"),
> +   glsl_struct_field(glsl_type::vec4_type, "ambient"),
> +   glsl_struct_field(glsl_type::vec4_type, "diffuse"),
> +   glsl_struct_field(glsl_type::vec4_type, "specular"),
> +   glsl_struct_field(glsl_type::float_type, "shininess"),
>  };
>  
>  static const struct glsl_struct_field gl_LightSourceParameters_fields[] = {
> -   { glsl_type::vec4_type, "ambient", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::vec4_type, "diffuse", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::vec4_type, "specular", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::vec4_type, "position", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::vec4_type, "halfVector", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::vec3_type, "spotDirection", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "spotExponent", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "spotCutoff", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "spotCosCutoff", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "constantAttenuation", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "linearAttenuation", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "quadraticAttenuation", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> +   glsl_struct_field(glsl_type::vec4_type, "ambient"),
> +   glsl_struct_field(glsl_type::vec4_type, "diffuse"),
> +   glsl_struct_field(glsl_type::vec4_type, "specular"),
> +   glsl_struct_field(glsl_type::vec4_type, "position"),
> +   glsl_struct_field(glsl_type::vec4_type, "halfVector"),
> +   glsl_struct_field(glsl_type::vec3_type, "spotDirection"),
> +   glsl_struct_field(glsl_type::float_type, "spotExponent"),
> +   glsl_struct_field(glsl_type::float_type, "spotCutoff"),
> +   glsl_struct_field(glsl_type::float_type, "spotCosCutoff"),
> +   glsl_struct_field(glsl_type::float_type, "constantAttenuation"),
> +   glsl_struct_field(glsl_type::float_type, "linearAttenuation"),
> +   glsl_struct_field(glsl_type::float_type, "quadraticAttenuation"),
>  };
>  
>  static const struct glsl_struct_field gl_LightModelParameters_fields[] = {
> -   { glsl_type::vec4_type, "ambient", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> +   glsl_struct_field(glsl_type::vec4_type, "ambient"),
>  };
>  
>  static const struct glsl_struct_field gl_LightModelProducts_fields[] = {
> -   { glsl_type::vec4_type, "sceneColor", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> +   glsl_struct_field(glsl_type::vec4_type, "sceneColor"),
>  };
>  
>  static const struct glsl_struct_field gl_LightProducts_fields[] = {
> -   { glsl_type::vec4_type, "ambient", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::vec4_type, "diffuse", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::vec4_type, "specular", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> +   glsl_struct_field(glsl_type::vec4_type, "ambient"),
> +   glsl_struct_field(glsl_type::vec4_type, "diffuse"),
> +   glsl_struct_field(glsl_type::vec4_type, "specular"),
>  };
>  
>  static const struct glsl_struct_field gl_FogParameters_fields[] = {
> -   { glsl_type::vec4_type, "color", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "density", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "start", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "end", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> -   { glsl_type::float_type, "scale", -1, 0, 0, 0, GLSL_MATRIX_LAYOUT_INHERITED, 0 },
> +   glsl_struct_field(glsl_type::vec4_type, "color"),
> +   glsl_struct_field(glsl_type::float_type, "density"),
> +   glsl_struct_field(glsl_type::float_type, "start"),
> +   glsl_struct_field(glsl_type::float_type, "end"),
> +   glsl_struct_field(glsl_type::float_type, "scale"),
>  };
>  
>  #include "builtin_type_macros.h"
> diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
> index 52672b3..e7c73da 100644
> --- a/src/glsl/glsl_types.h
> +++ b/src/glsl/glsl_types.h
> @@ -781,6 +781,19 @@ struct glsl_struct_field {
>      * streams (as in ir_variable::stream). -1 otherwise.
>      */
>     int stream;
> +
> +   glsl_struct_field(const struct glsl_type *_type, const char *_name)
> +      : type(_type), name(_name), location(-1), interpolation(0), centroid(0),
> +        sample(0), matrix_layout(GLSL_MATRIX_LAYOUT_INHERITED), patch(0),
> +        stream(-1)
> +   {
> +      /* empty */
> +   }
> +
> +   glsl_struct_field()
> +   {
> +      /* empty */

The empty constructor does match the previous semantics, but it may be a
good idea to initialize the whole struct to some sane defaults while
you're at it.  Either way this patch is:

Reviewed-by: Francisco Jerez <currojerez at riseup.net>

> +   }
>  };
>  
>  static inline unsigned int
> diff --git a/src/glsl/tests/general_ir_test.cpp b/src/glsl/tests/general_ir_test.cpp
> index 882642d..217305b 100644
> --- a/src/glsl/tests/general_ir_test.cpp
> +++ b/src/glsl/tests/general_ir_test.cpp
> @@ -31,11 +31,7 @@ TEST(ir_variable_constructor, interface)
>     void *mem_ctx = ralloc_context(NULL);
>  
>     static const glsl_struct_field f[] = {
> -      {
> -         glsl_type::vec(4),
> -         "v",
> -         false
> -      }
> +      glsl_struct_field(glsl_type::vec(4), "v")
>     };
>  
>     const glsl_type *const interface =
> @@ -60,11 +56,7 @@ TEST(ir_variable_constructor, interface_array)
>     void *mem_ctx = ralloc_context(NULL);
>  
>     static const glsl_struct_field f[] = {
> -      {
> -         glsl_type::vec(4),
> -         "v",
> -         false
> -      }
> +      glsl_struct_field(glsl_type::vec(4), "v")
>     };
>  
>     const glsl_type *const interface =
> diff --git a/src/glsl/tests/varyings_test.cpp b/src/glsl/tests/varyings_test.cpp
> index 62f8c6b..0c4e0a4 100644
> --- a/src/glsl/tests/varyings_test.cpp
> +++ b/src/glsl/tests/varyings_test.cpp
> @@ -76,15 +76,7 @@ public:
>  link_varyings::link_varyings()
>  {
>     static const glsl_struct_field f[] = {
> -      {
> -         glsl_type::vec(4),
> -         "v",
> -         false,
> -         0,
> -         0,
> -         0,
> -         0
> -      }
> +      glsl_struct_field(glsl_type::vec(4), "v")
>     };
>  
>     this->simple_interface =
> -- 
> 2.1.0
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150730/7ab8704f/attachment.sig>


More information about the mesa-dev mailing list