On Tue, Nov 8, 2011 at 1:13 AM, Paul Berry <stereotype...@gmail.com> wrote: > @@ -1806,16 +2187,50 @@ link_shaders(struct gl_context *ctx, struct > gl_shader_program *prog) > break; > } > > + /* From GL_EXT_transform_feedback: > + * A program will fail to link if: > + * > + * * the <count> specified by TransformFeedbackVaryingsEXT is > + * non-zero, but the program object has no vertex or geometry > + * shader; > + */ > + if (prog->TransformFeedback.NumVarying > 0 && > + prev >= MESA_SHADER_FRAGMENT) { > + linker_error(prog, "Transform feedback varyings specified, but " > + "no vertex or geometry shader is present."); > + goto done; > + } > + > for (unsigned i = prev + 1; i < MESA_SHADER_TYPES; i++) { > if (prog->_LinkedShaders[i] == NULL) > continue; > > + tfeedback_decl *tfeedback_decls = NULL; > + unsigned num_tfeedback_decls = 0; > + if (i == MESA_SHADER_FRAGMENT && > + prog->TransformFeedback.NumVarying != 0) { > + num_tfeedback_decls = prog->TransformFeedback.NumVarying; > + tfeedback_decls = ralloc_array(mem_ctx, tfeedback_decl, > + prog->TransformFeedback.NumVarying); > + if (!parse_tfeedback_decls(prog, mem_ctx, num_tfeedback_decls, > + prog->TransformFeedback.VaryingNames, > + tfeedback_decls)) > + goto done; > + } > + > if (!assign_varying_locations(ctx, prog, > prog->_LinkedShaders[prev], > - prog->_LinkedShaders[i])) { > + prog->_LinkedShaders[i], > + num_tfeedback_decls, tfeedback_decls)) { > goto done; > } > > + if (i == MESA_SHADER_FRAGMENT) { > + if (!store_tfeedback_info(ctx, prog, num_tfeedback_decls, > + tfeedback_decls)) > + goto done; > + } > + > prev = i; > }
Also I realized that this part won't work if there is no fragment shader. Transform feedback varyings should be assigned *regardless* of the presence of a fragment shader. Marek _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev