From: Danylo Piliaiev Date: Thu, 12 Sep 2019 13:47:40 +0000 (+0300) Subject: iris/query: Implement PIPE_QUERY_GPU_FINISHED X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f3ca47d9f389404aa9c2098a865d0becc53cc189;p=mesa.git iris/query: Implement PIPE_QUERY_GPU_FINISHED Implementation is similar to radeonsi in 5f1cef76 Signed-off-by: Danylo Piliaiev Reviewed-by: Kenneth Graunke --- diff --git a/src/gallium/drivers/iris/iris_query.c b/src/gallium/drivers/iris/iris_query.c index 139d9521a66..a6e062ded0f 100644 --- a/src/gallium/drivers/iris/iris_query.c +++ b/src/gallium/drivers/iris/iris_query.c @@ -69,6 +69,9 @@ struct iris_query { int batch_idx; struct iris_monitor_object *monitor; + + /* Fence for PIPE_QUERY_GPU_FINISHED. */ + struct pipe_fence_handle *fence; }; struct iris_query_snapshots { @@ -480,6 +483,7 @@ iris_destroy_query(struct pipe_context *ctx, struct pipe_query *p_query) query->monitor = NULL; } else { iris_syncpt_reference(screen, &query->syncpt, NULL); + screen->base.fence_reference(ctx->screen, &query->fence, NULL); } free(query); } @@ -543,6 +547,11 @@ iris_end_query(struct pipe_context *ctx, struct pipe_query *query) if (q->monitor) return iris_end_monitor(ctx, q->monitor); + if (q->type == PIPE_QUERY_GPU_FINISHED) { + ctx->flush(ctx, &q->fence, PIPE_FLUSH_DEFERRED); + return true; + } + struct iris_batch *batch = &ice->batches[q->batch_idx]; if (q->type == PIPE_QUERY_TIMESTAMP) { @@ -606,6 +615,14 @@ iris_get_query_result(struct pipe_context *ctx, return true; } + if (q->type == PIPE_QUERY_GPU_FINISHED) { + struct pipe_screen *screen = ctx->screen; + + result->b = screen->fence_finish(screen, ctx, q->fence, + wait ? PIPE_TIMEOUT_INFINITE : 0); + return result->b; + } + if (!q->ready) { struct iris_batch *batch = &ice->batches[q->batch_idx]; if (q->syncpt == iris_batch_get_signal_syncpt(batch))