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,
|
unsigned num_tfeedback_decls,
|
||||||
tfeedback_decl *tfeedback_decls, bool has_xfb_qualifiers)
|
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
|
/* Make sure MaxTransformFeedbackBuffers is less than 32 so the bitmask for
|
||||||
* tracking the number of buffers doesn't overflow.
|
* 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 =
|
bool separate_attribs_mode =
|
||||||
prog->TransformFeedback.BufferMode == GL_SEPARATE_ATTRIBS;
|
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 =
|
xfb_prog->sh.LinkedTransformFeedback =
|
||||||
rzalloc(xfb_prog, struct gl_transform_feedback_info);
|
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))
|
output_stage, GL_PROGRAM_OUTPUT))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (shProg->last_vert_prog) {
|
||||||
struct gl_transform_feedback_info *linked_xfb =
|
struct gl_transform_feedback_info *linked_xfb =
|
||||||
shProg->xfb_program->sh.LinkedTransformFeedback;
|
shProg->last_vert_prog->sh.LinkedTransformFeedback;
|
||||||
|
|
||||||
/* Add transform feedback varyings. */
|
/* Add transform feedback varyings. */
|
||||||
if (linked_xfb->NumVarying > 0) {
|
if (linked_xfb->NumVarying > 0) {
|
||||||
|
@ -4258,6 +4259,7 @@ build_program_resource_list(struct gl_context *ctx,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Add uniforms from uniform storage. */
|
/* Add uniforms from uniform storage. */
|
||||||
for (unsigned i = 0; i < shProg->data->NumUniformStorage; i++) {
|
for (unsigned i = 0; i < shProg->data->NumUniformStorage; i++) {
|
||||||
|
@ -4566,15 +4568,12 @@ link_varyings_and_uniforms(unsigned first, unsigned last,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the program used for xfb. Even if we don't use xfb we still want to
|
prog->last_vert_prog = NULL;
|
||||||
* 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--) {
|
for (int i = MESA_SHADER_GEOMETRY; i >= MESA_SHADER_VERTEX; i--) {
|
||||||
if (prog->_LinkedShaders[i] == NULL)
|
if (prog->_LinkedShaders[i] == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
prog->xfb_program = prog->_LinkedShaders[i]->Program;
|
prog->last_vert_prog = prog->_LinkedShaders[i]->Program;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2742,7 +2742,7 @@ struct gl_shader_program
|
||||||
GLchar **VaryingNames; /**< Array [NumVarying] of char * */
|
GLchar **VaryingNames; /**< Array [NumVarying] of char * */
|
||||||
} TransformFeedback;
|
} TransformFeedback;
|
||||||
|
|
||||||
struct gl_program *xfb_program;
|
struct gl_program *last_vert_prog;
|
||||||
|
|
||||||
/** Post-link gl_FragDepth layout for ARB_conservative_depth. */
|
/** Post-link gl_FragDepth layout for ARB_conservative_depth. */
|
||||||
enum gl_frag_depth_layout FragDepthLayout;
|
enum gl_frag_depth_layout FragDepthLayout;
|
||||||
|
|
|
@ -1047,7 +1047,7 @@ get_buffer_property(struct gl_shader_program *shProg,
|
||||||
return 1;
|
return 1;
|
||||||
case GL_ACTIVE_VARIABLES:
|
case GL_ACTIVE_VARIABLES:
|
||||||
struct gl_transform_feedback_info *linked_xfb =
|
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++) {
|
for (int i = 0; i < linked_xfb->NumVarying; i++) {
|
||||||
unsigned index = linked_xfb->Varyings[i].BufferIndex;
|
unsigned index = linked_xfb->Varyings[i].BufferIndex;
|
||||||
struct gl_program_resource *buf_res =
|
struct gl_program_resource *buf_res =
|
||||||
|
|
|
@ -65,9 +65,12 @@ bool
|
||||||
_mesa_transform_feedback_is_using_program(struct gl_context *ctx,
|
_mesa_transform_feedback_is_using_program(struct gl_context *ctx,
|
||||||
struct gl_shader_program *shProg)
|
struct gl_shader_program *shProg)
|
||||||
{
|
{
|
||||||
|
if (!shProg->last_vert_prog)
|
||||||
|
return false;
|
||||||
|
|
||||||
struct using_program_tuple callback_data;
|
struct using_program_tuple callback_data;
|
||||||
callback_data.found = false;
|
callback_data.found = false;
|
||||||
callback_data.prog = shProg->xfb_program;
|
callback_data.prog = shProg->last_vert_prog;
|
||||||
|
|
||||||
_mesa_HashWalk(ctx->TransformFeedback.Objects,
|
_mesa_HashWalk(ctx->TransformFeedback.Objects,
|
||||||
active_xfb_object_references_program, &callback_data);
|
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[],
|
const GLuint outputMapping[],
|
||||||
struct pipe_stream_output_info *so)
|
struct pipe_stream_output_info *so)
|
||||||
{
|
{
|
||||||
|
if (!glsl_to_tgsi->shader_program->last_vert_prog)
|
||||||
|
return;
|
||||||
|
|
||||||
struct gl_transform_feedback_info *info =
|
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);
|
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.type = PIPE_SHADER_IR_NIR;
|
||||||
stvp->tgsi.ir.nir = 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->result_to_output,
|
||||||
&stvp->tgsi.stream_output);
|
&stvp->tgsi.stream_output);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue