radeonsi: add SI_QUERY_TIME_ELAPSED_SDMA_SI for measuring DMA on SI

DMA on SI doesn't support the timestamp packet, so it's emulated.
This commit is contained in:
Marek Olšák 2018-08-21 00:46:53 -04:00
parent c359880d8b
commit d7250e4304
2 changed files with 20 additions and 0 deletions

View file

@ -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;

View file

@ -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,
};