From b6a013ccab0f5545bdc2e63dae1c93e688a93eaa Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Mon, 10 Aug 2020 10:27:57 +0300 Subject: [PATCH] anv: VK_INTEL_performance_query interaction with VK_EXT_private_data All objects are expected to have the base internal object for private data storage. This also fixes a memory leak of a gen_perf_registers structure. Signed-off-by: Lionel Landwerlin Fixes: 51c6bc13ce3a70 ("anv,vulkan: Implement VK_EXT_private_data") Reviewed-by: Jason Ekstrand Part-of: --- src/intel/vulkan/anv_perf.c | 42 ++++++++++++++++++++++++---------- src/intel/vulkan/anv_private.h | 11 +++++++++ 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/intel/vulkan/anv_perf.c b/src/intel/vulkan/anv_perf.c index 0781ee775c3..91f7ba3b2bd 100644 --- a/src/intel/vulkan/anv_perf.c +++ b/src/intel/vulkan/anv_perf.c @@ -180,24 +180,38 @@ VkResult anv_AcquirePerformanceConfigurationINTEL( VkPerformanceConfigurationINTEL* pConfiguration) { ANV_FROM_HANDLE(anv_device, device, _device); - int ret = -1; + struct anv_performance_configuration_intel *config; + + config = vk_alloc(&device->vk.alloc, sizeof(*config), 8, + VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); + if (!config) + return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); if (likely(!(INTEL_DEBUG & DEBUG_NO_OACONFIG))) { - struct gen_perf_registers *perf_config = + config->register_config = gen_perf_load_configuration(device->physical->perf, device->fd, GEN_PERF_QUERY_GUID_MDAPI); - if (!perf_config) + if (!config->register_config) { + vk_free(&device->vk.alloc, config); return VK_INCOMPLETE; + } - ret = gen_perf_store_configuration(device->physical->perf, device->fd, - perf_config, NULL /* guid */); + int ret = + gen_perf_store_configuration(device->physical->perf, device->fd, + config->register_config, NULL /* guid */); if (ret < 0) { - ralloc_free(perf_config); + ralloc_free(config->register_config); + vk_free(&device->vk.alloc, config); return VK_INCOMPLETE; } + + config->config_id = ret; } - *pConfiguration = (VkPerformanceConfigurationINTEL) (uint64_t) ret; + vk_object_base_init(&device->vk, &config->base, + VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL); + + *pConfiguration = anv_performance_configuration_intel_to_handle(config); return VK_SUCCESS; } @@ -207,10 +221,14 @@ VkResult anv_ReleasePerformanceConfigurationINTEL( VkPerformanceConfigurationINTEL _configuration) { ANV_FROM_HANDLE(anv_device, device, _device); - uint64_t config = (uint64_t) _configuration; + ANV_FROM_HANDLE(anv_performance_configuration_intel, config, _configuration); if (likely(!(INTEL_DEBUG & DEBUG_NO_OACONFIG))) - gen_ioctl(device->fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &config); + gen_ioctl(device->fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &config->config_id); + + ralloc_free(config->register_config); + vk_object_base_finish(&config->base); + vk_free(&device->vk.alloc, config); return VK_SUCCESS; } @@ -220,17 +238,17 @@ VkResult anv_QueueSetPerformanceConfigurationINTEL( VkPerformanceConfigurationINTEL _configuration) { ANV_FROM_HANDLE(anv_queue, queue, _queue); + ANV_FROM_HANDLE(anv_performance_configuration_intel, config, _configuration); struct anv_device *device = queue->device; - uint64_t configuration = (uint64_t) _configuration; if (likely(!(INTEL_DEBUG & DEBUG_NO_OACONFIG))) { if (device->perf_fd < 0) { - device->perf_fd = anv_device_perf_open(device, configuration); + device->perf_fd = anv_device_perf_open(device, config->config_id); if (device->perf_fd < 0) return VK_ERROR_INITIALIZATION_FAILED; } else { int ret = gen_ioctl(device->perf_fd, I915_PERF_IOCTL_CONFIG, - (void *)(uintptr_t) _configuration); + (void *)(uintptr_t) config->config_id); if (ret < 0) return anv_device_set_lost(device, "i915-perf config failed: %m"); } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index e34bfb3d8ee..eb18b147fc4 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -4456,6 +4456,14 @@ anv_get_subpass_id(const struct anv_cmd_state * const cmd_state) return subpass_id; } +struct anv_performance_configuration_intel { + struct vk_object_base base; + + struct gen_perf_registers *register_config; + + uint64_t config_id; +}; + struct gen_perf_config *anv_get_perf(const struct gen_device_info *devinfo, int fd); void anv_device_perf_init(struct anv_device *device); void anv_perf_write_pass_results(struct gen_perf_config *perf, @@ -4518,6 +4526,9 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(anv_shader_module, base, VkShaderModule, VK_DEFINE_NONDISP_HANDLE_CASTS(anv_ycbcr_conversion, base, VkSamplerYcbcrConversion, VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION) +VK_DEFINE_NONDISP_HANDLE_CASTS(anv_performance_configuration_intel, base, + VkPerformanceConfigurationINTEL, + VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL) /* Gen-specific function declarations */ #ifdef genX -- 2.30.2