glsl: don't dead code remove SSO varyings marked as active
authorGregory Hainaut <gregory.hainaut@gmail.com>
Sun, 25 Oct 2015 14:01:35 +0000 (15:01 +0100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Tue, 1 Dec 2015 01:46:32 +0000 (12:46 +1100)
GL_ARB_separate_shader_objects allow matching by name variable or block
interface. Input varyings can't be removed because it is will impact the
location assignment.

This fixes the bug 79783 and likely any application that uses
GL_ARB_separate_shader_objects extension.

V2 (by Timothy Arceri):
* simplify now that builtins are not set as always active

Signed-off-by: Gregory Hainaut <gregory.hainaut@gmail.com>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
https://bugs.freedesktop.org/show_bug.cgi?id=79783

src/glsl/opt_dead_code.cpp

index c5be166e75aa0ddb5cb29f0ee3559e1ee4e137cf..c2ce0b94eceed925d772aabcd8bda29b781bd3c5 100644 (file)
@@ -75,6 +75,20 @@ do_dead_code(exec_list *instructions, bool uniform_locations_assigned)
          || !entry->declaration)
         continue;
 
+      /* Section 7.4.1 (Shader Interface Matching) of the OpenGL 4.5
+       * (Core Profile) spec says:
+       *
+       *    "With separable program objects, interfaces between shader
+       *    stages may involve the outputs from one program object and the
+       *    inputs from a second program object.  For such interfaces, it is
+       *    not possible to detect mismatches at link time, because the
+       *    programs are linked separately. When each such program is
+       *    linked, all inputs or outputs interfacing with another program
+       *    stage are treated as active."
+       */
+      if (entry->var->data.always_active_io)
+         continue;
+
       if (!entry->assign_list.is_empty()) {
         /* Remove all the dead assignments to the variable we found.
          * Don't do so if it's a shader or function output, though.