summaryrefslogtreecommitdiff
path: root/src/mesa/state_tracker/st_cb_queryobj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/state_tracker/st_cb_queryobj.c')
-rw-r--r--src/mesa/state_tracker/st_cb_queryobj.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/mesa/state_tracker/st_cb_queryobj.c b/src/mesa/state_tracker/st_cb_queryobj.c
index 1896663932..e423d9d8a5 100644
--- a/src/mesa/state_tracker/st_cb_queryobj.c
+++ b/src/mesa/state_tracker/st_cb_queryobj.c
@@ -43,6 +43,8 @@
#include "st_cb_queryobj.h"
+#if FEATURE_queryobj
+
static struct gl_query_object *
st_NewQueryObject(GLcontext *ctx, GLuint id)
{
@@ -51,6 +53,7 @@ st_NewQueryObject(GLcontext *ctx, GLuint id)
stq->base.Id = id;
stq->base.Ready = GL_TRUE;
stq->pq = NULL;
+ stq->type = PIPE_QUERY_TYPES; /* an invalid value */
return &stq->base;
}
return NULL;
@@ -78,17 +81,41 @@ st_BeginQuery(GLcontext *ctx, struct gl_query_object *q)
{
struct pipe_context *pipe = st_context(ctx)->pipe;
struct st_query_object *stq = st_query_object(q);
+ unsigned type;
+ /* convert GL query type to Gallium query type */
switch (q->Target) {
case GL_SAMPLES_PASSED_ARB:
- if (!stq->pq)
- stq->pq = pipe->create_query( pipe, PIPE_QUERY_OCCLUSION_COUNTER );
+ type = PIPE_QUERY_OCCLUSION_COUNTER;
+ break;
+ case GL_PRIMITIVES_GENERATED:
+ type = PIPE_QUERY_PRIMITIVES_GENERATED;
+ break;
+ case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
+ type = PIPE_QUERY_PRIMITIVES_EMITTED;
+ break;
+ case GL_TIME_ELAPSED_EXT:
+ type = PIPE_QUERY_TIME_ELAPSED;
break;
default:
- assert(0);
+ assert(0 && "unexpected query target in st_BeginQuery()");
return;
}
+ if (stq->pq && stq->type != type) {
+ /* free old query of different type */
+ pipe->destroy_query(pipe, stq->pq);
+ stq->pq = NULL;
+ stq->type = PIPE_QUERY_TYPES; /* an invalid value */
+ }
+
+ if (!stq->pq) {
+ stq->pq = pipe->create_query(pipe, type);
+ stq->type = type;
+ }
+
+ assert(stq->type == type);
+
pipe->begin_query(pipe, stq->pq);
}
@@ -146,3 +173,5 @@ void st_init_query_functions(struct dd_function_table *functions)
functions->WaitQuery = st_WaitQuery;
functions->CheckQuery = st_CheckQuery;
}
+
+#endif /* FEATURE_queryobj */