[Mesa-dev] [PATCH v2] glsl/linker: Check the invariance of built-in special variables
Tapani Pälli
tapani.palli at intel.com
Tue Sep 11 06:38:04 UTC 2018
r-b (as already did with previous) and if no objections, will push
On 09/07/2018 03:14 PM, Vadym Shovkoplias wrote:
> From Section 4.6.4 (Invariance and Linkage) of the GLSL ES 1.0 specification
>
> "The invariance of varyings that are declared in both the vertex and
> fragment shaders must match. For the built-in special variables,
> gl_FragCoord can only be declared invariant if and only if
> gl_Position is declared invariant. Similarly gl_PointCoord can only
> be declared invariant if and only if gl_PointSize is declared
> invariant. It is an error to declare gl_FrontFacing as invariant.
> The invariance of gl_FrontFacing is the same as the invariance of
> gl_Position."
>
> Fixes:
> * glsl-pcoord-invariant.shader_test
> * glsl-fcoord-invariant.shader_test
> * glsl-fface-invariant.shader_test
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107734
> Signed-off-by: Vadym Shovkoplias <vadym.shovkoplias at globallogic.com>
> ---
> src/compiler/glsl/linker.cpp | 66 ++++++++++++++++++++++++++++++++++++
> 1 file changed, 66 insertions(+)
>
> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
> index dbd76b7fcc..e502149932 100644
> --- a/src/compiler/glsl/linker.cpp
> +++ b/src/compiler/glsl/linker.cpp
> @@ -1286,6 +1286,66 @@ interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog,
> return true;
> }
>
> +/**
> + * Verifies the invariance of built-in special variables.
> + */
> +static bool
> +validate_invariant_builtins(struct gl_shader_program *prog,
> + const gl_linked_shader *vert,
> + const gl_linked_shader *frag)
> +{
> + const ir_variable *var_vert;
> + const ir_variable *var_frag;
> +
> + if (!vert || !frag)
> + return true;
> +
> + /*
> + * From OpenGL ES Shading Language 1.0 specification
> + * (4.6.4 Invariance and Linkage):
> + * "The invariance of varyings that are declared in both the vertex and
> + * fragment shaders must match. For the built-in special variables,
> + * gl_FragCoord can only be declared invariant if and only if
> + * gl_Position is declared invariant. Similarly gl_PointCoord can only
> + * be declared invariant if and only if gl_PointSize is declared
> + * invariant. It is an error to declare gl_FrontFacing as invariant.
> + * The invariance of gl_FrontFacing is the same as the invariance of
> + * gl_Position."
> + */
> + var_frag = frag->symbols->get_variable("gl_FragCoord");
> + if (var_frag && var_frag->data.invariant) {
> + var_vert = vert->symbols->get_variable("gl_Position");
> + if (var_vert && !var_vert->data.invariant) {
> + linker_error(prog,
> + "fragment shader built-in `%s' has invariant qualifier, "
> + "but vertex shader built-in `%s' lacks invariant qualifier\n",
> + var_frag->name, var_vert->name);
> + return false;
> + }
> + }
> +
> + var_frag = frag->symbols->get_variable("gl_PointCoord");
> + if (var_frag && var_frag->data.invariant) {
> + var_vert = vert->symbols->get_variable("gl_PointSize");
> + if (var_vert && !var_vert->data.invariant) {
> + linker_error(prog,
> + "fragment shader built-in `%s' has invariant qualifier, "
> + "but vertex shader built-in `%s' lacks invariant qualifier\n",
> + var_frag->name, var_vert->name);
> + return false;
> + }
> + }
> +
> + var_frag = frag->symbols->get_variable("gl_FrontFacing");
> + if (var_frag && var_frag->data.invariant) {
> + linker_error(prog,
> + "fragment shader built-in `%s' can not be declared as invariant\n",
> + var_frag->name);
> + return false;
> + }
> +
> + return true;
> +}
>
> /**
> * Populates a shaders symbol table with all global declarations
> @@ -5011,6 +5071,12 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
> lower_named_interface_blocks(mem_ctx, prog->_LinkedShaders[i]);
> }
>
> + if (prog->IsES && prog->data->Version == 100)
> + if (!validate_invariant_builtins(prog,
> + prog->_LinkedShaders[MESA_SHADER_VERTEX],
> + prog->_LinkedShaders[MESA_SHADER_FRAGMENT]))
> + goto done;
> +
> /* Implement the GLSL 1.30+ rule for discard vs infinite loops Do
> * it before optimization because we want most of the checks to get
> * dropped thanks to constant propagation.
>
More information about the mesa-dev
mailing list