Patch adds ValidProgramUse flag to gl_shader_program that can be used to track if a program is fully utilized by program pipeline. Flag is set by glUseProgramStages and will be used for pipeline validation by the next patch.
Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> Suggested-by: Timothy Arceri <timothy.arc...@collabora.com> --- src/glsl/linker.cpp | 1 + src/mesa/main/mtypes.h | 1 + src/mesa/main/pipelineobj.c | 27 +++++++++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index ae628cd..7e0af44 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -4062,6 +4062,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) prog->LinkStatus = true; /* All error paths will set this to false */ prog->Validated = false; prog->_Used = false; + prog->ValidProgramUse = false; prog->ARB_fragment_coord_conventions_enable = false; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 1eb1e21..770055f 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2746,6 +2746,7 @@ struct gl_shader_program GLboolean Validated; GLboolean _Used; /**< Ever used for drawing? */ GLboolean SamplersValidated; /**< Samplers validated against texture units? */ + GLboolean ValidProgramUse; /**< SSO, is every stage used by the pipeline? */ GLchar *InfoLog; unsigned Version; /**< GLSL version used for linking */ diff --git a/src/mesa/main/pipelineobj.c b/src/mesa/main/pipelineobj.c index 5eda4e5..f4ce3ed 100644 --- a/src/mesa/main/pipelineobj.c +++ b/src/mesa/main/pipelineobj.c @@ -219,6 +219,31 @@ _mesa_reference_pipeline_object_(struct gl_context *ctx, } /** + * Raise a flag if shader programs in pipeline contain + * stages that are not used. This is used by validation later. + */ +static void +update_program_usage(struct gl_pipeline_object *pipe) +{ + unsigned i, j; + for (i = 0; i < MESA_SHADER_STAGES; i++) { + struct gl_shader_program *shProg = pipe->CurrentProgram[i]; + if (!shProg) + continue; + shProg->ValidProgramUse = true; + for (j = 0; j < MESA_SHADER_STAGES; j++) { + if (!shProg->_LinkedShaders[j]) + continue; + /* Make sure that any shader stage is also used in the pipeline. */ + if (shProg != pipe->CurrentProgram[j]) { + shProg->ValidProgramUse = false; + return; + } + } + } +} + +/** * Bound program to severals stages of the pipeline */ void GLAPIENTRY @@ -341,6 +366,8 @@ _mesa_UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program) if ((stages & GL_COMPUTE_SHADER_BIT) != 0) _mesa_use_shader_program(ctx, GL_COMPUTE_SHADER, shProg, pipe); + + update_program_usage(pipe); } /** -- 2.5.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev