glsl: Prohibit illegal mixing of redeclarations inside/outside gl_PerVertex.
authorPaul Berry <stereotype441@gmail.com>
Thu, 14 Nov 2013 00:53:18 +0000 (16:53 -0800)
committerPaul Berry <stereotype441@gmail.com>
Thu, 21 Nov 2013 23:04:59 +0000 (15:04 -0800)
commit2bbcf19acad530d339ffe8e007fe2f6a244e1580
tree54df0e3f535b1f7ee0b5aaf1701f2b4eb285a005
parent7a70f033b5fbb8d3e5956cc4df30b84f0d4d9653
glsl: Prohibit illegal mixing of redeclarations inside/outside gl_PerVertex.

From section 7.1 (Built-In Language Variables) of the GLSL 4.10
spec:

    Also, if a built-in interface block is redeclared, no member of
    the built-in declaration can be redeclared outside the block
    redeclaration.

We have been regarding this text as a clarification to the behaviour
established for gl_PerVertex by GLSL 1.50, so we apply it regardless
of GLSL version.

This patch enforces the rule by adding an enum to ir_variable to track
how the variable was declared: implicitly, normally, or in an
interface block.

Fixes piglit tests:
- gs-redeclares-pervertex-out-after-global-redeclaration.geom
- vs-redeclares-pervertex-out-after-global-redeclaration.vert
- gs-redeclares-pervertex-out-after-other-global-redeclaration.geom
- vs-redeclares-pervertex-out-after-other-global-redeclaration.vert
- gs-redeclares-pervertex-out-before-global-redeclaration
- vs-redeclares-pervertex-out-before-global-redeclaration

Cc: "10.0" <mesa-stable@lists.freedesktop.org>
v2: Don't set "how_declared" redundantly in builtin_variables.cpp.
Properly clone "how_declared".

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/ast_to_hir.cpp
src/glsl/builtin_variables.cpp
src/glsl/ir.cpp
src/glsl/ir.h
src/glsl/ir_clone.cpp