<div dir="ltr">On 31 July 2013 17:42, Ian Romanick <span dir="ltr"><<a href="mailto:idr@freedesktop.org" target="_blank">idr@freedesktop.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On 07/28/2013 11:03 PM, Paul Berry wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
From: Eric Anholt <<a href="mailto:eric@anholt.net" target="_blank">eric@anholt.net</a>><br>
<br>
Next step is to validate them at link time.<br>
<br>
v2 (Paul Berry <<a href="mailto:stereotype441@gmail.com" target="_blank">stereotype441@gmail.com</a>>): Don't attempt to export the<br>
layout qualifiers in the event of a compile error, since some of them<br>
are set up by ast_to_hir(), and ast_to_hir() isn't guaranteed to have<br>
run in the event of a compile error.<br>
---<br>
  src/glsl/glsl_parser_extras.<u></u>cpp | 31 ++++++++++++++++++++++++++++++<u></u>+<br>
  src/mesa/main/mtypes.h          | 18 ++++++++++++++++++<br>
  2 files changed, 49 insertions(+)<br>
<br>
diff --git a/src/glsl/glsl_parser_extras.<u></u>cpp b/src/glsl/glsl_parser_extras.<u></u>cpp<br>
index 6b8fb45..2311447 100644<br>
--- a/src/glsl/glsl_parser_extras.<u></u>cpp<br>
+++ b/src/glsl/glsl_parser_extras.<u></u>cpp<br>
@@ -1446,6 +1446,34 @@ ast_struct_specifier::ast_<u></u>struct_specifier(const char *identifier,<br>
     is_declaration = true;<br>
  }<br>
<br>
+static void<br>
+set_shader_inout_layout(<u></u>struct gl_shader *shader,<br>
+                    struct _mesa_glsl_parse_state *state)<br>
+{<br>
+   if (shader->Type != GL_GEOMETRY_SHADER) {<br>
+      /* Should have been prevented by the parser. */<br>
+      assert(!state->gs_input_prim_<u></u>type_specified);<br>
+      assert(!state->out_qualifier-><u></u>flags.i);<br>
+      return;<br>
+   }<br>
+<br>
+   shader->Geom.VerticesOut = 0;<br>
+   if (state->out_qualifier->flags.<u></u>q.max_vertices)<br>
+      shader->Geom.VerticesOut = state->out_qualifier->max_<u></u>vertices;<br>
+<br>
+   if (state->gs_input_prim_type_<u></u>specified) {<br>
+      shader->Geom.InputType = state->gs_input_prim_type;<br>
+   } else {<br>
+      shader->Geom.InputType = ~0;<br>
+   }<br>
+<br>
+   if (state->out_qualifier->flags.<u></u>q.prim_type) {<br>
+      shader->Geom.OutputType = state->out_qualifier->prim_<u></u>type;<br>
+   } else {<br>
+      shader->Geom.OutputType = ~0;<br>
+   }<br>
+}<br>
+<br>
  extern "C" {<br>
<br>
  void<br>
@@ -1521,6 +1549,9 @@ _mesa_glsl_compile_shader(<u></u>struct gl_context *ctx, struct gl_shader *shader,<br>
     shader->UniformBlocks = state->uniform_blocks;<br>
     ralloc_steal(shader, shader->UniformBlocks);<br>
<br>
+   if (!state->error)<br>
+      set_shader_inout_layout(<u></u>shader, state);<br>
+<br>
     /* Retain any live IR, but trash the rest. */<br>
     reparent_ir(shader->ir, shader->ir);<br>
<br>
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h<br>
index 33075bd..bc90d09 100644<br>
--- a/src/mesa/main/mtypes.h<br>
+++ b/src/mesa/main/mtypes.h<br>
@@ -2170,6 +2170,24 @@ struct gl_shader<br>
     /** Shaders containing built-in functions that are used for linking. */<br>
     struct gl_shader *builtins_to_link[16];<br>
     unsigned num_builtins_to_link;<br>
+<br>
+   /**<br>
+    * Geometry shader state from GLSL 1.50 layout qualifiers.<br>
+    */<br>
+   struct {<br>
+      GLint VerticesOut;<br>
+      /**<br>
+       * GL_POINTS, GL_LINES, GL_LINES_ADJACENCY_ARB, GL_TRIANGLES, or<br>
+       * GL_TRIANGLES_ADJACENCY_ARB, or ~0 if it's not set in this shader<br>
+       * (since GL_POINTS is 0).<br>
+       */<br>
</blockquote>
<br></div></div>
After looking at the next patch, I wonder if we should make a descriptive #define for ~0u for this.  Thoughts?</blockquote><div><br></div><div>Hmm, maybe we should use mtypes.h's PRIM_UNKNOWN.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      GLenum InputType;<br>
+       /**<br>
+        * GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP, or ~0 if it's not set<br>
+        * in this shader (since GL_POINTS is 0).<br>
+        */<br>
+      GLenum OutputType;<br>
+   } Geom;<br>
  };<br>
<br>
<br>
<br>
</blockquote>
<br>
</div></div></blockquote></div><br></div></div>