[Mesa-dev] [PATCH 3/3] mesa: add more draw time validation for separate shader programs
Timothy Arceri
t_arceri at yahoo.com.au
Mon Dec 7 15:56:02 PST 2015
On Mon, 2015-12-07 at 11:29 +0200, Tapani Pälli wrote:
> Validation checks that we do not have active shader stages that are
> not used by the pipeline.
>
> This fixes a subtest in following CTS test:
> ES31-CTS.sepshaderobjs.StateInteraction
>
> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> ---
> src/mesa/main/api_validate.c | 38
> ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 38 insertions(+)
>
> diff --git a/src/mesa/main/api_validate.c
> b/src/mesa/main/api_validate.c
> index d693ec6..6a0cbb0 100644
> --- a/src/mesa/main/api_validate.c
> +++ b/src/mesa/main/api_validate.c
> @@ -47,6 +47,44 @@ check_valid_to_render(struct gl_context *ctx,
> const char *function)
>
> switch (ctx->API) {
> case API_OPENGLES2:
> + /* If SSO in use, validate that all linked program stages are
> used by
> + * the current pipeline.
> + *
> + * OpenGL ES 3.1 spec (11.1.3.11 Validation):
> + *
> + * "An INVALID_OPERATION error is generated by any command
> that trans-
> + * fers vertices to the GL or launches compute work if the
> current set
> + * of active program objects cannot be executed, for
> reasons including:
> + *
> + * ...
> + *
> + * "A program object is active for at least one, but not
> all of
> + * the shader stages that were present when the program was
> linked."
> + *
> + */
Doesn't this need to be in _mesa_validate_program_pipeline() with all
the other validation otherwise it won't set the validation flag to
false when we call ValidateProgramPipeline()
> + if (ctx->Pipeline.Current) {
> + struct gl_pipeline_object *pipe = ctx->Pipeline.Current;
> + unsigned i;
If my thinking in patch 2 is correct you could just have:
if (!pipe->ValidProgramUse) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"Shader program active for shader stages that"
"are not used by the pipeline");
return false;
}
> + for (i = 0; i < MESA_SHADER_STAGES; i++) {
> + if (!pipe->CurrentProgram[i])
> + continue;
> +
> + /* Check that each active stage of linked program is
> used.
> + * This is done by comparing ActiveStages masks of
> program and
> + * pipeline. Program mask must not contain active
> stages that
> + * are not marked used by the pipeline.
> + */
> + struct gl_shader_program *shProg = pipe
> ->CurrentProgram[i];
> + if (((pipe->ActiveStages & shProg->ActiveStages) ^
> + shProg->ActiveStages) != 0) {
> + _mesa_error(ctx, GL_INVALID_OPERATION,
> + "Shader program active for shader stages
> that "
> + "are not used by the pipeline");
> + return false;
> + }
> + }
> + }
> +
> /* For ES2, we can draw if we have a vertex program/shader).
> */
> return ctx->VertexProgram._Current != NULL;
>
More information about the mesa-dev
mailing list