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.
This commit is contained in:
@@ -365,6 +365,11 @@ struct ast_type_qualifier {
|
|||||||
*/
|
*/
|
||||||
unsigned location;
|
unsigned location;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if and only if an interpolation qualifier is present.
|
||||||
|
*/
|
||||||
|
bool has_interpolation() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Return string representation of interpolation qualifier.
|
* \brief Return string representation of interpolation qualifier.
|
||||||
*
|
*
|
||||||
|
@@ -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
|
/* Process the initializer and add its instructions to a temporary
|
||||||
* list. This list will be added to the instruction stream (below) after
|
* 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
|
* the declaration is added. This is done because in some cases (such as
|
||||||
|
@@ -117,6 +117,13 @@ ast_fully_specified_type::has_qualifiers() const
|
|||||||
return this->qualifier.flags.i != 0;
|
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*
|
const char*
|
||||||
ast_type_qualifier::interpolation_string() const
|
ast_type_qualifier::interpolation_string() const
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user