diff options
author | Brian Paul <brianp@vmware.com> | 2010-05-11 21:04:43 -0600 |
---|---|---|
committer | Brian Paul <brianp@vmware.com> | 2010-05-11 21:04:43 -0600 |
commit | 1e0afa695b56665ad89771589d728b2479a7b081 (patch) | |
tree | f3cefa9e480f3f06035af5affc16a4dbcdc4e333 /src/mesa/state_tracker | |
parent | d35c2ca345d98801ddeb59b7b1a0515b8ac84219 (diff) |
st/mesa: update query code for transform feedback
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r-- | src/mesa/state_tracker/st_cb_queryobj.c | 28 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_cb_queryobj.h | 1 |
2 files changed, 26 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..af60db8869 100644 --- a/src/mesa/state_tracker/st_cb_queryobj.c +++ b/src/mesa/state_tracker/st_cb_queryobj.c @@ -51,6 +51,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 +79,38 @@ 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; 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); } diff --git a/src/mesa/state_tracker/st_cb_queryobj.h b/src/mesa/state_tracker/st_cb_queryobj.h index fa256b7182..b8b578159d 100644 --- a/src/mesa/state_tracker/st_cb_queryobj.h +++ b/src/mesa/state_tracker/st_cb_queryobj.h @@ -36,6 +36,7 @@ struct st_query_object { struct gl_query_object base; struct pipe_query *pq; + unsigned type; /**< PIPE_QUERY_x */ }; |