diff options
-rw-r--r-- | src/gallium/drivers/iris/iris_query.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/src/gallium/drivers/iris/iris_query.c b/src/gallium/drivers/iris/iris_query.c index a50b47418df..c5ebf6b59bd 100644 --- a/src/gallium/drivers/iris/iris_query.c +++ b/src/gallium/drivers/iris/iris_query.c @@ -43,6 +43,7 @@ #include "iris_context.h" #include "iris_defines.h" #include "iris_fence.h" +#include "iris_monitor.h" #include "iris_resource.h" #include "iris_screen.h" @@ -439,6 +440,7 @@ iris_create_query(struct pipe_context *ctx, q->type = query_type; q->index = index; + q->monitor = NULL; if (q->type == PIPE_QUERY_PIPELINE_STATISTICS_SINGLE && q->index == PIPE_STAT_QUERY_CS_INVOCATIONS) @@ -448,12 +450,35 @@ iris_create_query(struct pipe_context *ctx, return (struct pipe_query *) q; } +static struct pipe_query * +iris_create_batch_query(struct pipe_context *ctx, + unsigned num_queries, + unsigned *query_types) +{ + struct iris_context *ice = (void *) ctx; + struct iris_query *q = calloc(1, sizeof(struct iris_query)); + if (unlikely(!q)) + return NULL; + q->type = PIPE_QUERY_DRIVER_SPECIFIC; + q->index = -1; + q->monitor = iris_create_monitor_object(ice, num_queries, query_types); + if (unlikely(!q->monitor)) + return NULL; + + return (struct pipe_query *) q; +} + static void iris_destroy_query(struct pipe_context *ctx, struct pipe_query *p_query) { struct iris_query *query = (void *) p_query; struct iris_screen *screen = (void *) ctx->screen; - iris_syncpt_reference(screen, &query->syncpt, NULL); + if (query->monitor) { + iris_destroy_monitor_object(ctx, query->monitor); + query->monitor = NULL; + } else { + iris_syncpt_reference(screen, &query->syncpt, NULL); + } free(query); } @@ -463,6 +488,10 @@ iris_begin_query(struct pipe_context *ctx, struct pipe_query *query) { struct iris_context *ice = (void *) ctx; struct iris_query *q = (void *) query; + + if (q->monitor) + return iris_begin_monitor(ctx, q->monitor); + void *ptr = NULL; uint32_t size; @@ -508,6 +537,10 @@ iris_end_query(struct pipe_context *ctx, struct pipe_query *query) { struct iris_context *ice = (void *) ctx; struct iris_query *q = (void *) query; + + if (q->monitor) + return iris_end_monitor(ctx, q->monitor); + struct iris_batch *batch = &ice->batches[q->batch_idx]; if (q->type == PIPE_QUERY_TIMESTAMP) { @@ -559,6 +592,10 @@ iris_get_query_result(struct pipe_context *ctx, { struct iris_context *ice = (void *) ctx; struct iris_query *q = (void *) query; + + if (q->monitor) + return iris_get_monitor_result(ctx, q->monitor, wait, result->batch); + struct iris_screen *screen = (void *) ctx->screen; const struct gen_device_info *devinfo = &screen->devinfo; @@ -812,6 +849,7 @@ genX(init_query)(struct iris_context *ice) struct pipe_context *ctx = &ice->ctx; ctx->create_query = iris_create_query; + ctx->create_batch_query = iris_create_batch_query; ctx->destroy_query = iris_destroy_query; ctx->begin_query = iris_begin_query; ctx->end_query = iris_end_query; |