diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2019-01-29 11:08:07 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2019-01-29 11:08:07 +0000 |
commit | 6b139c2063623e9310025247cd966490b9aa57ea (patch) | |
tree | 375acfd898ca3d721250aa17291bbb90a8d7250a /lib/mesa/src/vulkan/util | |
parent | cce99579dcfb1d54c54cff65573be3430e77f2c5 (diff) |
Import Mesa 18.3.2
Diffstat (limited to 'lib/mesa/src/vulkan/util')
-rw-r--r-- | lib/mesa/src/vulkan/util/meson.build | 45 | ||||
-rw-r--r-- | lib/mesa/src/vulkan/util/vk_debug_report.c | 122 | ||||
-rw-r--r-- | lib/mesa/src/vulkan/util/vk_debug_report.h | 72 |
3 files changed, 239 insertions, 0 deletions
diff --git a/lib/mesa/src/vulkan/util/meson.build b/lib/mesa/src/vulkan/util/meson.build new file mode 100644 index 000000000..15e4ff491 --- /dev/null +++ b/lib/mesa/src/vulkan/util/meson.build @@ -0,0 +1,45 @@ +# 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 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. + +files_vulkan_util = files( + 'vk_alloc.h', + 'vk_debug_report.c', + 'vk_debug_report.h', + 'vk_util.c', + 'vk_util.h', +) + +vk_enum_to_str = custom_target( + 'vk_enum_to_str', + input : ['gen_enum_to_str.py', vk_api_xml[0]], + output : ['vk_enum_to_str.c', 'vk_enum_to_str.h'], + command : [ + prog_python, '@INPUT0@', '--xml', '@INPUT1@', '--outdir', + meson.current_build_dir() + ], +) + +libvulkan_util = static_library( + 'vulkan_util', + [files_vulkan_util, vk_enum_to_str], + include_directories : [inc_common, inc_vulkan], + c_args : [c_vis_args], + build_by_default : false, +) diff --git a/lib/mesa/src/vulkan/util/vk_debug_report.c b/lib/mesa/src/vulkan/util/vk_debug_report.c new file mode 100644 index 000000000..22ae4a7d9 --- /dev/null +++ b/lib/mesa/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/lib/mesa/src/vulkan/util/vk_debug_report.h b/lib/mesa/src/vulkan/util/vk_debug_report.h new file mode 100644 index 000000000..625ecbb69 --- /dev/null +++ b/lib/mesa/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 |