Mesa (master): mesa: _mesa_Begin/EndConditionalRender() functions

Brian Paul brianp at kemper.freedesktop.org
Thu Dec 31 15:54:55 UTC 2009


Module: Mesa
Branch: master
Commit: 0fbe828c1d2a7e7d9155a3ef64e91da4ec2b79ee
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0fbe828c1d2a7e7d9155a3ef64e91da4ec2b79ee

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Dec 30 14:47:06 2009 -0700

mesa: _mesa_Begin/EndConditionalRender() functions

For GL_NV_conditional_render and GL3.

The drawing functions don't check the query object yet.
No API dispatch yet.

---

 src/mesa/SConscript        |    1 +
 src/mesa/main/condrender.c |  143 ++++++++++++++++++++++++++++++++++++++++++++
 src/mesa/main/condrender.h |   45 ++++++++++++++
 src/mesa/main/dd.h         |    5 ++
 src/mesa/main/mtypes.h     |    4 +
 src/mesa/sources.mak       |    1 +
 6 files changed, 199 insertions(+), 0 deletions(-)

diff --git a/src/mesa/SConscript b/src/mesa/SConscript
index f4e0b98..7035bdc 100644
--- a/src/mesa/SConscript
+++ b/src/mesa/SConscript
@@ -38,6 +38,7 @@ if env['platform'] != 'winddk':
 		'main/clear.c',
 		'main/clip.c',
 		'main/colortab.c',
+		'main/condrender.c',
 		'main/context.c',
 		'main/convolve.c',
 		'main/cpuinfo.c',
diff --git a/src/mesa/main/condrender.c b/src/mesa/main/condrender.c
new file mode 100644
index 0000000..5276213
--- /dev/null
+++ b/src/mesa/main/condrender.c
@@ -0,0 +1,143 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.8
+ *
+ * Copyright (C) 2009  VMware, Inc.   All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file condrender.c
+ * Conditional rendering functions
+ *
+ * \author Brian Paul
+ */
+
+#include "glheader.h"
+#include "condrender.h"
+#include "enums.h"
+#include "queryobj.h"
+
+
+GLAPI void GLAPIENTRY
+_mesa_BeginConditionalRender(GLuint queryId, GLenum mode)
+{
+   struct gl_query_object *q;
+   GET_CURRENT_CONTEXT(ctx);
+
+   if (ctx->Query.CondRenderQuery) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginConditionalRender()");
+      return;
+   }
+
+   ASSERT(ctx->Query.CondRenderMode == GL_NONE);
+
+   switch (mode) {
+   case GL_QUERY_WAIT:
+   case GL_QUERY_NO_WAIT:
+   case GL_QUERY_BY_REGION_WAIT:
+   case GL_QUERY_BY_REGION_NO_WAIT:
+      /* OK */
+      break;
+   default:
+      _mesa_error(ctx, GL_INVALID_ENUM, "glBeginConditionalRender(mode=%s)",
+                  _mesa_lookup_enum_by_nr(mode));
+      return;
+   }
+
+   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);
+
+   if (q->Target != GL_SAMPLES_PASSED) {
+      _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);
+}
+
+
+GLAPI void APIENTRY
+_mesa_EndConditionalRender(void)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   if (!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;
+}
+
+
+/**
+ * This function is called by software rendering commands to determine if
+ * subsequent drawing commands should be executed or discarded depending
+ * on the current conditional rendering state.
+ * Ideally, this check would be implemented by the GPU when doing hardware
+ * rendering.
+ * XXX should this function be called via a new driver hook?
+ *
+ * \return GL_TRUE if we should render, GL_FALSE if we should discard
+ */
+GLboolean
+_mesa_check_conditional_render(GLcontext *ctx)
+{
+   struct gl_query_object *q = ctx->Query.CondRenderQuery;
+
+   if (!q) {
+      /* no query in progress - draw normally */
+      return GL_TRUE;
+   }
+
+   switch (ctx->Query.CondRenderMode) {
+   case GL_QUERY_BY_REGION_WAIT:
+      /* fall-through */
+   case GL_QUERY_WAIT:
+      if (!q->Ready) {
+         ctx->Driver.WaitQuery(ctx, q);
+      }
+      return q->Result > 0;
+   case GL_QUERY_BY_REGION_NO_WAIT:
+      /* fall-through */
+   case GL_QUERY_NO_WAIT:
+      return q->Ready ? (q->Result > 0) : GL_TRUE;
+   default:
+      _mesa_problem(ctx, "Bad cond render mode %s in "
+                    " _mesa_check_conditional_render()",
+                    _mesa_lookup_enum_by_nr(ctx->Query.CondRenderMode));
+      return GL_TRUE;
+   }
+}
diff --git a/src/mesa/main/condrender.h b/src/mesa/main/condrender.h
new file mode 100644
index 0000000..d55e980
--- /dev/null
+++ b/src/mesa/main/condrender.h
@@ -0,0 +1,45 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.8
+ *
+ * Copyright (C) 2009  VMware, Inc.   All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef CONDRENDER_H
+#define CONDRENDER_H
+
+
+#include "glheader.h"
+#include "context.h"
+
+
+extern void GLAPIENTRY
+_mesa_BeginConditionalRender(GLuint queryId, GLenum mode);
+
+extern void APIENTRY
+_mesa_EndConditionalRender(void);
+
+extern GLboolean
+_mesa_check_conditional_render(GLcontext *ctx);
+
+
+#endif /* CONDRENDER_H */
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index 496b0d2..e99e87d 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -1016,6 +1016,11 @@ struct dd_function_table {
 			  GLbitfield, GLuint64);
    /*@}*/
 #endif
+
+   /** GL_NV_conditional_render */
+   void (*BeginConditionalRender)(GLcontext *ctx, struct gl_query_object *q,
+                                  GLenum mode);
+   void (*EndConditionalRender)(GLcontext *ctx, struct gl_query_object *q);
 };
 
 
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 849d168..1a7f878 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1899,6 +1899,10 @@ struct gl_query_state
    struct _mesa_HashTable *QueryObjects;
    struct gl_query_object *CurrentOcclusionObject; /* GL_ARB_occlusion_query */
    struct gl_query_object *CurrentTimerObject;     /* GL_EXT_timer_query */
+
+   /** GL_NV_conditional_render */
+   struct gl_query_object *CondRenderQuery;
+   GLenum CondRenderMode;
 };
 
 
diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak
index a7a3b9a..ba56df5 100644
--- a/src/mesa/sources.mak
+++ b/src/mesa/sources.mak
@@ -15,6 +15,7 @@ MAIN_SOURCES = \
 	main/clear.c \
 	main/clip.c \
 	main/colortab.c \
+	main/condrender.c \
 	main/context.c \
 	main/convolve.c \
 	main/cpuinfo.c \




More information about the mesa-commit mailing list