From f68db81cbb3c8f2b901fc5dcac02d01d3e698cc3 Mon Sep 17 00:00:00 2001 From: Eric Engestrom Date: Wed, 15 May 2019 11:30:36 +0100 Subject: [PATCH] anv: disable VK_EXT_calibrated_timestamps when the timestamp register is unreadable When running in a virtual context, the timestamp register is unreadable on Gen12+. While we could work around this, that would result in very inaccurate results for an extension where the whole point is accuracy, so let's just disable the extension. Signed-off-by: Eric Engestrom Reviewed-by: Lionel Landwerlin Reviewed-by: Jason Ekstrand Part-of: --- src/intel/vulkan/anv_device.c | 10 ++++++++-- src/intel/vulkan/anv_extensions.py | 2 +- src/intel/vulkan/anv_private.h | 7 +++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index fe87c233d15..8178a128089 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -66,6 +66,9 @@ DRI_CONF_END; */ #define MAX_DEBUG_MESSAGE_LENGTH 4096 +/* Render engine timestamp register */ +#define TIMESTAMP 0x2358 + static void compiler_debug_log(void *data, const char *fmt, ...) { @@ -472,6 +475,11 @@ anv_physical_device_try_create(struct anv_instance *instance, device->has_implicit_ccs = device->info.has_aux_map; + /* Check if we can read the GPU timestamp register from the CPU */ + uint64_t u64_ignore; + device->has_reg_timestamp = anv_gem_reg_read(fd, TIMESTAMP | I915_REG_READ_8B_WA, + &u64_ignore) == 0; + device->has_mem_available = get_available_system_memory() != 0; device->always_flush_cache = @@ -4427,8 +4435,6 @@ anv_clock_gettime(clockid_t clock_id) return (uint64_t) current.tv_sec * 1000000000ULL + current.tv_nsec; } -#define TIMESTAMP 0x2358 - VkResult anv_GetCalibratedTimestampsEXT( VkDevice _device, uint32_t timestampCount, diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_extensions.py index dabe675971c..251ca0f3495 100644 --- a/src/intel/vulkan/anv_extensions.py +++ b/src/intel/vulkan/anv_extensions.py @@ -117,7 +117,7 @@ EXTENSIONS = [ Extension('VK_KHR_xlib_surface', 6, 'VK_USE_PLATFORM_XLIB_KHR'), Extension('VK_EXT_acquire_xlib_display', 1, 'VK_USE_PLATFORM_XLIB_XRANDR_EXT'), Extension('VK_EXT_buffer_device_address', 1, 'device->has_a64_buffer_access'), - Extension('VK_EXT_calibrated_timestamps', 1, True), + Extension('VK_EXT_calibrated_timestamps', 1, 'device->has_reg_timestamp'), Extension('VK_EXT_conditional_rendering', 1, 'device->info.gen >= 8 || device->info.is_haswell'), Extension('VK_EXT_custom_border_color', 12, 'device->info.gen >= 8'), Extension('VK_EXT_debug_report', 8, True), diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 3994b21b962..4bee161227d 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1092,6 +1092,13 @@ struct anv_physical_device { /** True if we can use bindless access for samplers */ bool has_bindless_samplers; + /** True if we can read the GPU timestamp register + * + * When running in a virtual context, the timestamp register is unreadable + * on Gen12+. + */ + bool has_reg_timestamp; + /** True if this device has implicit AUX * * If true, CCS is handled as an implicit attachment to the BO rather than -- 2.30.2