mesa/version: only enable GL4.1 with correct limits.
[mesa.git] / src / mesa / main / condrender.c
index 77e4b95ee8f2e4171c51859f779264970533f7e4..320003aa73f218b36e5e4449d75d92f3324ed3f0 100644 (file)
 #include "queryobj.h"
 
 
+static ALWAYS_INLINE void
+begin_conditional_render(struct gl_context *ctx, GLuint queryId, GLenum mode,
+                         bool no_error)
+{
+   struct gl_query_object *q = NULL;
+
+   assert(ctx->Query.CondRenderMode == GL_NONE);
+
+   if (queryId != 0)
+      q = _mesa_lookup_query_object(ctx, queryId);
+
+   if (!no_error) {
+      /* Section 2.14 (Conditional Rendering) of the OpenGL 3.0 spec says:
+       *
+       *     "The error INVALID_VALUE is generated if <id> is not the name of an
+       *     existing query object query."
+       */
+      if (!q) {
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glBeginConditionalRender(bad queryId=%u)", queryId);
+         return;
+      }
+      assert(q->Id == queryId);
+
+      switch (mode) {
+      case GL_QUERY_WAIT:
+      case GL_QUERY_NO_WAIT:
+      case GL_QUERY_BY_REGION_WAIT:
+      case GL_QUERY_BY_REGION_NO_WAIT:
+         break; /* OK */
+      case GL_QUERY_WAIT_INVERTED:
+      case GL_QUERY_NO_WAIT_INVERTED:
+      case GL_QUERY_BY_REGION_WAIT_INVERTED:
+      case GL_QUERY_BY_REGION_NO_WAIT_INVERTED:
+         if (ctx->Extensions.ARB_conditional_render_inverted)
+            break; /* OK */
+         /* fallthrough - invalid */
+      default:
+         _mesa_error(ctx, GL_INVALID_ENUM, "glBeginConditionalRender(mode=%s)",
+                     _mesa_enum_to_string(mode));
+         return;
+      }
+
+      /* Section 2.14 (Conditional Rendering) of the OpenGL 3.0 spec says:
+       *
+       *     "The error INVALID_OPERATION is generated if <id> is the name of a
+       *     query object with a target other than SAMPLES_PASSED, or <id> is
+       *     the name of a query currently in progress."
+       */
+      if ((q->Target != GL_SAMPLES_PASSED &&
+           q->Target != GL_ANY_SAMPLES_PASSED &&
+           q->Target != GL_ANY_SAMPLES_PASSED_CONSERVATIVE &&
+           q->Target != GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB &&
+           q->Target != GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB) || q->Active) {
+         _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginConditionalRender()");
+         return;
+      }
+   }
+
+   ctx->Query.CondRenderQuery = q;
+   ctx->Query.CondRenderMode = mode;
+
+   if (ctx->Driver.BeginConditionalRender)
+      ctx->Driver.BeginConditionalRender(ctx, q, mode);
+}
+
+
+void GLAPIENTRY
+_mesa_BeginConditionalRender_no_error(GLuint queryId, GLenum mode)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   begin_conditional_render(ctx, queryId, mode, true);
+}
+
+
 void GLAPIENTRY
 _mesa_BeginConditionalRender(GLuint queryId, GLenum mode)
 {
-   struct gl_query_object *q = NULL;
    GET_CURRENT_CONTEXT(ctx);
 
    /* Section 2.14 (Conditional Rendering) of the OpenGL 3.0 spec says:
@@ -55,60 +129,28 @@ _mesa_BeginConditionalRender(GLuint queryId, GLenum mode)
       return;
    }
 
-   assert(ctx->Query.CondRenderMode == GL_NONE);
+   begin_conditional_render(ctx, queryId, mode, false);
+}
 
-   /* Section 2.14 (Conditional Rendering) of the OpenGL 3.0 spec says:
-    *
-    *     "The error INVALID_VALUE is generated if <id> is not the name of an
-    *     existing query object query."
-    */
-   if (queryId != 0)
-      q = _mesa_lookup_query_object(ctx, queryId);
 
-   if (!q) {
-      _mesa_error(ctx, GL_INVALID_VALUE,
-                  "glBeginConditionalRender(bad queryId=%u)", queryId);
-      return;
-   }
-   assert(q->Id == queryId);
+static void
+end_conditional_render(struct gl_context *ctx)
+{
+   FLUSH_VERTICES(ctx, 0x0);
 
-   switch (mode) {
-   case GL_QUERY_WAIT:
-   case GL_QUERY_NO_WAIT:
-   case GL_QUERY_BY_REGION_WAIT:
-   case GL_QUERY_BY_REGION_NO_WAIT:
-      break; /* OK */
-   case GL_QUERY_WAIT_INVERTED:
-   case GL_QUERY_NO_WAIT_INVERTED:
-   case GL_QUERY_BY_REGION_WAIT_INVERTED:
-   case GL_QUERY_BY_REGION_NO_WAIT_INVERTED:
-      if (ctx->Extensions.ARB_conditional_render_inverted)
-         break; /* OK */
-      /* fallthrough - invalid */
-   default:
-      _mesa_error(ctx, GL_INVALID_ENUM, "glBeginConditionalRender(mode=%s)",
-                  _mesa_lookup_enum_by_nr(mode));
-      return;
-   }
+   if (ctx->Driver.EndConditionalRender)
+      ctx->Driver.EndConditionalRender(ctx, ctx->Query.CondRenderQuery);
 
-   /* Section 2.14 (Conditional Rendering) of the OpenGL 3.0 spec says:
-    *
-    *     "The error INVALID_OPERATION is generated if <id> is the name of a
-    *     query object with a target other than SAMPLES_PASSED, or <id> is the
-    *     name of a query currently in progress."
-    */
-   if ((q->Target != GL_SAMPLES_PASSED &&
-        q->Target != GL_ANY_SAMPLES_PASSED &&
-        q->Target != GL_ANY_SAMPLES_PASSED_CONSERVATIVE) || q->Active) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginConditionalRender()");
-      return;
-   }
+   ctx->Query.CondRenderQuery = NULL;
+   ctx->Query.CondRenderMode = GL_NONE;
+}
 
-   ctx->Query.CondRenderQuery = q;
-   ctx->Query.CondRenderMode = mode;
 
-   if (ctx->Driver.BeginConditionalRender)
-      ctx->Driver.BeginConditionalRender(ctx, q, mode);
+void APIENTRY
+_mesa_EndConditionalRender_no_error(void)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   end_conditional_render(ctx);
 }
 
 
@@ -117,18 +159,12 @@ _mesa_EndConditionalRender(void)
 {
    GET_CURRENT_CONTEXT(ctx);
 
-   FLUSH_VERTICES(ctx, 0x0);
-
    if (!ctx->Extensions.NV_conditional_render || !ctx->Query.CondRenderQuery) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glEndConditionalRender()");
       return;
    }
 
-   if (ctx->Driver.EndConditionalRender)
-      ctx->Driver.EndConditionalRender(ctx, ctx->Query.CondRenderQuery);
-
-   ctx->Query.CondRenderQuery = NULL;
-   ctx->Query.CondRenderMode = GL_NONE;
+   end_conditional_render(ctx);
 }
 
 
@@ -184,7 +220,7 @@ _mesa_check_conditional_render(struct gl_context *ctx)
    default:
       _mesa_problem(ctx, "Bad cond render mode %s in "
                     " _mesa_check_conditional_render()",
-                    _mesa_lookup_enum_by_nr(ctx->Query.CondRenderMode));
+                    _mesa_enum_to_string(ctx->Query.CondRenderMode));
       return GL_TRUE;
    }
 }