X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_cb_queryobj.c;h=aa31b3710b594f9bcc806cc358c1494de5b604d3;hb=83d50c3ee1309ee12bc4516d6c836a3c03fa9026;hp=2281d10e99960c5b4c3f9f9792dac628a151ffb0;hpb=9b346f83a7b672e913a7bb6a089d5dbd7fbdce06;p=mesa.git diff --git a/src/mesa/state_tracker/st_cb_queryobj.c b/src/mesa/state_tracker/st_cb_queryobj.c index 2281d10e999..aa31b3710b5 100644 --- a/src/mesa/state_tracker/st_cb_queryobj.c +++ b/src/mesa/state_tracker/st_cb_queryobj.c @@ -35,7 +35,6 @@ #include "main/imports.h" #include "main/context.h" -#include "main/image.h" #include "pipe/p_context.h" #include "pipe/p_defines.h" @@ -43,14 +42,17 @@ #include "st_cb_queryobj.h" +#if FEATURE_queryobj + static struct gl_query_object * -st_NewQueryObject(GLcontext *ctx, GLuint id) +st_NewQueryObject(struct gl_context *ctx, GLuint id) { struct st_query_object *stq = ST_CALLOC_STRUCT(st_query_object); if (stq) { 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; @@ -59,9 +61,9 @@ st_NewQueryObject(GLcontext *ctx, GLuint id) static void -st_DeleteQuery(GLcontext *ctx, struct gl_query_object *q) +st_DeleteQuery(struct gl_context *ctx, struct gl_query_object *q) { - struct pipe_context *pipe = ctx->st->pipe; + struct pipe_context *pipe = st_context(ctx)->pipe; struct st_query_object *stq = st_query_object(q); if (stq->pq) { @@ -69,34 +71,58 @@ st_DeleteQuery(GLcontext *ctx, struct gl_query_object *q) stq->pq = NULL; } - _mesa_free(stq); + free(stq); } static void -st_BeginQuery(GLcontext *ctx, struct gl_query_object *q) +st_BeginQuery(struct gl_context *ctx, struct gl_query_object *q) { - struct pipe_context *pipe = ctx->st->pipe; + 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); } static void -st_EndQuery(GLcontext *ctx, struct gl_query_object *q) +st_EndQuery(struct gl_context *ctx, struct gl_query_object *q) { - struct pipe_context *pipe = ctx->st->pipe; + struct pipe_context *pipe = st_context(ctx)->pipe; struct st_query_object *stq = st_query_object(q); pipe->end_query(pipe, stq->pq); @@ -104,9 +130,9 @@ st_EndQuery(GLcontext *ctx, struct gl_query_object *q) static void -st_WaitQuery(GLcontext *ctx, struct gl_query_object *q) +st_WaitQuery(struct gl_context *ctx, struct gl_query_object *q) { - struct pipe_context *pipe = ctx->st->pipe; + struct pipe_context *pipe = st_context(ctx)->pipe; struct st_query_object *stq = st_query_object(q); /* this function should only be called if we don't have a ready result */ @@ -126,17 +152,12 @@ st_WaitQuery(GLcontext *ctx, struct gl_query_object *q) static void -st_CheckQuery(GLcontext *ctx, struct gl_query_object *q) +st_CheckQuery(struct gl_context *ctx, struct gl_query_object *q) { - struct pipe_context *pipe = ctx->st->pipe; + struct pipe_context *pipe = st_context(ctx)->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); - } + assert(!q->Ready); /* we should not get called if Ready is TRUE */ + q->Ready = pipe->get_query_result(pipe, stq->pq, FALSE, &q->Result); } @@ -151,3 +172,5 @@ void st_init_query_functions(struct dd_function_table *functions) functions->WaitQuery = st_WaitQuery; functions->CheckQuery = st_CheckQuery; } + +#endif /* FEATURE_queryobj */