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