X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fr600%2Fr600_query.c;h=faec99c6a808e80fc7f915e3ef57c01eecbdb65a;hb=74027a9ba250f07a77ee40e105c50c27e4fc3bc0;hp=bedb48b6031a1a1b64454af6d14030e372ba4e3e;hpb=c3b2230b71cb3a00a7f4c0987197d397bada650b;p=mesa.git diff --git a/src/gallium/drivers/r600/r600_query.c b/src/gallium/drivers/r600/r600_query.c index bedb48b6031..faec99c6a80 100644 --- a/src/gallium/drivers/r600/r600_query.c +++ b/src/gallium/drivers/r600/r600_query.c @@ -25,62 +25,72 @@ static struct pipe_query *r600_create_query(struct pipe_context *ctx, unsigned query_type) { - struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; + struct r600_context *rctx = (struct r600_context *)ctx; - return (struct pipe_query*)r600_context_query_create(&rctx->ctx, query_type); + return (struct pipe_query*)r600_context_query_create(rctx, query_type); } static void r600_destroy_query(struct pipe_context *ctx, struct pipe_query *query) { - struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; + struct r600_context *rctx = (struct r600_context *)ctx; - r600_context_query_destroy(&rctx->ctx, (struct r600_query *)query); + r600_context_query_destroy(rctx, (struct r600_query *)query); } static void r600_begin_query(struct pipe_context *ctx, struct pipe_query *query) { - struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; + struct r600_context *rctx = (struct r600_context *)ctx; struct r600_query *rquery = (struct r600_query *)query; - rquery->result = 0; - rquery->num_results = 0; - r600_query_begin(&rctx->ctx, (struct r600_query *)query); + memset(&rquery->result, 0, sizeof(rquery->result)); + rquery->results_start = rquery->results_end; + r600_query_begin(rctx, (struct r600_query *)query); + LIST_ADDTAIL(&rquery->list, &rctx->active_query_list); } static void r600_end_query(struct pipe_context *ctx, struct pipe_query *query) { - struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; + struct r600_context *rctx = (struct r600_context *)ctx; + struct r600_query *rquery = (struct r600_query *)query; - r600_query_end(&rctx->ctx, (struct r600_query *)query); + r600_query_end(rctx, rquery); + LIST_DELINIT(&rquery->list); } static boolean r600_get_query_result(struct pipe_context *ctx, struct pipe_query *query, boolean wait, void *vresult) { - struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; + struct r600_context *rctx = (struct r600_context *)ctx; struct r600_query *rquery = (struct r600_query *)query; - if (rquery->num_results) { - ctx->flush(ctx, NULL); - } - return r600_context_query_result(&rctx->ctx, (struct r600_query *)query, wait, vresult); + return r600_context_query_result(rctx, rquery, wait, vresult); } static void r600_render_condition(struct pipe_context *ctx, struct pipe_query *query, uint mode) { - struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; + struct r600_context *rctx = (struct r600_context *)ctx; struct r600_query *rquery = (struct r600_query *)query; int wait_flag = 0; + /* If we already have nonzero result, render unconditionally */ + if (query != NULL && rquery->result.u64 != 0) { + if (rctx->current_render_cond) { + r600_render_condition(ctx, NULL, 0); + } + return; + } + rctx->current_render_cond = query; rctx->current_render_cond_mode = mode; - if (!query) { - rctx->ctx.predicate_drawing = false; - r600_query_predication(&rctx->ctx, NULL, PREDICATION_OP_CLEAR, 1); + if (query == NULL) { + if (rctx->predicate_drawing) { + rctx->predicate_drawing = false; + r600_query_predication(rctx, NULL, PREDICATION_OP_CLEAR, 1); + } return; } @@ -89,12 +99,25 @@ static void r600_render_condition(struct pipe_context *ctx, wait_flag = 1; } - rctx->ctx.predicate_drawing = true; - r600_query_predication(&rctx->ctx, rquery, PREDICATION_OP_ZPASS, wait_flag); - + rctx->predicate_drawing = true; + + switch (rquery->type) { + case PIPE_QUERY_OCCLUSION_COUNTER: + case PIPE_QUERY_OCCLUSION_PREDICATE: + r600_query_predication(rctx, rquery, PREDICATION_OP_ZPASS, wait_flag); + break; + case PIPE_QUERY_PRIMITIVES_EMITTED: + case PIPE_QUERY_PRIMITIVES_GENERATED: + case PIPE_QUERY_SO_STATISTICS: + case PIPE_QUERY_SO_OVERFLOW_PREDICATE: + r600_query_predication(rctx, rquery, PREDICATION_OP_PRIMCOUNT, wait_flag); + break; + default: + assert(0); + } } -void r600_init_query_functions(struct r600_pipe_context *rctx) +void r600_init_query_functions(struct r600_context *rctx) { rctx->context.create_query = r600_create_query; rctx->context.destroy_query = r600_destroy_query; @@ -102,6 +125,6 @@ void r600_init_query_functions(struct r600_pipe_context *rctx) rctx->context.end_query = r600_end_query; rctx->context.get_query_result = r600_get_query_result; - if (r600_get_num_backends(rctx->screen->radeon) > 0) + if (rctx->screen->info.r600_num_backends > 0) rctx->context.render_condition = r600_render_condition; }