summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Versace <chad.versace@intel.com>2011-01-11 17:21:18 -0800
committerChad Versace <chad.versace@intel.com>2011-01-17 09:41:24 -0800
commit605aacc67d73db0926e0046a90a07fcd93a2d613 (patch)
treede484f94ab19f20b93a45c6611f63d3151a18d1e
parent0e2f8936c8ef872cb464e54a9f09ae0324487147 (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.
-rw-r--r--src/glsl/ast.h5
-rw-r--r--src/glsl/ast_to_hir.cpp26
-rw-r--r--src/glsl/ast_type.cpp7
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
{