On 08/01/2013 07:17 AM, Paul Berry wrote:
On 31 July 2013 17:42, Ian Romanick <i...@freedesktop.org
<mailto:i...@freedesktop.org>> wrote:

    On 07/28/2013 11:03 PM, Paul Berry wrote:

        From: Eric Anholt <e...@anholt.net <mailto:e...@anholt.net>>

        Next step is to validate them at link time.

        v2 (Paul Berry <stereotype...@gmail.com
        <mailto:stereotype...@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;
           };

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to