summaryrefslogtreecommitdiffstats
path: root/src/glsl/linker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/glsl/linker.cpp')
-rw-r--r--src/glsl/linker.cpp42
1 files changed, 28 insertions, 14 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 22cdd76015a..4172e419105 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -1104,6 +1104,28 @@ assign_attribute_locations(gl_shader_program *prog, unsigned max_attribute_index
}
+/**
+ * Demote shader outputs that are not read to being just plain global variables
+ */
+void
+demote_unread_shader_outputs(gl_shader *sh)
+{
+ foreach_list(node, sh->ir) {
+ ir_variable *const var = ((ir_instruction *) node)->as_variable();
+
+ if ((var == NULL) || (var->mode != ir_var_out))
+ continue;
+
+ /* An 'out' variable is only really a shader output if its value is read
+ * by the following stage.
+ */
+ if (var->location == -1) {
+ var->mode = ir_var_auto;
+ }
+ }
+}
+
+
void
assign_varying_locations(struct gl_shader_program *prog,
gl_shader *producer, gl_shader *consumer)
@@ -1152,19 +1174,7 @@ assign_varying_locations(struct gl_shader_program *prog,
input_index++;
}
- foreach_list(node, producer->ir) {
- ir_variable *const var = ((ir_instruction *) node)->as_variable();
-
- if ((var == NULL) || (var->mode != ir_var_out))
- continue;
-
- /* An 'out' variable is only really a shader output if its value is read
- * by the following stage.
- */
- if (var->location == -1) {
- var->mode = ir_var_auto;
- }
- }
+ demote_unread_shader_outputs(producer);
foreach_list(node, consumer->ir) {
ir_variable *const var = ((ir_instruction *) node)->as_variable();
@@ -1320,7 +1330,7 @@ link_shaders(struct gl_shader_program *prog)
assign_uniform_locations(prog);
- if (prog->_LinkedShaders[0]->Type == GL_VERTEX_SHADER)
+ if (prog->_LinkedShaders[0]->Type == GL_VERTEX_SHADER) {
/* FINISHME: The value of the max_attribute_index parameter is
* FINISHME: implementation dependent based on the value of
* FINISHME: GL_MAX_VERTEX_ATTRIBS. GL_MAX_VERTEX_ATTRIBS must be
@@ -1329,6 +1339,10 @@ link_shaders(struct gl_shader_program *prog)
if (!assign_attribute_locations(prog, 16))
goto done;
+ if (prog->_NumLinkedShaders == 1)
+ demote_unread_shader_outputs(prog->_LinkedShaders[0]);
+ }
+
for (unsigned i = 1; i < prog->_NumLinkedShaders; i++)
assign_varying_locations(prog,
prog->_LinkedShaders[i - 1],