diff options
-rw-r--r-- | src/gallium/drivers/radeonsi/si_query.c | 19 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_query.h | 1 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeonsi/si_query.c b/src/gallium/drivers/radeonsi/si_query.c index 93efbd4ef4a..80e84c23937 100644 --- a/src/gallium/drivers/radeonsi/si_query.c +++ b/src/gallium/drivers/radeonsi/si_query.c @@ -92,6 +92,19 @@ static enum radeon_value_id winsys_id_from_type(unsigned type) } } +static int64_t si_finish_dma_get_cpu_time(struct si_context *sctx) +{ + struct pipe_fence_handle *fence = NULL; + + si_flush_dma_cs(sctx, 0, &fence); + if (fence) { + sctx->ws->fence_wait(sctx->ws, fence, PIPE_TIMEOUT_INFINITE); + sctx->ws->fence_reference(&fence, NULL); + } + + return os_time_get_nano(); +} + static bool si_query_sw_begin(struct si_context *sctx, struct si_query *rquery) { @@ -102,6 +115,9 @@ static bool si_query_sw_begin(struct si_context *sctx, case PIPE_QUERY_TIMESTAMP_DISJOINT: case PIPE_QUERY_GPU_FINISHED: break; + case SI_QUERY_TIME_ELAPSED_SDMA_SI: + query->begin_result = si_finish_dma_get_cpu_time(sctx); + break; case SI_QUERY_DRAW_CALLS: query->begin_result = sctx->num_draw_calls; break; @@ -262,6 +278,9 @@ static bool si_query_sw_end(struct si_context *sctx, case PIPE_QUERY_GPU_FINISHED: sctx->b.flush(&sctx->b, &query->fence, PIPE_FLUSH_DEFERRED); break; + case SI_QUERY_TIME_ELAPSED_SDMA_SI: + query->end_result = si_finish_dma_get_cpu_time(sctx); + break; case SI_QUERY_DRAW_CALLS: query->end_result = sctx->num_draw_calls; break; diff --git a/src/gallium/drivers/radeonsi/si_query.h b/src/gallium/drivers/radeonsi/si_query.h index bc3eb397bc5..cf2eccd862b 100644 --- a/src/gallium/drivers/radeonsi/si_query.h +++ b/src/gallium/drivers/radeonsi/si_query.h @@ -110,6 +110,7 @@ enum { SI_QUERY_GPIN_NUM_SPI, SI_QUERY_GPIN_NUM_SE, SI_QUERY_TIME_ELAPSED_SDMA, + SI_QUERY_TIME_ELAPSED_SDMA_SI, /* emulated, measured on the CPU */ SI_QUERY_FIRST_PERFCOUNTER = PIPE_QUERY_DRIVER_SPECIFIC + 100, }; |