summaryrefslogtreecommitdiff
path: root/src/mesa/state_tracker/st_cb_queryobj.c
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2007-12-11 17:10:26 +0000
committerKeith Whitwell <keith@tungstengraphics.com>2007-12-11 17:10:48 +0000
commit13699463a33c1adf44005125c488e886e074a05b (patch)
treecb9e0b85f96fd931f87d3b1fc813723013d2a2b7 /src/mesa/state_tracker/st_cb_queryobj.c
parentb247ab036327d66b8b9b1aff2dbcf4520ed0284f (diff)
Rework gallium and mesa queries a little.
Add a 'CheckQuery()' driver callback to mesa to check query completion. Make pipe_query an opaque type. Rework softpipe queries, support overlapping occlusion queries.
Diffstat (limited to 'src/mesa/state_tracker/st_cb_queryobj.c')
-rw-r--r--src/mesa/state_tracker/st_cb_queryobj.c68
1 files changed, 49 insertions, 19 deletions
diff --git a/src/mesa/state_tracker/st_cb_queryobj.c b/src/mesa/state_tracker/st_cb_queryobj.c
index 5b95dd7fd3..c1d0d086b4 100644
--- a/src/mesa/state_tracker/st_cb_queryobj.c
+++ b/src/mesa/state_tracker/st_cb_queryobj.c
@@ -47,7 +47,7 @@
struct st_query_object
{
struct gl_query_object base;
- struct pipe_query_object pq;
+ struct pipe_query *pq;
};
@@ -68,12 +68,28 @@ st_NewQueryObject(GLcontext *ctx, GLuint id)
if (stq) {
stq->base.Id = id;
stq->base.Ready = GL_TRUE;
+ stq->pq = NULL;
return &stq->base;
}
return NULL;
}
+
+static void
+st_DeleteQuery(GLcontext *ctx, struct gl_query_object *q)
+{
+ struct pipe_context *pipe = ctx->st->pipe;
+ struct st_query_object *stq = st_query_object(q);
+
+ if (stq->pq) {
+ pipe->destroy_query(pipe, stq->pq);
+ stq->pq = NULL;
+ }
+
+ FREE(stq);
+}
+
/**
* Do glReadPixels by getting rows from the framebuffer surface with
* get_tile(). Convert to requested format/type with Mesa image routines.
@@ -85,25 +101,17 @@ st_BeginQuery(GLcontext *ctx, struct gl_query_object *q)
struct pipe_context *pipe = ctx->st->pipe;
struct st_query_object *stq = st_query_object(q);
- stq->pq.count = 0;
-
switch (q->Target) {
case GL_SAMPLES_PASSED_ARB:
- stq->pq.type = PIPE_QUERY_OCCLUSION_COUNTER;
- break;
- case GL_PRIMITIVES_GENERATED_NV:
- /* someday */
- stq->pq.type = PIPE_QUERY_PRIMITIVES_GENERATED;
- break;
- case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV:
- /* someday */
- stq->pq.type = PIPE_QUERY_PRIMITIVES_EMITTED;
+ if (!stq->pq)
+ stq->pq = pipe->create_query( pipe, PIPE_QUERY_OCCLUSION_COUNTER );
break;
default:
assert(0);
+ return;
}
- pipe->begin_query(pipe, &stq->pq);
+ pipe->begin_query(pipe, stq->pq);
}
@@ -113,10 +121,7 @@ st_EndQuery(GLcontext *ctx, struct gl_query_object *q)
struct pipe_context *pipe = ctx->st->pipe;
struct st_query_object *stq = st_query_object(q);
- pipe->end_query(pipe, &stq->pq);
- stq->base.Ready = stq->pq.ready;
- if (stq->base.Ready)
- stq->base.Result = stq->pq.count;
+ pipe->end_query(pipe, stq->pq);
}
@@ -129,17 +134,42 @@ st_WaitQuery(GLcontext *ctx, struct gl_query_object *q)
/* this function should only be called if we don't have a ready result */
assert(!stq->base.Ready);
- pipe->wait_query(pipe, &stq->pq);
+ while (!stq->base.Ready &&
+ !pipe->get_query_result(pipe,
+ stq->pq,
+ TRUE,
+ &q->Result))
+ {
+ /* nothing */
+ }
+
q->Ready = GL_TRUE;
- q->Result = stq->pq.count;
}
+static void
+st_CheckQuery(GLcontext *ctx, struct gl_query_object *q)
+{
+ struct pipe_context *pipe = ctx->st->pipe;
+ struct st_query_object *stq = st_query_object(q);
+
+ if (!q->Ready) {
+ q->Ready = pipe->get_query_result(pipe,
+ stq->pq,
+ FALSE,
+ &q->Result);
+ }
+}
+
+
+
void st_init_query_functions(struct dd_function_table *functions)
{
functions->NewQueryObject = st_NewQueryObject;
+ functions->DeleteQuery = st_DeleteQuery;
functions->BeginQuery = st_BeginQuery;
functions->EndQuery = st_EndQuery;
functions->WaitQuery = st_WaitQuery;
+ functions->CheckQuery = st_CheckQuery;
}