From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jason Ekstrand Subject: Re: [PATCH] vulkan: Add VK_EXT_calibrated_timestamps extension (radv and anv) [v2] Date: Mon, 15 Oct 2018 16:36:39 -0500 Message-ID: References: <20181015212248.436-1-keithp@keithp.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0887288865==" Return-path: Received: from mail-ed1-x52a.google.com (mail-ed1-x52a.google.com [IPv6:2a00:1450:4864:20::52a]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8D65A6E0C5 for ; Mon, 15 Oct 2018 21:36:52 +0000 (UTC) Received: by mail-ed1-x52a.google.com with SMTP id w19-v6so19278470eds.1 for ; Mon, 15 Oct 2018 14:36:52 -0700 (PDT) In-Reply-To: <20181015212248.436-1-keithp@keithp.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Keith Packard Cc: ML mesa-dev , Maling list - DRI developers List-Id: dri-devel@lists.freedesktop.org --===============0887288865== Content-Type: multipart/alternative; boundary="0000000000002c951805784b3c19" --0000000000002c951805784b3c19 Content-Type: text/plain; charset="UTF-8" On Mon, Oct 15, 2018 at 4:22 PM Keith Packard wrote: > Offers three clocks, device, clock monotonic and clock monotonic > raw. Could use some kernel support to reduce the deviation between > clock values. > > v2: > Ensure deviation is at least as big as the GPU time interval. > > Signed-off-by: Keith Packard > --- > src/amd/vulkan/radv_device.c | 84 ++++++++++++++++++++++++++++ > src/amd/vulkan/radv_extensions.py | 1 + > src/intel/vulkan/anv_device.c | 88 ++++++++++++++++++++++++++++++ > src/intel/vulkan/anv_extensions.py | 1 + > src/intel/vulkan/anv_gem.c | 13 +++++ > src/intel/vulkan/anv_private.h | 2 + > 6 files changed, 189 insertions(+) > > diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c > index 174922780fc..29f0afbc69b 100644 > --- a/src/amd/vulkan/radv_device.c > +++ b/src/amd/vulkan/radv_device.c > @@ -4955,3 +4955,87 @@ radv_GetDeviceGroupPeerMemoryFeatures( > VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT | > VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT; > } > + > +static const VkTimeDomainEXT radv_time_domains[] = { > + VK_TIME_DOMAIN_DEVICE_EXT, > + VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT, > + VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT, > +}; > + > +VkResult radv_GetPhysicalDeviceCalibrateableTimeDomainsEXT( > + VkPhysicalDevice physicalDevice, > + uint32_t *pTimeDomainCount, > + VkTimeDomainEXT *pTimeDomains) > +{ > + int d; > + VK_OUTARRAY_MAKE(out, pTimeDomains, pTimeDomainCount); > + > + for (d = 0; d < ARRAY_SIZE(radv_time_domains); d++) { > + vk_outarray_append(&out, i) { > + *i = radv_time_domains[d]; > + } > + } > + > + return vk_outarray_status(&out); > +} > + > +static uint64_t > +radv_clock_gettime(clockid_t clock_id) > +{ > + struct timespec current; > + int ret; > + > + ret = clock_gettime(clock_id, ¤t); > + if (ret < 0 && clock_id == CLOCK_MONOTONIC_RAW) > + ret = clock_gettime(CLOCK_MONOTONIC, ¤t); > + if (ret < 0) > + return 0; > + > + return (uint64_t) current.tv_sec * 1000000000ULL + current.tv_nsec; > +} > + > +#define TIMESTAMP 0x2358 > + > +VkResult radv_GetCalibratedTimestampsEXT( > + VkDevice _device, > + uint32_t timestampCount, > + const VkCalibratedTimestampInfoEXT *pTimestampInfos, > + uint64_t *pTimestamps, > + uint64_t *pMaxDeviation) > +{ > + RADV_FROM_HANDLE(radv_device, device, _device); > + uint32_t clock_crystal_freq = > device->physical_device->rad_info.clock_crystal_freq; > + int d; > + uint64_t begin, end; > + > + begin = radv_clock_gettime(CLOCK_MONOTONIC_RAW); > + > + for (d = 0; d < timestampCount; d++) { > + switch (pTimestampInfos[d].timeDomain) { > + case VK_TIME_DOMAIN_DEVICE_EXT: > + /* XXX older kernels don't support this interface. > */ > + pTimestamps[d] = > device->ws->query_value(device->ws, > + > RADEON_TIMESTAMP); > + break; > + case VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT: > + pTimestamps[d] = > radv_clock_gettime(CLOCK_MONOTONIC); > + break; > + > + case VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT: > + pTimestamps[d] = begin; > + break; > + default: > + pTimestamps[d] = 0; > + break; > + } > + } > + > + end = radv_clock_gettime(CLOCK_MONOTONIC_RAW); > + > + uint64_t clock_period = end - begin; > + uint64_t device_period = (1000000 + clock_crystal_freq - 1) / > clock_crystal_freq; > + > + *pMaxDeviation = clock_period > device_period ? clock_period : > device_period; > + > + return VK_SUCCESS; > +} > diff --git a/src/amd/vulkan/radv_extensions.py > b/src/amd/vulkan/radv_extensions.py > index 5dcedae1c63..4c81d3f0068 100644 > --- a/src/amd/vulkan/radv_extensions.py > +++ b/src/amd/vulkan/radv_extensions.py > @@ -92,6 +92,7 @@ EXTENSIONS = [ > Extension('VK_KHR_display', 23, > 'VK_USE_PLATFORM_DISPLAY_KHR'), > Extension('VK_EXT_direct_mode_display', 1, > 'VK_USE_PLATFORM_DISPLAY_KHR'), > Extension('VK_EXT_acquire_xlib_display', 1, > 'VK_USE_PLATFORM_XLIB_XRANDR_EXT'), > + Extension('VK_EXT_calibrated_timestamps', 1, True), > Extension('VK_EXT_conditional_rendering', 1, True), > Extension('VK_EXT_conservative_rasterization', 1, > 'device->rad_info.chip_class >= GFX9'), > Extension('VK_EXT_display_surface_counter', 1, > 'VK_USE_PLATFORM_DISPLAY_KHR'), > diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c > index a2551452eb1..6a6539c9685 100644 > --- a/src/intel/vulkan/anv_device.c > +++ b/src/intel/vulkan/anv_device.c > @@ -3021,6 +3021,94 @@ void anv_DestroyFramebuffer( > vk_free2(&device->alloc, pAllocator, fb); > } > > +static const VkTimeDomainEXT anv_time_domains[] = { > + VK_TIME_DOMAIN_DEVICE_EXT, > + VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT, > + VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT, > +}; > + > +VkResult anv_GetPhysicalDeviceCalibrateableTimeDomainsEXT( > + VkPhysicalDevice physicalDevice, > + uint32_t *pTimeDomainCount, > + VkTimeDomainEXT *pTimeDomains) > +{ > + int d; > + VK_OUTARRAY_MAKE(out, pTimeDomains, pTimeDomainCount); > + > + for (d = 0; d < ARRAY_SIZE(anv_time_domains); d++) { > + vk_outarray_append(&out, i) { > + *i = anv_time_domains[d]; > + } > + } > + > + return vk_outarray_status(&out); > +} > + > +static uint64_t > +anv_clock_gettime(clockid_t clock_id) > +{ > + struct timespec current; > + int ret; > + > + ret = clock_gettime(clock_id, ¤t); > + if (ret < 0 && clock_id == CLOCK_MONOTONIC_RAW) > + ret = clock_gettime(CLOCK_MONOTONIC, ¤t); > + if (ret < 0) > + return 0; > + > + return (uint64_t) current.tv_sec * 1000000000ULL + current.tv_nsec; > +} > One lf these days, we should unify these. I know this is at least the second copy in anv and we've got it hand-rolled a couple other places. I don't care too much today though so meh. > + > +#define TIMESTAMP 0x2358 > + > +VkResult anv_GetCalibratedTimestampsEXT( > + VkDevice _device, > + uint32_t timestampCount, > + const VkCalibratedTimestampInfoEXT *pTimestampInfos, > + uint64_t *pTimestamps, > + uint64_t *pMaxDeviation) > +{ > + ANV_FROM_HANDLE(anv_device, device, _device); > + uint64_t timestamp_frequency = device->info.timestamp_frequency; > + int ret; > + int d; > + uint64_t begin, end; > + > + begin = anv_clock_gettime(CLOCK_MONOTONIC_RAW); > + > + for (d = 0; d < timestampCount; d++) { > + switch (pTimestampInfos[d].timeDomain) { > + case VK_TIME_DOMAIN_DEVICE_EXT: > + /* XXX older kernels don't support this interface. */ > I don't think we support kernels that old, so you can drop the comment. > + ret = anv_gem_reg_read(device, TIMESTAMP | 1, > + &pTimestamps[d]); > + > + if (ret != 0) > + return VK_ERROR_DEVICE_LOST; > If you're going to return device_lost, you should set device->lost = true; > + break; > + case VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT: > + pTimestamps[d] = anv_clock_gettime(CLOCK_MONOTONIC); > + break; > + > + case VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT: > + pTimestamps[d] = begin; > + break; > + default: > + pTimestamps[d] = 0; > + break; > + } > + } > + > + end = anv_clock_gettime(CLOCK_MONOTONIC_RAW); > + > + uint64_t clock_period = end - begin; > + uint64_t device_period = (1000000000 + timestamp_frequency - 1) / > timestamp_frequency; > I think you just want DIV_ROUND_UP(a, b) > + > + *pMaxDeviation = clock_period > device_period ? clock_period : > device_period; > MAX2(a, b) is your friend. > + > + return VK_SUCCESS; > +} > + > /* vk_icd.h does not declare this function, so we declare it here to > * suppress Wmissing-prototypes. > */ > diff --git a/src/intel/vulkan/anv_extensions.py > b/src/intel/vulkan/anv_extensions.py > index d4915c95013..a8535964da7 100644 > --- a/src/intel/vulkan/anv_extensions.py > +++ b/src/intel/vulkan/anv_extensions.py > @@ -126,6 +126,7 @@ EXTENSIONS = [ > Extension('VK_EXT_vertex_attribute_divisor', 3, True), > Extension('VK_EXT_post_depth_coverage', 1, > 'device->info.gen >= 9'), > Extension('VK_EXT_sampler_filter_minmax', 1, > 'device->info.gen >= 9'), > + Extension('VK_EXT_calibrated_timestamps', 1, True), > ] > > class VkVersion: > diff --git a/src/intel/vulkan/anv_gem.c b/src/intel/vulkan/anv_gem.c > index c43b5ef9e06..1bdf040c1a3 100644 > --- a/src/intel/vulkan/anv_gem.c > +++ b/src/intel/vulkan/anv_gem.c > @@ -423,6 +423,19 @@ anv_gem_fd_to_handle(struct anv_device *device, int > fd) > return args.handle; > } > > +int > +anv_gem_reg_read(struct anv_device *device, uint32_t offset, uint64_t > *result) > +{ > + struct drm_i915_reg_read args = { > + .offset = offset > + }; > + > + int ret = anv_ioctl(device->fd, DRM_IOCTL_I915_REG_READ, &args); > + > + *result = args.val; > + return ret; > +} > + > #ifndef SYNC_IOC_MAGIC > /* duplicated from linux/sync_file.h to avoid build-time dependency > * on new (v4.7) kernel headers. Once distro's are mostly using > diff --git a/src/intel/vulkan/anv_private.h > b/src/intel/vulkan/anv_private.h > index 599b903f25c..08376b00c8e 100644 > --- a/src/intel/vulkan/anv_private.h > +++ b/src/intel/vulkan/anv_private.h > @@ -1103,6 +1103,8 @@ int anv_gem_get_aperture(int fd, uint64_t *size); > int anv_gem_gpu_get_reset_stats(struct anv_device *device, > uint32_t *active, uint32_t *pending); > int anv_gem_handle_to_fd(struct anv_device *device, uint32_t gem_handle); > +int anv_gem_reg_read(struct anv_device *device, > + uint32_t offset, uint64_t *result); > uint32_t anv_gem_fd_to_handle(struct anv_device *device, int fd); > int anv_gem_set_caching(struct anv_device *device, uint32_t gem_handle, > uint32_t caching); > int anv_gem_set_domain(struct anv_device *device, uint32_t gem_handle, > -- > 2.19.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel > --0000000000002c951805784b3c19 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
On Mon, Oct 15= , 2018 at 4:22 PM Keith Packard <ke= ithp@keithp.com> wrote:
Offe= rs three clocks, device, clock monotonic and clock monotonic
raw. Could use some kernel support to reduce the deviation between
clock values.

v2:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 Ensure deviation is at least as big as the GPU = time interval.

Signed-off-by: Keith Packard <keithp@keithp.com>
---
=C2=A0src/amd/vulkan/radv_device.c=C2=A0 =C2=A0 =C2=A0 =C2=A0| 84 +++++++++= +++++++++++++++++++
=C2=A0src/amd/vulkan/radv_extensions.py=C2=A0 |=C2=A0 1 +
=C2=A0src/intel/vulkan/anv_device.c=C2=A0 =C2=A0 =C2=A0 | 88 ++++++++++++++= ++++++++++++++++
=C2=A0src/intel/vulkan/anv_extensions.py |=C2=A0 1 +
=C2=A0src/intel/vulkan/anv_gem.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| 13 ++++= +
=C2=A0src/intel/vulkan/anv_private.h=C2=A0 =C2=A0 =C2=A0|=C2=A0 2 +
=C2=A06 files changed, 189 insertions(+)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 174922780fc..29f0afbc69b 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -4955,3 +4955,87 @@ radv_GetDeviceGroupPeerMemoryFeatures(
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BI= T |
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0VK_PEER_MEMORY_FEATURE_GENERIC_DST_BI= T;
=C2=A0}
+
+static const VkTimeDomainEXT radv_time_domains[] =3D {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0VK_TIME_DOMAIN_DEVICE_EXT,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT,
+};
+
+VkResult radv_GetPhysicalDeviceCalibrateableTimeDomainsEXT(
+=C2=A0 =C2=A0 =C2=A0 =C2=A0VkPhysicalDevice=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ph= ysicalDevice,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0uint32_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0*pTimeDomainCount,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0VkTimeDomainEXT=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *= pTimeDomains)
+{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0int d;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0VK_OUTARRAY_MAKE(out, pTimeDomains, pTimeDomain= Count);
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0for (d =3D 0; d < ARRAY_SIZE(radv_time_domai= ns); d++) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0vk_outarray_append(= &out, i) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0*i =3D radv_time_domains[d];
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0return vk_outarray_status(&out);
+}
+
+static uint64_t
+radv_clock_gettime(clockid_t clock_id)
+{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0struct timespec current;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0int ret;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D clock_gettime(clock_id, &current);<= br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0 && clock_id =3D=3D CLOCK= _MONOTONIC_RAW)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D clock_getti= me(CLOCK_MONOTONIC, &current);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0return (uint64_t) current.tv_sec * 1000000000UL= L + current.tv_nsec;
+}
+
+#define TIMESTAMP 0x2358
+
+VkResult radv_GetCalibratedTimestampsEXT(
+=C2=A0 =C2=A0 =C2=A0 =C2=A0VkDevice=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0_device,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0uint32_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0timestampCount,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0const VkCalibratedTimestampInfoEXT=C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0*pTimestampInfos,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0uint64_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0*pTimestamps,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0uint64_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0*pMaxDeviation)
+{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0RADV_FROM_HANDLE(radv_device, device, _device);=
+=C2=A0 =C2=A0 =C2=A0 =C2=A0uint32_t clock_crystal_freq =3D device->phys= ical_device->rad_info.clock_crystal_freq;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0int d;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0uint64_t begin, end;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0begin =3D radv_clock_gettime(CLOCK_MONOTONIC_RA= W);
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0for (d =3D 0; d < timestampCount; d++) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0switch (pTimestampI= nfos[d].timeDomain) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case VK_TIME_DOMAIN= _DEVICE_EXT:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0/* XXX older kernels don't support this interface. */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0pTimestamps[d] =3D device->ws->query_value(device->ws, +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 RADEON_TIMESTAMP);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0break;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case VK_TIME_DOMAIN= _CLOCK_MONOTONIC_EXT:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0pTimestamps[d] =3D radv_clock_gettime(CLOCK_MONOTONIC);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0break;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case VK_TIME_DOMAIN= _CLOCK_MONOTONIC_RAW_EXT:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0pTimestamps[d] =3D begin;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0break;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0default:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0pTimestamps[d] =3D 0;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0break;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0end =3D radv_clock_gettime(CLOCK_MONOTONIC_RAW)= ;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0uint64_t clock_period =3D end - begin;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0uint64_t device_period =3D (1000000 + clock_cry= stal_freq - 1) / clock_crystal_freq;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0*pMaxDeviation =3D clock_period > device_per= iod ? clock_period : device_period;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0return VK_SUCCESS;
+}
diff --git a/src/amd/vulkan/radv_extensions.py b/src/amd/vulkan/radv_extens= ions.py
index 5dcedae1c63..4c81d3f0068 100644
--- a/src/amd/vulkan/radv_extensions.py
+++ b/src/amd/vulkan/radv_extensions.py
@@ -92,6 +92,7 @@ EXTENSIONS =3D [
=C2=A0 =C2=A0 =C2=A0Extension('VK_KHR_display',=C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 23, = 'VK_USE_PLATFORM_DISPLAY_KHR'),
=C2=A0 =C2=A0 =C2=A0Extension('VK_EXT_direct_mode_display',=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, 'VK_USE_PLATFORM_DIS= PLAY_KHR'),
=C2=A0 =C2=A0 =C2=A0Extension('VK_EXT_acquire_xlib_display',=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1, 'VK_USE_PLATFORM_XLIB_XRAN= DR_EXT'),
+=C2=A0 =C2=A0 Extension('VK_EXT_calibrated_timestamps',=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, True),
=C2=A0 =C2=A0 =C2=A0Extension('VK_EXT_conditional_rendering',=C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, True),
=C2=A0 =C2=A0 =C2=A0Extension('VK_EXT_conservative_rasterization',= =C2=A0 =C2=A0 =C2=A0 =C2=A0 1, 'device->rad_info.chip_class >=3D = GFX9'),
=C2=A0 =C2=A0 =C2=A0Extension('VK_EXT_display_surface_counter',=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, 'VK_USE_PLATFORM_DISPLAY_KHR&#= 39;),
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c<= br> index a2551452eb1..6a6539c9685 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -3021,6 +3021,94 @@ void anv_DestroyFramebuffer(
=C2=A0 =C2=A0 vk_free2(&device->alloc, pAllocator, fb);
=C2=A0}

+static const VkTimeDomainEXT anv_time_domains[] =3D {
+=C2=A0 =C2=A0VK_TIME_DOMAIN_DEVICE_EXT,
+=C2=A0 =C2=A0VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT,
+=C2=A0 =C2=A0VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT,
+};
+
+VkResult anv_GetPhysicalDeviceCalibrateableTimeDomainsEXT(
+=C2=A0 =C2=A0VkPhysicalDevice=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0physicalDevice,<= br> +=C2=A0 =C2=A0uint32_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0*pTimeDomainCount,
+=C2=A0 =C2=A0VkTimeDomainEXT=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *pTimeDomains)<= br> +{
+=C2=A0 =C2=A0int d;
+=C2=A0 =C2=A0VK_OUTARRAY_MAKE(out, pTimeDomains, pTimeDomainCount);
+
+=C2=A0 =C2=A0for (d =3D 0; d < ARRAY_SIZE(anv_time_domains); d++) {
+=C2=A0 =C2=A0 =C2=A0 vk_outarray_append(&out, i) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*i =3D anv_time_domains[d];
+=C2=A0 =C2=A0 =C2=A0 }
+=C2=A0 =C2=A0}
+
+=C2=A0 =C2=A0return vk_outarray_status(&out);
+}
+
+static uint64_t
+anv_clock_gettime(clockid_t clock_id)
+{
+=C2=A0 =C2=A0struct timespec current;
+=C2=A0 =C2=A0int ret;
+
+=C2=A0 =C2=A0ret =3D clock_gettime(clock_id, &current);
+=C2=A0 =C2=A0if (ret < 0 && clock_id =3D=3D CLOCK_MONOTONIC_RAW= )
+=C2=A0 =C2=A0 =C2=A0 ret =3D clock_gettime(CLOCK_MONOTONIC, &current);=
+=C2=A0 =C2=A0if (ret < 0)
+=C2=A0 =C2=A0 =C2=A0 return 0;
+
+=C2=A0 =C2=A0return (uint64_t) current.tv_sec * 1000000000ULL + current.tv= _nsec;
+}

One lf these days, we should unify t= hese.=C2=A0 I know this is at least the second copy in anv and we've go= t it hand-rolled a couple other places.=C2=A0 I don't care too much tod= ay though so meh.
=C2=A0
+
+#define TIMESTAMP 0x2358
+
+VkResult anv_GetCalibratedTimestampsEXT(
+=C2=A0 =C2=A0VkDevice=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0_device,
+=C2=A0 =C2=A0uint32_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0timestampCount,
+=C2=A0 =C2=A0const VkCalibratedTimestampInfoEXT=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0*pTimestampInfos,
+=C2=A0 =C2=A0uint64_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0*pTimestamps,
+=C2=A0 =C2=A0uint64_t=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0*pMaxDeviation)
+{
+=C2=A0 =C2=A0ANV_FROM_HANDLE(anv_device, device, _device);
+=C2=A0 =C2=A0uint64_t timestamp_frequency =3D device->info.timestamp_fr= equency;
+=C2=A0 =C2=A0int=C2=A0 ret;
+=C2=A0 =C2=A0int d;
+=C2=A0 =C2=A0uint64_t begin, end;
+
+=C2=A0 =C2=A0begin =3D anv_clock_gettime(CLOCK_MONOTONIC_RAW);
+
+=C2=A0 =C2=A0for (d =3D 0; d < timestampCount; d++) {
+=C2=A0 =C2=A0 =C2=A0 switch (pTimestampInfos[d].timeDomain) {
+=C2=A0 =C2=A0 =C2=A0 case VK_TIME_DOMAIN_DEVICE_EXT:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* XXX older kernels don't support t= his interface. */

I don't think we = support kernels that old, so you can drop the comment.
=C2=A0=
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D anv_gem_reg_read(device, TIMESTA= MP | 1,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &pTimestamps[d]);
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret !=3D 0)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return VK_ERROR_DEVICE_LOST;
=

If you're going to return device_lost, you = should set device->lost =3D true;
= =C2=A0
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
+=C2=A0 =C2=A0 =C2=A0 case VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pTimestamps[d] =3D anv_clock_gettime(CLO= CK_MONOTONIC);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
+
+=C2=A0 =C2=A0 =C2=A0 case VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pTimestamps[d] =3D begin;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
+=C2=A0 =C2=A0 =C2=A0 default:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pTimestamps[d] =3D 0;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
+=C2=A0 =C2=A0 =C2=A0 }
+=C2=A0 =C2=A0}
+
+=C2=A0 =C2=A0end =3D anv_clock_gettime(CLOCK_MONOTONIC_RAW);
+
+=C2=A0 =C2=A0uint64_t clock_period =3D end - begin;
+=C2=A0 =C2=A0uint64_t device_period =3D (1000000000 + timestamp_frequency = - 1) / timestamp_frequency;

I think you= just want DIV_ROUND_UP(a, b)
=C2=A0
+
+=C2=A0 =C2=A0*pMaxDeviation =3D clock_period > device_period ? clock_pe= riod : device_period;

MAX2(a, b) is you= r friend.
=C2=A0
+
+=C2=A0 =C2=A0return VK_SUCCESS;
+}
+
=C2=A0/* vk_icd.h does not declare this function, so we declare it here to<= br> =C2=A0 * suppress Wmissing-prototypes.
=C2=A0 */
diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_exte= nsions.py
index d4915c95013..a8535964da7 100644
--- a/src/intel/vulkan/anv_extensions.py
+++ b/src/intel/vulkan/anv_extensions.py
@@ -126,6 +126,7 @@ EXTENSIONS =3D [
=C2=A0 =C2=A0 =C2=A0Extension('VK_EXT_vertex_attribute_divisor',=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 3, True),
=C2=A0 =C2=A0 =C2=A0Extension('VK_EXT_post_depth_coverage',=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, 'device->info.gen= >=3D 9'),
=C2=A0 =C2=A0 =C2=A0Extension('VK_EXT_sampler_filter_minmax',=C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, 'device->info.gen >= =3D 9'),
+=C2=A0 =C2=A0 Extension('VK_EXT_calibrated_timestamps',=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, True),
=C2=A0]

=C2=A0class VkVersion:
diff --git a/src/intel/vulkan/anv_gem.c b/src/intel/vulkan/anv_gem.c
index c43b5ef9e06..1bdf040c1a3 100644
--- a/src/intel/vulkan/anv_gem.c
+++ b/src/intel/vulkan/anv_gem.c
@@ -423,6 +423,19 @@ anv_gem_fd_to_handle(struct anv_device *device, int fd= )
=C2=A0 =C2=A0 return args.handle;
=C2=A0}

+int
+anv_gem_reg_read(struct anv_device *device, uint32_t offset, uint64_t *res= ult)
+{
+=C2=A0 =C2=A0struct drm_i915_reg_read args =3D {
+=C2=A0 =C2=A0 =C2=A0 .offset =3D offset
+=C2=A0 =C2=A0};
+
+=C2=A0 =C2=A0int ret =3D anv_ioctl(device->fd, DRM_IOCTL_I915_REG_READ,= &args);
+
+=C2=A0 =C2=A0*result =3D args.val;
+=C2=A0 =C2=A0return ret;
+}
+
=C2=A0#ifndef SYNC_IOC_MAGIC
=C2=A0/* duplicated from linux/sync_file.h to avoid build-time dependency =C2=A0 * on new (v4.7) kernel headers.=C2=A0 Once distro's are mostly u= sing
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.= h
index 599b903f25c..08376b00c8e 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -1103,6 +1103,8 @@ int anv_gem_get_aperture(int fd, uint64_t *size);
=C2=A0int anv_gem_gpu_get_reset_stats(struct anv_device *device,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0uint32_t *active, uint32_t *pe= nding);
=C2=A0int anv_gem_handle_to_fd(struct anv_device *device, uint32_t gem_hand= le);
+int anv_gem_reg_read(struct anv_device *device,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0uint32_t offset, uint64_t *result);
=C2=A0uint32_t anv_gem_fd_to_handle(struct anv_device *device, int fd);
=C2=A0int anv_gem_set_caching(struct anv_device *device, uint32_t gem_handl= e, uint32_t caching);
=C2=A0int anv_gem_set_domain(struct anv_device *device, uint32_t gem_handle= ,
--
2.19.1

_______________________________________________
dri-devel mailing list
dri-de= vel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listin= fo/dri-devel
--0000000000002c951805784b3c19-- --===============0887288865== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVs IG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== --===============0887288865==--