On 7 November 2011 18:18, Marek Olšák <span dir="ltr">&lt;<a href="mailto:maraeo@gmail.com">maraeo@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Tue, Nov 8, 2011 at 1:13 AM, Paul Berry &lt;<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>&gt; wrote:<br>
</div><div><div class="h5">&gt; @@ -1806,16 +2187,50 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)<br>
&gt;         break;<br>
&gt;    }<br>
&gt;<br>
&gt; +   /* From GL_EXT_transform_feedback:<br>
&gt; +    *   A program will fail to link if:<br>
&gt; +    *<br>
&gt; +    *   * the &lt;count&gt; specified by TransformFeedbackVaryingsEXT is<br>
&gt; +    *     non-zero, but the program object has no vertex or geometry<br>
&gt; +    *     shader;<br>
&gt; +    */<br>
&gt; +   if (prog-&gt;TransformFeedback.NumVarying &gt; 0 &amp;&amp;<br>
&gt; +       prev &gt;= MESA_SHADER_FRAGMENT) {<br>
&gt; +      linker_error(prog, &quot;Transform feedback varyings specified, but &quot;<br>
&gt; +                   &quot;no vertex or geometry shader is present.&quot;);<br>
&gt; +      goto done;<br>
&gt; +   }<br>
&gt; +<br>
&gt;    for (unsigned i = prev + 1; i &lt; MESA_SHADER_TYPES; i++) {<br>
&gt;       if (prog-&gt;_LinkedShaders[i] == NULL)<br>
&gt;         continue;<br>
&gt;<br>
&gt; +      tfeedback_decl *tfeedback_decls = NULL;<br>
&gt; +      unsigned num_tfeedback_decls = 0;<br>
&gt; +      if (i == MESA_SHADER_FRAGMENT &amp;&amp;<br>
&gt; +          prog-&gt;TransformFeedback.NumVarying != 0) {<br>
&gt; +         num_tfeedback_decls = prog-&gt;TransformFeedback.NumVarying;<br>
&gt; +         tfeedback_decls = ralloc_array(mem_ctx, tfeedback_decl,<br>
&gt; +                                        prog-&gt;TransformFeedback.NumVarying);<br>
&gt; +         if (!parse_tfeedback_decls(prog, mem_ctx, num_tfeedback_decls,<br>
&gt; +                                    prog-&gt;TransformFeedback.VaryingNames,<br>
&gt; +                                    tfeedback_decls))<br>
&gt; +            goto done;<br>
&gt; +      }<br>
&gt; +<br>
&gt;       if (!assign_varying_locations(ctx, prog,<br>
&gt;                                    prog-&gt;_LinkedShaders[prev],<br>
&gt; -                                   prog-&gt;_LinkedShaders[i])) {<br>
&gt; +                                   prog-&gt;_LinkedShaders[i],<br>
&gt; +                                    num_tfeedback_decls, tfeedback_decls)) {<br>
&gt;         goto done;<br>
&gt;       }<br>
&gt;<br>
&gt; +      if (i == MESA_SHADER_FRAGMENT) {<br>
&gt; +         if (!store_tfeedback_info(ctx, prog, num_tfeedback_decls,<br>
&gt; +                                   tfeedback_decls))<br>
&gt; +            goto done;<br>
&gt; +      }<br>
&gt; +<br>
&gt;       prev = i;<br>
&gt;    }<br>
<br>
</div></div>Also I realized that this part won&#39;t work if there is no fragment<br>
shader. Transform feedback varyings should be assigned *regardless* of<br>
the presence of a fragment shader.<br></blockquote><div><br>Good catch, I forgot to think about that case.  That will require modifying assign_varying_locations to accept NULL for the consumer, and modifying the control flow in link_shaders slightly.  I&#39;ll post a revised patch shortly.<br>
</div></div>