mesa/glsl: move LinkedTransformFeedback from gl_shader_program to gl_program
This will help allow us to store gl_program in the CurrentProgram array rather than gl_shader_program which will allow a bunch of simplifications. Note that we make LinkedTransformFeedback a pointer so we don't waste memory creating a struct for each stage. We also store a pointer to the gl_program that will contain the pointer in gl_shader_program so we can get easy access to the correct stage. Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
@@ -4242,25 +4242,26 @@ build_program_resource_list(struct gl_context *ctx,
|
||||
output_stage, GL_PROGRAM_OUTPUT))
|
||||
return;
|
||||
|
||||
struct gl_transform_feedback_info *linked_xfb =
|
||||
shProg->xfb_program->sh.LinkedTransformFeedback;
|
||||
|
||||
/* Add transform feedback varyings. */
|
||||
if (shProg->LinkedTransformFeedback.NumVarying > 0) {
|
||||
for (int i = 0; i < shProg->LinkedTransformFeedback.NumVarying; i++) {
|
||||
if (linked_xfb->NumVarying > 0) {
|
||||
for (int i = 0; i < linked_xfb->NumVarying; i++) {
|
||||
if (!add_program_resource(shProg, resource_set,
|
||||
GL_TRANSFORM_FEEDBACK_VARYING,
|
||||
&shProg->LinkedTransformFeedback.Varyings[i],
|
||||
0))
|
||||
&linked_xfb->Varyings[i], 0))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add transform feedback buffers. */
|
||||
for (unsigned i = 0; i < ctx->Const.MaxTransformFeedbackBuffers; i++) {
|
||||
if ((shProg->LinkedTransformFeedback.ActiveBuffers >> i) & 1) {
|
||||
shProg->LinkedTransformFeedback.Buffers[i].Binding = i;
|
||||
if ((linked_xfb->ActiveBuffers >> i) & 1) {
|
||||
linked_xfb->Buffers[i].Binding = i;
|
||||
if (!add_program_resource(shProg, resource_set,
|
||||
GL_TRANSFORM_FEEDBACK_BUFFER,
|
||||
&shProg->LinkedTransformFeedback.Buffers[i],
|
||||
0))
|
||||
&linked_xfb->Buffers[i], 0))
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -4587,6 +4588,18 @@ link_varyings_and_uniforms(unsigned first, unsigned last,
|
||||
varying_names = prog->TransformFeedback.VaryingNames;
|
||||
}
|
||||
|
||||
/* Find the program used for xfb. Even if we don't use xfb we still want to
|
||||
* set this so we can fill the default values for program interface query.
|
||||
*/
|
||||
prog->xfb_program = prog->_LinkedShaders[last]->Program;
|
||||
for (int i = MESA_SHADER_GEOMETRY; i >= MESA_SHADER_VERTEX; i--) {
|
||||
if (prog->_LinkedShaders[i] == NULL)
|
||||
continue;
|
||||
|
||||
prog->xfb_program = prog->_LinkedShaders[i]->Program;
|
||||
break;
|
||||
}
|
||||
|
||||
if (num_tfeedback_decls != 0) {
|
||||
/* From GL_EXT_transform_feedback:
|
||||
* A program will fail to link if:
|
||||
|
||||
Reference in New Issue
Block a user