mesa: Only validate SSO shader IO in OpenGL ES or debug context
authorIan Romanick <ian.d.romanick@intel.com>
Thu, 19 May 2016 17:27:12 +0000 (10:27 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 26 May 2016 23:23:53 +0000 (16:23 -0700)
v2: Move later in series to avoid issues with Gallium drivers and debug
contexts.  Suggested by Ilia.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Suggested-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
src/mesa/main/pipelineobj.c
src/mesa/main/shader_query.cpp

index b1501984c9b4c4a91a7c4ff41b7cf59c65caa8a4..5a46cfe2dcda357e872811a8d42736a84d7f646d 100644 (file)
@@ -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;
index 81277b6175c715d2cd4fcfe737c51b8ff1f3a42e..31c0a4eb6fb14760d9195d00a88f621e4b61b032 100644 (file)
@@ -1377,9 +1377,6 @@ validate_io(struct gl_shader_program *producer,
    if (producer == consumer)
       return true;
 
-   if (!producer->IsES && !consumer->IsES)
-      return true;
-
    bool valid = true;
 
    gl_shader_variable const **outputs =