From b888d8e9372b671074844a208fd9cd499ef53c69 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Tue, 23 Feb 2016 12:03:43 -0500 Subject: [PATCH] freedreno: hw timestamp support If the kernel supports it, use hw counter for timestamps. Signed-off-by: Rob Clark --- configure.ac | 2 +- src/gallium/drivers/freedreno/freedreno_screen.c | 16 ++++++++++++++-- src/gallium/drivers/freedreno/freedreno_screen.h | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index bbc3af43424..5c196a93196 100644 --- a/configure.ac +++ b/configure.ac @@ -74,7 +74,7 @@ LIBDRM_AMDGPU_REQUIRED=2.4.63 LIBDRM_INTEL_REQUIRED=2.4.61 LIBDRM_NVVIEUX_REQUIRED=2.4.66 LIBDRM_NOUVEAU_REQUIRED=2.4.66 -LIBDRM_FREEDRENO_REQUIRED=2.4.67 +LIBDRM_FREEDRENO_REQUIRED=2.4.68 LIBDRM_VC4_REQUIRED=2.4.69 DRI2PROTO_REQUIRED=2.6 DRI3PROTO_REQUIRED=1.0 diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index 81fb2adae42..0aaa4d04899 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -109,8 +109,18 @@ fd_screen_get_device_vendor(struct pipe_screen *pscreen) static uint64_t fd_screen_get_timestamp(struct pipe_screen *pscreen) { - int64_t cpu_time = os_time_get() * 1000; - return cpu_time + fd_screen(pscreen)->cpu_gpu_time_delta; + struct fd_screen *screen = fd_screen(pscreen); + + if (screen->has_timestamp) { + uint64_t n; + fd_pipe_get_param(screen->pipe, FD_TIMESTAMP, &n); + debug_assert(screen->max_freq > 0); + return n * 1000000000 / screen->max_freq; + } else { + int64_t cpu_time = os_time_get() * 1000; + return cpu_time + screen->cpu_gpu_time_delta; + } + } static void @@ -595,6 +605,8 @@ fd_screen_create(struct fd_device *dev) screen->max_freq = 0; } else { screen->max_freq = val; + if (fd_pipe_get_param(screen->pipe, FD_TIMESTAMP, &val) == 0) + screen->has_timestamp = true; } if (fd_pipe_get_param(screen->pipe, FD_GPU_ID, &val)) { diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h index a81c7786390..0c899d5a7f0 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.h +++ b/src/gallium/drivers/freedreno/freedreno_screen.h @@ -58,6 +58,7 @@ struct fd_screen { uint32_t chip_id; /* coreid:8 majorrev:8 minorrev:8 patch:8 */ uint32_t max_freq; uint32_t max_rts; /* max # of render targets */ + bool has_timestamp; void *compiler; /* currently unused for a2xx */