On 07/28/2013 11:03 PM, Paul Berry wrote:
From: Eric Anholt <e...@anholt.net>

Next step is to validate them at link time.

v2 (Paul Berry <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?

+      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