summaryrefslogtreecommitdiffstats
path: root/src/vulkan
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <[email protected]>2018-01-09 03:22:56 +0100
committerBas Nieuwenhuizen <[email protected]>2018-01-17 11:27:52 +0100
commite5b1bd6ab8f5c1d9bf6a90b7003dc336cbe3cf93 (patch)
treeda5589535c0f1ebe2dcb3d441eb12ea06c85f5ac /src/vulkan
parentf69cbb2b53ac3edf7b201ba77430a61471edfa6e (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.sources2
-rw-r--r--src/vulkan/util/meson.build2
-rw-r--r--src/vulkan/util/vk_debug_report.c122
-rw-r--r--src/vulkan/util/vk_debug_report.h72
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