[v2] glsl/linker: Allow unused in blocks which are not declated on previous stage

Submitted by Vadym Shovkoplias on Aug. 22, 2018, 9:51 a.m.

Details

Message ID 20180822095107.14242-1-vadym.shovkoplias@globallogic.com
State New
Headers show
Series "glsl/linker: Allow unused in blocks which are not declated on previous stage" ( rev: 2 ) in Mesa

Not browsing as part of any series.

Commit Message

Vadym Shovkoplias Aug. 22, 2018, 9:51 a.m.
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:
  Remove obsolete 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>
---
 src/compiler/glsl/ir.h                      | 3 ---
 src/compiler/glsl/link_interface_blocks.cpp | 8 +++++++-
 2 files changed, 7 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h
index 67b38f48ef..c9f2cd8a0d 100644
--- a/src/compiler/glsl/ir.h
+++ b/src/compiler/glsl/ir.h
@@ -666,9 +666,6 @@  public:
        * Several GLSL semantic checks require knowledge of whether or not a
        * 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.
        */
       unsigned used:1;
 
diff --git a/src/compiler/glsl/link_interface_blocks.cpp b/src/compiler/glsl/link_interface_blocks.cpp
index e5eca9460e..801fbcd5d9 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;