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;
}
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;
}
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");
}
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,
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