blob: afbd906ef48086fd48eadf21af61a24daafac1f1 [file] [log] [blame]
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
5 * Copyright (c) 2015-2016 Google, Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * Author: Mark Lobodzinski <mark@lunarg.com>
20 * Author: Tobin Ehlis <tobine@google.com>
21 * Author: Courtney Goeltzenleuchter <courtneygo@google.com>
22 * Author: Jon Ashburn <jon@lunarg.com>
23 * Author: Mike Stroyan <stroyan@google.com>
24 * Author: Tony Barbour <tony@LunarG.com>
25 */
26
27#include "vk_loader_platform.h"
28#include "vulkan/vulkan.h"
29
30#include <cinttypes>
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34
35#include <unordered_map>
36
37#include "vk_layer_config.h"
38#include "vk_layer_data.h"
39#include "vk_layer_logging.h"
40#include "vk_layer_table.h"
41#include "vulkan/vk_layer.h"
42
43#include "object_tracker.h"
44
45namespace object_tracker {
46
47static void InitObjectTracker(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
48
49 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_object_tracker");
50}
51
52// Add new queue to head of global queue list
53static void AddQueueInfo(VkDevice device, uint32_t queue_node_index, VkQueue queue) {
54 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
55 auto queueItem = device_data->queue_info_map.find(queue);
56 if (queueItem == device_data->queue_info_map.end()) {
57 OT_QUEUE_INFO *p_queue_info = new OT_QUEUE_INFO;
58 if (p_queue_info != NULL) {
59 memset(p_queue_info, 0, sizeof(OT_QUEUE_INFO));
60 p_queue_info->queue = queue;
61 p_queue_info->queue_node_index = queue_node_index;
62 device_data->queue_info_map[queue] = p_queue_info;
63 } else {
64 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
65 reinterpret_cast<uint64_t>(queue), __LINE__, OBJTRACK_INTERNAL_ERROR, LayerName,
66 "ERROR: VK_ERROR_OUT_OF_HOST_MEMORY -- could not allocate memory for Queue Information");
67 }
68 }
69}
70
71// Destroy memRef lists and free all memory
72static void DestroyQueueDataStructures(VkDevice device) {
73 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
74
75 for (auto queue_item : device_data->queue_info_map) {
76 delete queue_item.second;
77 }
78 device_data->queue_info_map.clear();
79
80 // Destroy the items in the queue map
81 auto queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].begin();
82 while (queue != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
83 uint32_t obj_index = queue->second->object_type;
84 assert(device_data->num_total_objects > 0);
85 device_data->num_total_objects--;
86 assert(device_data->num_objects[obj_index] > 0);
87 device_data->num_objects[obj_index]--;
88 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, queue->second->object_type, queue->second->handle,
89 __LINE__, OBJTRACK_NONE, LayerName,
90 "OBJ_STAT Destroy Queue obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " Queue objs).",
91 queue->second->handle, device_data->num_total_objects, device_data->num_objects[obj_index]);
92 delete queue->second;
93 queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].erase(queue);
94 }
95}
96
97// Check Queue type flags for selected queue operations
98static void ValidateQueueFlags(VkQueue queue, const char *function) {
99 layer_data *device_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
100 auto queue_item = device_data->queue_info_map.find(queue);
101 if (queue_item != device_data->queue_info_map.end()) {
102 OT_QUEUE_INFO *pQueueInfo = queue_item->second;
103 if (pQueueInfo != NULL) {
104 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(device_data->physical_device), layer_data_map);
105 if ((instance_data->queue_family_properties[pQueueInfo->queue_node_index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) ==
106 0) {
107 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
108 reinterpret_cast<uint64_t>(queue), __LINE__, OBJTRACK_UNKNOWN_OBJECT, LayerName,
109 "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_SPARSE_BINDING_BIT not set", function);
110 }
111 }
112 }
113}
114
115static void AllocateCommandBuffer(VkDevice device, const VkCommandPool command_pool, const VkCommandBuffer command_buffer,
116 VkDebugReportObjectTypeEXT object_type, VkCommandBufferLevel level) {
117 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
118
119 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<const uint64_t>(command_buffer),
120 __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
121 string_VkDebugReportObjectTypeEXT(object_type), reinterpret_cast<const uint64_t>(command_buffer));
122
123 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
124 pNewObjNode->object_type = object_type;
125 pNewObjNode->handle = reinterpret_cast<const uint64_t>(command_buffer);
126 pNewObjNode->parent_object = reinterpret_cast<const uint64_t &>(command_pool);
127 if (level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) {
128 pNewObjNode->status = OBJSTATUS_COMMAND_BUFFER_SECONDARY;
129 } else {
130 pNewObjNode->status = OBJSTATUS_NONE;
131 }
132 device_data->object_map[object_type][reinterpret_cast<const uint64_t>(command_buffer)] = pNewObjNode;
133 device_data->num_objects[object_type]++;
134 device_data->num_total_objects++;
135}
136
137static bool ValidateCommandBuffer(VkDevice device, VkCommandPool command_pool, VkCommandBuffer command_buffer) {
138 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
139 bool skip_call = false;
140 uint64_t object_handle = reinterpret_cast<uint64_t>(command_buffer);
141 if (device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].find(object_handle) !=
142 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
143 OBJTRACK_NODE *pNode =
144 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<uint64_t>(command_buffer)];
145
146 if (pNode->parent_object != reinterpret_cast<uint64_t &>(command_pool)) {
147 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
148 __LINE__, OBJTRACK_COMMAND_POOL_MISMATCH, LayerName,
149 "FreeCommandBuffers is attempting to free Command Buffer 0x%" PRIxLEAST64
150 " belonging to Command Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").",
151 reinterpret_cast<uint64_t>(command_buffer), pNode->parent_object,
152 reinterpret_cast<uint64_t &>(command_pool));
153 }
154 } else {
Mark Lobodzinski45e68612016-07-18 17:06:52 -0600155 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle,
156 __LINE__, OBJTRACK_NONE, LayerName, "Unable to remove command buffer obj 0x%" PRIxLEAST64
157 ". Was it created? Has it already been destroyed?",
158 object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600159 }
160 return skip_call;
161}
162
163static void AllocateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set,
164 VkDebugReportObjectTypeEXT object_type) {
165 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
166
167 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type,
168 reinterpret_cast<uint64_t &>(descriptor_set), __LINE__, OBJTRACK_NONE, LayerName,
169 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, object_name[object_type],
170 reinterpret_cast<uint64_t &>(descriptor_set));
171
172 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
173 pNewObjNode->object_type = object_type;
174 pNewObjNode->status = OBJSTATUS_NONE;
175 pNewObjNode->handle = reinterpret_cast<uint64_t &>(descriptor_set);
176 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(descriptor_pool);
177 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT][reinterpret_cast<uint64_t &>(descriptor_set)] =
178 pNewObjNode;
179 device_data->num_objects[object_type]++;
180 device_data->num_total_objects++;
181}
182
183static bool ValidateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set) {
184 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
185 bool skip_call = false;
186 uint64_t object_handle = reinterpret_cast<uint64_t &>(descriptor_set);
187 auto dsItem = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].find(object_handle);
188 if (dsItem != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
189 OBJTRACK_NODE *pNode = dsItem->second;
190
191 if (pNode->parent_object != reinterpret_cast<uint64_t &>(descriptor_pool)) {
192 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
193 __LINE__, OBJTRACK_DESCRIPTOR_POOL_MISMATCH, LayerName,
194 "FreeDescriptorSets is attempting to free descriptorSet 0x%" PRIxLEAST64
195 " belonging to Descriptor Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").",
196 reinterpret_cast<uint64_t &>(descriptor_set), pNode->parent_object,
197 reinterpret_cast<uint64_t &>(descriptor_pool));
198 }
199 } else {
Mark Lobodzinski45e68612016-07-18 17:06:52 -0600200 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle,
201 __LINE__, OBJTRACK_NONE, LayerName, "Unable to remove descriptor set obj 0x%" PRIxLEAST64
202 ". Was it created? Has it already been destroyed?",
203 object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600204 }
205 return skip_call;
206}
207
208static void CreateQueue(VkDevice device, VkQueue vkObj, VkDebugReportObjectTypeEXT object_type) {
209 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
210
211 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<uint64_t>(vkObj), __LINE__,
212 OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
213 object_name[object_type], reinterpret_cast<uint64_t>(vkObj));
214
215 OBJTRACK_NODE *p_obj_node = NULL;
216 auto queue_item = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].find(reinterpret_cast<uint64_t>(vkObj));
217 if (queue_item == device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
218 p_obj_node = new OBJTRACK_NODE;
219 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT][reinterpret_cast<uint64_t>(vkObj)] = p_obj_node;
220 device_data->num_objects[object_type]++;
221 device_data->num_total_objects++;
222 } else {
223 p_obj_node = queue_item->second;
224 }
225 p_obj_node->object_type = object_type;
226 p_obj_node->status = OBJSTATUS_NONE;
227 p_obj_node->handle = reinterpret_cast<uint64_t>(vkObj);
228}
229
230static void CreateSwapchainImageObject(VkDevice dispatchable_object, VkImage swapchain_image, VkSwapchainKHR swapchain) {
231 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
232 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
233 reinterpret_cast<uint64_t &>(swapchain_image), __LINE__, OBJTRACK_NONE, LayerName,
234 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, "SwapchainImage",
235 reinterpret_cast<uint64_t &>(swapchain_image));
236
237 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
238 pNewObjNode->object_type = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT;
239 pNewObjNode->status = OBJSTATUS_NONE;
240 pNewObjNode->handle = reinterpret_cast<uint64_t &>(swapchain_image);
241 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(swapchain);
242 device_data->swapchainImageMap[reinterpret_cast<uint64_t &>(swapchain_image)] = pNewObjNode;
243}
244
Chris Forbes64a31a12016-10-04 14:54:13 +1300245template<typename T>
246uint64_t handle_value(T handle) {
247 return reinterpret_cast<uint64_t &>(handle);
248}
249template<typename T>
250uint64_t handle_value(T *handle) {
251 return reinterpret_cast<uint64_t>(handle);
252}
253
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600254template <typename T1, typename T2>
Chris Forbesfeecd402016-09-29 14:53:50 +1300255static void CreateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool custom_allocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600256 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes04257ad2016-10-04 10:08:31 +1300257
Chris Forbes64a31a12016-10-04 14:54:13 +1300258 auto object_handle = handle_value(object);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600259
Chris Forbesfeecd402016-09-29 14:53:50 +1300260 log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, object_handle,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600261 __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
Chris Forbesfeecd402016-09-29 14:53:50 +1300262 object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600263
264 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
265 pNewObjNode->object_type = object_type;
Chris Forbesdbfe96a2016-09-29 13:51:10 +1300266 pNewObjNode->status = custom_allocator ? OBJSTATUS_CUSTOM_ALLOCATOR : OBJSTATUS_NONE;
Chris Forbesfeecd402016-09-29 14:53:50 +1300267 pNewObjNode->handle = object_handle;
268 instance_data->object_map[object_type][object_handle] = pNewObjNode;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600269 instance_data->num_objects[object_type]++;
270 instance_data->num_total_objects++;
271}
272
273template <typename T1, typename T2>
Chris Forbesec461992016-09-29 14:41:44 +1300274static void DestroyObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool custom_allocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600275 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
276
Chris Forbes64a31a12016-10-04 14:54:13 +1300277 auto object_handle = handle_value(object);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600278
279 auto item = device_data->object_map[object_type].find(object_handle);
280 if (item != device_data->object_map[object_type].end()) {
281
282 OBJTRACK_NODE *pNode = item->second;
283 assert(device_data->num_total_objects > 0);
284 device_data->num_total_objects--;
285 assert(device_data->num_objects[pNode->object_type] > 0);
286 device_data->num_objects[pNode->object_type]--;
287
288 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, pNode->object_type, object_handle, __LINE__,
289 OBJTRACK_NONE, LayerName,
290 "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " %s objs).",
291 object_name[pNode->object_type], reinterpret_cast<uint64_t &>(object), device_data->num_total_objects,
292 device_data->num_objects[pNode->object_type], object_name[pNode->object_type]);
293
Chris Forbes3e51a202016-09-29 14:35:09 +1300294 auto allocated_with_custom = pNode->status & OBJSTATUS_CUSTOM_ALLOCATOR;
295 if (custom_allocator ^ allocated_with_custom) {
296 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
297 OBJTRACK_ALLOCATOR_MISMATCH, LayerName,
298 "Custom allocator %sspecified while destroying %s obj 0x%" PRIxLEAST64 " but %sspecified at creation",
299 (custom_allocator ? "" : "not "), object_name[object_type], object_handle,
300 (allocated_with_custom ? "" : "not "));
301 }
302
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600303 delete pNode;
304 device_data->object_map[object_type].erase(item);
305 } else {
306 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle, __LINE__,
307 OBJTRACK_UNKNOWN_OBJECT, LayerName,
Mark Lobodzinski45e68612016-07-18 17:06:52 -0600308 "Unable to remove %s obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",
309 object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600310 }
311}
312
313template <typename T1, typename T2>
Chris Forbes2f271a72016-09-29 14:58:08 +1300314static bool ValidateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool null_allowed) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600315 if (null_allowed && (object == VK_NULL_HANDLE)) {
316 return false;
317 }
Chris Forbes64a31a12016-10-04 14:54:13 +1300318 auto object_handle = handle_value(object);
319
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600320 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +1300321 if (device_data->object_map[object_type].find(object_handle) == device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600322 // If object is an image, also look for it in the swapchain image map
323 if ((object_type != VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT) ||
Chris Forbes2f271a72016-09-29 14:58:08 +1300324 (device_data->swapchainImageMap.find(object_handle) == device_data->swapchainImageMap.end())) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600325 return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type,
Chris Forbes2f271a72016-09-29 14:58:08 +1300326 object_handle, __LINE__, OBJTRACK_INVALID_OBJECT, LayerName,
327 "Invalid %s Object 0x%" PRIxLEAST64, object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600328 }
329 }
330 return false;
331}
332
333static void DeviceReportUndestroyedObjects(VkDevice device, VkDebugReportObjectTypeEXT object_type) {
334 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
335 for (auto item = device_data->object_map[object_type].begin(); item != device_data->object_map[object_type].end();) {
336 OBJTRACK_NODE *object_info = item->second;
337 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_info->object_type, object_info->handle, __LINE__,
338 OBJTRACK_OBJECT_LEAK, LayerName,
339 "OBJ ERROR : For device 0x%" PRIxLEAST64 ", %s object 0x%" PRIxLEAST64 " has not been destroyed.",
340 reinterpret_cast<uint64_t>(device), object_name[object_type], object_info->handle);
341 item = device_data->object_map[object_type].erase(item);
342 }
343}
344
345VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
346 std::unique_lock<std::mutex> lock(global_lock);
347
348 dispatch_key key = get_dispatch_key(instance);
349 layer_data *instance_data = get_my_data_ptr(key, layer_data_map);
350
351 // Enable the temporary callback(s) here to catch cleanup issues:
352 bool callback_setup = false;
353 if (instance_data->num_tmp_callbacks > 0) {
354 if (!layer_enable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks,
355 instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks)) {
356 callback_setup = true;
357 }
358 }
359
Chris Forbes2f271a72016-09-29 14:58:08 +1300360 ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600361
Chris Forbesec461992016-09-29 14:41:44 +1300362 DestroyObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600363 // Report any remaining objects in LL
364
365 for (auto iit = instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].begin();
366 iit != instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].end();) {
367 OBJTRACK_NODE *pNode = iit->second;
368
369 VkDevice device = reinterpret_cast<VkDevice>(pNode->handle);
370
371 log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, pNode->handle, __LINE__,
372 OBJTRACK_OBJECT_LEAK, LayerName, "OBJ ERROR : %s object 0x%" PRIxLEAST64 " has not been destroyed.",
373 string_VkDebugReportObjectTypeEXT(pNode->object_type), pNode->handle);
374 // Semaphore:
375 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT);
376 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT);
377 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT);
378 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT);
379 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
380 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
381 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT);
382 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT);
383 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT);
384 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT);
385 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT);
386 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT);
387 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT);
388 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT);
389 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT);
390 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT);
391 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT);
392 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT);
393 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
394 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT);
395 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT);
396 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT);
397 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
398 }
399 instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].clear();
400
401 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
402 pInstanceTable->DestroyInstance(instance, pAllocator);
403
404 // Disable and cleanup the temporary callback(s):
405 if (callback_setup) {
406 layer_disable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks, instance_data->tmp_callbacks);
407 }
408 if (instance_data->num_tmp_callbacks > 0) {
409 layer_free_tmp_callbacks(instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks);
410 instance_data->num_tmp_callbacks = 0;
411 }
412
413 // Clean up logging callback, if any
414 while (instance_data->logging_callback.size() > 0) {
415 VkDebugReportCallbackEXT callback = instance_data->logging_callback.back();
416 layer_destroy_msg_callback(instance_data->report_data, callback, pAllocator);
417 instance_data->logging_callback.pop_back();
418 }
419
420 layer_debug_report_destroy_instance(instance_data->report_data);
421 layer_data_map.erase(key);
422
423 instanceExtMap.erase(pInstanceTable);
424 lock.unlock();
425 ot_instance_table_map.erase(key);
426}
427
428VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
429
430 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300431 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Chris Forbesec461992016-09-29 14:41:44 +1300432 DestroyObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600433
434 // Report any remaining objects associated with this VkDevice object in LL
435 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT);
436 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT);
437 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT);
438 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
439 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
440 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT);
441 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT);
442 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT);
443 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT);
444 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT);
445 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT);
446 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT);
447 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT);
448 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT);
449 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT);
450 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT);
451 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT);
452 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
453 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT);
454 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT);
455 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT);
456 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT);
457 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
458
459 // Clean up Queue's MemRef Linked Lists
460 DestroyQueueDataStructures(device);
461
462 lock.unlock();
463
464 dispatch_key key = get_dispatch_key(device);
465 VkLayerDispatchTable *pDisp = get_dispatch_table(ot_device_table_map, device);
466 pDisp->DestroyDevice(device, pAllocator);
467 ot_device_table_map.erase(key);
468}
469
470VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
471 bool skip_call = false;
472 {
473 std::lock_guard<std::mutex> lock(global_lock);
474 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300475 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600476 }
477 if (skip_call) {
478 return;
479 }
480 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
481}
482
483VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
484 VkFormatProperties *pFormatProperties) {
485 bool skip_call = false;
486 {
487 std::lock_guard<std::mutex> lock(global_lock);
488 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300489 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600490 }
491 if (skip_call) {
492 return;
493 }
494 get_dispatch_table(ot_instance_table_map, physicalDevice)
495 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
496}
497
498VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
499 VkImageType type, VkImageTiling tiling,
500 VkImageUsageFlags usage, VkImageCreateFlags flags,
501 VkImageFormatProperties *pImageFormatProperties) {
502 bool skip_call = false;
503 {
504 std::lock_guard<std::mutex> lock(global_lock);
505 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300506 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600507 }
508 if (skip_call) {
509 return VK_ERROR_VALIDATION_FAILED_EXT;
510 }
511 VkResult result =
512 get_dispatch_table(ot_instance_table_map, physicalDevice)
513 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
514 return result;
515}
516
517VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
518 bool skip_call = false;
519 {
520 std::lock_guard<std::mutex> lock(global_lock);
521 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300522 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600523 }
524 if (skip_call) {
525 return;
526 }
527 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
528}
529
530VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
531 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
532 bool skip_call = false;
533 {
534 std::lock_guard<std::mutex> lock(global_lock);
535 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300536 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600537 }
538 if (skip_call) {
539 return;
540 }
541 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
542}
543
544VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *pName);
545
546VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *pName);
547
548VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount,
549 VkExtensionProperties *pProperties);
550
551VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pPropertyCount, VkLayerProperties *pProperties);
552
553VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
554 VkLayerProperties *pProperties);
555
556VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
557 bool skip_call = false;
558 {
559 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300560 skip_call |= ValidateObject(queue, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600561 if (pSubmits) {
562 for (uint32_t idx0 = 0; idx0 < submitCount; ++idx0) {
563 if (pSubmits[idx0].pCommandBuffers) {
564 for (uint32_t idx1 = 0; idx1 < pSubmits[idx0].commandBufferCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300565 skip_call |= ValidateObject(queue, pSubmits[idx0].pCommandBuffers[idx1],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600566 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
567 }
568 }
569 if (pSubmits[idx0].pSignalSemaphores) {
570 for (uint32_t idx2 = 0; idx2 < pSubmits[idx0].signalSemaphoreCount; ++idx2) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300571 skip_call |= ValidateObject(queue, pSubmits[idx0].pSignalSemaphores[idx2],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600572 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
573 }
574 }
575 if (pSubmits[idx0].pWaitSemaphores) {
576 for (uint32_t idx3 = 0; idx3 < pSubmits[idx0].waitSemaphoreCount; ++idx3) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300577 skip_call |= ValidateObject(queue, pSubmits[idx0].pWaitSemaphores[idx3],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600578 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
579 }
580 }
581 }
582 }
583 if (queue) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300584 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600585 }
586 }
587 if (skip_call) {
588 return VK_ERROR_VALIDATION_FAILED_EXT;
589 }
590 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
591 return result;
592}
593
594VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
595 bool skip_call = false;
596 {
597 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300598 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600599 }
600 if (skip_call) {
601 return VK_ERROR_VALIDATION_FAILED_EXT;
602 }
603 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueWaitIdle(queue);
604 return result;
605}
606
607VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
608 bool skip_call = false;
609 {
610 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300611 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600612 }
613 if (skip_call) {
614 return VK_ERROR_VALIDATION_FAILED_EXT;
615 }
616 VkResult result = get_dispatch_table(ot_device_table_map, device)->DeviceWaitIdle(device);
617 return result;
618}
619
620VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
621 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
622 bool skip_call = false;
623 {
624 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300625 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600626 }
627 if (skip_call) {
628 return VK_ERROR_VALIDATION_FAILED_EXT;
629 }
630 VkResult result = get_dispatch_table(ot_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
631 {
632 std::lock_guard<std::mutex> lock(global_lock);
633 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300634 CreateObject(device, *pMemory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600635 }
636 }
637 return result;
638}
639
640VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
641 const VkMappedMemoryRange *pMemoryRanges) {
642 bool skip_call = false;
643 {
644 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300645 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600646 if (pMemoryRanges) {
647 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
648 if (pMemoryRanges[idx0].memory) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300649 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600650 VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
651 }
652 }
653 }
654 }
655 if (skip_call) {
656 return VK_ERROR_VALIDATION_FAILED_EXT;
657 }
658 VkResult result =
659 get_dispatch_table(ot_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
660 return result;
661}
662
663VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
664 const VkMappedMemoryRange *pMemoryRanges) {
665 bool skip_call = false;
666 {
667 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300668 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600669 if (pMemoryRanges) {
670 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
671 if (pMemoryRanges[idx0].memory) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300672 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600673 VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
674 }
675 }
676 }
677 }
678 if (skip_call) {
679 return VK_ERROR_VALIDATION_FAILED_EXT;
680 }
681 VkResult result =
682 get_dispatch_table(ot_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
683 return result;
684}
685
686VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
687 VkDeviceSize *pCommittedMemoryInBytes) {
688 bool skip_call = false;
689 {
690 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300691 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
692 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600693 }
694 if (skip_call) {
695 return;
696 }
697 get_dispatch_table(ot_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
698}
699
700VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
701 VkDeviceSize memoryOffset) {
702 bool skip_call = false;
703 {
704 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300705 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
706 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
707 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600708 }
709 if (skip_call) {
710 return VK_ERROR_VALIDATION_FAILED_EXT;
711 }
712 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
713 return result;
714}
715
716VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
717 bool skip_call = false;
718 {
719 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300720 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
721 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
722 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600723 }
724 if (skip_call) {
725 return VK_ERROR_VALIDATION_FAILED_EXT;
726 }
727 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
728 return result;
729}
730
731VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
732 VkMemoryRequirements *pMemoryRequirements) {
733 bool skip_call = false;
734 {
735 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300736 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
737 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600738 }
739 if (skip_call) {
740 return;
741 }
742 get_dispatch_table(ot_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
743}
744
745VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
746 bool skip_call = false;
747 {
748 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300749 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
750 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600751 }
752 if (skip_call) {
753 return;
754 }
755 get_dispatch_table(ot_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
756}
757
758VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
759 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
760 bool skip_call = false;
761 {
762 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300763 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
764 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600765 }
766 if (skip_call) {
767 return;
768 }
769 get_dispatch_table(ot_device_table_map, device)
770 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
771}
772
773VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
774 VkImageType type, VkSampleCountFlagBits samples,
775 VkImageUsageFlags usage, VkImageTiling tiling,
776 uint32_t *pPropertyCount,
777 VkSparseImageFormatProperties *pProperties) {
778 bool skip_call = false;
779 {
780 std::lock_guard<std::mutex> lock(global_lock);
781 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300782 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600783 }
784 if (skip_call) {
785 return;
786 }
787 get_dispatch_table(ot_instance_table_map, physicalDevice)
788 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
789 pProperties);
790}
791
792VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
793 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
794 bool skip_call = false;
795 {
796 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300797 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600798 }
799 if (skip_call) {
800 return VK_ERROR_VALIDATION_FAILED_EXT;
801 }
802 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
803 {
804 std::lock_guard<std::mutex> lock(global_lock);
805 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300806 CreateObject(device, *pFence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600807 }
808 }
809 return result;
810}
811
812VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
813 bool skip_call = false;
814 {
815 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300816 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
817 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600818 }
819 if (skip_call) {
820 return;
821 }
822 {
823 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300824 DestroyObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600825 }
826 get_dispatch_table(ot_device_table_map, device)->DestroyFence(device, fence, pAllocator);
827}
828
829VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
830 bool skip_call = false;
831 {
832 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300833 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600834 if (pFences) {
835 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300836 skip_call |= ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600837 }
838 }
839 }
840 if (skip_call) {
841 return VK_ERROR_VALIDATION_FAILED_EXT;
842 }
843 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetFences(device, fenceCount, pFences);
844 return result;
845}
846
847VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
848 bool skip_call = false;
849 {
850 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300851 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
852 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600853 }
854 if (skip_call) {
855 return VK_ERROR_VALIDATION_FAILED_EXT;
856 }
857 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetFenceStatus(device, fence);
858 return result;
859}
860
861VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
862 uint64_t timeout) {
863 bool skip_call = false;
864 {
865 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300866 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600867 if (pFences) {
868 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300869 skip_call |= ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600870 }
871 }
872 }
873 if (skip_call) {
874 return VK_ERROR_VALIDATION_FAILED_EXT;
875 }
876 VkResult result = get_dispatch_table(ot_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
877 return result;
878}
879
880VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
881 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
882 bool skip_call = false;
883 {
884 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300885 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600886 }
887 if (skip_call) {
888 return VK_ERROR_VALIDATION_FAILED_EXT;
889 }
890 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
891 {
892 std::lock_guard<std::mutex> lock(global_lock);
893 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300894 CreateObject(device, *pSemaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600895 }
896 }
897 return result;
898}
899
900VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
901 bool skip_call = false;
902 {
903 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300904 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
905 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600906 }
907 if (skip_call) {
908 return;
909 }
910 {
911 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300912 DestroyObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600913 }
914 get_dispatch_table(ot_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
915}
916
917VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
918 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
919 bool skip_call = false;
920 {
921 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300922 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600923 }
924 if (skip_call) {
925 return VK_ERROR_VALIDATION_FAILED_EXT;
926 }
927 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
928 {
929 std::lock_guard<std::mutex> lock(global_lock);
930 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300931 CreateObject(device, *pEvent, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600932 }
933 }
934 return result;
935}
936
937VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
938 bool skip_call = false;
939 {
940 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300941 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
942 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600943 }
944 if (skip_call) {
945 return;
946 }
947 {
948 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300949 DestroyObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600950 }
951 get_dispatch_table(ot_device_table_map, device)->DestroyEvent(device, event, pAllocator);
952}
953
954VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
955 bool skip_call = false;
956 {
957 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300958 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
959 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600960 }
961 if (skip_call) {
962 return VK_ERROR_VALIDATION_FAILED_EXT;
963 }
964 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetEventStatus(device, event);
965 return result;
966}
967
968VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
969 bool skip_call = false;
970 {
971 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300972 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
973 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600974 }
975 if (skip_call) {
976 return VK_ERROR_VALIDATION_FAILED_EXT;
977 }
978 VkResult result = get_dispatch_table(ot_device_table_map, device)->SetEvent(device, event);
979 return result;
980}
981
982VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
983 bool skip_call = false;
984 {
985 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300986 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
987 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600988 }
989 if (skip_call) {
990 return VK_ERROR_VALIDATION_FAILED_EXT;
991 }
992 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetEvent(device, event);
993 return result;
994}
995
996VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
997 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
998 bool skip_call = false;
999 {
1000 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001001 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001002 }
1003 if (skip_call) {
1004 return VK_ERROR_VALIDATION_FAILED_EXT;
1005 }
1006 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
1007 {
1008 std::lock_guard<std::mutex> lock(global_lock);
1009 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001010 CreateObject(device, *pQueryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001011 }
1012 }
1013 return result;
1014}
1015
1016VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
1017 bool skip_call = false;
1018 {
1019 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001020 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1021 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001022 }
1023 if (skip_call) {
1024 return;
1025 }
1026 {
1027 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001028 DestroyObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001029 }
1030 get_dispatch_table(ot_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
1031}
1032
1033VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
1034 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
1035 bool skip_call = false;
1036 {
1037 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001038 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1039 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001040 }
1041 if (skip_call) {
1042 return VK_ERROR_VALIDATION_FAILED_EXT;
1043 }
1044 VkResult result = get_dispatch_table(ot_device_table_map, device)
1045 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
1046 return result;
1047}
1048
1049VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
1050 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
1051 bool skip_call = false;
1052 {
1053 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001054 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001055 }
1056 if (skip_call) {
1057 return VK_ERROR_VALIDATION_FAILED_EXT;
1058 }
1059 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
1060 {
1061 std::lock_guard<std::mutex> lock(global_lock);
1062 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001063 CreateObject(device, *pBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001064 }
1065 }
1066 return result;
1067}
1068
1069VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
1070 bool skip_call = false;
1071 {
1072 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001073 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
1074 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001075 }
1076 if (skip_call) {
1077 return;
1078 }
1079 {
1080 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001081 DestroyObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001082 }
1083 get_dispatch_table(ot_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
1084}
1085
1086VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
1087 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
1088 bool skip_call = false;
1089 {
1090 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001091 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001092 if (pCreateInfo) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001093 skip_call |= ValidateObject(device, pCreateInfo->buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001094 }
1095 }
1096 if (skip_call) {
1097 return VK_ERROR_VALIDATION_FAILED_EXT;
1098 }
1099 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
1100 {
1101 std::lock_guard<std::mutex> lock(global_lock);
1102 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001103 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001104 }
1105 }
1106 return result;
1107}
1108
1109VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
1110 bool skip_call = false;
1111 {
1112 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001113 skip_call |= ValidateObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, false);
1114 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001115 }
1116 if (skip_call) {
1117 return;
1118 }
1119 {
1120 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001121 DestroyObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001122 }
1123 get_dispatch_table(ot_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
1124}
1125
1126VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
1127 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
1128 bool skip_call = false;
1129 {
1130 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001131 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001132 }
1133 if (skip_call) {
1134 return VK_ERROR_VALIDATION_FAILED_EXT;
1135 }
1136 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
1137 {
1138 std::lock_guard<std::mutex> lock(global_lock);
1139 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001140 CreateObject(device, *pImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001141 }
1142 }
1143 return result;
1144}
1145
1146VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
1147 bool skip_call = false;
1148 {
1149 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001150 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1151 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001152 }
1153 if (skip_call) {
1154 return;
1155 }
1156 {
1157 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001158 DestroyObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001159 }
1160 get_dispatch_table(ot_device_table_map, device)->DestroyImage(device, image, pAllocator);
1161}
1162
1163VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
1164 VkSubresourceLayout *pLayout) {
1165 bool skip_call = false;
1166 {
1167 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001168 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1169 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001170 }
1171 if (skip_call) {
1172 return;
1173 }
1174 get_dispatch_table(ot_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
1175}
1176
1177VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
1178 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
1179 bool skip_call = false;
1180 {
1181 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001182 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001183 if (pCreateInfo) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001184 skip_call |= ValidateObject(device, pCreateInfo->image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001185 }
1186 }
1187 if (skip_call) {
1188 return VK_ERROR_VALIDATION_FAILED_EXT;
1189 }
1190 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
1191 {
1192 std::lock_guard<std::mutex> lock(global_lock);
1193 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001194 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001195 }
1196 }
1197 return result;
1198}
1199
1200VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
1201 bool skip_call = false;
1202 {
1203 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001204 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1205 skip_call |= ValidateObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001206 }
1207 if (skip_call) {
1208 return;
1209 }
1210 {
1211 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001212 DestroyObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001213 }
1214 get_dispatch_table(ot_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
1215}
1216
1217VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
1218 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
1219 bool skip_call = false;
1220 {
1221 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001222 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001223 }
1224 if (skip_call) {
1225 return VK_ERROR_VALIDATION_FAILED_EXT;
1226 }
1227 VkResult result =
1228 get_dispatch_table(ot_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
1229 {
1230 std::lock_guard<std::mutex> lock(global_lock);
1231 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001232 CreateObject(device, *pShaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001233 }
1234 }
1235 return result;
1236}
1237
1238VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1239 const VkAllocationCallbacks *pAllocator) {
1240 bool skip_call = false;
1241 {
1242 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001243 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1244 skip_call |= ValidateObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001245 }
1246 if (skip_call) {
1247 return;
1248 }
1249 {
1250 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001251 DestroyObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001252 }
1253 get_dispatch_table(ot_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
1254}
1255
1256VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
1257 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
1258 bool skip_call = false;
1259 {
1260 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001261 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001262 }
1263 if (skip_call) {
1264 return VK_ERROR_VALIDATION_FAILED_EXT;
1265 }
1266 VkResult result =
1267 get_dispatch_table(ot_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
1268 {
1269 std::lock_guard<std::mutex> lock(global_lock);
1270 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001271 CreateObject(device, *pPipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001272 }
1273 }
1274 return result;
1275}
1276
1277VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
1278 const VkAllocationCallbacks *pAllocator) {
1279 bool skip_call = false;
1280 {
1281 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001282 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1283 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001284 }
1285 if (skip_call) {
1286 return;
1287 }
1288 {
1289 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001290 DestroyObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001291 }
1292 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
1293}
1294
1295VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
1296 void *pData) {
1297 bool skip_call = false;
1298 {
1299 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001300 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1301 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001302 }
1303 if (skip_call) {
1304 return VK_ERROR_VALIDATION_FAILED_EXT;
1305 }
1306 VkResult result =
1307 get_dispatch_table(ot_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
1308 return result;
1309}
1310
1311VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
1312 const VkPipelineCache *pSrcCaches) {
1313 bool skip_call = false;
1314 {
1315 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001316 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1317 skip_call |= ValidateObject(device, dstCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001318 if (pSrcCaches) {
1319 for (uint32_t idx0 = 0; idx0 < srcCacheCount; ++idx0) {
1320 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001321 ValidateObject(device, pSrcCaches[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001322 }
1323 }
1324 }
1325 if (skip_call) {
1326 return VK_ERROR_VALIDATION_FAILED_EXT;
1327 }
1328 VkResult result =
1329 get_dispatch_table(ot_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
1330 return result;
1331}
1332
1333VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
1334 bool skip_call = false;
1335 {
1336 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001337 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1338 skip_call |= ValidateObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001339 }
1340 if (skip_call) {
1341 return;
1342 }
1343 {
1344 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001345 DestroyObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001346 }
1347 get_dispatch_table(ot_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
1348}
1349
1350VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
1351 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
1352 bool skip_call = false;
1353 {
1354 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001355 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001356 if (pCreateInfo) {
1357 if (pCreateInfo->pSetLayouts) {
1358 for (uint32_t idx0 = 0; idx0 < pCreateInfo->setLayoutCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001359 skip_call |= ValidateObject(device, pCreateInfo->pSetLayouts[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001360 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false);
1361 }
1362 }
1363 }
1364 }
1365 if (skip_call) {
1366 return VK_ERROR_VALIDATION_FAILED_EXT;
1367 }
1368 VkResult result =
1369 get_dispatch_table(ot_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
1370 {
1371 std::lock_guard<std::mutex> lock(global_lock);
1372 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001373 CreateObject(device, *pPipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001374 }
1375 }
1376 return result;
1377}
1378
1379VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1380 const VkAllocationCallbacks *pAllocator) {
1381 bool skip_call = false;
1382 {
1383 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001384 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1385 skip_call |= ValidateObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001386 }
1387 if (skip_call) {
1388 return;
1389 }
1390 {
1391 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001392 DestroyObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001393 }
1394 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
1395}
1396
1397VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
1398 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
1399 bool skip_call = false;
1400 {
1401 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001402 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001403 }
1404 if (skip_call) {
1405 return VK_ERROR_VALIDATION_FAILED_EXT;
1406 }
1407 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
1408 {
1409 std::lock_guard<std::mutex> lock(global_lock);
1410 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001411 CreateObject(device, *pSampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001412 }
1413 }
1414 return result;
1415}
1416
1417VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
1418 bool skip_call = false;
1419 {
1420 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001421 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1422 skip_call |= ValidateObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001423 }
1424 if (skip_call) {
1425 return;
1426 }
1427 {
1428 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001429 DestroyObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001430 }
1431 get_dispatch_table(ot_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
1432}
1433
1434VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
1435 const VkAllocationCallbacks *pAllocator,
1436 VkDescriptorSetLayout *pSetLayout) {
1437 bool skip_call = false;
1438 {
1439 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001440 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001441 if (pCreateInfo) {
1442 if (pCreateInfo->pBindings) {
1443 for (uint32_t idx0 = 0; idx0 < pCreateInfo->bindingCount; ++idx0) {
1444 if (pCreateInfo->pBindings[idx0].pImmutableSamplers) {
1445 for (uint32_t idx1 = 0; idx1 < pCreateInfo->pBindings[idx0].descriptorCount; ++idx1) {
1446 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001447 ValidateObject(device, pCreateInfo->pBindings[idx0].pImmutableSamplers[idx1],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001448 VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false);
1449 }
1450 }
1451 }
1452 }
1453 }
1454 }
1455 if (skip_call) {
1456 return VK_ERROR_VALIDATION_FAILED_EXT;
1457 }
1458 VkResult result =
1459 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
1460 {
1461 std::lock_guard<std::mutex> lock(global_lock);
1462 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001463 CreateObject(device, *pSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001464 }
1465 }
1466 return result;
1467}
1468
1469VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1470 const VkAllocationCallbacks *pAllocator) {
1471 bool skip_call = false;
1472 {
1473 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001474 skip_call |= ValidateObject(device, descriptorSetLayout,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001475 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false);
Chris Forbes2f271a72016-09-29 14:58:08 +13001476 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001477 }
1478 if (skip_call) {
1479 return;
1480 }
1481 {
1482 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001483 DestroyObject(device, descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001484 }
1485 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
1486}
1487
1488VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
1489 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
1490 bool skip_call = false;
1491 {
1492 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001493 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001494 }
1495 if (skip_call) {
1496 return VK_ERROR_VALIDATION_FAILED_EXT;
1497 }
1498 VkResult result =
1499 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
1500 {
1501 std::lock_guard<std::mutex> lock(global_lock);
1502 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001503 CreateObject(device, *pDescriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001504 }
1505 }
1506 return result;
1507}
1508
1509VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1510 VkDescriptorPoolResetFlags flags) {
1511 bool skip_call = false;
Chris Forbes2a947ce2016-09-29 18:47:50 +13001512 std::unique_lock<std::mutex> lock(global_lock);
1513 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1514 skip_call |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
1515 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001516 if (skip_call) {
1517 return VK_ERROR_VALIDATION_FAILED_EXT;
1518 }
Chris Forbes2a947ce2016-09-29 18:47:50 +13001519 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is reset.
1520 // Remove this pool's descriptor sets from our descriptorSet map.
1521 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
1522 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
1523 OBJTRACK_NODE *pNode = (*itr).second;
1524 auto del_itr = itr++;
1525 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
1526 DestroyObject(device, (VkDescriptorSet)((*del_itr).first),
1527 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1528 }
1529 }
1530 lock.unlock();
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001531 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
1532 return result;
1533}
1534
1535VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
1536 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
1537 const VkCopyDescriptorSet *pDescriptorCopies) {
1538 bool skip_call = false;
1539 {
1540 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001541 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001542 if (pDescriptorCopies) {
1543 for (uint32_t idx0 = 0; idx0 < descriptorCopyCount; ++idx0) {
1544 if (pDescriptorCopies[idx0].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001545 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].dstSet,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001546 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1547 }
1548 if (pDescriptorCopies[idx0].srcSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001549 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].srcSet,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001550 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1551 }
1552 }
1553 }
1554 if (pDescriptorWrites) {
1555 for (uint32_t idx1 = 0; idx1 < descriptorWriteCount; ++idx1) {
1556 if (pDescriptorWrites[idx1].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001557 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].dstSet,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001558 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1559 }
1560 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
1561 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
1562 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
1563 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
1564 for (uint32_t idx2 = 0; idx2 < pDescriptorWrites[idx1].descriptorCount; ++idx2) {
1565 if (pDescriptorWrites[idx1].pBufferInfo[idx2].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001566 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pBufferInfo[idx2].buffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001567 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
1568 }
1569 }
1570 }
1571 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
1572 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
1573 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) ||
1574 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
1575 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)) {
1576 for (uint32_t idx3 = 0; idx3 < pDescriptorWrites[idx1].descriptorCount; ++idx3) {
1577 if (pDescriptorWrites[idx1].pImageInfo[idx3].imageView) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001578 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pImageInfo[idx3].imageView,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001579 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false);
1580 }
1581 if (pDescriptorWrites[idx1].pImageInfo[idx3].sampler) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001582 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pImageInfo[idx3].sampler,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001583 VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false);
1584 }
1585 }
1586 }
1587 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
1588 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
1589 for (uint32_t idx4 = 0; idx4 < pDescriptorWrites[idx1].descriptorCount; ++idx4) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001590 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pTexelBufferView[idx4],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001591 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, true);
1592 }
1593 }
1594 }
1595 }
1596 }
1597 if (skip_call) {
1598 return;
1599 }
1600 get_dispatch_table(ot_device_table_map, device)
1601 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
1602}
1603
1604VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
1605 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
1606 bool skip_call = false;
1607 {
1608 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001609 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001610 if (pCreateInfo) {
1611 if (pCreateInfo->pAttachments) {
1612 for (uint32_t idx0 = 0; idx0 < pCreateInfo->attachmentCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001613 skip_call |= ValidateObject(device, pCreateInfo->pAttachments[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001614 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false);
1615 }
1616 }
1617 if (pCreateInfo->renderPass) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001618 skip_call |= ValidateObject(device, pCreateInfo->renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001619 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
1620 }
1621 }
1622 }
1623 if (skip_call) {
1624 return VK_ERROR_VALIDATION_FAILED_EXT;
1625 }
1626 VkResult result =
1627 get_dispatch_table(ot_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
1628 {
1629 std::lock_guard<std::mutex> lock(global_lock);
1630 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001631 CreateObject(device, *pFramebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001632 }
1633 }
1634 return result;
1635}
1636
1637VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
1638 bool skip_call = false;
1639 {
1640 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001641 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1642 skip_call |= ValidateObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001643 }
1644 if (skip_call) {
1645 return;
1646 }
1647 {
1648 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001649 DestroyObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001650 }
1651 get_dispatch_table(ot_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
1652}
1653
1654VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
1655 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
1656 bool skip_call = false;
1657 {
1658 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001659 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001660 }
1661 if (skip_call) {
1662 return VK_ERROR_VALIDATION_FAILED_EXT;
1663 }
1664 VkResult result =
1665 get_dispatch_table(ot_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
1666 {
1667 std::lock_guard<std::mutex> lock(global_lock);
1668 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001669 CreateObject(device, *pRenderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001670 }
1671 }
1672 return result;
1673}
1674
1675VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
1676 bool skip_call = false;
1677 {
1678 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001679 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1680 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001681 }
1682 if (skip_call) {
1683 return;
1684 }
1685 {
1686 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001687 DestroyObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001688 }
1689 get_dispatch_table(ot_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
1690}
1691
1692VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
1693 bool skip_call = false;
1694 {
1695 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001696 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1697 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001698 }
1699 if (skip_call) {
1700 return;
1701 }
1702 get_dispatch_table(ot_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
1703}
1704
1705VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1706 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
1707 bool skip_call = false;
1708 {
1709 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001710 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001711 }
1712 if (skip_call) {
1713 return VK_ERROR_VALIDATION_FAILED_EXT;
1714 }
1715 VkResult result =
1716 get_dispatch_table(ot_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
1717 {
1718 std::lock_guard<std::mutex> lock(global_lock);
1719 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001720 CreateObject(device, *pCommandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001721 }
1722 }
1723 return result;
1724}
1725
1726VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
1727 bool skip_call = false;
1728 {
1729 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001730 skip_call |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
1731 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001732 }
1733 if (skip_call) {
1734 return VK_ERROR_VALIDATION_FAILED_EXT;
1735 }
1736 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
1737 return result;
1738}
1739
1740VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer command_buffer, const VkCommandBufferBeginInfo *begin_info) {
1741 layer_data *device_data = get_my_data_ptr(get_dispatch_key(command_buffer), layer_data_map);
1742 bool skip_call = false;
1743 {
1744 std::lock_guard<std::mutex> lock(global_lock);
1745 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001746 ValidateObject(command_buffer, command_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001747 if (begin_info) {
1748 OBJTRACK_NODE *pNode =
1749 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<const uint64_t>(command_buffer)];
1750 if ((begin_info->pInheritanceInfo) && (pNode->status & OBJSTATUS_COMMAND_BUFFER_SECONDARY)) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001751 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->framebuffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001752 VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, true);
Chris Forbes2f271a72016-09-29 14:58:08 +13001753 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001754 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, true);
1755 }
1756 }
1757 }
1758 if (skip_call) {
1759 return VK_ERROR_VALIDATION_FAILED_EXT;
1760 }
1761 VkResult result = get_dispatch_table(ot_device_table_map, command_buffer)->BeginCommandBuffer(command_buffer, begin_info);
1762 return result;
1763}
1764
1765VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
1766 bool skip_call = false;
1767 {
1768 std::lock_guard<std::mutex> lock(global_lock);
1769 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001770 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001771 }
1772 if (skip_call) {
1773 return VK_ERROR_VALIDATION_FAILED_EXT;
1774 }
1775 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
1776 return result;
1777}
1778
1779VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
1780 bool skip_call = false;
1781 {
1782 std::lock_guard<std::mutex> lock(global_lock);
1783 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001784 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001785 }
1786 if (skip_call) {
1787 return VK_ERROR_VALIDATION_FAILED_EXT;
1788 }
1789 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
1790 return result;
1791}
1792
1793VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1794 VkPipeline pipeline) {
1795 bool skip_call = false;
1796 {
1797 std::lock_guard<std::mutex> lock(global_lock);
1798 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001799 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
1800 skip_call |= ValidateObject(commandBuffer, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001801 }
1802 if (skip_call) {
1803 return;
1804 }
1805 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
1806}
1807
1808VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
1809 const VkViewport *pViewports) {
1810 bool skip_call = false;
1811 {
1812 std::lock_guard<std::mutex> lock(global_lock);
1813 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001814 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001815 }
1816 if (skip_call) {
1817 return;
1818 }
1819 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
1820}
1821
1822VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
1823 const VkRect2D *pScissors) {
1824 bool skip_call = false;
1825 {
1826 std::lock_guard<std::mutex> lock(global_lock);
1827 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001828 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001829 }
1830 if (skip_call) {
1831 return;
1832 }
1833 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
1834}
1835
1836VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
1837 bool skip_call = false;
1838 {
1839 std::lock_guard<std::mutex> lock(global_lock);
1840 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001841 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001842 }
1843 if (skip_call) {
1844 return;
1845 }
1846 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
1847}
1848
1849VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
1850 float depthBiasSlopeFactor) {
1851 bool skip_call = false;
1852 {
1853 std::lock_guard<std::mutex> lock(global_lock);
1854 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001855 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001856 }
1857 if (skip_call) {
1858 return;
1859 }
1860 get_dispatch_table(ot_device_table_map, commandBuffer)
1861 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
1862}
1863
1864VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
1865 bool skip_call = false;
1866 {
1867 std::lock_guard<std::mutex> lock(global_lock);
1868 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001869 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001870 }
1871 if (skip_call) {
1872 return;
1873 }
1874 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
1875}
1876
1877VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
1878 bool skip_call = false;
1879 {
1880 std::lock_guard<std::mutex> lock(global_lock);
1881 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001882 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001883 }
1884 if (skip_call) {
1885 return;
1886 }
1887 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
1888}
1889
1890VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
1891 uint32_t compareMask) {
1892 bool skip_call = false;
1893 {
1894 std::lock_guard<std::mutex> lock(global_lock);
1895 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001896 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001897 }
1898 if (skip_call) {
1899 return;
1900 }
1901 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
1902}
1903
1904VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
1905 bool skip_call = false;
1906 {
1907 std::lock_guard<std::mutex> lock(global_lock);
1908 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001909 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001910 }
1911 if (skip_call) {
1912 return;
1913 }
1914 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
1915}
1916
1917VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
1918 bool skip_call = false;
1919 {
1920 std::lock_guard<std::mutex> lock(global_lock);
1921 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001922 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001923 }
1924 if (skip_call) {
1925 return;
1926 }
1927 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
1928}
1929
1930VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1931 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
1932 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
1933 const uint32_t *pDynamicOffsets) {
1934 bool skip_call = false;
1935 {
1936 std::lock_guard<std::mutex> lock(global_lock);
1937 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001938 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
1939 skip_call |= ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001940 if (pDescriptorSets) {
1941 for (uint32_t idx0 = 0; idx0 < descriptorSetCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001942 skip_call |= ValidateObject(commandBuffer, pDescriptorSets[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001943 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1944 }
1945 }
1946 }
1947 if (skip_call) {
1948 return;
1949 }
1950 get_dispatch_table(ot_device_table_map, commandBuffer)
1951 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
1952 dynamicOffsetCount, pDynamicOffsets);
1953}
1954
1955VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1956 VkIndexType indexType) {
1957 bool skip_call = false;
1958 {
1959 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001960 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001961 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001962 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001963 }
1964 if (skip_call) {
1965 return;
1966 }
1967 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
1968}
1969
1970VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
1971 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
1972 bool skip_call = false;
1973 {
1974 std::lock_guard<std::mutex> lock(global_lock);
1975 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001976 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001977 if (pBuffers) {
1978 for (uint32_t idx0 = 0; idx0 < bindingCount; ++idx0) {
1979 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001980 ValidateObject(commandBuffer, pBuffers[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001981 }
1982 }
1983 }
1984 if (skip_call) {
1985 return;
1986 }
1987 get_dispatch_table(ot_device_table_map, commandBuffer)
1988 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
1989}
1990
1991VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
1992 uint32_t firstVertex, uint32_t firstInstance) {
1993 bool skip_call = false;
1994 {
1995 std::lock_guard<std::mutex> lock(global_lock);
1996 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001997 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001998 }
1999 if (skip_call) {
2000 return;
2001 }
2002 get_dispatch_table(ot_device_table_map, commandBuffer)
2003 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
2004}
2005
2006VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
2007 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
2008 bool skip_call = false;
2009 {
2010 std::lock_guard<std::mutex> lock(global_lock);
2011 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002012 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002013 }
2014 if (skip_call) {
2015 return;
2016 }
2017 get_dispatch_table(ot_device_table_map, commandBuffer)
2018 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
2019}
2020
2021VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
2022 uint32_t stride) {
2023 bool skip_call = false;
2024 {
2025 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002026 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002027 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002028 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002029 }
2030 if (skip_call) {
2031 return;
2032 }
2033 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
2034}
2035
2036VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2037 uint32_t drawCount, uint32_t stride) {
2038 bool skip_call = false;
2039 {
2040 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002041 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002042 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002043 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002044 }
2045 if (skip_call) {
2046 return;
2047 }
2048 get_dispatch_table(ot_device_table_map, commandBuffer)
2049 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
2050}
2051
2052VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
2053 bool skip_call = false;
2054 {
2055 std::lock_guard<std::mutex> lock(global_lock);
2056 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002057 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002058 }
2059 if (skip_call) {
2060 return;
2061 }
2062 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
2063}
2064
2065VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
2066 bool skip_call = false;
2067 {
2068 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002069 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002070 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002071 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002072 }
2073 if (skip_call) {
2074 return;
2075 }
2076 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
2077}
2078
2079VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
2080 uint32_t regionCount, const VkBufferCopy *pRegions) {
2081 bool skip_call = false;
2082 {
2083 std::lock_guard<std::mutex> lock(global_lock);
2084 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002085 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2086 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2087 skip_call |= ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002088 }
2089 if (skip_call) {
2090 return;
2091 }
2092 get_dispatch_table(ot_device_table_map, commandBuffer)
2093 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
2094}
2095
2096VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2097 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2098 const VkImageCopy *pRegions) {
2099 bool skip_call = false;
2100 {
2101 std::lock_guard<std::mutex> lock(global_lock);
2102 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002103 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2104 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2105 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002106 }
2107 if (skip_call) {
2108 return;
2109 }
2110 get_dispatch_table(ot_device_table_map, commandBuffer)
2111 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2112}
2113
2114VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2115 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2116 const VkImageBlit *pRegions, VkFilter filter) {
2117 bool skip_call = false;
2118 {
2119 std::lock_guard<std::mutex> lock(global_lock);
2120 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002121 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2122 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2123 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002124 }
2125 if (skip_call) {
2126 return;
2127 }
2128 get_dispatch_table(ot_device_table_map, commandBuffer)
2129 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
2130}
2131
2132VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
2133 VkImageLayout dstImageLayout, uint32_t regionCount,
2134 const VkBufferImageCopy *pRegions) {
2135 bool skip_call = false;
2136 {
2137 std::lock_guard<std::mutex> lock(global_lock);
2138 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002139 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2140 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2141 skip_call |= ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002142 }
2143 if (skip_call) {
2144 return;
2145 }
2146 get_dispatch_table(ot_device_table_map, commandBuffer)
2147 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
2148}
2149
2150VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2151 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
2152 bool skip_call = false;
2153 {
2154 std::lock_guard<std::mutex> lock(global_lock);
2155 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002156 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2157 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2158 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002159 }
2160 if (skip_call) {
2161 return;
2162 }
2163 get_dispatch_table(ot_device_table_map, commandBuffer)
2164 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
2165}
2166
2167VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2168 VkDeviceSize dataSize, const uint32_t *pData) {
2169 bool skip_call = false;
2170 {
2171 std::lock_guard<std::mutex> lock(global_lock);
2172 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002173 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2174 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002175 }
2176 if (skip_call) {
2177 return;
2178 }
2179 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
2180}
2181
2182VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2183 VkDeviceSize size, uint32_t data) {
2184 bool skip_call = false;
2185 {
2186 std::lock_guard<std::mutex> lock(global_lock);
2187 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002188 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2189 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002190 }
2191 if (skip_call) {
2192 return;
2193 }
2194 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
2195}
2196
2197VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2198 const VkClearColorValue *pColor, uint32_t rangeCount,
2199 const VkImageSubresourceRange *pRanges) {
2200 bool skip_call = false;
2201 {
2202 std::lock_guard<std::mutex> lock(global_lock);
2203 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002204 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2205 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002206 }
2207 if (skip_call) {
2208 return;
2209 }
2210 get_dispatch_table(ot_device_table_map, commandBuffer)
2211 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
2212}
2213
2214VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2215 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
2216 const VkImageSubresourceRange *pRanges) {
2217 bool skip_call = false;
2218 {
2219 std::lock_guard<std::mutex> lock(global_lock);
2220 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002221 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2222 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002223 }
2224 if (skip_call) {
2225 return;
2226 }
2227 get_dispatch_table(ot_device_table_map, commandBuffer)
2228 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
2229}
2230
2231VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
2232 const VkClearAttachment *pAttachments, uint32_t rectCount,
2233 const VkClearRect *pRects) {
2234 bool skip_call = false;
2235 {
2236 std::lock_guard<std::mutex> lock(global_lock);
2237 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002238 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002239 }
2240 if (skip_call) {
2241 return;
2242 }
2243 get_dispatch_table(ot_device_table_map, commandBuffer)
2244 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
2245}
2246
2247VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2248 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2249 const VkImageResolve *pRegions) {
2250 bool skip_call = false;
2251 {
2252 std::lock_guard<std::mutex> lock(global_lock);
2253 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002254 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2255 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2256 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002257 }
2258 if (skip_call) {
2259 return;
2260 }
2261 get_dispatch_table(ot_device_table_map, commandBuffer)
2262 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2263}
2264
2265VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
2266 bool skip_call = false;
2267 {
2268 std::lock_guard<std::mutex> lock(global_lock);
2269 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002270 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2271 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002272 }
2273 if (skip_call) {
2274 return;
2275 }
2276 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
2277}
2278
2279VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
2280 bool skip_call = false;
2281 {
2282 std::lock_guard<std::mutex> lock(global_lock);
2283 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002284 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2285 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002286 }
2287 if (skip_call) {
2288 return;
2289 }
2290 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
2291}
2292
2293VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2294 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
2295 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2296 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2297 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
2298 bool skip_call = false;
2299 {
2300 std::lock_guard<std::mutex> lock(global_lock);
2301 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002302 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002303 if (pBufferMemoryBarriers) {
2304 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2305 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002306 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002307 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2308 }
2309 }
2310 }
2311 if (pEvents) {
2312 for (uint32_t idx1 = 0; idx1 < eventCount; ++idx1) {
2313 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002314 ValidateObject(commandBuffer, pEvents[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002315 }
2316 }
2317 if (pImageMemoryBarriers) {
2318 for (uint32_t idx2 = 0; idx2 < imageMemoryBarrierCount; ++idx2) {
2319 if (pImageMemoryBarriers[idx2].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002320 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx2].image,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002321 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2322 }
2323 }
2324 }
2325 }
2326 if (skip_call) {
2327 return;
2328 }
2329 get_dispatch_table(ot_device_table_map, commandBuffer)
2330 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
2331 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2332}
2333
2334VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2335 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2336 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2337 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2338 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
2339 bool skip_call = false;
2340 {
2341 std::lock_guard<std::mutex> lock(global_lock);
2342 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002343 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002344 if (pBufferMemoryBarriers) {
2345 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2346 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002347 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002348 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2349 }
2350 }
2351 }
2352 if (pImageMemoryBarriers) {
2353 for (uint32_t idx1 = 0; idx1 < imageMemoryBarrierCount; ++idx1) {
2354 if (pImageMemoryBarriers[idx1].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002355 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx1].image,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002356 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2357 }
2358 }
2359 }
2360 }
2361 if (skip_call) {
2362 return;
2363 }
2364 get_dispatch_table(ot_device_table_map, commandBuffer)
2365 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
2366 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2367}
2368
2369VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query,
2370 VkQueryControlFlags flags) {
2371 bool skip_call = false;
2372 {
2373 std::lock_guard<std::mutex> lock(global_lock);
2374 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002375 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2376 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002377 }
2378 if (skip_call) {
2379 return;
2380 }
2381 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, query, flags);
2382}
2383
2384VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query) {
2385 bool skip_call = false;
2386 {
2387 std::lock_guard<std::mutex> lock(global_lock);
2388 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002389 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2390 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002391 }
2392 if (skip_call) {
2393 return;
2394 }
2395 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, query);
2396}
2397
2398VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2399 uint32_t queryCount) {
2400 bool skip_call = false;
2401 {
2402 std::lock_guard<std::mutex> lock(global_lock);
2403 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002404 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2405 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002406 }
2407 if (skip_call) {
2408 return;
2409 }
2410 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
2411}
2412
2413VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2414 VkQueryPool queryPool, uint32_t query) {
2415 bool skip_call = false;
2416 {
2417 std::lock_guard<std::mutex> lock(global_lock);
2418 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002419 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2420 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002421 }
2422 if (skip_call) {
2423 return;
2424 }
2425 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
2426}
2427
2428VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2429 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2430 VkDeviceSize stride, VkQueryResultFlags flags) {
2431 bool skip_call = false;
2432 {
2433 std::lock_guard<std::mutex> lock(global_lock);
2434 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002435 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2436 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2437 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002438 }
2439 if (skip_call) {
2440 return;
2441 }
2442 get_dispatch_table(ot_device_table_map, commandBuffer)
2443 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
2444}
2445
2446VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
2447 uint32_t offset, uint32_t size, const void *pValues) {
2448 bool skip_call = false;
2449 {
2450 std::lock_guard<std::mutex> lock(global_lock);
2451 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002452 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2453 skip_call |= ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002454 }
2455 if (skip_call) {
2456 return;
2457 }
2458 get_dispatch_table(ot_device_table_map, commandBuffer)
2459 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
2460}
2461
2462VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
2463 VkSubpassContents contents) {
2464 bool skip_call = false;
2465 {
2466 std::lock_guard<std::mutex> lock(global_lock);
2467 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002468 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002469 if (pRenderPassBegin) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002470 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->framebuffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002471 VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, false);
Chris Forbes2f271a72016-09-29 14:58:08 +13002472 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002473 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
2474 }
2475 }
2476 if (skip_call) {
2477 return;
2478 }
2479 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
2480}
2481
2482VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
2483 bool skip_call = false;
2484 {
2485 std::lock_guard<std::mutex> lock(global_lock);
2486 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002487 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002488 }
2489 if (skip_call) {
2490 return;
2491 }
2492 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
2493}
2494
2495VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
2496 bool skip_call = false;
2497 {
2498 std::lock_guard<std::mutex> lock(global_lock);
2499 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002500 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002501 }
2502 if (skip_call) {
2503 return;
2504 }
2505 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
2506}
2507
2508VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
2509 const VkCommandBuffer *pCommandBuffers) {
2510 bool skip_call = false;
2511 {
2512 std::lock_guard<std::mutex> lock(global_lock);
2513 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002514 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002515 if (pCommandBuffers) {
2516 for (uint32_t idx0 = 0; idx0 < commandBufferCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002517 skip_call |= ValidateObject(commandBuffer, pCommandBuffers[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002518 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2519 }
2520 }
2521 }
2522 if (skip_call) {
2523 return;
2524 }
2525 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
2526}
2527
2528VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
2529 bool skip_call = false;
2530 {
2531 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002532 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
2533 skip_call |= ValidateObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002534 }
2535 if (skip_call) {
2536 return;
2537 }
2538 {
2539 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13002540 DestroyObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002541 }
2542 get_dispatch_table(ot_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
2543}
2544
2545VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
2546 VkSurfaceKHR surface, VkBool32 *pSupported) {
2547 bool skip_call = false;
2548 {
2549 std::lock_guard<std::mutex> lock(global_lock);
2550 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002551 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2552 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002553 }
2554 if (skip_call) {
2555 return VK_ERROR_VALIDATION_FAILED_EXT;
2556 }
2557 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2558 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
2559 return result;
2560}
2561
2562VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2563 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
2564 bool skip_call = false;
2565 {
2566 std::lock_guard<std::mutex> lock(global_lock);
2567 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002568 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2569 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002570 }
2571 if (skip_call) {
2572 return VK_ERROR_VALIDATION_FAILED_EXT;
2573 }
2574 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2575 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
2576 return result;
2577}
2578
2579VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2580 uint32_t *pSurfaceFormatCount,
2581 VkSurfaceFormatKHR *pSurfaceFormats) {
2582 bool skip_call = false;
2583 {
2584 std::lock_guard<std::mutex> lock(global_lock);
2585 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002586 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2587 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002588 }
2589 if (skip_call) {
2590 return VK_ERROR_VALIDATION_FAILED_EXT;
2591 }
2592 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2593 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
2594 return result;
2595}
2596
2597VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2598 uint32_t *pPresentModeCount,
2599 VkPresentModeKHR *pPresentModes) {
2600 bool skip_call = false;
2601 {
2602 std::lock_guard<std::mutex> lock(global_lock);
2603 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002604 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2605 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002606 }
2607 if (skip_call) {
2608 return VK_ERROR_VALIDATION_FAILED_EXT;
2609 }
2610 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2611 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
2612 return result;
2613}
2614
2615VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
2616 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
2617 bool skip_call = false;
2618 {
2619 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002620 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002621 if (pCreateInfo) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002622 skip_call |= ValidateObject(device, pCreateInfo->oldSwapchain,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002623 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, true);
2624 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002625 skip_call |= ValidateObject(device_data->physical_device, pCreateInfo->surface,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002626 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
2627 }
2628 }
2629 if (skip_call) {
2630 return VK_ERROR_VALIDATION_FAILED_EXT;
2631 }
2632 VkResult result =
2633 get_dispatch_table(ot_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
2634 {
2635 std::lock_guard<std::mutex> lock(global_lock);
2636 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002637 CreateObject(device, *pSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002638 }
2639 }
2640 return result;
2641}
2642
2643VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
2644 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
2645 bool skip_call = false;
2646 {
2647 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002648 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
2649 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true);
2650 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, true);
2651 skip_call |= ValidateObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002652 }
2653 if (skip_call) {
2654 return VK_ERROR_VALIDATION_FAILED_EXT;
2655 }
2656 VkResult result = get_dispatch_table(ot_device_table_map, device)
2657 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
2658 return result;
2659}
2660
2661VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
2662 bool skip_call = false;
2663 {
2664 std::lock_guard<std::mutex> lock(global_lock);
2665 if (pPresentInfo) {
2666 if (pPresentInfo->pSwapchains) {
2667 for (uint32_t idx0 = 0; idx0 < pPresentInfo->swapchainCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002668 skip_call |= ValidateObject(queue, pPresentInfo->pSwapchains[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002669 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false);
2670 }
2671 }
2672 if (pPresentInfo->pWaitSemaphores) {
2673 for (uint32_t idx1 = 0; idx1 < pPresentInfo->waitSemaphoreCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002674 skip_call |= ValidateObject(queue, pPresentInfo->pWaitSemaphores[idx1],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002675 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
2676 }
2677 }
2678 }
Chris Forbes2f271a72016-09-29 14:58:08 +13002679 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002680 }
2681 if (skip_call) {
2682 return VK_ERROR_VALIDATION_FAILED_EXT;
2683 }
2684 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
2685 return result;
2686}
2687
2688#ifdef VK_USE_PLATFORM_WIN32_KHR
2689VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
2690 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2691 bool skip_call = false;
2692 {
2693 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002694 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002695 }
2696 if (skip_call) {
2697 return VK_ERROR_VALIDATION_FAILED_EXT;
2698 }
2699 VkResult result =
2700 get_dispatch_table(ot_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2701 {
2702 std::lock_guard<std::mutex> lock(global_lock);
2703 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002704 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002705 }
2706 }
2707 return result;
2708}
2709
2710VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
2711 uint32_t queueFamilyIndex) {
2712 bool skip_call = false;
2713 {
2714 std::lock_guard<std::mutex> lock(global_lock);
2715 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002716 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002717 }
2718 if (skip_call) {
2719 return VK_FALSE;
2720 }
2721 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2722 ->GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
2723 return result;
2724}
2725#endif // VK_USE_PLATFORM_WIN32_KHR
2726
2727#ifdef VK_USE_PLATFORM_XCB_KHR
2728VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
2729 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2730 bool skip_call = false;
2731 {
2732 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002733 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002734 }
2735 if (skip_call) {
2736 return VK_ERROR_VALIDATION_FAILED_EXT;
2737 }
2738 VkResult result =
2739 get_dispatch_table(ot_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2740 {
2741 std::lock_guard<std::mutex> lock(global_lock);
2742 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002743 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002744 }
2745 }
2746 return result;
2747}
2748
2749VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2750 uint32_t queueFamilyIndex, xcb_connection_t *connection,
2751 xcb_visualid_t visual_id) {
2752 bool skip_call = false;
2753 {
2754 std::lock_guard<std::mutex> lock(global_lock);
2755 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002756 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002757 }
2758 if (skip_call) {
2759 return VK_FALSE;
2760 }
2761 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2762 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
2763 return result;
2764}
2765#endif // VK_USE_PLATFORM_XCB_KHR
2766
2767#ifdef VK_USE_PLATFORM_XLIB_KHR
2768VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
2769 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2770 bool skip_call = false;
2771 {
2772 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002773 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002774 }
2775 if (skip_call) {
2776 return VK_ERROR_VALIDATION_FAILED_EXT;
2777 }
2778 VkResult result =
2779 get_dispatch_table(ot_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2780 {
2781 std::lock_guard<std::mutex> lock(global_lock);
2782 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002783 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002784 }
2785 }
2786 return result;
2787}
2788
2789VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2790 uint32_t queueFamilyIndex, Display *dpy,
2791 VisualID visualID) {
2792 bool skip_call = false;
2793 {
2794 std::lock_guard<std::mutex> lock(global_lock);
2795 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002796 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002797 }
2798 if (skip_call) {
2799 return VK_FALSE;
2800 }
2801 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2802 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
2803 return result;
2804}
2805#endif // VK_USE_PLATFORM_XLIB_KHR
2806
2807#ifdef VK_USE_PLATFORM_MIR_KHR
2808VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
2809 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2810 bool skip_call = false;
2811 {
2812 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002813 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002814 }
2815 if (skip_call) {
2816 return VK_ERROR_VALIDATION_FAILED_EXT;
2817 }
2818 VkResult result =
2819 get_dispatch_table(ot_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2820 {
2821 std::lock_guard<std::mutex> lock(global_lock);
2822 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002823 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002824 }
2825 }
2826 return result;
2827}
2828
2829VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2830 uint32_t queueFamilyIndex, MirConnection *connection) {
2831 bool skip_call = false;
2832 {
2833 std::lock_guard<std::mutex> lock(global_lock);
2834 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002835 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002836 }
2837 if (skip_call) {
2838 return VK_FALSE;
2839 }
2840 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2841 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
2842 return result;
2843}
2844#endif // VK_USE_PLATFORM_MIR_KHR
2845
2846#ifdef VK_USE_PLATFORM_WAYLAND_KHR
2847VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
2848 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2849 bool skip_call = false;
2850 {
2851 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002852 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002853 }
2854 if (skip_call) {
2855 return VK_ERROR_VALIDATION_FAILED_EXT;
2856 }
2857 VkResult result =
2858 get_dispatch_table(ot_instance_table_map, instance)->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2859 {
2860 std::lock_guard<std::mutex> lock(global_lock);
2861 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002862 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002863 }
2864 }
2865 return result;
2866}
2867
2868VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2869 uint32_t queueFamilyIndex,
2870 struct wl_display *display) {
2871 bool skip_call = false;
2872 {
2873 std::lock_guard<std::mutex> lock(global_lock);
2874 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002875 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002876 }
2877 if (skip_call) {
2878 return VK_FALSE;
2879 }
2880 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2881 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
2882 return result;
2883}
2884#endif // VK_USE_PLATFORM_WAYLAND_KHR
2885
2886#ifdef VK_USE_PLATFORM_ANDROID_KHR
2887VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
2888 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2889 bool skip_call = false;
2890 {
2891 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002892 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002893 }
2894 if (skip_call) {
2895 return VK_ERROR_VALIDATION_FAILED_EXT;
2896 }
2897 VkResult result =
2898 get_dispatch_table(ot_instance_table_map, instance)->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2899 {
2900 std::lock_guard<std::mutex> lock(global_lock);
2901 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002902 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002903 }
2904 }
2905 return result;
2906}
2907#endif // VK_USE_PLATFORM_ANDROID_KHR
2908
Mark Youngead9b932016-09-08 12:28:38 -06002909VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
2910 const VkSwapchainCreateInfoKHR *pCreateInfos,
2911 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
2912 bool skip_call = false;
2913 uint32_t i = 0;
2914 {
2915 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002916 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Youngead9b932016-09-08 12:28:38 -06002917 if (NULL != pCreateInfos) {
2918 for (i = 0; i < swapchainCount; i++) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002919 skip_call |= ValidateObject(device, pCreateInfos[i].oldSwapchain,
Mark Youngead9b932016-09-08 12:28:38 -06002920 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, true);
2921 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002922 skip_call |= ValidateObject(device_data->physical_device, pCreateInfos[i].surface,
Mark Youngead9b932016-09-08 12:28:38 -06002923 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
2924 }
2925 }
2926 }
2927 if (skip_call) {
2928 return VK_ERROR_VALIDATION_FAILED_EXT;
2929 }
2930 VkResult result =
2931 get_dispatch_table(ot_device_table_map, device)->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
2932 {
2933 std::lock_guard<std::mutex> lock(global_lock);
2934 if (result == VK_SUCCESS) {
2935 for (i = 0; i < swapchainCount; i++) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002936 CreateObject(device, pSwapchains[i], VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Youngead9b932016-09-08 12:28:38 -06002937 }
2938 }
2939 }
2940 return result;
2941}
2942
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002943VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
2944 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
2945 const VkAllocationCallbacks *pAllocator,
2946 VkDebugReportCallbackEXT *pCallback) {
2947 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
2948 VkResult result = pInstanceTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback);
2949 if (VK_SUCCESS == result) {
2950 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2951 result = layer_create_msg_callback(instance_data->report_data, false, pCreateInfo, pAllocator, pCallback);
Chris Forbesfeecd402016-09-29 14:53:50 +13002952 CreateObject(instance, *pCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002953 }
2954 return result;
2955}
2956
2957VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
2958 const VkAllocationCallbacks *pAllocator) {
2959 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
2960 pInstanceTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
2961 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2962 layer_destroy_msg_callback(instance_data->report_data, msgCallback, pAllocator);
Chris Forbesec461992016-09-29 14:41:44 +13002963 DestroyObject(instance, msgCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002964}
2965
2966VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
2967 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
2968 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
2969 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
2970 pInstanceTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
2971}
2972
2973static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
2974
2975static const VkLayerProperties globalLayerProps = {"VK_LAYER_LUNARG_object_tracker",
2976 VK_LAYER_API_VERSION, // specVersion
2977 1, // implementationVersion
2978 "LunarG Validation Layer"};
2979
2980VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
2981 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
2982}
2983
2984VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
2985 VkLayerProperties *pProperties) {
2986 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
2987}
2988
2989VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
2990 VkExtensionProperties *pProperties) {
2991 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
2992 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
2993
2994 return VK_ERROR_LAYER_NOT_PRESENT;
2995}
2996
2997VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
2998 uint32_t *pCount, VkExtensionProperties *pProperties) {
2999 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3000 return util_GetExtensionProperties(0, nullptr, pCount, pProperties);
3001
3002 assert(physicalDevice);
3003 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, physicalDevice);
3004 return pTable->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
3005}
3006
3007static inline PFN_vkVoidFunction InterceptMsgCallbackGetProcAddrCommand(const char *name, VkInstance instance) {
3008 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3009 return debug_report_get_instance_proc_addr(instance_data->report_data, name);
3010}
3011
3012static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
3013 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, instance);
3014 if (instanceExtMap.size() == 0 || !instanceExtMap[pTable].wsi_enabled)
3015 return nullptr;
3016
3017 if (!strcmp("vkDestroySurfaceKHR", name))
3018 return reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR);
3019 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name))
3020 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR);
3021 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name))
3022 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR);
3023 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name))
3024 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR);
3025 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name))
3026 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR);
3027
3028#ifdef VK_USE_PLATFORM_WIN32_KHR
3029 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
3030 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
3031 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name))
3032 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR);
3033#endif // VK_USE_PLATFORM_WIN32_KHR
3034#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003035 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003036 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003037 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003038 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
3039#endif // VK_USE_PLATFORM_XCB_KHR
3040#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003041 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003042 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003043 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003044 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
3045#endif // VK_USE_PLATFORM_XLIB_KHR
3046#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003047 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003048 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003049 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003050 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
3051#endif // VK_USE_PLATFORM_MIR_KHR
3052#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003053 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003054 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003055 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003056 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
3057#endif // VK_USE_PLATFORM_WAYLAND_KHR
3058#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003059 if ((instanceExtMap[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003060 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
3061#endif // VK_USE_PLATFORM_ANDROID_KHR
3062
3063 return nullptr;
3064}
3065
3066static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
3067 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3068 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06003069 device_data->wsi_display_swapchain_enabled = false;
3070 device_data->objtrack_extensions_enabled = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003071
3072 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3073 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
3074 device_data->wsi_enabled = true;
3075 }
Mark Youngead9b932016-09-08 12:28:38 -06003076 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
3077 device_data->wsi_display_swapchain_enabled = true;
3078 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003079 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], "OBJTRACK_EXTENSIONS") == 0) {
3080 device_data->objtrack_extensions_enabled = true;
3081 }
3082 }
3083}
3084
3085static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
3086 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(ot_instance_table_map, instance);
3087
3088
3089 instanceExtMap[pDisp] = {};
3090
3091 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3092 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
3093 instanceExtMap[pDisp].wsi_enabled = true;
3094 }
3095#ifdef VK_USE_PLATFORM_XLIB_KHR
3096 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
3097 instanceExtMap[pDisp].xlib_enabled = true;
3098 }
3099#endif
3100#ifdef VK_USE_PLATFORM_XCB_KHR
3101 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
3102 instanceExtMap[pDisp].xcb_enabled = true;
3103 }
3104#endif
3105#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3106 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
3107 instanceExtMap[pDisp].wayland_enabled = true;
3108 }
3109#endif
3110#ifdef VK_USE_PLATFORM_MIR_KHR
3111 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
3112 instanceExtMap[pDisp].mir_enabled = true;
3113 }
3114#endif
3115#ifdef VK_USE_PLATFORM_ANDROID_KHR
3116 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
3117 instanceExtMap[pDisp].android_enabled = true;
3118 }
3119#endif
3120#ifdef VK_USE_PLATFORM_WIN32_KHR
3121 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
3122 instanceExtMap[pDisp].win32_enabled = true;
3123 }
3124#endif
3125 }
3126}
3127
3128VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
3129 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
3130 std::lock_guard<std::mutex> lock(global_lock);
3131 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3132 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3133
3134 assert(chain_info->u.pLayerInfo);
3135 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3136 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
3137 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(phy_dev_data->instance, "vkCreateDevice");
3138 if (fpCreateDevice == NULL) {
3139 return VK_ERROR_INITIALIZATION_FAILED;
3140 }
3141
3142 // Advance the link info for the next element on the chain
3143 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3144
3145 VkResult result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
3146 if (result != VK_SUCCESS) {
3147 return result;
3148 }
3149
3150 layer_data *device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
3151 device_data->report_data = layer_debug_report_create_device(phy_dev_data->report_data, *pDevice);
3152
3153 // Add link back to physDev
3154 device_data->physical_device = physicalDevice;
3155
3156 initDeviceTable(*pDevice, fpGetDeviceProcAddr, ot_device_table_map);
3157
3158 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
Chris Forbesfeecd402016-09-29 14:53:50 +13003159 CreateObject(*pDevice, *pDevice, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003160
3161 return result;
3162}
3163
3164VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3165 uint32_t *pQueueFamilyPropertyCount,
3166 VkQueueFamilyProperties *pQueueFamilyProperties) {
3167 get_dispatch_table(ot_instance_table_map, physicalDevice)
3168 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
3169 std::lock_guard<std::mutex> lock(global_lock);
3170 if (pQueueFamilyProperties != NULL) {
3171 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3172 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
3173 instance_data->queue_family_properties.emplace_back(pQueueFamilyProperties[i]);
3174 }
3175 }
3176}
3177
3178VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3179 VkInstance *pInstance) {
3180 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3181
3182 assert(chain_info->u.pLayerInfo);
3183 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3184 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
3185 if (fpCreateInstance == NULL) {
3186 return VK_ERROR_INITIALIZATION_FAILED;
3187 }
3188
3189 // Advance the link info for the next element on the chain
3190 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3191
3192 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
3193 if (result != VK_SUCCESS) {
3194 return result;
3195 }
3196
3197 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
3198 instance_data->instance = *pInstance;
3199 initInstanceTable(*pInstance, fpGetInstanceProcAddr, ot_instance_table_map);
3200 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, *pInstance);
3201
3202 // Look for one or more debug report create info structures, and copy the
3203 // callback(s) for each one found (for use by vkDestroyInstance)
3204 layer_copy_tmp_callbacks(pCreateInfo->pNext, &instance_data->num_tmp_callbacks, &instance_data->tmp_dbg_create_infos,
3205 &instance_data->tmp_callbacks);
3206
3207 instance_data->report_data = debug_report_create_instance(pInstanceTable, *pInstance, pCreateInfo->enabledExtensionCount,
3208 pCreateInfo->ppEnabledExtensionNames);
3209
3210 InitObjectTracker(instance_data, pAllocator);
3211 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
3212
Chris Forbesfeecd402016-09-29 14:53:50 +13003213 CreateObject(*pInstance, *pInstance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003214
3215 return result;
3216}
3217
3218VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
3219 VkPhysicalDevice *pPhysicalDevices) {
3220 bool skip_call = VK_FALSE;
3221 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003222 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003223 lock.unlock();
3224 if (skip_call) {
3225 return VK_ERROR_VALIDATION_FAILED_EXT;
3226 }
3227 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
3228 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
3229 lock.lock();
3230 if (result == VK_SUCCESS) {
3231 if (pPhysicalDevices) {
3232 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003233 CreateObject(instance, pPhysicalDevices[i], VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003234 }
3235 }
3236 }
3237 lock.unlock();
3238 return result;
3239}
3240
3241VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
3242 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003243 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003244 lock.unlock();
3245
3246 get_dispatch_table(ot_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
3247
3248 lock.lock();
3249
3250 CreateQueue(device, *pQueue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT);
3251 AddQueueInfo(device, queueFamilyIndex, *pQueue);
3252}
3253
3254VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
3255 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003256 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003257 lock.unlock();
3258
3259 get_dispatch_table(ot_device_table_map, device)->FreeMemory(device, memory, pAllocator);
3260
3261 lock.lock();
Chris Forbesec461992016-09-29 14:41:44 +13003262 DestroyObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003263}
3264
3265VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
3266 VkMemoryMapFlags flags, void **ppData) {
3267 bool skip_call = VK_FALSE;
3268 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003269 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003270 lock.unlock();
3271 if (skip_call == VK_TRUE) {
3272 return VK_ERROR_VALIDATION_FAILED_EXT;
3273 }
3274 VkResult result = get_dispatch_table(ot_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
3275 return result;
3276}
3277
3278VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
3279 bool skip_call = VK_FALSE;
3280 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003281 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003282 lock.unlock();
3283 if (skip_call == VK_TRUE) {
3284 return;
3285 }
3286
3287 get_dispatch_table(ot_device_table_map, device)->UnmapMemory(device, memory);
3288}
3289VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
3290 VkFence fence) {
3291 std::unique_lock<std::mutex> lock(global_lock);
3292 ValidateQueueFlags(queue, "QueueBindSparse");
3293
3294 for (uint32_t i = 0; i < bindInfoCount; i++) {
3295 for (uint32_t j = 0; j < pBindInfo[i].bufferBindCount; j++)
Chris Forbes2f271a72016-09-29 14:58:08 +13003296 ValidateObject(queue, pBindInfo[i].pBufferBinds[j].buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003297 false);
3298 for (uint32_t j = 0; j < pBindInfo[i].imageOpaqueBindCount; j++)
Chris Forbes2f271a72016-09-29 14:58:08 +13003299 ValidateObject(queue, pBindInfo[i].pImageOpaqueBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003300 false);
3301 for (uint32_t j = 0; j < pBindInfo[i].imageBindCount; j++)
Chris Forbes2f271a72016-09-29 14:58:08 +13003302 ValidateObject(queue, pBindInfo[i].pImageBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003303 }
3304 lock.unlock();
3305
3306 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
3307 return result;
3308}
3309
3310VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3311 VkCommandBuffer *pCommandBuffers) {
3312 bool skip_call = VK_FALSE;
3313 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003314 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003315 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13003316 ValidateObject(device, pAllocateInfo->commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003317 lock.unlock();
3318
3319 if (skip_call) {
3320 return VK_ERROR_VALIDATION_FAILED_EXT;
3321 }
3322
3323 VkResult result =
3324 get_dispatch_table(ot_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3325
3326 lock.lock();
3327 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {
3328 AllocateCommandBuffer(device, pAllocateInfo->commandPool, pCommandBuffers[i],
3329 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, pAllocateInfo->level);
3330 }
3331 lock.unlock();
3332
3333 return result;
3334}
3335
3336VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3337 VkDescriptorSet *pDescriptorSets) {
3338 bool skip_call = VK_FALSE;
3339 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003340 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3341 skip_call |= ValidateObject(device, pAllocateInfo->descriptorPool,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003342 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
3343 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003344 skip_call |= ValidateObject(device, pAllocateInfo->pSetLayouts[i],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003345 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false);
3346 }
3347 lock.unlock();
3348 if (skip_call) {
3349 return VK_ERROR_VALIDATION_FAILED_EXT;
3350 }
3351
3352 VkResult result =
3353 get_dispatch_table(ot_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3354
3355 if (VK_SUCCESS == result) {
3356 lock.lock();
3357 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
3358 AllocateDescriptorSet(device, pAllocateInfo->descriptorPool, pDescriptorSets[i],
3359 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
3360 }
3361 lock.unlock();
3362 }
3363
3364 return result;
3365}
3366
3367VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
3368 const VkCommandBuffer *pCommandBuffers) {
3369 bool skip_call = false;
3370 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003371 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
3372 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003373 for (uint32_t i = 0; i < commandBufferCount; i++) {
3374 skip_call |= ValidateCommandBuffer(device, commandPool, pCommandBuffers[i]);
3375 }
3376
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003377 for (uint32_t i = 0; i < commandBufferCount; i++) {
Chris Forbesec461992016-09-29 14:41:44 +13003378 DestroyObject(device, pCommandBuffers[i], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003379 }
3380
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003381 lock.unlock();
3382 if (!skip_call) {
3383 get_dispatch_table(ot_device_table_map, device)
3384 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
3385 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003386}
3387VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
3388 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3389 std::unique_lock<std::mutex> lock(global_lock);
3390 // A swapchain's images are implicitly deleted when the swapchain is deleted.
3391 // Remove this swapchain's images from our map of such images.
3392 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr = device_data->swapchainImageMap.begin();
3393 while (itr != device_data->swapchainImageMap.end()) {
3394 OBJTRACK_NODE *pNode = (*itr).second;
3395 if (pNode->parent_object == reinterpret_cast<uint64_t &>(swapchain)) {
3396 delete pNode;
3397 auto delete_item = itr++;
3398 device_data->swapchainImageMap.erase(delete_item);
3399 } else {
3400 ++itr;
3401 }
3402 }
Chris Forbesec461992016-09-29 14:41:44 +13003403 DestroyObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003404 lock.unlock();
3405
3406 get_dispatch_table(ot_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
3407}
3408
3409VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
3410 const VkDescriptorSet *pDescriptorSets) {
3411 bool skip_call = false;
3412 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3413 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003414 skip_call |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
3415 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003416 for (uint32_t i = 0; i < descriptorSetCount; i++) {
3417 skip_call |= ValidateDescriptorSet(device, descriptorPool, pDescriptorSets[i]);
3418 }
3419
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003420 for (uint32_t i = 0; i < descriptorSetCount; i++) {
Chris Forbesec461992016-09-29 14:41:44 +13003421 DestroyObject(device, pDescriptorSets[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003422 }
3423
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003424 lock.unlock();
3425 if (!skip_call) {
3426 result = get_dispatch_table(ot_device_table_map, device)
3427 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
3428 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003429 return result;
3430}
3431
3432VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3433 const VkAllocationCallbacks *pAllocator) {
3434 bool skip_call = VK_FALSE;
3435 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3436 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003437 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3438 skip_call |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003439 lock.unlock();
3440 if (skip_call) {
3441 return;
3442 }
3443 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is deleted.
3444 // Remove this pool's descriptor sets from our descriptorSet map.
3445 lock.lock();
3446 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr =
3447 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
3448 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
3449 OBJTRACK_NODE *pNode = (*itr).second;
3450 auto del_itr = itr++;
3451 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
Chris Forbesec461992016-09-29 14:41:44 +13003452 DestroyObject(device, (VkDescriptorSet)((*del_itr).first),
Chris Forbes3e51a202016-09-29 14:35:09 +13003453 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003454 }
3455 }
Chris Forbesec461992016-09-29 14:41:44 +13003456 DestroyObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003457 lock.unlock();
3458 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
3459}
3460
3461VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3462 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3463 bool skip_call = false;
3464 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003465 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3466 skip_call |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003467 lock.unlock();
3468 if (skip_call) {
3469 return;
3470 }
3471 lock.lock();
3472 // A CommandPool's command buffers are implicitly deleted when the pool is deleted.
3473 // Remove this pool's cmdBuffers from our cmd buffer map.
3474 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].begin();
3475 auto del_itr = itr;
3476 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
3477 OBJTRACK_NODE *pNode = (*itr).second;
3478 del_itr = itr++;
3479 if (pNode->parent_object == reinterpret_cast<uint64_t &>(commandPool)) {
3480 skip_call |= ValidateCommandBuffer(device, commandPool, reinterpret_cast<VkCommandBuffer>((*del_itr).first));
Chris Forbesec461992016-09-29 14:41:44 +13003481 DestroyObject(device, reinterpret_cast<VkCommandBuffer>((*del_itr).first),
Chris Forbes3e51a202016-09-29 14:35:09 +13003482 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003483 }
3484 }
Chris Forbesec461992016-09-29 14:41:44 +13003485 DestroyObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003486 lock.unlock();
3487 get_dispatch_table(ot_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
3488}
3489
3490VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
3491 VkImage *pSwapchainImages) {
3492 bool skip_call = VK_FALSE;
3493 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003494 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003495 lock.unlock();
3496 if (skip_call) {
3497 return VK_ERROR_VALIDATION_FAILED_EXT;
3498 }
3499 VkResult result = get_dispatch_table(ot_device_table_map, device)
3500 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
3501 if (pSwapchainImages != NULL) {
3502 lock.lock();
3503 for (uint32_t i = 0; i < *pSwapchainImageCount; i++) {
3504 CreateSwapchainImageObject(device, pSwapchainImages[i], swapchain);
3505 }
3506 lock.unlock();
3507 }
3508 return result;
3509}
3510
3511VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3512 const VkGraphicsPipelineCreateInfo *pCreateInfos,
3513 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3514 bool skip_call = VK_FALSE;
3515 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003516 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003517 if (pCreateInfos) {
3518 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3519 if (pCreateInfos[idx0].basePipelineHandle) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003520 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003521 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, true);
3522 }
3523 if (pCreateInfos[idx0].layout) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003524 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003525 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
3526 }
3527 if (pCreateInfos[idx0].pStages) {
3528 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
3529 if (pCreateInfos[idx0].pStages[idx1].module) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003530 skip_call |= ValidateObject(device, pCreateInfos[idx0].pStages[idx1].module,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003531 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false);
3532 }
3533 }
3534 }
3535 if (pCreateInfos[idx0].renderPass) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003536 skip_call |= ValidateObject(device, pCreateInfos[idx0].renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003537 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
3538 }
3539 }
3540 }
3541 if (pipelineCache) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003542 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003543 }
3544 lock.unlock();
3545 if (skip_call) {
3546 return VK_ERROR_VALIDATION_FAILED_EXT;
3547 }
3548 VkResult result = get_dispatch_table(ot_device_table_map, device)
3549 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3550 lock.lock();
3551 if (result == VK_SUCCESS) {
3552 for (uint32_t idx2 = 0; idx2 < createInfoCount; ++idx2) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003553 CreateObject(device, pPipelines[idx2], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003554 }
3555 }
3556 lock.unlock();
3557 return result;
3558}
3559
3560VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3561 const VkComputePipelineCreateInfo *pCreateInfos,
3562 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3563 bool skip_call = VK_FALSE;
3564 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003565 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003566 if (pCreateInfos) {
3567 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3568 if (pCreateInfos[idx0].basePipelineHandle) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003569 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003570 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, true);
3571 }
3572 if (pCreateInfos[idx0].layout) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003573 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003574 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
3575 }
3576 if (pCreateInfos[idx0].stage.module) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003577 skip_call |= ValidateObject(device, pCreateInfos[idx0].stage.module,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003578 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false);
3579 }
3580 }
3581 }
3582 if (pipelineCache) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003583 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003584 }
3585 lock.unlock();
3586 if (skip_call) {
3587 return VK_ERROR_VALIDATION_FAILED_EXT;
3588 }
3589 VkResult result = get_dispatch_table(ot_device_table_map, device)
3590 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3591 lock.lock();
3592 if (result == VK_SUCCESS) {
3593 for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003594 CreateObject(device, pPipelines[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003595 }
3596 }
3597 lock.unlock();
3598 return result;
3599}
3600
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003601// VK_EXT_debug_marker Extension
3602VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
3603 bool skip_call = VK_FALSE;
3604 std::unique_lock<std::mutex> lock(global_lock);
3605 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3606 lock.unlock();
3607 if (skip_call) {
3608 return VK_ERROR_VALIDATION_FAILED_EXT;
3609 }
3610 VkResult result = get_dispatch_table(ot_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
3611 return result;
3612}
3613
3614VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
3615 bool skip_call = VK_FALSE;
3616 std::unique_lock<std::mutex> lock(global_lock);
3617 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3618 lock.unlock();
3619 if (skip_call) {
3620 return VK_ERROR_VALIDATION_FAILED_EXT;
3621 }
3622 VkResult result = get_dispatch_table(ot_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
3623 return result;
3624}
3625
3626VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3627 bool skip_call = VK_FALSE;
3628 std::unique_lock<std::mutex> lock(global_lock);
3629 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
3630 lock.unlock();
3631 if (!skip_call) {
3632 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
3633 }
3634}
3635
3636VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerEndEXT(VkCommandBuffer commandBuffer) {
3637 bool skip_call = VK_FALSE;
3638 std::unique_lock<std::mutex> lock(global_lock);
3639 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
3640 lock.unlock();
3641 if (!skip_call) {
3642 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerEndEXT(commandBuffer);
3643 }
3644}
3645
3646VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3647 bool skip_call = VK_FALSE;
3648 std::unique_lock<std::mutex> lock(global_lock);
3649 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
3650 lock.unlock();
3651 if (!skip_call) {
3652 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
3653 }
3654}
3655
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003656// VK_NV_external_memory_capabilities Extension
3657VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
3658 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
3659 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
3660 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
3661
3662 bool skip_call = false;
3663 {
3664 std::lock_guard<std::mutex> lock(global_lock);
3665 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
3666 }
3667 if (skip_call) {
3668 return VK_ERROR_VALIDATION_FAILED_EXT;
3669 }
3670 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3671 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
3672 externalHandleType, pExternalImageFormatProperties);
3673 return result;
3674}
3675
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003676#ifdef VK_USE_PLATFORM_WIN32_KHR
3677// VK_NV_external_memory_win32 Extension
3678VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
3679 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
3680 bool skip_call = VK_FALSE;
3681 std::unique_lock<std::mutex> lock(global_lock);
3682 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3683 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
3684 lock.unlock();
3685 if (skip_call) {
3686 return VK_ERROR_VALIDATION_FAILED_EXT;
3687 }
3688 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
3689 return result;
3690}
3691#endif // VK_USE_PLATFORM_WIN32_KHR
3692
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003693// VK_AMD_draw_indirect_count Extension
3694VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3695 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3696 uint32_t stride) {
3697 bool skip_call = VK_FALSE;
3698 std::unique_lock<std::mutex> lock(global_lock);
3699 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3700 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
3701 lock.unlock();
3702 if (!skip_call) {
3703 get_dispatch_table(ot_device_table_map, commandBuffer)
3704 ->CmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3705 }
3706}
3707
3708VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3709 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3710 uint32_t maxDrawCount, uint32_t stride) {
3711 bool skip_call = VK_FALSE;
3712 std::unique_lock<std::mutex> lock(global_lock);
3713 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3714 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
3715 lock.unlock();
3716 if (!skip_call) {
3717 get_dispatch_table(ot_device_table_map, commandBuffer)
3718 ->CmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3719 }
3720}
3721
3722
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003723static inline PFN_vkVoidFunction InterceptCoreDeviceCommand(const char *name) {
3724 if (!name || name[0] != 'v' || name[1] != 'k')
3725 return NULL;
3726
3727 name += 2;
3728 if (!strcmp(name, "GetDeviceProcAddr"))
3729 return (PFN_vkVoidFunction)GetDeviceProcAddr;
3730 if (!strcmp(name, "DestroyDevice"))
3731 return (PFN_vkVoidFunction)DestroyDevice;
3732 if (!strcmp(name, "GetDeviceQueue"))
3733 return (PFN_vkVoidFunction)GetDeviceQueue;
3734 if (!strcmp(name, "QueueSubmit"))
3735 return (PFN_vkVoidFunction)QueueSubmit;
3736 if (!strcmp(name, "QueueWaitIdle"))
3737 return (PFN_vkVoidFunction)QueueWaitIdle;
3738 if (!strcmp(name, "DeviceWaitIdle"))
3739 return (PFN_vkVoidFunction)DeviceWaitIdle;
3740 if (!strcmp(name, "AllocateMemory"))
3741 return (PFN_vkVoidFunction)AllocateMemory;
3742 if (!strcmp(name, "FreeMemory"))
3743 return (PFN_vkVoidFunction)FreeMemory;
3744 if (!strcmp(name, "MapMemory"))
3745 return (PFN_vkVoidFunction)MapMemory;
3746 if (!strcmp(name, "UnmapMemory"))
3747 return (PFN_vkVoidFunction)UnmapMemory;
3748 if (!strcmp(name, "FlushMappedMemoryRanges"))
3749 return (PFN_vkVoidFunction)FlushMappedMemoryRanges;
3750 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
3751 return (PFN_vkVoidFunction)InvalidateMappedMemoryRanges;
3752 if (!strcmp(name, "GetDeviceMemoryCommitment"))
3753 return (PFN_vkVoidFunction)GetDeviceMemoryCommitment;
3754 if (!strcmp(name, "BindBufferMemory"))
3755 return (PFN_vkVoidFunction)BindBufferMemory;
3756 if (!strcmp(name, "BindImageMemory"))
3757 return (PFN_vkVoidFunction)BindImageMemory;
3758 if (!strcmp(name, "GetBufferMemoryRequirements"))
3759 return (PFN_vkVoidFunction)GetBufferMemoryRequirements;
3760 if (!strcmp(name, "GetImageMemoryRequirements"))
3761 return (PFN_vkVoidFunction)GetImageMemoryRequirements;
3762 if (!strcmp(name, "GetImageSparseMemoryRequirements"))
3763 return (PFN_vkVoidFunction)GetImageSparseMemoryRequirements;
3764 if (!strcmp(name, "QueueBindSparse"))
3765 return (PFN_vkVoidFunction)QueueBindSparse;
3766 if (!strcmp(name, "CreateFence"))
3767 return (PFN_vkVoidFunction)CreateFence;
3768 if (!strcmp(name, "DestroyFence"))
3769 return (PFN_vkVoidFunction)DestroyFence;
3770 if (!strcmp(name, "ResetFences"))
3771 return (PFN_vkVoidFunction)ResetFences;
3772 if (!strcmp(name, "GetFenceStatus"))
3773 return (PFN_vkVoidFunction)GetFenceStatus;
3774 if (!strcmp(name, "WaitForFences"))
3775 return (PFN_vkVoidFunction)WaitForFences;
3776 if (!strcmp(name, "CreateSemaphore"))
3777 return (PFN_vkVoidFunction)CreateSemaphore;
3778 if (!strcmp(name, "DestroySemaphore"))
3779 return (PFN_vkVoidFunction)DestroySemaphore;
3780 if (!strcmp(name, "CreateEvent"))
3781 return (PFN_vkVoidFunction)CreateEvent;
3782 if (!strcmp(name, "DestroyEvent"))
3783 return (PFN_vkVoidFunction)DestroyEvent;
3784 if (!strcmp(name, "GetEventStatus"))
3785 return (PFN_vkVoidFunction)GetEventStatus;
3786 if (!strcmp(name, "SetEvent"))
3787 return (PFN_vkVoidFunction)SetEvent;
3788 if (!strcmp(name, "ResetEvent"))
3789 return (PFN_vkVoidFunction)ResetEvent;
3790 if (!strcmp(name, "CreateQueryPool"))
3791 return (PFN_vkVoidFunction)CreateQueryPool;
3792 if (!strcmp(name, "DestroyQueryPool"))
3793 return (PFN_vkVoidFunction)DestroyQueryPool;
3794 if (!strcmp(name, "GetQueryPoolResults"))
3795 return (PFN_vkVoidFunction)GetQueryPoolResults;
3796 if (!strcmp(name, "CreateBuffer"))
3797 return (PFN_vkVoidFunction)CreateBuffer;
3798 if (!strcmp(name, "DestroyBuffer"))
3799 return (PFN_vkVoidFunction)DestroyBuffer;
3800 if (!strcmp(name, "CreateBufferView"))
3801 return (PFN_vkVoidFunction)CreateBufferView;
3802 if (!strcmp(name, "DestroyBufferView"))
3803 return (PFN_vkVoidFunction)DestroyBufferView;
3804 if (!strcmp(name, "CreateImage"))
3805 return (PFN_vkVoidFunction)CreateImage;
3806 if (!strcmp(name, "DestroyImage"))
3807 return (PFN_vkVoidFunction)DestroyImage;
3808 if (!strcmp(name, "GetImageSubresourceLayout"))
3809 return (PFN_vkVoidFunction)GetImageSubresourceLayout;
3810 if (!strcmp(name, "CreateImageView"))
3811 return (PFN_vkVoidFunction)CreateImageView;
3812 if (!strcmp(name, "DestroyImageView"))
3813 return (PFN_vkVoidFunction)DestroyImageView;
3814 if (!strcmp(name, "CreateShaderModule"))
3815 return (PFN_vkVoidFunction)CreateShaderModule;
3816 if (!strcmp(name, "DestroyShaderModule"))
3817 return (PFN_vkVoidFunction)DestroyShaderModule;
3818 if (!strcmp(name, "CreatePipelineCache"))
3819 return (PFN_vkVoidFunction)CreatePipelineCache;
3820 if (!strcmp(name, "DestroyPipelineCache"))
3821 return (PFN_vkVoidFunction)DestroyPipelineCache;
3822 if (!strcmp(name, "GetPipelineCacheData"))
3823 return (PFN_vkVoidFunction)GetPipelineCacheData;
3824 if (!strcmp(name, "MergePipelineCaches"))
3825 return (PFN_vkVoidFunction)MergePipelineCaches;
3826 if (!strcmp(name, "CreateGraphicsPipelines"))
3827 return (PFN_vkVoidFunction)CreateGraphicsPipelines;
3828 if (!strcmp(name, "CreateComputePipelines"))
3829 return (PFN_vkVoidFunction)CreateComputePipelines;
3830 if (!strcmp(name, "DestroyPipeline"))
3831 return (PFN_vkVoidFunction)DestroyPipeline;
3832 if (!strcmp(name, "CreatePipelineLayout"))
3833 return (PFN_vkVoidFunction)CreatePipelineLayout;
3834 if (!strcmp(name, "DestroyPipelineLayout"))
3835 return (PFN_vkVoidFunction)DestroyPipelineLayout;
3836 if (!strcmp(name, "CreateSampler"))
3837 return (PFN_vkVoidFunction)CreateSampler;
3838 if (!strcmp(name, "DestroySampler"))
3839 return (PFN_vkVoidFunction)DestroySampler;
3840 if (!strcmp(name, "CreateDescriptorSetLayout"))
3841 return (PFN_vkVoidFunction)CreateDescriptorSetLayout;
3842 if (!strcmp(name, "DestroyDescriptorSetLayout"))
3843 return (PFN_vkVoidFunction)DestroyDescriptorSetLayout;
3844 if (!strcmp(name, "CreateDescriptorPool"))
3845 return (PFN_vkVoidFunction)CreateDescriptorPool;
3846 if (!strcmp(name, "DestroyDescriptorPool"))
3847 return (PFN_vkVoidFunction)DestroyDescriptorPool;
3848 if (!strcmp(name, "ResetDescriptorPool"))
3849 return (PFN_vkVoidFunction)ResetDescriptorPool;
3850 if (!strcmp(name, "AllocateDescriptorSets"))
3851 return (PFN_vkVoidFunction)AllocateDescriptorSets;
3852 if (!strcmp(name, "FreeDescriptorSets"))
3853 return (PFN_vkVoidFunction)FreeDescriptorSets;
3854 if (!strcmp(name, "UpdateDescriptorSets"))
3855 return (PFN_vkVoidFunction)UpdateDescriptorSets;
3856 if (!strcmp(name, "CreateFramebuffer"))
3857 return (PFN_vkVoidFunction)CreateFramebuffer;
3858 if (!strcmp(name, "DestroyFramebuffer"))
3859 return (PFN_vkVoidFunction)DestroyFramebuffer;
3860 if (!strcmp(name, "CreateRenderPass"))
3861 return (PFN_vkVoidFunction)CreateRenderPass;
3862 if (!strcmp(name, "DestroyRenderPass"))
3863 return (PFN_vkVoidFunction)DestroyRenderPass;
3864 if (!strcmp(name, "GetRenderAreaGranularity"))
3865 return (PFN_vkVoidFunction)GetRenderAreaGranularity;
3866 if (!strcmp(name, "CreateCommandPool"))
3867 return (PFN_vkVoidFunction)CreateCommandPool;
3868 if (!strcmp(name, "DestroyCommandPool"))
3869 return (PFN_vkVoidFunction)DestroyCommandPool;
3870 if (!strcmp(name, "ResetCommandPool"))
3871 return (PFN_vkVoidFunction)ResetCommandPool;
3872 if (!strcmp(name, "AllocateCommandBuffers"))
3873 return (PFN_vkVoidFunction)AllocateCommandBuffers;
3874 if (!strcmp(name, "FreeCommandBuffers"))
3875 return (PFN_vkVoidFunction)FreeCommandBuffers;
3876 if (!strcmp(name, "BeginCommandBuffer"))
3877 return (PFN_vkVoidFunction)BeginCommandBuffer;
3878 if (!strcmp(name, "EndCommandBuffer"))
3879 return (PFN_vkVoidFunction)EndCommandBuffer;
3880 if (!strcmp(name, "ResetCommandBuffer"))
3881 return (PFN_vkVoidFunction)ResetCommandBuffer;
3882 if (!strcmp(name, "CmdBindPipeline"))
3883 return (PFN_vkVoidFunction)CmdBindPipeline;
3884 if (!strcmp(name, "CmdSetViewport"))
3885 return (PFN_vkVoidFunction)CmdSetViewport;
3886 if (!strcmp(name, "CmdSetScissor"))
3887 return (PFN_vkVoidFunction)CmdSetScissor;
3888 if (!strcmp(name, "CmdSetLineWidth"))
3889 return (PFN_vkVoidFunction)CmdSetLineWidth;
3890 if (!strcmp(name, "CmdSetDepthBias"))
3891 return (PFN_vkVoidFunction)CmdSetDepthBias;
3892 if (!strcmp(name, "CmdSetBlendConstants"))
3893 return (PFN_vkVoidFunction)CmdSetBlendConstants;
3894 if (!strcmp(name, "CmdSetDepthBounds"))
3895 return (PFN_vkVoidFunction)CmdSetDepthBounds;
3896 if (!strcmp(name, "CmdSetStencilCompareMask"))
3897 return (PFN_vkVoidFunction)CmdSetStencilCompareMask;
3898 if (!strcmp(name, "CmdSetStencilWriteMask"))
3899 return (PFN_vkVoidFunction)CmdSetStencilWriteMask;
3900 if (!strcmp(name, "CmdSetStencilReference"))
3901 return (PFN_vkVoidFunction)CmdSetStencilReference;
3902 if (!strcmp(name, "CmdBindDescriptorSets"))
3903 return (PFN_vkVoidFunction)CmdBindDescriptorSets;
3904 if (!strcmp(name, "CmdBindIndexBuffer"))
3905 return (PFN_vkVoidFunction)CmdBindIndexBuffer;
3906 if (!strcmp(name, "CmdBindVertexBuffers"))
3907 return (PFN_vkVoidFunction)CmdBindVertexBuffers;
3908 if (!strcmp(name, "CmdDraw"))
3909 return (PFN_vkVoidFunction)CmdDraw;
3910 if (!strcmp(name, "CmdDrawIndexed"))
3911 return (PFN_vkVoidFunction)CmdDrawIndexed;
3912 if (!strcmp(name, "CmdDrawIndirect"))
3913 return (PFN_vkVoidFunction)CmdDrawIndirect;
3914 if (!strcmp(name, "CmdDrawIndexedIndirect"))
3915 return (PFN_vkVoidFunction)CmdDrawIndexedIndirect;
3916 if (!strcmp(name, "CmdDispatch"))
3917 return (PFN_vkVoidFunction)CmdDispatch;
3918 if (!strcmp(name, "CmdDispatchIndirect"))
3919 return (PFN_vkVoidFunction)CmdDispatchIndirect;
3920 if (!strcmp(name, "CmdCopyBuffer"))
3921 return (PFN_vkVoidFunction)CmdCopyBuffer;
3922 if (!strcmp(name, "CmdCopyImage"))
3923 return (PFN_vkVoidFunction)CmdCopyImage;
3924 if (!strcmp(name, "CmdBlitImage"))
3925 return (PFN_vkVoidFunction)CmdBlitImage;
3926 if (!strcmp(name, "CmdCopyBufferToImage"))
3927 return (PFN_vkVoidFunction)CmdCopyBufferToImage;
3928 if (!strcmp(name, "CmdCopyImageToBuffer"))
3929 return (PFN_vkVoidFunction)CmdCopyImageToBuffer;
3930 if (!strcmp(name, "CmdUpdateBuffer"))
3931 return (PFN_vkVoidFunction)CmdUpdateBuffer;
3932 if (!strcmp(name, "CmdFillBuffer"))
3933 return (PFN_vkVoidFunction)CmdFillBuffer;
3934 if (!strcmp(name, "CmdClearColorImage"))
3935 return (PFN_vkVoidFunction)CmdClearColorImage;
3936 if (!strcmp(name, "CmdClearDepthStencilImage"))
3937 return (PFN_vkVoidFunction)CmdClearDepthStencilImage;
3938 if (!strcmp(name, "CmdClearAttachments"))
3939 return (PFN_vkVoidFunction)CmdClearAttachments;
3940 if (!strcmp(name, "CmdResolveImage"))
3941 return (PFN_vkVoidFunction)CmdResolveImage;
3942 if (!strcmp(name, "CmdSetEvent"))
3943 return (PFN_vkVoidFunction)CmdSetEvent;
3944 if (!strcmp(name, "CmdResetEvent"))
3945 return (PFN_vkVoidFunction)CmdResetEvent;
3946 if (!strcmp(name, "CmdWaitEvents"))
3947 return (PFN_vkVoidFunction)CmdWaitEvents;
3948 if (!strcmp(name, "CmdPipelineBarrier"))
3949 return (PFN_vkVoidFunction)CmdPipelineBarrier;
3950 if (!strcmp(name, "CmdBeginQuery"))
3951 return (PFN_vkVoidFunction)CmdBeginQuery;
3952 if (!strcmp(name, "CmdEndQuery"))
3953 return (PFN_vkVoidFunction)CmdEndQuery;
3954 if (!strcmp(name, "CmdResetQueryPool"))
3955 return (PFN_vkVoidFunction)CmdResetQueryPool;
3956 if (!strcmp(name, "CmdWriteTimestamp"))
3957 return (PFN_vkVoidFunction)CmdWriteTimestamp;
3958 if (!strcmp(name, "CmdCopyQueryPoolResults"))
3959 return (PFN_vkVoidFunction)CmdCopyQueryPoolResults;
3960 if (!strcmp(name, "CmdPushConstants"))
3961 return (PFN_vkVoidFunction)CmdPushConstants;
3962 if (!strcmp(name, "CmdBeginRenderPass"))
3963 return (PFN_vkVoidFunction)CmdBeginRenderPass;
3964 if (!strcmp(name, "CmdNextSubpass"))
3965 return (PFN_vkVoidFunction)CmdNextSubpass;
3966 if (!strcmp(name, "CmdEndRenderPass"))
3967 return (PFN_vkVoidFunction)CmdEndRenderPass;
3968 if (!strcmp(name, "CmdExecuteCommands"))
3969 return (PFN_vkVoidFunction)CmdExecuteCommands;
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003970 if (!strcmp(name, "DebugMarkerSetObjectTagEXT"))
3971 return (PFN_vkVoidFunction)DebugMarkerSetObjectTagEXT;
3972 if (!strcmp(name, "DebugMarkerSetObjectNameEXT"))
3973 return (PFN_vkVoidFunction)DebugMarkerSetObjectNameEXT;
3974 if (!strcmp(name, "CmdDebugMarkerBeginEXT"))
3975 return (PFN_vkVoidFunction)CmdDebugMarkerBeginEXT;
3976 if (!strcmp(name, "CmdDebugMarkerEndEXT"))
3977 return (PFN_vkVoidFunction)CmdDebugMarkerEndEXT;
3978 if (!strcmp(name, "CmdDebugMarkerInsertEXT"))
3979 return (PFN_vkVoidFunction)CmdDebugMarkerInsertEXT;
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003980#ifdef VK_USE_PLATFORM_WIN32_KHR
3981 if (!strcmp(name, "GetMemoryWin32HandleNV"))
3982 return (PFN_vkVoidFunction)GetMemoryWin32HandleNV;
3983#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003984 if (!strcmp(name, "CmdDrawIndirectCountAMD"))
3985 return (PFN_vkVoidFunction)CmdDrawIndirectCountAMD;
3986 if (!strcmp(name, "CmdDrawIndexedIndirectCountAMD"))
3987 return (PFN_vkVoidFunction)CmdDrawIndexedIndirectCountAMD;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003988
3989 return NULL;
3990}
3991static inline PFN_vkVoidFunction InterceptCoreInstanceCommand(const char *name) {
3992 if (!name || name[0] != 'v' || name[1] != 'k')
3993 return NULL;
3994
3995 name += 2;
3996 if (!strcmp(name, "CreateInstance"))
3997 return (PFN_vkVoidFunction)CreateInstance;
3998 if (!strcmp(name, "DestroyInstance"))
3999 return (PFN_vkVoidFunction)DestroyInstance;
4000 if (!strcmp(name, "EnumeratePhysicalDevices"))
4001 return (PFN_vkVoidFunction)EnumeratePhysicalDevices;
4002 if (!strcmp(name, "GetPhysicalDeviceFeatures"))
4003 return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures;
4004 if (!strcmp(name, "GetPhysicalDeviceFormatProperties"))
4005 return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties;
4006 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties"))
4007 return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties;
4008 if (!strcmp(name, "GetPhysicalDeviceProperties"))
4009 return (PFN_vkVoidFunction)GetPhysicalDeviceProperties;
4010 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties"))
4011 return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties;
4012 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties"))
4013 return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties;
4014 if (!strcmp(name, "GetInstanceProcAddr"))
4015 return (PFN_vkVoidFunction)GetInstanceProcAddr;
4016 if (!strcmp(name, "CreateDevice"))
4017 return (PFN_vkVoidFunction)CreateDevice;
4018 if (!strcmp(name, "EnumerateInstanceExtensionProperties"))
4019 return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
4020 if (!strcmp(name, "EnumerateInstanceLayerProperties"))
4021 return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties;
4022 if (!strcmp(name, "EnumerateDeviceLayerProperties"))
4023 return (PFN_vkVoidFunction)EnumerateDeviceLayerProperties;
4024 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties"))
4025 return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties;
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06004026 if (!strcmp(name, "GetPhysicalDeviceExternalImageFormatPropertiesNV"))
4027 return (PFN_vkVoidFunction)GetPhysicalDeviceExternalImageFormatPropertiesNV;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004028
4029 return NULL;
4030}
4031
4032static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
4033 if (device) {
4034 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06004035
4036 if (device_data->wsi_enabled) {
4037 if (!strcmp("vkCreateSwapchainKHR", name))
4038 return reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR);
4039 if (!strcmp("vkDestroySwapchainKHR", name))
4040 return reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR);
4041 if (!strcmp("vkGetSwapchainImagesKHR", name))
4042 return reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR);
4043 if (!strcmp("vkAcquireNextImageKHR", name))
4044 return reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR);
4045 if (!strcmp("vkQueuePresentKHR", name))
4046 return reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR);
4047 }
4048
4049 if (device_data->wsi_display_swapchain_enabled) {
4050 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
4051 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
4052 }
4053 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004054 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004055
4056 return nullptr;
4057}
4058
4059VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
4060 PFN_vkVoidFunction addr;
4061 addr = InterceptCoreDeviceCommand(funcName);
4062 if (addr) {
4063 return addr;
4064 }
4065 assert(device);
4066
4067 addr = InterceptWsiEnabledCommand(funcName, device);
4068 if (addr) {
4069 return addr;
4070 }
4071 if (get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr == NULL) {
4072 return NULL;
4073 }
4074 return get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr(device, funcName);
4075}
4076
4077VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
4078 PFN_vkVoidFunction addr;
4079 addr = InterceptCoreInstanceCommand(funcName);
4080 if (!addr) {
4081 addr = InterceptCoreDeviceCommand(funcName);
4082 }
4083 if (!addr) {
4084 addr = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
4085 }
4086 if (addr) {
4087 return addr;
4088 }
4089 assert(instance);
4090
4091 addr = InterceptMsgCallbackGetProcAddrCommand(funcName, instance);
4092 if (addr) {
4093 return addr;
4094 }
4095 addr = InterceptWsiEnabledCommand(funcName, instance);
4096 if (addr) {
4097 return addr;
4098 }
4099 if (get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr == NULL) {
4100 return NULL;
4101 }
4102 return get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
4103}
4104
4105} // namespace object_tracker
4106
4107// vk_layer_logging.h expects these to be defined
4108VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
4109 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4110 const VkAllocationCallbacks *pAllocator,
4111 VkDebugReportCallbackEXT *pMsgCallback) {
4112 return object_tracker::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
4113}
4114
4115VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
4116 const VkAllocationCallbacks *pAllocator) {
4117 object_tracker::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
4118}
4119
4120VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
4121 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
4122 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
4123 object_tracker::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
4124}
4125
4126// Loader-layer interface v0, just wrappers since there is only a layer
4127VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4128 VkExtensionProperties *pProperties) {
4129 return object_tracker::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
4130}
4131
4132VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
4133 VkLayerProperties *pProperties) {
4134 return object_tracker::EnumerateInstanceLayerProperties(pCount, pProperties);
4135}
4136
4137VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4138 VkLayerProperties *pProperties) {
4139 // The layer command handles VK_NULL_HANDLE just fine internally
4140 assert(physicalDevice == VK_NULL_HANDLE);
4141 return object_tracker::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
4142}
4143
4144VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
4145 return object_tracker::GetDeviceProcAddr(dev, funcName);
4146}
4147
4148VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
4149 return object_tracker::GetInstanceProcAddr(instance, funcName);
4150}
4151
4152VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4153 const char *pLayerName, uint32_t *pCount,
4154 VkExtensionProperties *pProperties) {
4155 // The layer command handles VK_NULL_HANDLE just fine internally
4156 assert(physicalDevice == VK_NULL_HANDLE);
4157 return object_tracker::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Mark Lobodzinski38080682016-07-22 15:30:27 -06004158}