diff options
Diffstat (limited to 'src/intel/vulkan')
-rw-r--r-- | src/intel/vulkan/anv_debug_report.c | 119 | ||||
-rw-r--r-- | src/intel/vulkan/anv_device.c | 54 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 28 | ||||
-rw-r--r-- | src/intel/vulkan/anv_util.c | 32 | ||||
-rw-r--r-- | src/intel/vulkan/meson.build | 1 |
5 files changed, 62 insertions, 172 deletions
diff --git a/src/intel/vulkan/anv_debug_report.c b/src/intel/vulkan/anv_debug_report.c deleted file mode 100644 index 55d62057c28..00000000000 --- a/src/intel/vulkan/anv_debug_report.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright © 2017 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#include "anv_private.h" -#include "vk_util.h" - -/* This file contains implementation for VK_EXT_debug_report. */ - -VkResult -anv_CreateDebugReportCallbackEXT(VkInstance _instance, - const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkDebugReportCallbackEXT* pCallback) -{ - ANV_FROM_HANDLE(anv_instance, instance, _instance); - - struct anv_debug_report_callback *cb = - vk_alloc2(&instance->alloc, pAllocator, - sizeof(struct anv_debug_report_callback), 8, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - - if (!cb) - return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); - - cb->flags = pCreateInfo->flags; - cb->callback = pCreateInfo->pfnCallback; - cb->data = pCreateInfo->pUserData; - - pthread_mutex_lock(&instance->callbacks_mutex); - list_addtail(&cb->link, &instance->callbacks); - pthread_mutex_unlock(&instance->callbacks_mutex); - - *pCallback = anv_debug_report_callback_to_handle(cb); - - return VK_SUCCESS; -} - -void -anv_DestroyDebugReportCallbackEXT(VkInstance _instance, - VkDebugReportCallbackEXT _callback, - const VkAllocationCallbacks* pAllocator) -{ - ANV_FROM_HANDLE(anv_instance, instance, _instance); - ANV_FROM_HANDLE(anv_debug_report_callback, callback, _callback); - - /* Remove from list and destroy given callback. */ - pthread_mutex_lock(&instance->callbacks_mutex); - list_del(&callback->link); - vk_free2(&instance->alloc, pAllocator, callback); - pthread_mutex_unlock(&instance->callbacks_mutex); -} - -void -anv_DebugReportMessageEXT(VkInstance _instance, - VkDebugReportFlagsEXT flags, - VkDebugReportObjectTypeEXT objectType, - uint64_t object, - size_t location, - int32_t messageCode, - const char* pLayerPrefix, - const char* pMessage) -{ - ANV_FROM_HANDLE(anv_instance, instance, _instance); - anv_debug_report(instance, flags, objectType, object, - location, messageCode, pLayerPrefix, pMessage); -} - -void -anv_debug_report(struct anv_instance *instance, - VkDebugReportFlagsEXT flags, - VkDebugReportObjectTypeEXT object_type, - uint64_t handle, - size_t location, - int32_t messageCode, - const char* pLayerPrefix, - const char *pMessage) -{ - /* Allow NULL for convinience, return if no callbacks registered. */ - if (!instance || list_empty(&instance->callbacks)) - return; - - pthread_mutex_lock(&instance->callbacks_mutex); - - /* Section 33.2 of the Vulkan 1.0.59 spec says: - * - * "callback is an externally synchronized object and must not be - * used on more than one thread at a time. This means that - * vkDestroyDebugReportCallbackEXT must not be called when a callback - * is active." - */ - list_for_each_entry(struct anv_debug_report_callback, cb, - &instance->callbacks, link) { - if (cb->flags & flags) - cb->callback(flags, object_type, handle, location, messageCode, - pLayerPrefix, pMessage, cb->data); - } - - pthread_mutex_unlock(&instance->callbacks_mutex); -} diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 90fdda66c5b..777abd87578 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -482,6 +482,7 @@ VkResult anv_CreateInstance( VkInstance* pInstance) { struct anv_instance *instance; + VkResult result; assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO); @@ -541,18 +542,10 @@ VkResult anv_CreateInstance( instance->apiVersion = client_version; instance->physicalDeviceCount = -1; - if (pthread_mutex_init(&instance->callbacks_mutex, NULL) != 0) { + result = vk_debug_report_instance_init(&instance->debug_report_callbacks); + if (result != VK_SUCCESS) { vk_free2(&default_alloc, pAllocator, instance); - return vk_error(VK_ERROR_INITIALIZATION_FAILED); - } - - list_inithead(&instance->callbacks); - - /* Store report debug callback to be used during DestroyInstance. */ - if (ctor_cb) { - instance->destroy_debug_cb.flags = ctor_cb->flags; - instance->destroy_debug_cb.callback = ctor_cb->pfnCallback; - instance->destroy_debug_cb.data = ctor_cb->pUserData; + return vk_error(result); } _mesa_locale_init(); @@ -581,7 +574,7 @@ void anv_DestroyInstance( VG(VALGRIND_DESTROY_MEMPOOL(instance)); - pthread_mutex_destroy(&instance->callbacks_mutex); + vk_debug_report_instance_destroy(&instance->debug_report_callbacks); _mesa_locale_fini(); @@ -1066,6 +1059,43 @@ PFN_vkVoidFunction anv_GetDeviceProcAddr( return anv_lookup_entrypoint(&device->info, pName); } +VkResult +anv_CreateDebugReportCallbackEXT(VkInstance _instance, + const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDebugReportCallbackEXT* pCallback) +{ + ANV_FROM_HANDLE(anv_instance, instance, _instance); + return vk_create_debug_report_callback(&instance->debug_report_callbacks, + pCreateInfo, pAllocator, &instance->alloc, + pCallback); +} + +void +anv_DestroyDebugReportCallbackEXT(VkInstance _instance, + VkDebugReportCallbackEXT _callback, + const VkAllocationCallbacks* pAllocator) +{ + ANV_FROM_HANDLE(anv_instance, instance, _instance); + vk_destroy_debug_report_callback(&instance->debug_report_callbacks, + _callback, pAllocator, &instance->alloc); +} + +void +anv_DebugReportMessageEXT(VkInstance _instance, + VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT objectType, + uint64_t object, + size_t location, + int32_t messageCode, + const char* pLayerPrefix, + const char* pMessage) +{ + ANV_FROM_HANDLE(anv_instance, instance, _instance); + vk_debug_report(&instance->debug_report_callbacks, flags, objectType, + object, location, messageCode, pLayerPrefix, pMessage); +} + static void anv_queue_init(struct anv_device *device, struct anv_queue *queue) { diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index b7bde4b8ce6..ed711e9434b 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -50,6 +50,7 @@ #include "util/u_atomic.h" #include "util/u_vector.h" #include "vk_alloc.h" +#include "vk_debug_report.h" /* Pre-declarations needed for WSI entrypoints */ struct wl_surface; @@ -62,7 +63,6 @@ struct anv_buffer; struct anv_buffer_view; struct anv_image_view; struct anv_instance; -struct anv_debug_report_callback; struct gen_l3_config; @@ -291,7 +291,7 @@ vk_to_isl_color(VkClearColorValue color) __builtin_types_compatible_p (__typeof (o), struct wsi_swapchain*), \ VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, \ __builtin_choose_expr ( \ - __builtin_types_compatible_p (__typeof (o), struct anv_debug_callback*), \ + __builtin_types_compatible_p (__typeof (o), struct vk_debug_callback*), \ VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT, \ __builtin_choose_expr ( \ __builtin_types_compatible_p (__typeof (o), void*), \ @@ -346,15 +346,6 @@ void __anv_perf_warn(struct anv_instance *instance, const void *object, void anv_loge(const char *format, ...) anv_printflike(1, 2); void anv_loge_v(const char *format, va_list va); -void anv_debug_report(struct anv_instance *instance, - VkDebugReportFlagsEXT flags, - VkDebugReportObjectTypeEXT object_type, - uint64_t handle, - size_t location, - int32_t messageCode, - const char* pLayerPrefix, - const char *pMessage); - /** * Print a FINISHME message, including its source location. */ @@ -796,14 +787,6 @@ struct anv_physical_device { int local_fd; }; -struct anv_debug_report_callback { - /* Link in the 'callbacks' list in anv_instance struct. */ - struct list_head link; - VkDebugReportFlagsEXT flags; - PFN_vkDebugReportCallbackEXT callback; - void * data; -}; - struct anv_instance { VK_LOADER_DATA _loader_data; @@ -813,10 +796,7 @@ struct anv_instance { int physicalDeviceCount; struct anv_physical_device physicalDevice; - /* VK_EXT_debug_report debug callbacks */ - pthread_mutex_t callbacks_mutex; - struct list_head callbacks; - struct anv_debug_report_callback destroy_debug_cb; + struct vk_debug_report_instance debug_report_callbacks; }; VkResult anv_init_wsi(struct anv_physical_device *physical_device); @@ -2922,7 +2902,7 @@ ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_render_pass, VkRenderPass) ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_sampler, VkSampler) ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_semaphore, VkSemaphore) ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_shader_module, VkShaderModule) -ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_debug_report_callback, VkDebugReportCallbackEXT) +ANV_DEFINE_NONDISP_HANDLE_CASTS(vk_debug_report_callback, VkDebugReportCallbackEXT) ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_ycbcr_conversion, VkSamplerYcbcrConversionKHR) /* Gen-specific function declarations */ diff --git a/src/intel/vulkan/anv_util.c b/src/intel/vulkan/anv_util.c index 59f893492b7..6b31224d7f1 100644 --- a/src/intel/vulkan/anv_util.c +++ b/src/intel/vulkan/anv_util.c @@ -65,14 +65,14 @@ __anv_perf_warn(struct anv_instance *instance, const void *object, snprintf(report, sizeof(report), "%s: %s", file, buffer); - anv_debug_report(instance, - VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, - type, - (uint64_t) (uintptr_t) object, - line, - 0, - "anv", - report); + vk_debug_report(&instance->debug_report_callbacks, + VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, + type, + (uint64_t) (uintptr_t) object, + line, + 0, + "anv", + report); intel_logw("%s:%d: PERF: %s", file, line, buffer); } @@ -99,14 +99,14 @@ __vk_errorf(struct anv_instance *instance, const void *object, snprintf(report, sizeof(report), "%s:%d: %s", file, line, error_str); } - anv_debug_report(instance, - VK_DEBUG_REPORT_ERROR_BIT_EXT, - type, - (uint64_t) (uintptr_t) object, - line, - 0, - "anv", - report); + vk_debug_report(&instance->debug_report_callbacks, + VK_DEBUG_REPORT_ERROR_BIT_EXT, + type, + (uint64_t) (uintptr_t) object, + line, + 0, + "anv", + report); intel_loge("%s", report); diff --git a/src/intel/vulkan/meson.build b/src/intel/vulkan/meson.build index a0ec35dadc4..4986f79c213 100644 --- a/src/intel/vulkan/meson.build +++ b/src/intel/vulkan/meson.build @@ -109,7 +109,6 @@ libanv_files = files( 'anv_batch_chain.c', 'anv_blorp.c', 'anv_cmd_buffer.c', - 'anv_debug_report.c', 'anv_descriptor_set.c', 'anv_device.c', 'anv_dump.c', |