diff options
| author | Chad Versace <chad.versace@intel.com> | 2011-01-11 17:21:18 -0800 | 
|---|---|---|
| committer | Chad Versace <chad.versace@intel.com> | 2011-01-17 09:41:24 -0800 | 
| commit | 605aacc67d73db0926e0046a90a07fcd93a2d613 (patch) | |
| tree | de484f94ab19f20b93a45c6611f63d3151a18d1e /src/glsl | |
| parent | 0e2f8936c8ef872cb464e54a9f09ae0324487147 (diff) | |
glsl: Check that interpolation qualifiers do not precede 'varying'
... and 'centroid varying'. The check is performed only in GLSL
versions >= 1.30.
From page 29 (page 35 of the PDF) of the GLSL 1.30 spec:
   "interpolation qualifiers may only precede the qualifiers in, centroid
    in, out, or centroid out in a declaration. They do not apply to the
    deprecated storage qualifiers varying or centroid varying."
Fixes Piglit test
spec/glsl-1.30/compiler/interpolation-qualifiers/smooth-varying-01.frag.
Diffstat (limited to 'src/glsl')
| -rw-r--r-- | src/glsl/ast.h | 5 | ||||
| -rw-r--r-- | src/glsl/ast_to_hir.cpp | 26 | ||||
| -rw-r--r-- | src/glsl/ast_type.cpp | 7 | 
3 files changed, 38 insertions, 0 deletions
| diff --git a/src/glsl/ast.h b/src/glsl/ast.h index c096f9aa87..523a38937a 100644 --- a/src/glsl/ast.h +++ b/src/glsl/ast.h @@ -366,6 +366,11 @@ struct ast_type_qualifier {     unsigned location;     /** +    * Return true if and only if an interpolation qualifier is present. +    */ +   bool has_interpolation() const; + +   /**      * \brief Return string representation of interpolation qualifier.      *      * If an interpolation qualifier is present, then return that qualifier's diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 365a6e2676..a2edb6a27c 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -2277,6 +2277,32 @@ ast_declarator_list::hir(exec_list *instructions,        } +      /* Interpolation qualifiers cannot be applied to 'centroid' and +       * 'centroid varying'. +       * +       * From page 29 (page 35 of the PDF) of the GLSL 1.30 spec: +       *    "interpolation qualifiers may only precede the qualifiers in, +       *    centroid in, out, or centroid out in a declaration. They do not apply +       *    to the deprecated storage qualifiers varying or centroid varying." +       */ +      if (state->language_version >= 130 +          && this->type->qualifier.has_interpolation() +          && this->type->qualifier.flags.q.varying) { + +         const char *i = this->type->qualifier.interpolation_string(); +         assert(i != NULL); +         const char *s; +         if (this->type->qualifier.flags.q.centroid) +            s = "centroid varying"; +         else +            s = "varying"; + +         _mesa_glsl_error(&loc, state, +                          "qualifier '%s' cannot be applied to the " +                          "deprecated storage qualifier '%s'", i, s); +      } + +        /* Process the initializer and add its instructions to a temporary         * list.  This list will be added to the instruction stream (below) after         * the declaration is added.  This is done because in some cases (such as diff --git a/src/glsl/ast_type.cpp b/src/glsl/ast_type.cpp index a8761611d3..f23e545762 100644 --- a/src/glsl/ast_type.cpp +++ b/src/glsl/ast_type.cpp @@ -117,6 +117,13 @@ ast_fully_specified_type::has_qualifiers() const     return this->qualifier.flags.i != 0;  } +bool ast_type_qualifier::has_interpolation() const +{ +   return this->flags.q.smooth +          || this->flags.q.flat +          || this->flags.q.noperspective; +} +  const char*  ast_type_qualifier::interpolation_string() const  { | 
