Loading vulkan/include/vulkan/vk_debug_report_lunarg.h 0 → 100644 +188 −0 Original line number Diff line number Diff line // // File: vk_debug_report_lunarg.h // /* * Vulkan * * Copyright (C) 2015 LunarG, Inc. * * 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. * * Authors: * Jon Ashburn <jon@lunarg.com> * Courtney Goeltzenleuchter <courtney@lunarg.com> */ #ifndef __VK_DEBUG_REPORT_LUNARG_H__ #define __VK_DEBUG_REPORT_LUNARG_H__ #include <vulkan/vulkan.h> #define VK_DEBUG_REPORT_EXTENSION_NUMBER 5 #define VK_DEBUG_REPORT_EXTENSION_REVISION 1 #ifdef __cplusplus extern "C" { #endif // __cplusplus /* *************************************************************************************************** * DebugReport Vulkan Extension API *************************************************************************************************** */ typedef enum { VK_OBJECT_TYPE_INSTANCE = 0, VK_OBJECT_TYPE_PHYSICAL_DEVICE = 1, VK_OBJECT_TYPE_DEVICE = 2, VK_OBJECT_TYPE_QUEUE = 3, VK_OBJECT_TYPE_COMMAND_BUFFER = 4, VK_OBJECT_TYPE_DEVICE_MEMORY = 5, VK_OBJECT_TYPE_BUFFER = 6, VK_OBJECT_TYPE_BUFFER_VIEW = 7, VK_OBJECT_TYPE_IMAGE = 8, VK_OBJECT_TYPE_IMAGE_VIEW = 9, VK_OBJECT_TYPE_ATTACHMENT_VIEW = 10, VK_OBJECT_TYPE_SHADER_MODULE = 12, VK_OBJECT_TYPE_SHADER = 13, VK_OBJECT_TYPE_PIPELINE = 14, VK_OBJECT_TYPE_PIPELINE_LAYOUT = 15, VK_OBJECT_TYPE_SAMPLER = 16, VK_OBJECT_TYPE_DESCRIPTOR_SET = 17, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT = 18, VK_OBJECT_TYPE_DESCRIPTOR_POOL = 19, VK_OBJECT_TYPE_DYNAMIC_VIEWPORT_STATE = 20, VK_OBJECT_TYPE_DYNAMIC_LINE_WIDTH_STATE = 21, VK_OBJECT_TYPE_DYNAMIC_DEPTH_BIAS_STATE = 22, VK_OBJECT_TYPE_DYNAMIC_BLEND_STATE = 23, VK_OBJECT_TYPE_DYNAMIC_DEPTH_BOUNDS_STATE = 24, VK_OBJECT_TYPE_DYNAMIC_STENCIL_STATE = 25, VK_OBJECT_TYPE_FENCE = 26, VK_OBJECT_TYPE_SEMAPHORE = 27, VK_OBJECT_TYPE_EVENT = 28, VK_OBJECT_TYPE_QUERY_POOL = 29, VK_OBJECT_TYPE_FRAMEBUFFER = 30, VK_OBJECT_TYPE_RENDER_PASS = 31, VK_OBJECT_TYPE_PIPELINE_CACHE = 32, VK_OBJECT_TYPE_SWAPCHAIN_KHR = 33, VK_OBJECT_TYPE_CMD_POOL = 34, VK_OBJECT_TYPE_BEGIN_RANGE = VK_OBJECT_TYPE_INSTANCE, VK_OBJECT_TYPE_END_RANGE = VK_OBJECT_TYPE_CMD_POOL, VK_OBJECT_TYPE_NUM = (VK_OBJECT_TYPE_CMD_POOL - VK_OBJECT_TYPE_INSTANCE + 1), VK_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF } VkDbgObjectType; #define VK_DEBUG_REPORT_EXTENSION_NAME "DEBUG_REPORT" VK_DEFINE_NONDISP_HANDLE(VkDbgMsgCallback) // ------------------------------------------------------------------------------------------------ // Enumerations typedef enum VkDbgReportFlags_ { VK_DBG_REPORT_INFO_BIT = 0x0001, VK_DBG_REPORT_WARN_BIT = 0x0002, VK_DBG_REPORT_PERF_WARN_BIT = 0x0004, VK_DBG_REPORT_ERROR_BIT = 0x0008, VK_DBG_REPORT_DEBUG_BIT = 0x0010, } VkDbgReportFlags; // Debug Report ERROR codes typedef enum _DEBUG_REPORT_ERROR { DEBUG_REPORT_NONE, // Used for INFO & other non-error messages DEBUG_REPORT_CALLBACK_REF, // Callbacks were not destroyed prior to calling // DestroyInstance } DEBUG_REPORT_ERROR; #define VK_DEBUG_REPORT_ENUM_EXTEND(type, id) \ ((type)(VK_DEBUG_REPORT_EXTENSION_NUMBER * -1000 + (id))) #define VK_OBJECT_TYPE_MSG_CALLBACK \ VK_DEBUG_REPORT_ENUM_EXTEND(VkDbgObjectType, 0) // ------------------------------------------------------------------------------------------------ // Vulkan function pointers typedef void (*PFN_vkDbgMsgCallback)(VkFlags msgFlags, VkDbgObjectType objType, uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void* pUserData); // ------------------------------------------------------------------------------------------------ // API functions typedef VkResult(VKAPI* PFN_vkDbgCreateMsgCallback)( VkInstance instance, VkFlags msgFlags, const PFN_vkDbgMsgCallback pfnMsgCallback, void* pUserData, VkDbgMsgCallback* pMsgCallback); typedef VkResult(VKAPI* PFN_vkDbgDestroyMsgCallback)( VkInstance instance, VkDbgMsgCallback msgCallback); #ifdef VK_PROTOTYPES // DebugReport extension entrypoints VkResult VKAPI vkDbgCreateMsgCallback(VkInstance instance, VkFlags msgFlags, const PFN_vkDbgMsgCallback pfnMsgCallback, void* pUserData, VkDbgMsgCallback* pMsgCallback); VkResult VKAPI vkDbgDestroyMsgCallback(VkInstance instance, VkDbgMsgCallback msgCallback); // DebugReport utility callback functions void VKAPI vkDbgStringCallback(VkFlags msgFlags, VkDbgObjectType objType, uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void* pUserData); void VKAPI vkDbgStdioCallback(VkFlags msgFlags, VkDbgObjectType objType, uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void* pUserData); void VKAPI vkDbgBreakCallback(VkFlags msgFlags, VkDbgObjectType objType, uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void* pUserData); #endif // VK_PROTOTYPES #ifdef __cplusplus } // extern "C" #endif // __cplusplus #endif // __VK_DEBUG_REPORT_LUNARG_H__ vulkan/libvulkan/loader.cpp +34 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include <cutils/properties.h> #include <hardware/hwvulkan.h> #include <log/log.h> #include <vulkan/vk_debug_report_lunarg.h> using namespace vulkan; Loading Loading @@ -136,6 +137,7 @@ struct VkInstance_T { VkPhysicalDevice physical_devices[kMaxPhysicalDevices]; Vector<std::pair<String, SharedLibraryHandle> > active_layers; VkDbgMsgCallback message; struct Driver { // Pointers to driver entry points. Used explicitly by the loader; not Loading Loading @@ -331,6 +333,21 @@ void LoadLayerFromProperty(const char* name, const char* value, void* data) { (*instance_layers_pair->layers)[layer_name_str]); } void LogDebugMessageCallback(VkFlags message_flags, VkDbgObjectType /*obj_type*/, uint64_t /*src_object*/, size_t /*location*/, int32_t message_code, const char* layer_prefix, const char* message, void* /*user_data*/) { if (message_flags & VK_DBG_REPORT_ERROR_BIT) { ALOGE("[%s] Code %d : %s", layer_prefix, message_code, message); } else if (message_flags & VK_DBG_REPORT_WARN_BIT) { ALOGW("[%s] Code %d : %s", layer_prefix, message_code, message); } } // ----------------------------------------------------------------------------- // "Bottom" functions. These are called at the end of the instance dispatch // chain. Loading @@ -345,6 +362,12 @@ VkResult DestroyInstanceBottom(VkInstance instance) { for (auto& layer : instance->active_layers) { dlclose(layer.second); } if (instance->message) { PFN_vkDbgDestroyMsgCallback DebugDestroyMessageCallback; DebugDestroyMessageCallback = reinterpret_cast<PFN_vkDbgDestroyMsgCallback>( vkGetInstanceProcAddr(instance, "vkDbgDestroyMsgCallback")); DebugDestroyMessageCallback(instance, instance->message); } const VkAllocCallbacks* alloc = instance->alloc; instance->~VkInstance_T(); alloc->pfnFree(alloc->pUserData, instance); Loading Loading @@ -727,6 +750,7 @@ VkResult CreateInstance(const VkInstanceCreateInfo* create_info, instance->vtbl_storage = kBottomInstanceFunctions; instance->vtbl_storage.instance = instance; instance->message = VK_NULL_HANDLE; // Scan layers // TODO: Add more directories to scan Loading Loading @@ -817,6 +841,7 @@ VkResult CreateInstance(const VkInstanceCreateInfo* create_info, // Force enable callback extension if required bool enable_callback = property_get_bool("debug.vulkan.enable_layer_callback", false); bool enable_logging = enable_callback; const char* callback_name = "DEBUG_REPORT"; if (enable_callback) { for (uint32_t i = 0; i < create_info->extensionCount; ++i) { Loading Loading @@ -872,6 +897,15 @@ VkResult CreateInstance(const VkInstanceCreateInfo* create_info, // already gone at this point. Nothing to do. } if (enable_logging) { PFN_vkDbgCreateMsgCallback DebugCreateMessageCallback; DebugCreateMessageCallback = reinterpret_cast<PFN_vkDbgCreateMsgCallback>( vkGetInstanceProcAddr(instance, "vkDbgCreateMsgCallback")); DebugCreateMessageCallback(instance, VK_DBG_REPORT_ERROR_BIT | VK_DBG_REPORT_WARN_BIT, LogDebugMessageCallback, NULL, &instance->message); } return result; } Loading Loading
vulkan/include/vulkan/vk_debug_report_lunarg.h 0 → 100644 +188 −0 Original line number Diff line number Diff line // // File: vk_debug_report_lunarg.h // /* * Vulkan * * Copyright (C) 2015 LunarG, Inc. * * 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. * * Authors: * Jon Ashburn <jon@lunarg.com> * Courtney Goeltzenleuchter <courtney@lunarg.com> */ #ifndef __VK_DEBUG_REPORT_LUNARG_H__ #define __VK_DEBUG_REPORT_LUNARG_H__ #include <vulkan/vulkan.h> #define VK_DEBUG_REPORT_EXTENSION_NUMBER 5 #define VK_DEBUG_REPORT_EXTENSION_REVISION 1 #ifdef __cplusplus extern "C" { #endif // __cplusplus /* *************************************************************************************************** * DebugReport Vulkan Extension API *************************************************************************************************** */ typedef enum { VK_OBJECT_TYPE_INSTANCE = 0, VK_OBJECT_TYPE_PHYSICAL_DEVICE = 1, VK_OBJECT_TYPE_DEVICE = 2, VK_OBJECT_TYPE_QUEUE = 3, VK_OBJECT_TYPE_COMMAND_BUFFER = 4, VK_OBJECT_TYPE_DEVICE_MEMORY = 5, VK_OBJECT_TYPE_BUFFER = 6, VK_OBJECT_TYPE_BUFFER_VIEW = 7, VK_OBJECT_TYPE_IMAGE = 8, VK_OBJECT_TYPE_IMAGE_VIEW = 9, VK_OBJECT_TYPE_ATTACHMENT_VIEW = 10, VK_OBJECT_TYPE_SHADER_MODULE = 12, VK_OBJECT_TYPE_SHADER = 13, VK_OBJECT_TYPE_PIPELINE = 14, VK_OBJECT_TYPE_PIPELINE_LAYOUT = 15, VK_OBJECT_TYPE_SAMPLER = 16, VK_OBJECT_TYPE_DESCRIPTOR_SET = 17, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT = 18, VK_OBJECT_TYPE_DESCRIPTOR_POOL = 19, VK_OBJECT_TYPE_DYNAMIC_VIEWPORT_STATE = 20, VK_OBJECT_TYPE_DYNAMIC_LINE_WIDTH_STATE = 21, VK_OBJECT_TYPE_DYNAMIC_DEPTH_BIAS_STATE = 22, VK_OBJECT_TYPE_DYNAMIC_BLEND_STATE = 23, VK_OBJECT_TYPE_DYNAMIC_DEPTH_BOUNDS_STATE = 24, VK_OBJECT_TYPE_DYNAMIC_STENCIL_STATE = 25, VK_OBJECT_TYPE_FENCE = 26, VK_OBJECT_TYPE_SEMAPHORE = 27, VK_OBJECT_TYPE_EVENT = 28, VK_OBJECT_TYPE_QUERY_POOL = 29, VK_OBJECT_TYPE_FRAMEBUFFER = 30, VK_OBJECT_TYPE_RENDER_PASS = 31, VK_OBJECT_TYPE_PIPELINE_CACHE = 32, VK_OBJECT_TYPE_SWAPCHAIN_KHR = 33, VK_OBJECT_TYPE_CMD_POOL = 34, VK_OBJECT_TYPE_BEGIN_RANGE = VK_OBJECT_TYPE_INSTANCE, VK_OBJECT_TYPE_END_RANGE = VK_OBJECT_TYPE_CMD_POOL, VK_OBJECT_TYPE_NUM = (VK_OBJECT_TYPE_CMD_POOL - VK_OBJECT_TYPE_INSTANCE + 1), VK_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF } VkDbgObjectType; #define VK_DEBUG_REPORT_EXTENSION_NAME "DEBUG_REPORT" VK_DEFINE_NONDISP_HANDLE(VkDbgMsgCallback) // ------------------------------------------------------------------------------------------------ // Enumerations typedef enum VkDbgReportFlags_ { VK_DBG_REPORT_INFO_BIT = 0x0001, VK_DBG_REPORT_WARN_BIT = 0x0002, VK_DBG_REPORT_PERF_WARN_BIT = 0x0004, VK_DBG_REPORT_ERROR_BIT = 0x0008, VK_DBG_REPORT_DEBUG_BIT = 0x0010, } VkDbgReportFlags; // Debug Report ERROR codes typedef enum _DEBUG_REPORT_ERROR { DEBUG_REPORT_NONE, // Used for INFO & other non-error messages DEBUG_REPORT_CALLBACK_REF, // Callbacks were not destroyed prior to calling // DestroyInstance } DEBUG_REPORT_ERROR; #define VK_DEBUG_REPORT_ENUM_EXTEND(type, id) \ ((type)(VK_DEBUG_REPORT_EXTENSION_NUMBER * -1000 + (id))) #define VK_OBJECT_TYPE_MSG_CALLBACK \ VK_DEBUG_REPORT_ENUM_EXTEND(VkDbgObjectType, 0) // ------------------------------------------------------------------------------------------------ // Vulkan function pointers typedef void (*PFN_vkDbgMsgCallback)(VkFlags msgFlags, VkDbgObjectType objType, uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void* pUserData); // ------------------------------------------------------------------------------------------------ // API functions typedef VkResult(VKAPI* PFN_vkDbgCreateMsgCallback)( VkInstance instance, VkFlags msgFlags, const PFN_vkDbgMsgCallback pfnMsgCallback, void* pUserData, VkDbgMsgCallback* pMsgCallback); typedef VkResult(VKAPI* PFN_vkDbgDestroyMsgCallback)( VkInstance instance, VkDbgMsgCallback msgCallback); #ifdef VK_PROTOTYPES // DebugReport extension entrypoints VkResult VKAPI vkDbgCreateMsgCallback(VkInstance instance, VkFlags msgFlags, const PFN_vkDbgMsgCallback pfnMsgCallback, void* pUserData, VkDbgMsgCallback* pMsgCallback); VkResult VKAPI vkDbgDestroyMsgCallback(VkInstance instance, VkDbgMsgCallback msgCallback); // DebugReport utility callback functions void VKAPI vkDbgStringCallback(VkFlags msgFlags, VkDbgObjectType objType, uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void* pUserData); void VKAPI vkDbgStdioCallback(VkFlags msgFlags, VkDbgObjectType objType, uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void* pUserData); void VKAPI vkDbgBreakCallback(VkFlags msgFlags, VkDbgObjectType objType, uint64_t srcObject, size_t location, int32_t msgCode, const char* pLayerPrefix, const char* pMsg, void* pUserData); #endif // VK_PROTOTYPES #ifdef __cplusplus } // extern "C" #endif // __cplusplus #endif // __VK_DEBUG_REPORT_LUNARG_H__
vulkan/libvulkan/loader.cpp +34 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include <cutils/properties.h> #include <hardware/hwvulkan.h> #include <log/log.h> #include <vulkan/vk_debug_report_lunarg.h> using namespace vulkan; Loading Loading @@ -136,6 +137,7 @@ struct VkInstance_T { VkPhysicalDevice physical_devices[kMaxPhysicalDevices]; Vector<std::pair<String, SharedLibraryHandle> > active_layers; VkDbgMsgCallback message; struct Driver { // Pointers to driver entry points. Used explicitly by the loader; not Loading Loading @@ -331,6 +333,21 @@ void LoadLayerFromProperty(const char* name, const char* value, void* data) { (*instance_layers_pair->layers)[layer_name_str]); } void LogDebugMessageCallback(VkFlags message_flags, VkDbgObjectType /*obj_type*/, uint64_t /*src_object*/, size_t /*location*/, int32_t message_code, const char* layer_prefix, const char* message, void* /*user_data*/) { if (message_flags & VK_DBG_REPORT_ERROR_BIT) { ALOGE("[%s] Code %d : %s", layer_prefix, message_code, message); } else if (message_flags & VK_DBG_REPORT_WARN_BIT) { ALOGW("[%s] Code %d : %s", layer_prefix, message_code, message); } } // ----------------------------------------------------------------------------- // "Bottom" functions. These are called at the end of the instance dispatch // chain. Loading @@ -345,6 +362,12 @@ VkResult DestroyInstanceBottom(VkInstance instance) { for (auto& layer : instance->active_layers) { dlclose(layer.second); } if (instance->message) { PFN_vkDbgDestroyMsgCallback DebugDestroyMessageCallback; DebugDestroyMessageCallback = reinterpret_cast<PFN_vkDbgDestroyMsgCallback>( vkGetInstanceProcAddr(instance, "vkDbgDestroyMsgCallback")); DebugDestroyMessageCallback(instance, instance->message); } const VkAllocCallbacks* alloc = instance->alloc; instance->~VkInstance_T(); alloc->pfnFree(alloc->pUserData, instance); Loading Loading @@ -727,6 +750,7 @@ VkResult CreateInstance(const VkInstanceCreateInfo* create_info, instance->vtbl_storage = kBottomInstanceFunctions; instance->vtbl_storage.instance = instance; instance->message = VK_NULL_HANDLE; // Scan layers // TODO: Add more directories to scan Loading Loading @@ -817,6 +841,7 @@ VkResult CreateInstance(const VkInstanceCreateInfo* create_info, // Force enable callback extension if required bool enable_callback = property_get_bool("debug.vulkan.enable_layer_callback", false); bool enable_logging = enable_callback; const char* callback_name = "DEBUG_REPORT"; if (enable_callback) { for (uint32_t i = 0; i < create_info->extensionCount; ++i) { Loading Loading @@ -872,6 +897,15 @@ VkResult CreateInstance(const VkInstanceCreateInfo* create_info, // already gone at this point. Nothing to do. } if (enable_logging) { PFN_vkDbgCreateMsgCallback DebugCreateMessageCallback; DebugCreateMessageCallback = reinterpret_cast<PFN_vkDbgCreateMsgCallback>( vkGetInstanceProcAddr(instance, "vkDbgCreateMsgCallback")); DebugCreateMessageCallback(instance, VK_DBG_REPORT_ERROR_BIT | VK_DBG_REPORT_WARN_BIT, LogDebugMessageCallback, NULL, &instance->message); } return result; } Loading