[Mesa-dev] [PATCH 29/34] glsl: Export the compiler's GS layout qualifiers to the gl_shader.

Ian Romanick idr at freedesktop.org
Wed Jul 31 17:42:57 PDT 2013


On 07/28/2013 11:03 PM, Paul Berry wrote:
> From: Eric Anholt <eric at anholt.net>
>
> Next step is to validate them at link time.
>
> v2 (Paul Berry <stereotype441 at gmail.com>): Don't attempt to export the
> layout qualifiers in the event of a compile error, since some of them
> are set up by ast_to_hir(), and ast_to_hir() isn't guaranteed to have
> run in the event of a compile error.
> ---
>   src/glsl/glsl_parser_extras.cpp | 31 +++++++++++++++++++++++++++++++
>   src/mesa/main/mtypes.h          | 18 ++++++++++++++++++
>   2 files changed, 49 insertions(+)
>
> diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
> index 6b8fb45..2311447 100644
> --- a/src/glsl/glsl_parser_extras.cpp
> +++ b/src/glsl/glsl_parser_extras.cpp
> @@ -1446,6 +1446,34 @@ ast_struct_specifier::ast_struct_specifier(const char *identifier,
>      is_declaration = true;
>   }
>
> +static void
> +set_shader_inout_layout(struct gl_shader *shader,
> +		     struct _mesa_glsl_parse_state *state)
> +{
> +   if (shader->Type != GL_GEOMETRY_SHADER) {
> +      /* Should have been prevented by the parser. */
> +      assert(!state->gs_input_prim_type_specified);
> +      assert(!state->out_qualifier->flags.i);
> +      return;
> +   }
> +
> +   shader->Geom.VerticesOut = 0;
> +   if (state->out_qualifier->flags.q.max_vertices)
> +      shader->Geom.VerticesOut = state->out_qualifier->max_vertices;
> +
> +   if (state->gs_input_prim_type_specified) {
> +      shader->Geom.InputType = state->gs_input_prim_type;
> +   } else {
> +      shader->Geom.InputType = ~0;
> +   }
> +
> +   if (state->out_qualifier->flags.q.prim_type) {
> +      shader->Geom.OutputType = state->out_qualifier->prim_type;
> +   } else {
> +      shader->Geom.OutputType = ~0;
> +   }
> +}
> +
>   extern "C" {
>
>   void
> @@ -1521,6 +1549,9 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
>      shader->UniformBlocks = state->uniform_blocks;
>      ralloc_steal(shader, shader->UniformBlocks);
>
> +   if (!state->error)
> +      set_shader_inout_layout(shader, state);
> +
>      /* Retain any live IR, but trash the rest. */
>      reparent_ir(shader->ir, shader->ir);
>
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 33075bd..bc90d09 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2170,6 +2170,24 @@ struct gl_shader
>      /** Shaders containing built-in functions that are used for linking. */
>      struct gl_shader *builtins_to_link[16];
>      unsigned num_builtins_to_link;
> +
> +   /**
> +    * Geometry shader state from GLSL 1.50 layout qualifiers.
> +    */
> +   struct {
> +      GLint VerticesOut;
> +      /**
> +       * GL_POINTS, GL_LINES, GL_LINES_ADJACENCY_ARB, GL_TRIANGLES, or
> +       * GL_TRIANGLES_ADJACENCY_ARB, or ~0 if it's not set in this shader
> +       * (since GL_POINTS is 0).
> +       */

After looking at the next patch, I wonder if we should make a 
descriptive #define for ~0u for this.  Thoughts?

> +      GLenum InputType;
> +       /**
> +        * GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP, or ~0 if it's not set
> +        * in this shader (since GL_POINTS is 0).
> +        */
> +      GLenum OutputType;
> +   } Geom;
>   };
>
>
>



More information about the mesa-dev mailing list