mesa: Do (TCS && !TES) draw time validation in ES as well.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 11 Feb 2017 04:40:22 +0000 (20:40 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 13 Feb 2017 05:09:14 +0000 (21:09 -0800)
Now that we have OES_tessellation_shader, the same situation can occur
in ES too, not just GL core profile.

Having a TCS but no TES may confuse drivers - i965 crashes, for example.

This prevents regressions in
ES31-CTS.core.tessellation_shader.single.xfb_captures_data_from_correct_stage
with some SSO pipeline validation changes I'm making.

v2: Add an ES spec citation (suggested by Alejandro)

Cc: "17.0" <mesa-stable@lists.freedesktop.org>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
src/mesa/main/api_validate.c

index 6c95701ea0ed90369e0dcca1899bb51c6a2eb4e5..e7c439c431ae1f715e988371d9b61f94a74ac6c1 100644 (file)
@@ -236,6 +236,32 @@ check_valid_to_render(struct gl_context *ctx, const char *function)
       return false;
    }
 
+   /* Section 11.2 (Tessellation) of the ES 3.2 spec says:
+    *
+    * "An INVALID_OPERATION error is generated by any command that
+    *  transfers vertices to the GL if the current program state has
+    *  one but not both of a tessellation control shader and tessellation
+    *  evaluation shader."
+    *
+    * The OpenGL spec argues that this is allowed because a tess ctrl shader
+    * without a tess eval shader can be used with transform feedback.
+    * However, glBeginTransformFeedback doesn't allow GL_PATCHES and
+    * therefore doesn't allow tessellation.
+    *
+    * Further investigation showed that this is indeed a spec bug and
+    * a tess ctrl shader without a tess eval shader shouldn't have been
+    * allowed, because there is no API in GL 4.0 that can make use this
+    * to produce something useful.
+    *
+    * Also, all vendors except one don't support a tess ctrl shader without
+    * a tess eval shader anyway.
+    */
+   if (ctx->TessCtrlProgram._Current && !ctx->TessEvalProgram._Current) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "%s(tess eval shader is missing)", function);
+      return false;
+   }
+
    switch (ctx->API) {
    case API_OPENGLES2:
       /* For ES2, we can draw if we have a vertex program/shader). */
@@ -260,25 +286,6 @@ check_valid_to_render(struct gl_context *ctx, const char *function)
          return false;
       }
 
-      /* The spec argues that this is allowed because a tess ctrl shader
-       * without a tess eval shader can be used with transform feedback.
-       * However, glBeginTransformFeedback doesn't allow GL_PATCHES and
-       * therefore doesn't allow tessellation.
-       *
-       * Further investigation showed that this is indeed a spec bug and
-       * a tess ctrl shader without a tess eval shader shouldn't have been
-       * allowed, because there is no API in GL 4.0 that can make use this
-       * to produce something useful.
-       *
-       * Also, all vendors except one don't support a tess ctrl shader without
-       * a tess eval shader anyway.
-       */
-      if (ctx->TessCtrlProgram._Current && !ctx->TessEvalProgram._Current) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "%s(tess eval shader is missing)", function);
-         return false;
-      }
-
       /* Section 7.3 (Program Objects) of the OpenGL 4.5 Core Profile spec
        * says:
        *