From: Ian Romanick <ian.d.roman...@intel.com> Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> Suggested-by: Timothy Arceri <timothy.arc...@collabora.com> Cc: Timothy Arceri <timothy.arc...@collabora.com> --- src/mesa/main/pipelineobj.c | 18 ++++++++++++++++-- src/mesa/main/shader_query.cpp | 12 ++++-------- 2 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/src/mesa/main/pipelineobj.c b/src/mesa/main/pipelineobj.c index b150198..5a46cfe 100644 --- a/src/mesa/main/pipelineobj.c +++ b/src/mesa/main/pipelineobj.c @@ -906,7 +906,8 @@ _mesa_validate_program_pipeline(struct gl_context* ctx, /* Validate inputs against outputs, this cannot be done during linking * since programs have been linked separately from each other. * - * From OpenGL 4.5 Core spec: + * Section 11.1.3.11 (Validation) of the OpenGL 4.5 Core Profile spec says: + * * "Separable program objects may have validation failures that cannot be * detected without the complete program pipeline. Mismatched interfaces, * improper usage of program objects together, and the same @@ -914,8 +915,21 @@ _mesa_validate_program_pipeline(struct gl_context* ctx, * program objects." * * OpenGL ES 3.1 specification has the same text. + * + * Section 11.1.3.11 (Validation) of the OpenGL ES spec also says: + * + * An INVALID_OPERATION error is generated by any command that transfers + * vertices to the GL or launches compute work if the current set of + * active program objects cannot be executed, for reasons including: + * + * * The current program pipeline object contains a shader interface + * that doesn't have an exact match (see section 7.4.1) + * + * Based on this, only perform the most-strict checking on ES or when the + * application has created a debug context. */ - if (!_mesa_validate_pipeline_io(pipe)) + if ((_mesa_is_gles(ctx) || (ctx->Const.ContextFlags & GL_CONTEXT_FLAG_DEBUG_BIT)) && + !_mesa_validate_pipeline_io(pipe)) return GL_FALSE; pipe->Validated = GL_TRUE; diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp index 9e18a1c..a37c179 100644 --- a/src/mesa/main/shader_query.cpp +++ b/src/mesa/main/shader_query.cpp @@ -1372,7 +1372,7 @@ _mesa_get_program_resourceiv(struct gl_shader_program *shProg, static bool validate_io(const struct gl_shader *producer, - const struct gl_shader *consumer, bool isES) + const struct gl_shader *consumer) { assert(producer && consumer); unsigned inputs = 0, outputs = 0; @@ -1416,10 +1416,6 @@ validate_io(const struct gl_shader *producer, * packing makes this challenging. */ - /* Currently no matching done for desktop. */ - if (!isES) - return true; - /* For each output in a, find input in b and do any required checks. */ foreach_in_list(ir_instruction, out, producer->ir) { ir_variable *out_var = out->as_variable(); @@ -1502,9 +1498,9 @@ _mesa_validate_pipeline_io(struct gl_pipeline_object *pipeline) break; if (!validate_io(shProg[prev]->_LinkedShaders[prev], - shProg[idx]->_LinkedShaders[idx], - shProg[prev]->IsES || shProg[idx]->IsES)) - return false; + shProg[idx]->_LinkedShaders[idx])) + return false; + prev = idx; } } -- 2.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev