object_tracker.h revision cc7c305c82f6443c324165edb7af59f60fc87eeb
1288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski/* Copyright (c) 2015-2016 The Khronos Group Inc. 2288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski * Copyright (c) 2015-2016 Valve Corporation 3288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski * Copyright (c) 2015-2016 LunarG, Inc. 4288e4f7d378f9185c714ead36a17dff64be24e49Mark Lobodzinski * Copyright (C) 2015-2016 Google Inc. 5acab8885d3e8c1fdcbfb8ebf9c52168148da63b5Tobin Ehlis * 643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Licensed under the Apache License, Version 2.0 (the "License"); 743b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * you may not use this file except in compliance with the License. 843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * You may obtain a copy of the License at 9acab8885d3e8c1fdcbfb8ebf9c52168148da63b5Tobin Ehlis * 1043b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * http://www.apache.org/licenses/LICENSE-2.0 11acab8885d3e8c1fdcbfb8ebf9c52168148da63b5Tobin Ehlis * 1243b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Unless required by applicable law or agreed to in writing, software 1343b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * distributed under the License is distributed on an "AS IS" BASIS, 1443b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1543b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * See the License for the specific language governing permissions and 1643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * limitations under the License. 1796cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * 1896cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: Mark Lobodzinski <mark@lunarg.com> 192faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski * Author: Jon Ashburn <jon@lunarg.com> 2096cd795bb585711057cd90d37a2251419384c937Courtney Goeltzenleuchter * Author: Tobin Ehlis <tobin@lunarg.com> 21acab8885d3e8c1fdcbfb8ebf9c52168148da63b5Tobin Ehlis */ 22acab8885d3e8c1fdcbfb8ebf9c52168148da63b5Tobin Ehlis 23241a2dbc046af61b3af566c7429f3e42aa49b286Jeremy Hayes#include <mutex> 24241a2dbc046af61b3af566c7429f3e42aa49b286Jeremy Hayes 251c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter#include "vk_enum_string_helper.h" 262faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski#include "vk_layer_extension_utils.h" 272bdf6da2d55b916479f90c87797ff20ddbb14fd9Courtney Goeltzenleuchter#include "vk_layer_table.h" 28d11c4ee2bd2a5672093d76630d895e824ee1a571Mark Lobodzinski#include "vk_layer_utils.h" 292faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski#include "vulkan/vk_layer.h" 3014305ad4363dd22e47118a76bc89376e5b291645Mark Lobodzinski 311c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wunamespace object_tracker { 321c0b73114010d6eb49ff34243fa9474493ef6eaeChia-I Wu 333c26a547b82bacdf9a378eb5bff0a5e7782f9379Tobin Ehlis// Object Tracker ERROR codes 346cb97f9b4cb894c01e9efbc065ef11fc9f6221b6Mark Lobodzinskienum OBJECT_TRACK_ERROR { 35cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJTRACK_NONE, // Used for INFO & other non-error messages 36cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJTRACK_UNKNOWN_OBJECT, // Updating uses of object that's not in global object list 37cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJTRACK_INTERNAL_ERROR, // Bug with data tracking within the layer 38cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJTRACK_OBJECT_LEAK, // OBJECT was not correctly freed/destroyed 39cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJTRACK_INVALID_OBJECT, // Object used that has never been created 40cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJTRACK_DESCRIPTOR_POOL_MISMATCH, // Descriptor Pools specified incorrectly 41cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJTRACK_COMMAND_POOL_MISMATCH, // Command Pools specified incorrectly 42cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJTRACK_ALLOCATOR_MISMATCH, // Created with custom allocator but destroyed without 436cb97f9b4cb894c01e9efbc065ef11fc9f6221b6Mark Lobodzinski}; 443c26a547b82bacdf9a378eb5bff0a5e7782f9379Tobin Ehlis 45235c20eeb60a1b09c15001ff90c48b89012eb0b9Tobin Ehlis// Object Status -- used to track state of individual objects 467d2d5ac7de9151a23b866b0b1e1380d184b41e69Mark Lobodzinskitypedef VkFlags ObjectStatusFlags; 476cb97f9b4cb894c01e9efbc065ef11fc9f6221b6Mark Lobodzinskienum ObjectStatusFlagBits { 48cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJSTATUS_NONE = 0x00000000, // No status is set 49cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJSTATUS_FENCE_IS_SUBMITTED = 0x00000001, // Fence has been submitted 50cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJSTATUS_VIEWPORT_BOUND = 0x00000002, // Viewport state object has been bound 51cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJSTATUS_RASTER_BOUND = 0x00000004, // Viewport state object has been bound 52cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJSTATUS_COLOR_BLEND_BOUND = 0x00000008, // Viewport state object has been bound 53cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJSTATUS_DEPTH_STENCIL_BOUND = 0x00000010, // Viewport state object has been bound 54cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJSTATUS_GPU_MEM_MAPPED = 0x00000020, // Memory object is currently mapped 55cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJSTATUS_COMMAND_BUFFER_SECONDARY = 0x00000040, // Command Buffer is of type SECONDARY 56cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski OBJSTATUS_CUSTOM_ALLOCATOR = 0x00000080, // Allocated with custom allocator 576cb97f9b4cb894c01e9efbc065ef11fc9f6221b6Mark Lobodzinski}; 58acab8885d3e8c1fdcbfb8ebf9c52168148da63b5Tobin Ehlis 592faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski// Object and state information structure 606cb97f9b4cb894c01e9efbc065ef11fc9f6221b6Mark Lobodzinskistruct OBJTRACK_NODE { 61cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski uint64_t handle; // Object handle (new) 62cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski VkDebugReportObjectTypeEXT object_type; // Object type identifier 63cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski ObjectStatusFlags status; // Object state 64cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski uint64_t parent_object; // Parent object 656cb97f9b4cb894c01e9efbc065ef11fc9f6221b6Mark Lobodzinski}; 66e1d3f0c689c3697d2e8b316fef899d7c7cb75faeMark Lobodzinski 672faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski// Track Queue information 682faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinskistruct OT_QUEUE_INFO { 692faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski uint32_t queue_node_index; 702faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski VkQueue queue; 7173bb657499347bd40990c742af60e63bb03426f3Cody Northrop}; 7214305ad4363dd22e47118a76bc89376e5b291645Mark Lobodzinski 732faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski// Layer name string to be logged with validation messages. 742faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinskiconst char LayerName[] = "ObjectTracker"; 752faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski 7661d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinskistruct instance_extension_enables { 77de4f1108f0a360ea02bfa0cc5e0fa0df8cf35927Jon Ashburn bool wsi_enabled; 7861d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinski bool xlib_enabled; 7961d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinski bool xcb_enabled; 8061d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinski bool wayland_enabled; 8161d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinski bool mir_enabled; 8261d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinski bool android_enabled; 8361d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinski bool win32_enabled; 846f2ed666809272002a31b3b4f8adf6581cb41819Norbert Nopper bool display_enabled; 85de4f1108f0a360ea02bfa0cc5e0fa0df8cf35927Jon Ashburn}; 86de4f1108f0a360ea02bfa0cc5e0fa0df8cf35927Jon Ashburn 875c4c68c37fbd5e01b931fb47ff2ba31c896bcbeeTobin Ehlistypedef std::unordered_map<uint64_t, OBJTRACK_NODE *> object_map_type; 882faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinskistruct layer_data { 892faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski VkInstance instance; 902faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski VkPhysicalDevice physical_device; 91dc87a3ff47dee440b96bdfb385d90d2e271188d9Mark Lobodzinski 922faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski uint64_t num_objects[VK_DEBUG_REPORT_OBJECT_TYPE_RANGE_SIZE_EXT + 1]; 932faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski uint64_t num_total_objects; 9461d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinski 952faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski debug_report_data *report_data; 962faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski std::vector<VkDebugReportCallbackEXT> logging_callback; 972faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski bool wsi_enabled; 9819ab93c7fb4fb9ae62679852783a97f599d1b367Mark Young bool wsi_display_swapchain_enabled; 99dfb417d980dc0341eb6b8e50c6095d7fcffff1acMark Lobodzinski bool wsi_display_extension_enabled; 1002faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski bool objtrack_extensions_enabled; 101b5f087aec8b42faee128c5c3dd1cb11b662d85aaMark Young bool nvx_device_generated_commands_enabled; 102b5f087aec8b42faee128c5c3dd1cb11b662d85aaMark Young bool ext_display_control_enabled; 10361d505ea40b189b7ae63f311e2f13210eef219d2Mark Lobodzinski 1042faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski // The following are for keeping track of the temporary callbacks that can 1052faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski // be used in vkCreateInstance and vkDestroyInstance: 1062faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski uint32_t num_tmp_callbacks; 1072faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos; 1082faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski VkDebugReportCallbackEXT *tmp_callbacks; 109de4f1108f0a360ea02bfa0cc5e0fa0df8cf35927Jon Ashburn 1102faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski std::vector<VkQueueFamilyProperties> queue_family_properties; 11114305ad4363dd22e47118a76bc89376e5b291645Mark Lobodzinski 1125c4c68c37fbd5e01b931fb47ff2ba31c896bcbeeTobin Ehlis // Vector of unordered_maps per object type to hold OBJTRACK_NODE info 1135c4c68c37fbd5e01b931fb47ff2ba31c896bcbeeTobin Ehlis std::vector<object_map_type> object_map; 1142faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski // Special-case map for swapchain images 1152faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski std::unordered_map<uint64_t, OBJTRACK_NODE *> swapchainImageMap; 1162faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski // Map of queue information structures, one per queue 1172faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski std::unordered_map<VkQueue, OT_QUEUE_INFO *> queue_info_map; 11814305ad4363dd22e47118a76bc89376e5b291645Mark Lobodzinski 1197b0f9d703b1f9b2a05f52ec6778941216e7598a3Tobin Ehlis VkLayerDispatchTable dispatch_table; 1202faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski // Default constructor 1212faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski layer_data() 122cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski : instance(nullptr), 123cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski physical_device(nullptr), 124cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski num_objects{}, 125cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski num_total_objects(0), 126cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski report_data(nullptr), 127cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski wsi_enabled(false), 128cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski wsi_display_swapchain_enabled(false), 129cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski wsi_display_extension_enabled(false), 130cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski objtrack_extensions_enabled(false), 131cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski num_tmp_callbacks(0), 132cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski tmp_dbg_create_infos(nullptr), 133cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski tmp_callbacks(nullptr), 134cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski object_map{}, 135cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski dispatch_table{} { 1365c4c68c37fbd5e01b931fb47ff2ba31c896bcbeeTobin Ehlis object_map.resize(VK_DEBUG_REPORT_OBJECT_TYPE_RANGE_SIZE_EXT + 1); 1375c4c68c37fbd5e01b931fb47ff2ba31c896bcbeeTobin Ehlis } 1386cb97f9b4cb894c01e9efbc065ef11fc9f6221b6Mark Lobodzinski}; 13914305ad4363dd22e47118a76bc89376e5b291645Mark Lobodzinski 1402faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinskistatic std::unordered_map<void *, struct instance_extension_enables> instanceExtMap; 1412faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinskistatic std::unordered_map<void *, layer_data *> layer_data_map; 1422faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinskistatic device_table_map ot_device_table_map; 1432faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinskistatic instance_table_map ot_instance_table_map; 1442faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinskistatic std::mutex global_lock; 1452faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinskistatic uint64_t object_track_index = 0; 1462faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski 1472faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinski// Array of object name strings for OBJECT_TYPE enum conversion 1482faa21475b11e094bb4a82cb7d370b9da1609623Mark Lobodzinskistatic const char *object_name[VK_DEBUG_REPORT_OBJECT_TYPE_RANGE_SIZE_EXT] = { 149cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Unknown", // VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN 150cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Instance", // VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT 151cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Physical Device", // VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT 152cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Device", // VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT 153cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Queue", // VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT 154cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Semaphore", // VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT 155cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Command Buffer", // VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT 156cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Fence", // VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT 157cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Device Memory", // VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT 158cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Buffer", // VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT 159cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Image", // VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT 160cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Event", // VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT 161cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Query Pool", // VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT 162cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Buffer View", // VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT 163cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Image View", // VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT 164cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Shader Module", // VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT 165cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Pipeline Cache", // VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT 166cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Pipeline Layout", // VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT 167cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Render Pass", // VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT 168cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Pipeline", // VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT 169cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Descriptor Set Layout", // VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT 170cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Sampler", // VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT 171cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Descriptor Pool", // VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT 172cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Descriptor Set", // VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT 173cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Framebuffer", // VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT 174cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Command Pool", // VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT 175cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "SurfaceKHR", // VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT 176cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "SwapchainKHR", // VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT 177cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski "Debug Report"}; // VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT 17814305ad4363dd22e47118a76bc89376e5b291645Mark Lobodzinski 17914305ad4363dd22e47118a76bc89376e5b291645Mark Lobodzinski#include "vk_dispatch_table_helper.h" 180d11c4ee2bd2a5672093d76630d895e824ee1a571Mark Lobodzinski 181cc7c305c82f6443c324165edb7af59f60fc87eebMark Lobodzinski} // namespace object_tracker 182