st/mesa/glsl: change xfb_program field to last_vert_prog
Now that the i965 backend doesn't depend on this field we can make it more generic and short circuit a bunch of code paths. The new field will be used in a following patch for another clean-up. Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
c505d6d852
commit
f86d15ed94
|
@ -1076,6 +1076,9 @@ store_tfeedback_info(struct gl_context *ctx, struct gl_shader_program *prog,
|
|||
unsigned num_tfeedback_decls,
|
||||
tfeedback_decl *tfeedback_decls, bool has_xfb_qualifiers)
|
||||
{
|
||||
if (!prog->last_vert_prog)
|
||||
return true;
|
||||
|
||||
/* Make sure MaxTransformFeedbackBuffers is less than 32 so the bitmask for
|
||||
* tracking the number of buffers doesn't overflow.
|
||||
*/
|
||||
|
@ -1084,7 +1087,7 @@ store_tfeedback_info(struct gl_context *ctx, struct gl_shader_program *prog,
|
|||
bool separate_attribs_mode =
|
||||
prog->TransformFeedback.BufferMode == GL_SEPARATE_ATTRIBS;
|
||||
|
||||
struct gl_program *xfb_prog = prog->xfb_program;
|
||||
struct gl_program *xfb_prog = prog->last_vert_prog;
|
||||
xfb_prog->sh.LinkedTransformFeedback =
|
||||
rzalloc(xfb_prog, struct gl_transform_feedback_info);
|
||||
|
||||
|
|
|
@ -4235,8 +4235,9 @@ build_program_resource_list(struct gl_context *ctx,
|
|||
output_stage, GL_PROGRAM_OUTPUT))
|
||||
return;
|
||||
|
||||
if (shProg->last_vert_prog) {
|
||||
struct gl_transform_feedback_info *linked_xfb =
|
||||
shProg->xfb_program->sh.LinkedTransformFeedback;
|
||||
shProg->last_vert_prog->sh.LinkedTransformFeedback;
|
||||
|
||||
/* Add transform feedback varyings. */
|
||||
if (linked_xfb->NumVarying > 0) {
|
||||
|
@ -4258,6 +4259,7 @@ build_program_resource_list(struct gl_context *ctx,
|
|||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Add uniforms from uniform storage. */
|
||||
for (unsigned i = 0; i < shProg->data->NumUniformStorage; i++) {
|
||||
|
@ -4566,15 +4568,12 @@ link_varyings_and_uniforms(unsigned first, unsigned last,
|
|||
return false;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
prog->last_vert_prog = NULL;
|
||||
for (int i = MESA_SHADER_GEOMETRY; i >= MESA_SHADER_VERTEX; i--) {
|
||||
if (prog->_LinkedShaders[i] == NULL)
|
||||
continue;
|
||||
|
||||
prog->xfb_program = prog->_LinkedShaders[i]->Program;
|
||||
prog->last_vert_prog = prog->_LinkedShaders[i]->Program;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -2742,7 +2742,7 @@ struct gl_shader_program
|
|||
GLchar **VaryingNames; /**< Array [NumVarying] of char * */
|
||||
} TransformFeedback;
|
||||
|
||||
struct gl_program *xfb_program;
|
||||
struct gl_program *last_vert_prog;
|
||||
|
||||
/** Post-link gl_FragDepth layout for ARB_conservative_depth. */
|
||||
enum gl_frag_depth_layout FragDepthLayout;
|
||||
|
|
|
@ -1047,7 +1047,7 @@ get_buffer_property(struct gl_shader_program *shProg,
|
|||
return 1;
|
||||
case GL_ACTIVE_VARIABLES:
|
||||
struct gl_transform_feedback_info *linked_xfb =
|
||||
shProg->xfb_program->sh.LinkedTransformFeedback;
|
||||
shProg->last_vert_prog->sh.LinkedTransformFeedback;
|
||||
for (int i = 0; i < linked_xfb->NumVarying; i++) {
|
||||
unsigned index = linked_xfb->Varyings[i].BufferIndex;
|
||||
struct gl_program_resource *buf_res =
|
||||
|
|
|
@ -65,9 +65,12 @@ bool
|
|||
_mesa_transform_feedback_is_using_program(struct gl_context *ctx,
|
||||
struct gl_shader_program *shProg)
|
||||
{
|
||||
if (!shProg->last_vert_prog)
|
||||
return false;
|
||||
|
||||
struct using_program_tuple callback_data;
|
||||
callback_data.found = false;
|
||||
callback_data.prog = shProg->xfb_program;
|
||||
callback_data.prog = shProg->last_vert_prog;
|
||||
|
||||
_mesa_HashWalk(ctx->TransformFeedback.Objects,
|
||||
active_xfb_object_references_program, &callback_data);
|
||||
|
|
|
@ -7003,8 +7003,11 @@ st_translate_stream_output_info(glsl_to_tgsi_visitor *glsl_to_tgsi,
|
|||
const GLuint outputMapping[],
|
||||
struct pipe_stream_output_info *so)
|
||||
{
|
||||
if (!glsl_to_tgsi->shader_program->last_vert_prog)
|
||||
return;
|
||||
|
||||
struct gl_transform_feedback_info *info =
|
||||
glsl_to_tgsi->shader_program->xfb_program->sh.LinkedTransformFeedback;
|
||||
glsl_to_tgsi->shader_program->last_vert_prog->sh.LinkedTransformFeedback;
|
||||
st_translate_stream_output_info2(info, outputMapping, so);
|
||||
}
|
||||
|
||||
|
|
|
@ -390,9 +390,13 @@ st_translate_vertex_program(struct st_context *st,
|
|||
stvp->tgsi.type = PIPE_SHADER_IR_NIR;
|
||||
stvp->tgsi.ir.nir = nir;
|
||||
|
||||
st_translate_stream_output_info2(stvp->shader_program->xfb_program->sh.LinkedTransformFeedback,
|
||||
struct gl_program *prog = stvp->shader_program->last_vert_prog;
|
||||
if (prog) {
|
||||
st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback,
|
||||
stvp->result_to_output,
|
||||
&stvp->tgsi.stream_output);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue