[Mesa-dev] [PATCH 3/3] mesa: add more draw time validation for separate shader programs
Tapani Pälli
tapani.palli at intel.com
Mon Dec 7 01:29:51 PST 2015
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."
+ *
+ */
+ if (ctx->Pipeline.Current) {
+ struct gl_pipeline_object *pipe = ctx->Pipeline.Current;
+ unsigned i;
+ 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;
--
2.5.0
More information about the mesa-dev
mailing list