glsl: Make add_interface_variables only consider the appropriate stage.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 29 Mar 2016 18:41:46 +0000 (11:41 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Sat, 2 Apr 2016 04:58:25 +0000 (21:58 -0700)
add_interface_variables() is supposed to add variables for the inputs of
the first shader stage linked into a program, and the outputs of the
last shader stage linked into a program.

From the ARB_program_interface_query specification:

"* PROGRAM_INPUT corresponds to the set of active input variables used by
   the first shader stage of <program>.  If <program> includes multiple
   shader stages, input variables from any shader stage other than the
   first will not be enumerated.

 * PROGRAM_OUTPUT corresponds to the set of active output variables
   (section 2.14.11) used by the last shader stage of <program>.  If
   <program> includes multiple shader stages, output variables from any
   shader stage other than the last will not be enumerated."

Previously, we used build_stageref here, which walks over all linked
shaders in the program.  This meant that internal varyings would be
visible.  We don't actually need any of build_stageref's code: we
already explicitly skip packed varyings, handle modes, and the name
comparisons just do a fuzzy string comparison of name with itself.

Fixes two tests: dEQP-GLES31.functional.program_interface_query.
program_{input,output}.referenced_by.referenced_by_vertex_fragment.

These tests have a VS and FS linked together into a single program.
Both stages have an input called "shaderInput".  But the FS input
should not be visible because it isn't the first stage.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
src/compiler/glsl/linker.cpp

index 3f06e3b26615c5f74db1a543c7195be728af54eb..a8d9cf4ce2a3428c0f5d7e1ce04e48df5b13b0d3 100644 (file)
@@ -3574,7 +3574,7 @@ add_interface_variables(struct gl_shader_program *shProg,
       if (!sha_v)
          return false;
 
-      stages |= build_stageref(shProg, sha_v->name, sha_v->mode);
+      stages |= 1 << stage;
 
       if (!add_program_resource(shProg, programInterface, sha_v, stages))
          return false;