<div dir="ltr">Hi Timothy,<div><br></div><div>Thanks for the review! Space was removed. Can you please push this patch since I haven't got write permissions ?</div><div><br></div><div>Regards,</div><div>Vadym</div></div><br><div class="gmail_quote"><div dir="ltr">вт, 28 авг. 2018 г. в 10:32, Vadym Shovkoplias <<a href="mailto:vadim.shovkoplias@gmail.com">vadim.shovkoplias@gmail.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: "vadym.shovkoplias" <<a href="mailto:vadym.shovkoplias@globallogic.com" target="_blank">vadym.shovkoplias@globallogic.com</a>><br>
<br>
During intra stage linking some out variables can be dropped because<br>
it is not used in a shader with the main function. But these out vars<br>
can be referenced on later stages which can lead to further linking<br>
errors.<br>
<br>
Bugzilla: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=105731" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=105731</a><br>
Signed-off-by: Vadym Shovkoplias <<a href="mailto:vadym.shovkoplias@globallogic.com" target="_blank">vadym.shovkoplias@globallogic.com</a>><br>
---<br>
 src/compiler/glsl/linker.cpp | 37 ++++++++++++++++++++++++++++++++++++<br>
 1 file changed, 37 insertions(+)<br>
<br>
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp<br>
index 3ce78fe642..dbd76b7fcc 100644<br>
--- a/src/compiler/glsl/linker.cpp<br>
+++ b/src/compiler/glsl/linker.cpp<br>
@@ -2187,6 +2187,40 @@ link_cs_input_layout_qualifiers(struct gl_shader_program *prog,<br>
    }<br>
 }<br>
<br>
+/**<br>
+ * Link all out variables on a single stage which are not<br>
+ * directly used in a shader with the main function.<br>
+ */<br>
+static void<br>
+link_output_variables(struct gl_linked_shader *linked_shader,<br>
+                      struct gl_shader **shader_list,<br>
+                      unsigned num_shaders)<br>
+{<br>
+   struct glsl_symbol_table *symbols = linked_shader->symbols;<br>
+<br>
+   for (unsigned i = 0; i < num_shaders; i++) {<br>
+<br>
+      /* Skip shader object with main function */<br>
+      if (shader_list[i]->symbols->get_function("main"))<br>
+         continue;<br>
+<br>
+      foreach_in_list (ir_instruction, ir, shader_list[i]->ir) {<br>
+         if (ir->ir_type != ir_type_variable)<br>
+            continue;<br>
+<br>
+         ir_variable *const var = (ir_variable *) ir;<br>
+<br>
+         if (var->data.mode == ir_var_shader_out &&<br>
+               !symbols->get_variable(var->name)) {<br>
+            symbols->add_variable(var);<br>
+            linked_shader->ir->push_head(var);<br>
+         }<br>
+      }<br>
+   }<br>
+<br>
+   return;<br>
+}<br>
+<br>
<br>
 /**<br>
  * Combine a group of shaders for a single stage to generate a linked shader<br>
@@ -2352,6 +2386,9 @@ link_intrastage_shaders(void *mem_ctx,<br>
       return NULL;<br>
    }<br>
<br>
+   if (linked->Stage != MESA_SHADER_FRAGMENT)<br>
+      link_output_variables(linked, shader_list, num_shaders);<br>
+<br>
    /* Make a pass over all variable declarations to ensure that arrays with<br>
     * unspecified sizes have a size specified.  The size is inferred from the<br>
     * max_array_access field.<br>
-- <br>
2.18.0<br>
<br>
</blockquote></div>