diff options
author | vadym.shovkoplias <vadim.shovkoplias@gmail.com> | 2018-08-23 13:12:16 +0300 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2018-08-28 09:02:44 -0700 |
commit | bdc842a0928f4f2512078dd4337d5f2a4fc19f85 (patch) | |
tree | 6d915cdeea2d021606287273a44ee9d2e7fd7ad9 | |
parent | 850e1259e1359b3bceed02d8724686f81c84bfde (diff) |
glsl/linker: Allow unused in blocks which are not declated on previous stage
>From Section 4.3.4 (Inputs) of the GLSL 1.50 spec:
"Only the input variables that are actually read need to be written
by the previous stage; it is allowed to have superfluous
declarations of input variables."
Fixes:
* interstage-multiple-shader-objects.shader_test
v2:
Update comment in ir.h since the usage of "used" field
has been extended.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101247
Signed-off-by: Vadym Shovkoplias <vadym.shovkoplias@globallogic.com>
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
(cherry picked from commit 4a8444d5bc865119218eca8674e5614535f4829e)
-rw-r--r-- | src/compiler/glsl/ir.h | 4 | ||||
-rw-r--r-- | src/compiler/glsl/link_interface_blocks.cpp | 8 |
2 files changed, 9 insertions, 3 deletions
diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h index 471d9e787a7..5420fc34545 100644 --- a/src/compiler/glsl/ir.h +++ b/src/compiler/glsl/ir.h @@ -667,8 +667,8 @@ public: * variable has been used. For example, it is an error to redeclare a * variable as invariant after it has been used. * - * This is only maintained in the ast_to_hir.cpp path, not in - * Mesa's fixed function or ARB program paths. + * This is maintained in the ast_to_hir.cpp path and during linking, + * but not in Mesa's fixed function or ARB program paths. */ unsigned used:1; diff --git a/src/compiler/glsl/link_interface_blocks.cpp b/src/compiler/glsl/link_interface_blocks.cpp index e5eca9460e3..801fbcd5d9f 100644 --- a/src/compiler/glsl/link_interface_blocks.cpp +++ b/src/compiler/glsl/link_interface_blocks.cpp @@ -417,9 +417,15 @@ validate_interstage_inout_blocks(struct gl_shader_program *prog, * write to any of the pre-defined outputs (e.g. if the vertex shader * does not write to gl_Position, etc), which is allowed and results in * undefined behavior. + * + * From Section 4.3.4 (Inputs) of the GLSL 1.50 spec: + * + * "Only the input variables that are actually read need to be written + * by the previous stage; it is allowed to have superfluous + * declarations of input variables." */ if (producer_def == NULL && - !is_builtin_gl_in_block(var, consumer->Stage)) { + !is_builtin_gl_in_block(var, consumer->Stage) && var->data.used) { linker_error(prog, "Input block `%s' is not an output of " "the previous stage\n", var->get_interface_type()->name); return; |