[Mesa-dev] [PATCH] glsl/gs: Prevent illegal input/output primitive types.

Paul Berry stereotype441 at gmail.com
Tue Oct 22 19:41:53 CEST 2013


>From the GLSL 1.50 spec, section 4.3.8.1 (Input Layout Qualifiers):

    The layout qualifier identifiers for geometry shader inputs are

        layout-qualifier-id
            points
            lines
            lines_adjacency
            triangles
            triangles_adjacency

And from section 4.3.8.2 (Output Layout Qualifiers)

    The layout qualifier identifiers for geometry shader outputs are

        layout-qualifier-id
            points
            line_strip
            triangle_strip
            max_vertices = integer-constant

We were erroneously allowing line_strip and triangle_strip to be used
as input qualifiers, and we were allowing lines, lines_adjacency,
triangles, and triangles_adjacency to be used as output qualifiers.

Fixes piglit tests "glsl-1.50-gs-{input,output}-layout-qualifiers *".
---
 src/glsl/glsl_parser.yy | 35 ++++++++++++++++++++++++++++++++---
 1 file changed, 32 insertions(+), 3 deletions(-)

diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index 00589e2..0a0708e 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -2372,6 +2372,7 @@ layout_defaults:
    | layout_qualifier IN_TOK ';'
    {
       void *ctx = state;
+      $$ = NULL;
       if (state->target != geometry_shader) {
          _mesa_glsl_error(& @1, state,
                           "input layout qualifiers only valid in "
@@ -2380,8 +2381,22 @@ layout_defaults:
          _mesa_glsl_error(& @1, state,
                           "input layout qualifiers must specify a primitive"
                           " type");
+      } else {
+         /* Make sure this is a valid input primitive type. */
+         switch ($1.prim_type) {
+         case GL_POINTS:
+         case GL_LINES:
+         case GL_LINES_ADJACENCY:
+         case GL_TRIANGLES:
+         case GL_TRIANGLES_ADJACENCY:
+            $$ = new(ctx) ast_gs_input_layout(@1, $1.prim_type);
+            break;
+         default:
+            _mesa_glsl_error(&@1, state,
+                             "invalid geometry shader input primitive type");
+            break;
+         }
       }
-      $$ = new(ctx) ast_gs_input_layout(@1, $1.prim_type);
    }
 
    | layout_qualifier OUT_TOK ';'
@@ -2390,8 +2405,22 @@ layout_defaults:
          _mesa_glsl_error(& @1, state,
                           "out layout qualifiers only valid in "
                           "geometry shaders");
-      } else if (!state->out_qualifier->merge_qualifier(& @1, state, $1)) {
-         YYERROR;
+      } else {
+         if ($1.flags.q.prim_type) {
+            /* Make sure this is a valid output primitive type. */
+            switch ($1.prim_type) {
+            case GL_POINTS:
+            case GL_LINE_STRIP:
+            case GL_TRIANGLE_STRIP:
+               break;
+            default:
+               _mesa_glsl_error(&@1, state, "invalid geometry shader output "
+                                "primitive type");
+               break;
+            }
+         }
+         if (!state->out_qualifier->merge_qualifier(& @1, state, $1))
+            YYERROR;
       }
       $$ = NULL;
    }
-- 
1.8.4.1



More information about the mesa-dev mailing list