[Mesa-dev] [PATCH 3/4] queryobj: Add IsQuery flag, making ISQuery() return false before BeginQuery()

Carl Worth cworth at cworth.org
Mon Dec 17 14:24:37 PST 2012


This flag allows for the specified behavior that GenQueries reserves a name,
but does not associate an object with it until BeginQuery. We allocate the
object immediately with the new IsQuery flag set to false, and then set the
flag to true at the time of BeginQuery.

This allows us to implement a conformant IsQuery function by checking the
state of the new IsQuery flag.

This fixes the following es3conform tests:

	occlusion_query_genqueries
	occlusion_query_is_query_nonzero
---
 src/mesa/main/mtypes.h   |    1 +
 src/mesa/main/queryobj.c |   20 +++++++++++++++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 1164fdf..5241660 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2495,6 +2495,7 @@ struct gl_query_object
    GLuint64EXT Result; /**< the counter */
    GLboolean Active;   /**< inside Begin/EndQuery */
    GLboolean Ready;    /**< result is ready? */
+   GLboolean IsQuery;  /**< query object is an actual query (see spec.) */
 };
 
 
diff --git a/src/mesa/main/queryobj.c b/src/mesa/main/queryobj.c
index b482b15..74e8b2b 100644
--- a/src/mesa/main/queryobj.c
+++ b/src/mesa/main/queryobj.c
@@ -56,6 +56,14 @@ _mesa_new_query_object(struct gl_context *ctx, GLuint id)
        * 2.13).
        */
       q->Ready = GL_TRUE;
+
+      /* OpenGL 3.1 § 2.13 says about GenQueries, "These names are marked as
+       * used, but no object is associated with them until the first time they
+       * are used by BeginQuery." Since our implementation actually does
+       * allocate an object at this point, use a flag to indicate that this
+       * object is not (yet) a query.
+       */
+      q->IsQuery = GL_FALSE;
    }
    return q;
 }
@@ -257,13 +265,22 @@ _mesa_DeleteQueries(GLsizei n, const GLuint *ids)
 GLboolean GLAPIENTRY
 _mesa_IsQuery(GLuint id)
 {
+   struct gl_query_object *q;
+
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
 
    if (MESA_VERBOSE & VERBOSE_API)
       _mesa_debug(ctx, "glIsQuery(%u)\n", id);
 
-   if (id && _mesa_lookup_query_object(ctx, id))
+   if (id == 0)
+      return GL_FALSE;
+
+   q = _mesa_lookup_query_object(ctx, id);
+   if (q == NULL)
+      return GL_FALSE;
+
+   if (q->IsQuery)
       return GL_TRUE;
    else
       return GL_FALSE;
@@ -359,6 +376,7 @@ _mesa_BeginQueryIndexed(GLenum target, GLuint index, GLuint id)
    q->Active = GL_TRUE;
    q->Result = 0;
    q->Ready = GL_FALSE;
+   q->IsQuery = GL_TRUE;
 
    /* XXX should probably refcount query objects */
    *bindpt = q;
-- 
1.7.10.4



More information about the mesa-dev mailing list