Signed-off-by: Gregory Hainaut <[email protected]>
---
src/glsl/linker.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index fd69dbc..a4a8ab4 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -3378,6 +3378,51 @@ link_assign_subroutine_types(struct gl_shader_program
*prog)
}
}
+static void
+set_interstage_io(struct gl_shader_program *prog)
+{
+ unsigned first, last;
+
+ /* In monolithic build, IO can be freely optimized */
+ if (!prog->SeparateShader)
+ return;
+
+ first = MESA_SHADER_STAGES;
+ last = 0;
+
+ /* Determine first and last stage. Excluding the compute stage */
+ for (unsigned i = 0; i < MESA_SHADER_COMPUTE; i++) {
+ if (!prog->_LinkedShaders[i])
+ continue;
+ if (first == MESA_SHADER_STAGES)
+ first = i;
+ last = i;
+ }
+
+ if (first == MESA_SHADER_STAGES)
+ return;
+
+ for (unsigned stage = 0; stage < MESA_SHADER_STAGES; stage++) {
+ gl_shader *sh = prog->_LinkedShaders[stage];
+ if (!sh)
+ continue;
+
+ if (first == last) {
+ /* Single shader program */
+ if (first != MESA_SHADER_VERTEX)
+ ir_set_not_interstage_io(sh->ir, ir_var_shader_in);
+ if (first != MESA_SHADER_FRAGMENT)
+ ir_set_not_interstage_io(sh->ir, ir_var_shader_out);
+ } else {
+ /* Multiple shaders program */
+ if (stage == first && stage != MESA_SHADER_VERTEX)
+ ir_set_not_interstage_io(sh->ir, ir_var_shader_in);
+ else if (stage == last && stage != MESA_SHADER_FRAGMENT)
+ ir_set_not_interstage_io(sh->ir, ir_var_shader_out);
+ }
+ }
+}
+
void
link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
{
@@ -3637,6 +3682,8 @@ link_shaders(struct gl_context *ctx, struct
gl_shader_program *prog)
}
}
+ set_interstage_io(prog);
+
if (!interstage_cross_validate_uniform_blocks(prog))
goto done;
--
2.1.4
_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev