diff options
| author | Ian Romanick <ian.d.romanick@intel.com> | 2010-08-17 14:55:50 -0700 | 
|---|---|---|
| committer | Ian Romanick <ian.d.romanick@intel.com> | 2010-08-17 14:57:18 -0700 | 
| commit | 40e114b5dc60c5e196a86e33c2436b099ed9f392 (patch) | |
| tree | 20ebde00d99d8aa7bf2ed9deb9fdd144c1c9cd7f /src | |
| parent | 5a38e70d59eb54aa375fb0f19c824bb74b71486d (diff) | |
linker: Demote user-defined varyings in the VS-only case
Fixes piglit test case glsl-vs-ff-frag and bugzilla #29623.
Diffstat (limited to 'src')
| -rw-r--r-- | src/glsl/linker.cpp | 42 | 
1 files changed, 28 insertions, 14 deletions
| diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 22cdd76015..4172e41910 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], | 
