diff options
author | Bas Nieuwenhuizen <[email protected]> | 2018-01-09 03:22:56 +0100 |
---|---|---|
committer | Bas Nieuwenhuizen <[email protected]> | 2018-01-17 11:27:52 +0100 |
commit | e5b1bd6ab8f5c1d9bf6a90b7003dc336cbe3cf93 (patch) | |
tree | da5589535c0f1ebe2dcb3d441eb12ea06c85f5ac /src/vulkan | |
parent | f69cbb2b53ac3edf7b201ba77430a61471edfa6e (diff) |
vulkan: move anv VK_EXT_debug_report implementation to common code.
For also using it in radv. I moved the remaining stubs back to
anv_device.c as they were just trivial.
This does not move the vk_errorf/anv_perf_warn or the object
type macros, as those depend on anv types and logging.
Reviewed-by: Tapani Pälli <[email protected]>
Diffstat (limited to 'src/vulkan')
-rw-r--r-- | src/vulkan/Makefile.sources | 2 | ||||
-rw-r--r-- | src/vulkan/util/meson.build | 2 | ||||
-rw-r--r-- | src/vulkan/util/vk_debug_report.c | 122 | ||||
-rw-r--r-- | src/vulkan/util/vk_debug_report.h | 72 |
4 files changed, 198 insertions, 0 deletions
diff --git a/src/vulkan/Makefile.sources b/src/vulkan/Makefile.sources index 6e9a09ce78b..a0a24ce7de8 100644 --- a/src/vulkan/Makefile.sources +++ b/src/vulkan/Makefile.sources @@ -19,6 +19,8 @@ VULKAN_WSI_X11_FILES := \ VULKAN_UTIL_FILES := \ util/vk_alloc.h \ + util/vk_debug_report.c \ + util/vk_debug_report.h \ util/vk_util.c \ util/vk_util.h diff --git a/src/vulkan/util/meson.build b/src/vulkan/util/meson.build index a6208b08eb5..78cee0adb50 100644 --- a/src/vulkan/util/meson.build +++ b/src/vulkan/util/meson.build @@ -20,6 +20,8 @@ files_vulkan_util = files( 'vk_alloc.h', + 'vk_debug_report.c', + 'vk_debug_report.h', 'vk_util.c', 'vk_util.h', ) diff --git a/src/vulkan/util/vk_debug_report.c b/src/vulkan/util/vk_debug_report.c new file mode 100644 index 00000000000..22ae4a7d931 --- /dev/null +++ b/src/vulkan/util/vk_debug_report.c @@ -0,0 +1,122 @@ +/* + * 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 "vk_debug_report.h" + +#include "vk_alloc.h" +#include "vk_util.h" + +VkResult vk_debug_report_instance_init(struct vk_debug_report_instance *instance) +{ + if (pthread_mutex_init(&instance->callbacks_mutex, NULL) != 0) { + return VK_ERROR_INITIALIZATION_FAILED; + } + + list_inithead(&instance->callbacks); + + return VK_SUCCESS; +} + +void vk_debug_report_instance_destroy(struct vk_debug_report_instance *instance) +{ + pthread_mutex_destroy(&instance->callbacks_mutex); +} + +VkResult +vk_create_debug_report_callback(struct vk_debug_report_instance *instance, + const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + const VkAllocationCallbacks* instance_allocator, + VkDebugReportCallbackEXT* pCallback) +{ + + struct vk_debug_report_callback *cb = + vk_alloc2(instance_allocator, pAllocator, + sizeof(struct vk_debug_report_callback), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + + if (!cb) + return 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 = (VkDebugReportCallbackEXT)(uintptr_t)cb; + + return VK_SUCCESS; +} + +void +vk_destroy_debug_report_callback(struct vk_debug_report_instance *instance, + VkDebugReportCallbackEXT _callback, + const VkAllocationCallbacks* pAllocator, + const VkAllocationCallbacks* instance_allocator) +{ + struct vk_debug_report_callback *callback = + (struct vk_debug_report_callback *)(uintptr_t)_callback; + + /* Remove from list and destroy given callback. */ + pthread_mutex_lock(&instance->callbacks_mutex); + list_del(&callback->link); + vk_free2(instance_allocator, pAllocator, callback); + pthread_mutex_unlock(&instance->callbacks_mutex); +} + + +void +vk_debug_report(struct vk_debug_report_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 vk_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/vulkan/util/vk_debug_report.h b/src/vulkan/util/vk_debug_report.h new file mode 100644 index 00000000000..625ecbb69fa --- /dev/null +++ b/src/vulkan/util/vk_debug_report.h @@ -0,0 +1,72 @@ +/* + * Copyright © 2018, Google Inc. + * + * based on the anv driver which is: + * 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. + */ +#ifndef VK_DEBUG_REPORT_H +#define VK_DEBUG_REPORT_H + +#include <pthread.h> + +#include "util/list.h" +#include <vulkan/vulkan.h> + +struct vk_debug_report_callback { + /* Link in the 'callbacks' list in anv_instance struct. */ + struct list_head link; + VkDebugReportFlagsEXT flags; + PFN_vkDebugReportCallbackEXT callback; + void * data; +}; + +struct vk_debug_report_instance { + /* VK_EXT_debug_report debug callbacks */ + pthread_mutex_t callbacks_mutex; + struct list_head callbacks; +}; + +VkResult vk_debug_report_instance_init(struct vk_debug_report_instance *instance); +void vk_debug_report_instance_destroy(struct vk_debug_report_instance *instance); + +VkResult +vk_create_debug_report_callback(struct vk_debug_report_instance *instance, + const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + const VkAllocationCallbacks* instance_allocator, + VkDebugReportCallbackEXT* pCallback); +void +vk_destroy_debug_report_callback(struct vk_debug_report_instance *instance, + VkDebugReportCallbackEXT _callback, + const VkAllocationCallbacks* pAllocator, + const VkAllocationCallbacks* instance_allocator); + +void +vk_debug_report(struct vk_debug_report_instance *instance, + VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT object_type, + uint64_t handle, + size_t location, + int32_t messageCode, + const char* pLayerPrefix, + const char *pMessage); +#endif |