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

Ian Romanick idr at freedesktop.org
Thu Aug 1 09:34:51 PDT 2013


On 08/01/2013 07:17 AM, Paul Berry wrote:
> On 31 July 2013 17:42, Ian Romanick <idr at freedesktop.org
> <mailto:idr at freedesktop.org>> wrote:
>
>     On 07/28/2013 11:03 PM, Paul Berry wrote:
>
>         From: Eric Anholt <eric at anholt.net <mailto:eric at anholt.net>>
>
>         Next step is to validate them at link time.
>
>         v2 (Paul Berry <stereotype441 at gmail.com
>         <mailto: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?
>
> Hmm, maybe we should use mtypes.h's PRIM_UNKNOWN.

Good call!  I had forgotten that PRIM_UNKNOWN existed and was defined in 
terms of the other GL_<prim> enums.

>         +      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