debug_report.h revision b3055f34650cd066a349e1e8cba294b05513ef2e
1715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall/* 2715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * Copyright 2016 The Android Open Source Project 3715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * 4715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * Licensed under the Apache License, Version 2.0 (the "License"); 5715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * you may not use this file except in compliance with the License. 6715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * You may obtain a copy of the License at 7715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * 8715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * http://www.apache.org/licenses/LICENSE-2.0 9715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * 10715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * Unless required by applicable law or agreed to in writing, software 11715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * distributed under the License is distributed on an "AS IS" BASIS, 12715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * See the License for the specific language governing permissions and 14715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall * limitations under the License. 15715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall */ 16715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall 17715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall#ifndef LIBVULKAN_DEBUG_REPORT_H 18715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall#define LIBVULKAN_DEBUG_REPORT_H 1 19715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall 20622622377a1ac71a81a88e335f170c4a08835f06Chia-I Wu#include <vulkan/vulkan.h> 21715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall#include <shared_mutex> 22715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall 23715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hallnamespace vulkan { 24622622377a1ac71a81a88e335f170c4a08835f06Chia-I Wunamespace driver { 25715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall 26715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall// clang-format off 27622622377a1ac71a81a88e335f170c4a08835f06Chia-I WuVKAPI_ATTR VkResult CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback); 28622622377a1ac71a81a88e335f170c4a08835f06Chia-I WuVKAPI_ATTR void DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator); 29622622377a1ac71a81a88e335f170c4a08835f06Chia-I WuVKAPI_ATTR void DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage); 30715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall// clang-format on 31715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall 32715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hallclass DebugReportCallbackList { 33a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu private: 34a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu // forward declaration 35a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu struct Node; 36a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu 37715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall public: 38715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall DebugReportCallbackList() 39715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall : head_{nullptr, 0, nullptr, nullptr, VK_NULL_HANDLE} {} 40715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall DebugReportCallbackList(const DebugReportCallbackList&) = delete; 41715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall DebugReportCallbackList& operator=(const DebugReportCallbackList&) = delete; 42715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall ~DebugReportCallbackList() = default; 43715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall 44a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu Node* AddCallback(const VkDebugReportCallbackCreateInfoEXT& info, 45a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu VkDebugReportCallbackEXT driver_handle, 46a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu const VkAllocationCallbacks& allocator); 47a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu void RemoveCallback(Node* node, const VkAllocationCallbacks& allocator); 48a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu 49715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall void Message(VkDebugReportFlagsEXT flags, 50715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall VkDebugReportObjectTypeEXT object_type, 51715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall uint64_t object, 52715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall size_t location, 53715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall int32_t message_code, 54715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall const char* layer_prefix, 55b3055f34650cd066a349e1e8cba294b05513ef2eChia-I Wu const char* message) const; 56715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall 57a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu static Node* FromHandle(VkDebugReportCallbackEXT handle) { 58a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu return reinterpret_cast<Node*>(uintptr_t(handle)); 59a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu } 60a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu 61a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu static VkDebugReportCallbackEXT GetHandle(const Node* node) { 62a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu return VkDebugReportCallbackEXT(reinterpret_cast<uintptr_t>(node)); 63a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu } 64a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu 65a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu static VkDebugReportCallbackEXT GetDriverHandle(const Node* node) { 66a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu return node->driver_handle; 67a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu } 68a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu 69715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall private: 70715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall struct Node { 71715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall Node* next; 72a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu 73715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall VkDebugReportFlagsEXT flags; 74715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall PFN_vkDebugReportCallbackEXT callback; 75a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu void* user_data; 76a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu 77a0d40aaf12435fe82bc9c1612dbe97ea2a60da31Chia-I Wu VkDebugReportCallbackEXT driver_handle; 78715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall }; 79715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall 80715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall // TODO(jessehall): replace with std::shared_mutex when available in libc++ 81b3055f34650cd066a349e1e8cba294b05513ef2eChia-I Wu mutable std::shared_timed_mutex rwmutex_; 82715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall Node head_; 83715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall}; 84715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall 85622622377a1ac71a81a88e335f170c4a08835f06Chia-I Wu} // namespace driver 86715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall} // namespace vulkan 87715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall 88715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall#endif // LIBVULKAN_DEBUG_REPORT_H 89