Module: Mesa Branch: main Commit: ae0df368a80d526b71ff135380995cb0399b7714 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ae0df368a80d526b71ff135380995cb0399b7714
Author: José Roberto de Souza <jose.so...@intel.com> Date: Wed Aug 9 09:57:58 2023 -0700 intel/common: Add intel_gem_read_correlate_cpu_gpu_timestamp() This function will make use of Xe DRM_XE_DEVICE_QUERY_ENGINE_CYCLES by returning correlate CPU ang GPU timestamp to be used by Intel drives. This correlate timestamps gives us more accuracy. Signed-off-by: José Roberto de Souza <jose.so...@intel.com> Reviewed-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24591> --- src/intel/common/intel_gem.c | 26 +++++++++++++++++++++ src/intel/common/intel_gem.h | 10 +++++++++ src/intel/common/xe/intel_gem.c | 50 +++++++++++++++++++++++++++++++++++++++-- src/intel/common/xe/intel_gem.h | 11 +++++++++ 4 files changed, 95 insertions(+), 2 deletions(-) diff --git a/src/intel/common/intel_gem.c b/src/intel/common/intel_gem.c index 0bf1b296466..ee010056e26 100644 --- a/src/intel/common/intel_gem.c +++ b/src/intel/common/intel_gem.c @@ -116,6 +116,32 @@ intel_gem_read_render_timestamp(int fd, } } +bool +intel_gem_read_correlate_cpu_gpu_timestamp(int fd, + enum intel_kmd_type kmd_type, + enum intel_engine_class engine_class, + uint16_t engine_instance, + clockid_t cpu_clock_id, + uint64_t *cpu_timestamp, + uint64_t *gpu_timestamp, + uint64_t *cpu_delta) +{ + switch (kmd_type) { + case INTEL_KMD_TYPE_I915: + return false; + case INTEL_KMD_TYPE_XE: + return xe_gem_read_correlate_cpu_gpu_timestamp(fd, engine_class, + engine_instance, + cpu_clock_id, + cpu_timestamp, + gpu_timestamp, + cpu_delta); + default: + unreachable("Missing"); + return false; + } +} + bool intel_gem_create_context_ext(int fd, enum intel_gem_create_context_flags flags, uint32_t *ctx_id) diff --git a/src/intel/common/intel_gem.h b/src/intel/common/intel_gem.h index 8c25aa9d0e2..c2d76fcae96 100644 --- a/src/intel/common/intel_gem.h +++ b/src/intel/common/intel_gem.h @@ -29,6 +29,7 @@ extern "C" { #endif #include <assert.h> +#include <time.h> #include <errno.h> #include <stdbool.h> #include <stdint.h> @@ -88,6 +89,15 @@ bool intel_gem_supports_syncobj_wait(int fd); bool intel_gem_read_render_timestamp(int fd, enum intel_kmd_type kmd_type, uint64_t *value); +bool +intel_gem_read_correlate_cpu_gpu_timestamp(int fd, + enum intel_kmd_type kmd_type, + enum intel_engine_class engine_class, + uint16_t engine_instance, + clockid_t cpu_clock_id, + uint64_t *cpu_timestamp, + uint64_t *gpu_timestamp, + uint64_t *cpu_delta); bool intel_gem_can_render_on_fd(int fd, enum intel_kmd_type kmd_type); /* Functions only used by i915 */ diff --git a/src/intel/common/xe/intel_gem.c b/src/intel/common/xe/intel_gem.c index cca0db5e956..f5aff725379 100644 --- a/src/intel/common/xe/intel_gem.c +++ b/src/intel/common/xe/intel_gem.c @@ -22,10 +22,11 @@ */ #include "xe/intel_gem.h" -#include "common/intel_gem.h" - #include "drm-uapi/xe_drm.h" +#include "common/intel_gem.h" +#include "common/xe/intel_engine.h" + bool xe_gem_read_render_timestamp(int fd, uint64_t *value) { @@ -41,3 +42,48 @@ xe_gem_can_render_on_fd(int fd) }; return intel_ioctl(fd, DRM_IOCTL_XE_DEVICE_QUERY, &query) == 0; } + +bool +xe_gem_read_correlate_cpu_gpu_timestamp(int fd, + enum intel_engine_class engine_class, + uint16_t engine_instance, + clockid_t cpu_clock_id, + uint64_t *cpu_timestamp, + uint64_t *gpu_timestamp, + uint64_t *cpu_delta) +{ + struct drm_xe_query_engine_cycles engine_cycles = {}; + struct drm_xe_device_query query = { + .query = DRM_XE_DEVICE_QUERY_ENGINE_CYCLES, + .size = sizeof(engine_cycles), + .data = (uintptr_t)&engine_cycles, + }; + + switch (cpu_clock_id) { + case CLOCK_MONOTONIC: +#ifdef CLOCK_MONOTONIC_RAW + case CLOCK_MONOTONIC_RAW: +#endif + case CLOCK_REALTIME: + case CLOCK_BOOTTIME: + case CLOCK_TAI: + break; + default: + return false; + } + + engine_cycles.eci.engine_class = intel_engine_class_to_xe(engine_class); + engine_cycles.eci.engine_instance = engine_instance; + engine_cycles.eci.gt_id = 0; + engine_cycles.clockid = cpu_clock_id; + + if (intel_ioctl(fd, DRM_IOCTL_XE_DEVICE_QUERY, &query)) + return false; + + *cpu_timestamp = engine_cycles.cpu_timestamp; + *gpu_timestamp = engine_cycles.engine_cycles; + if (cpu_delta) + *cpu_delta = engine_cycles.cpu_delta; + + return true; +} diff --git a/src/intel/common/xe/intel_gem.h b/src/intel/common/xe/intel_gem.h index 364b1bcc99f..6be526afb3a 100644 --- a/src/intel/common/xe/intel_gem.h +++ b/src/intel/common/xe/intel_gem.h @@ -25,6 +25,17 @@ #include <stdbool.h> #include <stdint.h> +#include <time.h> + +#include "common/intel_engine.h" bool xe_gem_read_render_timestamp(int fd, uint64_t *value); +bool +xe_gem_read_correlate_cpu_gpu_timestamp(int fd, + enum intel_engine_class engine_class, + uint16_t engine_instance, + clockid_t cpu_clock_id, + uint64_t *cpu_timestamp, + uint64_t *gpu_timestamp, + uint64_t *cpu_delta); bool xe_gem_can_render_on_fd(int fd);