blob: acb858ef998708b694c1b299423611f7d000813c [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
Karl Schultza9ef1e52016-10-06 17:53:48 -060045#include "vk_validation_error_messages.h"
46
Mark Lobodzinski9bab8662016-07-01 10:53:31 -060047namespace object_tracker {
48
49static void InitObjectTracker(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
50
51 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_object_tracker");
52}
53
54// Add new queue to head of global queue list
55static void AddQueueInfo(VkDevice device, uint32_t queue_node_index, VkQueue queue) {
56 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
57 auto queueItem = device_data->queue_info_map.find(queue);
58 if (queueItem == device_data->queue_info_map.end()) {
59 OT_QUEUE_INFO *p_queue_info = new OT_QUEUE_INFO;
60 if (p_queue_info != NULL) {
61 memset(p_queue_info, 0, sizeof(OT_QUEUE_INFO));
62 p_queue_info->queue = queue;
63 p_queue_info->queue_node_index = queue_node_index;
64 device_data->queue_info_map[queue] = p_queue_info;
65 } else {
66 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
67 reinterpret_cast<uint64_t>(queue), __LINE__, OBJTRACK_INTERNAL_ERROR, LayerName,
68 "ERROR: VK_ERROR_OUT_OF_HOST_MEMORY -- could not allocate memory for Queue Information");
69 }
70 }
71}
72
73// Destroy memRef lists and free all memory
74static void DestroyQueueDataStructures(VkDevice device) {
75 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
76
77 for (auto queue_item : device_data->queue_info_map) {
78 delete queue_item.second;
79 }
80 device_data->queue_info_map.clear();
81
82 // Destroy the items in the queue map
83 auto queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].begin();
84 while (queue != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
85 uint32_t obj_index = queue->second->object_type;
86 assert(device_data->num_total_objects > 0);
87 device_data->num_total_objects--;
88 assert(device_data->num_objects[obj_index] > 0);
89 device_data->num_objects[obj_index]--;
90 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, queue->second->object_type, queue->second->handle,
91 __LINE__, OBJTRACK_NONE, LayerName,
92 "OBJ_STAT Destroy Queue obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " Queue objs).",
93 queue->second->handle, device_data->num_total_objects, device_data->num_objects[obj_index]);
94 delete queue->second;
95 queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].erase(queue);
96 }
97}
98
99// Check Queue type flags for selected queue operations
100static void ValidateQueueFlags(VkQueue queue, const char *function) {
101 layer_data *device_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
102 auto queue_item = device_data->queue_info_map.find(queue);
103 if (queue_item != device_data->queue_info_map.end()) {
104 OT_QUEUE_INFO *pQueueInfo = queue_item->second;
105 if (pQueueInfo != NULL) {
106 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(device_data->physical_device), layer_data_map);
107 if ((instance_data->queue_family_properties[pQueueInfo->queue_node_index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) ==
108 0) {
109 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
110 reinterpret_cast<uint64_t>(queue), __LINE__, OBJTRACK_UNKNOWN_OBJECT, LayerName,
111 "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_SPARSE_BINDING_BIT not set", function);
112 }
113 }
114 }
115}
116
117static void AllocateCommandBuffer(VkDevice device, const VkCommandPool command_pool, const VkCommandBuffer command_buffer,
118 VkDebugReportObjectTypeEXT object_type, VkCommandBufferLevel level) {
119 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
120
121 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<const uint64_t>(command_buffer),
122 __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
123 string_VkDebugReportObjectTypeEXT(object_type), reinterpret_cast<const uint64_t>(command_buffer));
124
125 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
126 pNewObjNode->object_type = object_type;
127 pNewObjNode->handle = reinterpret_cast<const uint64_t>(command_buffer);
128 pNewObjNode->parent_object = reinterpret_cast<const uint64_t &>(command_pool);
129 if (level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) {
130 pNewObjNode->status = OBJSTATUS_COMMAND_BUFFER_SECONDARY;
131 } else {
132 pNewObjNode->status = OBJSTATUS_NONE;
133 }
134 device_data->object_map[object_type][reinterpret_cast<const uint64_t>(command_buffer)] = pNewObjNode;
135 device_data->num_objects[object_type]++;
136 device_data->num_total_objects++;
137}
138
139static bool ValidateCommandBuffer(VkDevice device, VkCommandPool command_pool, VkCommandBuffer command_buffer) {
140 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
141 bool skip_call = false;
142 uint64_t object_handle = reinterpret_cast<uint64_t>(command_buffer);
143 if (device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].find(object_handle) !=
144 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
145 OBJTRACK_NODE *pNode =
146 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<uint64_t>(command_buffer)];
147
148 if (pNode->parent_object != reinterpret_cast<uint64_t &>(command_pool)) {
149 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
150 __LINE__, OBJTRACK_COMMAND_POOL_MISMATCH, LayerName,
151 "FreeCommandBuffers is attempting to free Command Buffer 0x%" PRIxLEAST64
152 " belonging to Command Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").",
153 reinterpret_cast<uint64_t>(command_buffer), pNode->parent_object,
154 reinterpret_cast<uint64_t &>(command_pool));
155 }
156 } else {
Mark Lobodzinski45e68612016-07-18 17:06:52 -0600157 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle,
158 __LINE__, OBJTRACK_NONE, LayerName, "Unable to remove command buffer obj 0x%" PRIxLEAST64
159 ". Was it created? Has it already been destroyed?",
160 object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600161 }
162 return skip_call;
163}
164
165static void AllocateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set,
166 VkDebugReportObjectTypeEXT object_type) {
167 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
168
169 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type,
170 reinterpret_cast<uint64_t &>(descriptor_set), __LINE__, OBJTRACK_NONE, LayerName,
171 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, object_name[object_type],
172 reinterpret_cast<uint64_t &>(descriptor_set));
173
174 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
175 pNewObjNode->object_type = object_type;
176 pNewObjNode->status = OBJSTATUS_NONE;
177 pNewObjNode->handle = reinterpret_cast<uint64_t &>(descriptor_set);
178 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(descriptor_pool);
179 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT][reinterpret_cast<uint64_t &>(descriptor_set)] =
180 pNewObjNode;
181 device_data->num_objects[object_type]++;
182 device_data->num_total_objects++;
183}
184
185static bool ValidateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set) {
186 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
187 bool skip_call = false;
188 uint64_t object_handle = reinterpret_cast<uint64_t &>(descriptor_set);
189 auto dsItem = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].find(object_handle);
190 if (dsItem != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
191 OBJTRACK_NODE *pNode = dsItem->second;
192
193 if (pNode->parent_object != reinterpret_cast<uint64_t &>(descriptor_pool)) {
194 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
195 __LINE__, OBJTRACK_DESCRIPTOR_POOL_MISMATCH, LayerName,
196 "FreeDescriptorSets is attempting to free descriptorSet 0x%" PRIxLEAST64
197 " belonging to Descriptor Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").",
198 reinterpret_cast<uint64_t &>(descriptor_set), pNode->parent_object,
199 reinterpret_cast<uint64_t &>(descriptor_pool));
200 }
201 } else {
Mark Lobodzinski45e68612016-07-18 17:06:52 -0600202 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle,
203 __LINE__, OBJTRACK_NONE, LayerName, "Unable to remove descriptor set obj 0x%" PRIxLEAST64
204 ". Was it created? Has it already been destroyed?",
205 object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600206 }
207 return skip_call;
208}
209
210static void CreateQueue(VkDevice device, VkQueue vkObj, VkDebugReportObjectTypeEXT object_type) {
211 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
212
213 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<uint64_t>(vkObj), __LINE__,
214 OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
215 object_name[object_type], reinterpret_cast<uint64_t>(vkObj));
216
217 OBJTRACK_NODE *p_obj_node = NULL;
218 auto queue_item = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].find(reinterpret_cast<uint64_t>(vkObj));
219 if (queue_item == device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
220 p_obj_node = new OBJTRACK_NODE;
221 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT][reinterpret_cast<uint64_t>(vkObj)] = p_obj_node;
222 device_data->num_objects[object_type]++;
223 device_data->num_total_objects++;
224 } else {
225 p_obj_node = queue_item->second;
226 }
227 p_obj_node->object_type = object_type;
228 p_obj_node->status = OBJSTATUS_NONE;
229 p_obj_node->handle = reinterpret_cast<uint64_t>(vkObj);
230}
231
232static void CreateSwapchainImageObject(VkDevice dispatchable_object, VkImage swapchain_image, VkSwapchainKHR swapchain) {
233 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
234 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
235 reinterpret_cast<uint64_t &>(swapchain_image), __LINE__, OBJTRACK_NONE, LayerName,
236 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, "SwapchainImage",
237 reinterpret_cast<uint64_t &>(swapchain_image));
238
239 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
240 pNewObjNode->object_type = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT;
241 pNewObjNode->status = OBJSTATUS_NONE;
242 pNewObjNode->handle = reinterpret_cast<uint64_t &>(swapchain_image);
243 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(swapchain);
244 device_data->swapchainImageMap[reinterpret_cast<uint64_t &>(swapchain_image)] = pNewObjNode;
245}
246
Chris Forbes64a31a12016-10-04 14:54:13 +1300247template<typename T>
248uint64_t handle_value(T handle) {
249 return reinterpret_cast<uint64_t &>(handle);
250}
251template<typename T>
252uint64_t handle_value(T *handle) {
253 return reinterpret_cast<uint64_t>(handle);
254}
255
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600256template <typename T1, typename T2>
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600257static void CreateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600258 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes04257ad2016-10-04 10:08:31 +1300259
Chris Forbes64a31a12016-10-04 14:54:13 +1300260 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600261 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600262
Chris Forbesfeecd402016-09-29 14:53:50 +1300263 log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, object_handle,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600264 __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
Chris Forbesfeecd402016-09-29 14:53:50 +1300265 object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600266
267 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
268 pNewObjNode->object_type = object_type;
Chris Forbesdbfe96a2016-09-29 13:51:10 +1300269 pNewObjNode->status = custom_allocator ? OBJSTATUS_CUSTOM_ALLOCATOR : OBJSTATUS_NONE;
Chris Forbesfeecd402016-09-29 14:53:50 +1300270 pNewObjNode->handle = object_handle;
271 instance_data->object_map[object_type][object_handle] = pNewObjNode;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600272 instance_data->num_objects[object_type]++;
273 instance_data->num_total_objects++;
274}
275
276template <typename T1, typename T2>
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600277static void DestroyObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600278 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
279
Chris Forbes64a31a12016-10-04 14:54:13 +1300280 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600281 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600282
283 auto item = device_data->object_map[object_type].find(object_handle);
284 if (item != device_data->object_map[object_type].end()) {
285
286 OBJTRACK_NODE *pNode = item->second;
287 assert(device_data->num_total_objects > 0);
288 device_data->num_total_objects--;
289 assert(device_data->num_objects[pNode->object_type] > 0);
290 device_data->num_objects[pNode->object_type]--;
291
292 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, pNode->object_type, object_handle, __LINE__,
293 OBJTRACK_NONE, LayerName,
294 "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " %s objs).",
295 object_name[pNode->object_type], reinterpret_cast<uint64_t &>(object), device_data->num_total_objects,
296 device_data->num_objects[pNode->object_type], object_name[pNode->object_type]);
297
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600298 auto allocated_with_custom = (pNode->status & OBJSTATUS_CUSTOM_ALLOCATOR) ? true : false;
Chris Forbes3e51a202016-09-29 14:35:09 +1300299 if (custom_allocator ^ allocated_with_custom) {
300 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
301 OBJTRACK_ALLOCATOR_MISMATCH, LayerName,
302 "Custom allocator %sspecified while destroying %s obj 0x%" PRIxLEAST64 " but %sspecified at creation",
303 (custom_allocator ? "" : "not "), object_name[object_type], object_handle,
304 (allocated_with_custom ? "" : "not "));
305 }
306
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600307 delete pNode;
308 device_data->object_map[object_type].erase(item);
309 } else {
310 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle, __LINE__,
311 OBJTRACK_UNKNOWN_OBJECT, LayerName,
Mark Lobodzinski45e68612016-07-18 17:06:52 -0600312 "Unable to remove %s obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",
313 object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600314 }
315}
316
317template <typename T1, typename T2>
Karl Schultza9ef1e52016-10-06 17:53:48 -0600318static bool ValidateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool null_allowed,
319 int error_code = -1) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600320 if (null_allowed && (object == VK_NULL_HANDLE)) {
321 return false;
322 }
Chris Forbes64a31a12016-10-04 14:54:13 +1300323 auto object_handle = handle_value(object);
324
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600325 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +1300326 if (device_data->object_map[object_type].find(object_handle) == device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600327 // If object is an image, also look for it in the swapchain image map
328 if ((object_type != VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT) ||
Chris Forbes2f271a72016-09-29 14:58:08 +1300329 (device_data->swapchainImageMap.find(object_handle) == device_data->swapchainImageMap.end())) {
Karl Schultza9ef1e52016-10-06 17:53:48 -0600330 const char *error_msg = (error_code == -1) ? "" : validation_error_map[error_code];
331 return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
332 error_code, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s", object_name[object_type],
333 object_handle, error_msg);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600334 }
335 }
336 return false;
337}
338
339static void DeviceReportUndestroyedObjects(VkDevice device, VkDebugReportObjectTypeEXT object_type) {
340 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
341 for (auto item = device_data->object_map[object_type].begin(); item != device_data->object_map[object_type].end();) {
342 OBJTRACK_NODE *object_info = item->second;
343 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_info->object_type, object_info->handle, __LINE__,
344 OBJTRACK_OBJECT_LEAK, LayerName,
345 "OBJ ERROR : For device 0x%" PRIxLEAST64 ", %s object 0x%" PRIxLEAST64 " has not been destroyed.",
346 reinterpret_cast<uint64_t>(device), object_name[object_type], object_info->handle);
347 item = device_data->object_map[object_type].erase(item);
348 }
349}
350
351VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
352 std::unique_lock<std::mutex> lock(global_lock);
353
354 dispatch_key key = get_dispatch_key(instance);
355 layer_data *instance_data = get_my_data_ptr(key, layer_data_map);
356
357 // Enable the temporary callback(s) here to catch cleanup issues:
358 bool callback_setup = false;
359 if (instance_data->num_tmp_callbacks > 0) {
360 if (!layer_enable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks,
361 instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks)) {
362 callback_setup = true;
363 }
364 }
365
Chris Forbes2f271a72016-09-29 14:58:08 +1300366 ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600367
Chris Forbesec461992016-09-29 14:41:44 +1300368 DestroyObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600369 // Report any remaining objects in LL
370
371 for (auto iit = instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].begin();
372 iit != instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].end();) {
373 OBJTRACK_NODE *pNode = iit->second;
374
375 VkDevice device = reinterpret_cast<VkDevice>(pNode->handle);
376
377 log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, pNode->handle, __LINE__,
378 OBJTRACK_OBJECT_LEAK, LayerName, "OBJ ERROR : %s object 0x%" PRIxLEAST64 " has not been destroyed.",
379 string_VkDebugReportObjectTypeEXT(pNode->object_type), pNode->handle);
380 // Semaphore:
381 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT);
382 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT);
383 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT);
384 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT);
385 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
386 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
387 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT);
388 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT);
389 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT);
390 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT);
391 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT);
392 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT);
393 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT);
394 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT);
395 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT);
396 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT);
397 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT);
398 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT);
399 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
400 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT);
401 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT);
402 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT);
403 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
404 }
405 instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].clear();
406
407 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
408 pInstanceTable->DestroyInstance(instance, pAllocator);
409
410 // Disable and cleanup the temporary callback(s):
411 if (callback_setup) {
412 layer_disable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks, instance_data->tmp_callbacks);
413 }
414 if (instance_data->num_tmp_callbacks > 0) {
415 layer_free_tmp_callbacks(instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks);
416 instance_data->num_tmp_callbacks = 0;
417 }
418
419 // Clean up logging callback, if any
420 while (instance_data->logging_callback.size() > 0) {
421 VkDebugReportCallbackEXT callback = instance_data->logging_callback.back();
422 layer_destroy_msg_callback(instance_data->report_data, callback, pAllocator);
423 instance_data->logging_callback.pop_back();
424 }
425
426 layer_debug_report_destroy_instance(instance_data->report_data);
427 layer_data_map.erase(key);
428
429 instanceExtMap.erase(pInstanceTable);
430 lock.unlock();
431 ot_instance_table_map.erase(key);
432}
433
434VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
435
436 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300437 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Chris Forbesec461992016-09-29 14:41:44 +1300438 DestroyObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600439
440 // Report any remaining objects associated with this VkDevice object in LL
441 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT);
442 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT);
443 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT);
444 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
445 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
446 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT);
447 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT);
448 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT);
449 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT);
450 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT);
451 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT);
452 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT);
453 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT);
454 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT);
455 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT);
456 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT);
457 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT);
458 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
459 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT);
460 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT);
461 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT);
462 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT);
463 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
464
465 // Clean up Queue's MemRef Linked Lists
466 DestroyQueueDataStructures(device);
467
468 lock.unlock();
469
470 dispatch_key key = get_dispatch_key(device);
471 VkLayerDispatchTable *pDisp = get_dispatch_table(ot_device_table_map, device);
472 pDisp->DestroyDevice(device, pAllocator);
473 ot_device_table_map.erase(key);
474}
475
476VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
477 bool skip_call = false;
478 {
479 std::lock_guard<std::mutex> lock(global_lock);
480 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300481 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600482 }
483 if (skip_call) {
484 return;
485 }
486 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
487}
488
489VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
490 VkFormatProperties *pFormatProperties) {
491 bool skip_call = false;
492 {
493 std::lock_guard<std::mutex> lock(global_lock);
494 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300495 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600496 }
497 if (skip_call) {
498 return;
499 }
500 get_dispatch_table(ot_instance_table_map, physicalDevice)
501 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
502}
503
504VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
505 VkImageType type, VkImageTiling tiling,
506 VkImageUsageFlags usage, VkImageCreateFlags flags,
507 VkImageFormatProperties *pImageFormatProperties) {
508 bool skip_call = false;
509 {
510 std::lock_guard<std::mutex> lock(global_lock);
511 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300512 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600513 }
514 if (skip_call) {
515 return VK_ERROR_VALIDATION_FAILED_EXT;
516 }
517 VkResult result =
518 get_dispatch_table(ot_instance_table_map, physicalDevice)
519 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
520 return result;
521}
522
523VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
524 bool skip_call = false;
525 {
526 std::lock_guard<std::mutex> lock(global_lock);
527 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300528 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600529 }
530 if (skip_call) {
531 return;
532 }
533 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
534}
535
536VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
537 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
538 bool skip_call = false;
539 {
540 std::lock_guard<std::mutex> lock(global_lock);
541 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300542 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600543 }
544 if (skip_call) {
545 return;
546 }
547 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
548}
549
550VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *pName);
551
552VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *pName);
553
554VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount,
555 VkExtensionProperties *pProperties);
556
557VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pPropertyCount, VkLayerProperties *pProperties);
558
559VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
560 VkLayerProperties *pProperties);
561
562VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
563 bool skip_call = false;
564 {
565 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300566 skip_call |= ValidateObject(queue, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600567 if (pSubmits) {
568 for (uint32_t idx0 = 0; idx0 < submitCount; ++idx0) {
569 if (pSubmits[idx0].pCommandBuffers) {
570 for (uint32_t idx1 = 0; idx1 < pSubmits[idx0].commandBufferCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300571 skip_call |= ValidateObject(queue, pSubmits[idx0].pCommandBuffers[idx1],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600572 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
573 }
574 }
575 if (pSubmits[idx0].pSignalSemaphores) {
576 for (uint32_t idx2 = 0; idx2 < pSubmits[idx0].signalSemaphoreCount; ++idx2) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300577 skip_call |= ValidateObject(queue, pSubmits[idx0].pSignalSemaphores[idx2],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600578 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
579 }
580 }
581 if (pSubmits[idx0].pWaitSemaphores) {
582 for (uint32_t idx3 = 0; idx3 < pSubmits[idx0].waitSemaphoreCount; ++idx3) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300583 skip_call |= ValidateObject(queue, pSubmits[idx0].pWaitSemaphores[idx3],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600584 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
585 }
586 }
587 }
588 }
589 if (queue) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300590 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600591 }
592 }
593 if (skip_call) {
594 return VK_ERROR_VALIDATION_FAILED_EXT;
595 }
596 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
597 return result;
598}
599
600VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
601 bool skip_call = false;
602 {
603 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300604 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600605 }
606 if (skip_call) {
607 return VK_ERROR_VALIDATION_FAILED_EXT;
608 }
609 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueWaitIdle(queue);
610 return result;
611}
612
613VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
614 bool skip_call = false;
615 {
616 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300617 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600618 }
619 if (skip_call) {
620 return VK_ERROR_VALIDATION_FAILED_EXT;
621 }
622 VkResult result = get_dispatch_table(ot_device_table_map, device)->DeviceWaitIdle(device);
623 return result;
624}
625
626VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
627 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
628 bool skip_call = false;
629 {
630 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300631 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600632 }
633 if (skip_call) {
634 return VK_ERROR_VALIDATION_FAILED_EXT;
635 }
636 VkResult result = get_dispatch_table(ot_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
637 {
638 std::lock_guard<std::mutex> lock(global_lock);
639 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300640 CreateObject(device, *pMemory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600641 }
642 }
643 return result;
644}
645
646VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
647 const VkMappedMemoryRange *pMemoryRanges) {
648 bool skip_call = false;
649 {
650 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300651 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600652 if (pMemoryRanges) {
653 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
654 if (pMemoryRanges[idx0].memory) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300655 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600656 VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
657 }
658 }
659 }
660 }
661 if (skip_call) {
662 return VK_ERROR_VALIDATION_FAILED_EXT;
663 }
664 VkResult result =
665 get_dispatch_table(ot_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
666 return result;
667}
668
669VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
670 const VkMappedMemoryRange *pMemoryRanges) {
671 bool skip_call = false;
672 {
673 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300674 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600675 if (pMemoryRanges) {
676 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
677 if (pMemoryRanges[idx0].memory) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300678 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600679 VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
680 }
681 }
682 }
683 }
684 if (skip_call) {
685 return VK_ERROR_VALIDATION_FAILED_EXT;
686 }
687 VkResult result =
688 get_dispatch_table(ot_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
689 return result;
690}
691
692VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
693 VkDeviceSize *pCommittedMemoryInBytes) {
694 bool skip_call = false;
695 {
696 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300697 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
698 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600699 }
700 if (skip_call) {
701 return;
702 }
703 get_dispatch_table(ot_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
704}
705
706VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
707 VkDeviceSize memoryOffset) {
708 bool skip_call = false;
709 {
710 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300711 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
712 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
713 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600714 }
715 if (skip_call) {
716 return VK_ERROR_VALIDATION_FAILED_EXT;
717 }
718 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
719 return result;
720}
721
722VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
723 bool skip_call = false;
724 {
725 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300726 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
727 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
728 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600729 }
730 if (skip_call) {
731 return VK_ERROR_VALIDATION_FAILED_EXT;
732 }
733 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
734 return result;
735}
736
737VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
738 VkMemoryRequirements *pMemoryRequirements) {
739 bool skip_call = false;
740 {
741 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300742 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
743 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600744 }
745 if (skip_call) {
746 return;
747 }
748 get_dispatch_table(ot_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
749}
750
751VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
752 bool skip_call = false;
753 {
754 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300755 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
756 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600757 }
758 if (skip_call) {
759 return;
760 }
761 get_dispatch_table(ot_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
762}
763
764VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
765 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
766 bool skip_call = false;
767 {
768 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300769 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
770 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600771 }
772 if (skip_call) {
773 return;
774 }
775 get_dispatch_table(ot_device_table_map, device)
776 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
777}
778
779VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
780 VkImageType type, VkSampleCountFlagBits samples,
781 VkImageUsageFlags usage, VkImageTiling tiling,
782 uint32_t *pPropertyCount,
783 VkSparseImageFormatProperties *pProperties) {
784 bool skip_call = false;
785 {
786 std::lock_guard<std::mutex> lock(global_lock);
787 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300788 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600789 }
790 if (skip_call) {
791 return;
792 }
793 get_dispatch_table(ot_instance_table_map, physicalDevice)
794 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
795 pProperties);
796}
797
798VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
799 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
800 bool skip_call = false;
801 {
802 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300803 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600804 }
805 if (skip_call) {
806 return VK_ERROR_VALIDATION_FAILED_EXT;
807 }
808 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
809 {
810 std::lock_guard<std::mutex> lock(global_lock);
811 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300812 CreateObject(device, *pFence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600813 }
814 }
815 return result;
816}
817
818VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
819 bool skip_call = false;
820 {
821 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300822 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
823 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600824 }
825 if (skip_call) {
826 return;
827 }
828 {
829 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300830 DestroyObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600831 }
832 get_dispatch_table(ot_device_table_map, device)->DestroyFence(device, fence, pAllocator);
833}
834
835VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
836 bool skip_call = false;
837 {
838 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300839 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600840 if (pFences) {
841 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300842 skip_call |= ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600843 }
844 }
845 }
846 if (skip_call) {
847 return VK_ERROR_VALIDATION_FAILED_EXT;
848 }
849 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetFences(device, fenceCount, pFences);
850 return result;
851}
852
853VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
854 bool skip_call = false;
855 {
856 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300857 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
858 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600859 }
860 if (skip_call) {
861 return VK_ERROR_VALIDATION_FAILED_EXT;
862 }
863 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetFenceStatus(device, fence);
864 return result;
865}
866
867VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
868 uint64_t timeout) {
869 bool skip_call = false;
870 {
871 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300872 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600873 if (pFences) {
874 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300875 skip_call |= ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600876 }
877 }
878 }
879 if (skip_call) {
880 return VK_ERROR_VALIDATION_FAILED_EXT;
881 }
882 VkResult result = get_dispatch_table(ot_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
883 return result;
884}
885
886VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
887 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
888 bool skip_call = false;
889 {
890 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300891 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600892 }
893 if (skip_call) {
894 return VK_ERROR_VALIDATION_FAILED_EXT;
895 }
896 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
897 {
898 std::lock_guard<std::mutex> lock(global_lock);
899 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300900 CreateObject(device, *pSemaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600901 }
902 }
903 return result;
904}
905
906VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
907 bool skip_call = false;
908 {
909 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300910 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
911 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600912 }
913 if (skip_call) {
914 return;
915 }
916 {
917 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300918 DestroyObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600919 }
920 get_dispatch_table(ot_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
921}
922
923VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
924 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
925 bool skip_call = false;
926 {
927 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300928 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600929 }
930 if (skip_call) {
931 return VK_ERROR_VALIDATION_FAILED_EXT;
932 }
933 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
934 {
935 std::lock_guard<std::mutex> lock(global_lock);
936 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300937 CreateObject(device, *pEvent, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600938 }
939 }
940 return result;
941}
942
943VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
944 bool skip_call = false;
945 {
946 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300947 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
948 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600949 }
950 if (skip_call) {
951 return;
952 }
953 {
954 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300955 DestroyObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600956 }
957 get_dispatch_table(ot_device_table_map, device)->DestroyEvent(device, event, pAllocator);
958}
959
960VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
961 bool skip_call = false;
962 {
963 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300964 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
965 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600966 }
967 if (skip_call) {
968 return VK_ERROR_VALIDATION_FAILED_EXT;
969 }
970 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetEventStatus(device, event);
971 return result;
972}
973
974VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
975 bool skip_call = false;
976 {
977 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300978 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
979 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600980 }
981 if (skip_call) {
982 return VK_ERROR_VALIDATION_FAILED_EXT;
983 }
984 VkResult result = get_dispatch_table(ot_device_table_map, device)->SetEvent(device, event);
985 return result;
986}
987
988VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
989 bool skip_call = false;
990 {
991 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300992 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
993 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600994 }
995 if (skip_call) {
996 return VK_ERROR_VALIDATION_FAILED_EXT;
997 }
998 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetEvent(device, event);
999 return result;
1000}
1001
1002VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1003 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
1004 bool skip_call = false;
1005 {
1006 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001007 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001008 }
1009 if (skip_call) {
1010 return VK_ERROR_VALIDATION_FAILED_EXT;
1011 }
1012 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
1013 {
1014 std::lock_guard<std::mutex> lock(global_lock);
1015 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001016 CreateObject(device, *pQueryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001017 }
1018 }
1019 return result;
1020}
1021
1022VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
1023 bool skip_call = false;
1024 {
1025 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001026 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1027 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001028 }
1029 if (skip_call) {
1030 return;
1031 }
1032 {
1033 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001034 DestroyObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001035 }
1036 get_dispatch_table(ot_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
1037}
1038
1039VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
1040 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
1041 bool skip_call = false;
1042 {
1043 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001044 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1045 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001046 }
1047 if (skip_call) {
1048 return VK_ERROR_VALIDATION_FAILED_EXT;
1049 }
1050 VkResult result = get_dispatch_table(ot_device_table_map, device)
1051 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
1052 return result;
1053}
1054
1055VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
1056 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
1057 bool skip_call = false;
1058 {
1059 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultza9ef1e52016-10-06 17:53:48 -06001060 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00659);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001061 }
1062 if (skip_call) {
1063 return VK_ERROR_VALIDATION_FAILED_EXT;
1064 }
1065 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
1066 {
1067 std::lock_guard<std::mutex> lock(global_lock);
1068 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001069 CreateObject(device, *pBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001070 }
1071 }
1072 return result;
1073}
1074
1075VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
1076 bool skip_call = false;
1077 {
1078 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001079 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
1080 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001081 }
1082 if (skip_call) {
1083 return;
1084 }
1085 {
1086 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001087 DestroyObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001088 }
1089 get_dispatch_table(ot_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
1090}
1091
1092VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
1093 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
1094 bool skip_call = false;
1095 {
1096 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001097 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001098 if (pCreateInfo) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001099 skip_call |= ValidateObject(device, pCreateInfo->buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001100 }
1101 }
1102 if (skip_call) {
1103 return VK_ERROR_VALIDATION_FAILED_EXT;
1104 }
1105 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
1106 {
1107 std::lock_guard<std::mutex> lock(global_lock);
1108 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001109 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001110 }
1111 }
1112 return result;
1113}
1114
1115VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
1116 bool skip_call = false;
1117 {
1118 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001119 skip_call |= ValidateObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, false);
1120 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001121 }
1122 if (skip_call) {
1123 return;
1124 }
1125 {
1126 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001127 DestroyObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001128 }
1129 get_dispatch_table(ot_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
1130}
1131
1132VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
1133 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
1134 bool skip_call = false;
1135 {
1136 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001137 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001138 }
1139 if (skip_call) {
1140 return VK_ERROR_VALIDATION_FAILED_EXT;
1141 }
1142 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
1143 {
1144 std::lock_guard<std::mutex> lock(global_lock);
1145 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001146 CreateObject(device, *pImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001147 }
1148 }
1149 return result;
1150}
1151
1152VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
1153 bool skip_call = false;
1154 {
1155 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001156 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1157 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001158 }
1159 if (skip_call) {
1160 return;
1161 }
1162 {
1163 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001164 DestroyObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001165 }
1166 get_dispatch_table(ot_device_table_map, device)->DestroyImage(device, image, pAllocator);
1167}
1168
1169VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
1170 VkSubresourceLayout *pLayout) {
1171 bool skip_call = false;
1172 {
1173 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001174 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1175 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001176 }
1177 if (skip_call) {
1178 return;
1179 }
1180 get_dispatch_table(ot_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
1181}
1182
1183VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
1184 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
1185 bool skip_call = false;
1186 {
1187 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001188 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001189 if (pCreateInfo) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001190 skip_call |= ValidateObject(device, pCreateInfo->image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001191 }
1192 }
1193 if (skip_call) {
1194 return VK_ERROR_VALIDATION_FAILED_EXT;
1195 }
1196 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
1197 {
1198 std::lock_guard<std::mutex> lock(global_lock);
1199 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001200 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001201 }
1202 }
1203 return result;
1204}
1205
1206VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
1207 bool skip_call = false;
1208 {
1209 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001210 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1211 skip_call |= ValidateObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001212 }
1213 if (skip_call) {
1214 return;
1215 }
1216 {
1217 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001218 DestroyObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001219 }
1220 get_dispatch_table(ot_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
1221}
1222
1223VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
1224 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
1225 bool skip_call = false;
1226 {
1227 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001228 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001229 }
1230 if (skip_call) {
1231 return VK_ERROR_VALIDATION_FAILED_EXT;
1232 }
1233 VkResult result =
1234 get_dispatch_table(ot_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
1235 {
1236 std::lock_guard<std::mutex> lock(global_lock);
1237 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001238 CreateObject(device, *pShaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001239 }
1240 }
1241 return result;
1242}
1243
1244VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1245 const VkAllocationCallbacks *pAllocator) {
1246 bool skip_call = false;
1247 {
1248 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001249 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1250 skip_call |= ValidateObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001251 }
1252 if (skip_call) {
1253 return;
1254 }
1255 {
1256 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001257 DestroyObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001258 }
1259 get_dispatch_table(ot_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
1260}
1261
1262VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
1263 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
1264 bool skip_call = false;
1265 {
1266 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001267 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001268 }
1269 if (skip_call) {
1270 return VK_ERROR_VALIDATION_FAILED_EXT;
1271 }
1272 VkResult result =
1273 get_dispatch_table(ot_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
1274 {
1275 std::lock_guard<std::mutex> lock(global_lock);
1276 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001277 CreateObject(device, *pPipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001278 }
1279 }
1280 return result;
1281}
1282
1283VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
1284 const VkAllocationCallbacks *pAllocator) {
1285 bool skip_call = false;
1286 {
1287 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001288 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1289 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001290 }
1291 if (skip_call) {
1292 return;
1293 }
1294 {
1295 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001296 DestroyObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001297 }
1298 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
1299}
1300
1301VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
1302 void *pData) {
1303 bool skip_call = false;
1304 {
1305 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001306 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1307 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001308 }
1309 if (skip_call) {
1310 return VK_ERROR_VALIDATION_FAILED_EXT;
1311 }
1312 VkResult result =
1313 get_dispatch_table(ot_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
1314 return result;
1315}
1316
1317VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
1318 const VkPipelineCache *pSrcCaches) {
1319 bool skip_call = false;
1320 {
1321 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001322 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1323 skip_call |= ValidateObject(device, dstCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001324 if (pSrcCaches) {
1325 for (uint32_t idx0 = 0; idx0 < srcCacheCount; ++idx0) {
1326 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001327 ValidateObject(device, pSrcCaches[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001328 }
1329 }
1330 }
1331 if (skip_call) {
1332 return VK_ERROR_VALIDATION_FAILED_EXT;
1333 }
1334 VkResult result =
1335 get_dispatch_table(ot_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
1336 return result;
1337}
1338
1339VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
1340 bool skip_call = false;
1341 {
1342 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001343 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1344 skip_call |= ValidateObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001345 }
1346 if (skip_call) {
1347 return;
1348 }
1349 {
1350 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001351 DestroyObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001352 }
1353 get_dispatch_table(ot_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
1354}
1355
1356VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
1357 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
1358 bool skip_call = false;
1359 {
1360 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001361 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001362 if (pCreateInfo) {
1363 if (pCreateInfo->pSetLayouts) {
1364 for (uint32_t idx0 = 0; idx0 < pCreateInfo->setLayoutCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001365 skip_call |= ValidateObject(device, pCreateInfo->pSetLayouts[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001366 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false);
1367 }
1368 }
1369 }
1370 }
1371 if (skip_call) {
1372 return VK_ERROR_VALIDATION_FAILED_EXT;
1373 }
1374 VkResult result =
1375 get_dispatch_table(ot_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
1376 {
1377 std::lock_guard<std::mutex> lock(global_lock);
1378 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001379 CreateObject(device, *pPipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001380 }
1381 }
1382 return result;
1383}
1384
1385VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1386 const VkAllocationCallbacks *pAllocator) {
1387 bool skip_call = false;
1388 {
1389 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001390 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1391 skip_call |= ValidateObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001392 }
1393 if (skip_call) {
1394 return;
1395 }
1396 {
1397 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001398 DestroyObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001399 }
1400 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
1401}
1402
1403VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
1404 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
1405 bool skip_call = false;
1406 {
1407 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001408 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001409 }
1410 if (skip_call) {
1411 return VK_ERROR_VALIDATION_FAILED_EXT;
1412 }
1413 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
1414 {
1415 std::lock_guard<std::mutex> lock(global_lock);
1416 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001417 CreateObject(device, *pSampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001418 }
1419 }
1420 return result;
1421}
1422
1423VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
1424 bool skip_call = false;
1425 {
1426 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001427 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1428 skip_call |= ValidateObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001429 }
1430 if (skip_call) {
1431 return;
1432 }
1433 {
1434 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001435 DestroyObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001436 }
1437 get_dispatch_table(ot_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
1438}
1439
1440VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
1441 const VkAllocationCallbacks *pAllocator,
1442 VkDescriptorSetLayout *pSetLayout) {
1443 bool skip_call = false;
1444 {
1445 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001446 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001447 if (pCreateInfo) {
1448 if (pCreateInfo->pBindings) {
1449 for (uint32_t idx0 = 0; idx0 < pCreateInfo->bindingCount; ++idx0) {
1450 if (pCreateInfo->pBindings[idx0].pImmutableSamplers) {
1451 for (uint32_t idx1 = 0; idx1 < pCreateInfo->pBindings[idx0].descriptorCount; ++idx1) {
1452 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001453 ValidateObject(device, pCreateInfo->pBindings[idx0].pImmutableSamplers[idx1],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001454 VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false);
1455 }
1456 }
1457 }
1458 }
1459 }
1460 }
1461 if (skip_call) {
1462 return VK_ERROR_VALIDATION_FAILED_EXT;
1463 }
1464 VkResult result =
1465 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
1466 {
1467 std::lock_guard<std::mutex> lock(global_lock);
1468 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001469 CreateObject(device, *pSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001470 }
1471 }
1472 return result;
1473}
1474
1475VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1476 const VkAllocationCallbacks *pAllocator) {
1477 bool skip_call = false;
1478 {
1479 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001480 skip_call |= ValidateObject(device, descriptorSetLayout,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001481 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false);
Chris Forbes2f271a72016-09-29 14:58:08 +13001482 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001483 }
1484 if (skip_call) {
1485 return;
1486 }
1487 {
1488 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001489 DestroyObject(device, descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001490 }
1491 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
1492}
1493
1494VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
1495 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
1496 bool skip_call = false;
1497 {
1498 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001499 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001500 }
1501 if (skip_call) {
1502 return VK_ERROR_VALIDATION_FAILED_EXT;
1503 }
1504 VkResult result =
1505 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
1506 {
1507 std::lock_guard<std::mutex> lock(global_lock);
1508 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001509 CreateObject(device, *pDescriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001510 }
1511 }
1512 return result;
1513}
1514
1515VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1516 VkDescriptorPoolResetFlags flags) {
1517 bool skip_call = false;
Chris Forbes2a947ce2016-09-29 18:47:50 +13001518 std::unique_lock<std::mutex> lock(global_lock);
1519 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
1520 skip_call |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
1521 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001522 if (skip_call) {
1523 return VK_ERROR_VALIDATION_FAILED_EXT;
1524 }
Chris Forbes2a947ce2016-09-29 18:47:50 +13001525 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is reset.
1526 // Remove this pool's descriptor sets from our descriptorSet map.
1527 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
1528 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
1529 OBJTRACK_NODE *pNode = (*itr).second;
1530 auto del_itr = itr++;
1531 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
1532 DestroyObject(device, (VkDescriptorSet)((*del_itr).first),
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06001533 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr);
Chris Forbes2a947ce2016-09-29 18:47:50 +13001534 }
1535 }
1536 lock.unlock();
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001537 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
1538 return result;
1539}
1540
1541VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
1542 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
1543 const VkCopyDescriptorSet *pDescriptorCopies) {
1544 bool skip_call = false;
1545 {
1546 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001547 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001548 if (pDescriptorCopies) {
1549 for (uint32_t idx0 = 0; idx0 < descriptorCopyCount; ++idx0) {
1550 if (pDescriptorCopies[idx0].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001551 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].dstSet,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001552 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1553 }
1554 if (pDescriptorCopies[idx0].srcSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001555 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].srcSet,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001556 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1557 }
1558 }
1559 }
1560 if (pDescriptorWrites) {
1561 for (uint32_t idx1 = 0; idx1 < descriptorWriteCount; ++idx1) {
1562 if (pDescriptorWrites[idx1].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001563 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].dstSet,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001564 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1565 }
1566 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
1567 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
1568 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
1569 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
1570 for (uint32_t idx2 = 0; idx2 < pDescriptorWrites[idx1].descriptorCount; ++idx2) {
1571 if (pDescriptorWrites[idx1].pBufferInfo[idx2].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001572 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pBufferInfo[idx2].buffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001573 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
1574 }
1575 }
1576 }
1577 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
1578 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
1579 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) ||
1580 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
1581 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)) {
1582 for (uint32_t idx3 = 0; idx3 < pDescriptorWrites[idx1].descriptorCount; ++idx3) {
1583 if (pDescriptorWrites[idx1].pImageInfo[idx3].imageView) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001584 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pImageInfo[idx3].imageView,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001585 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false);
1586 }
1587 if (pDescriptorWrites[idx1].pImageInfo[idx3].sampler) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001588 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pImageInfo[idx3].sampler,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001589 VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false);
1590 }
1591 }
1592 }
1593 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
1594 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
1595 for (uint32_t idx4 = 0; idx4 < pDescriptorWrites[idx1].descriptorCount; ++idx4) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001596 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pTexelBufferView[idx4],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001597 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, true);
1598 }
1599 }
1600 }
1601 }
1602 }
1603 if (skip_call) {
1604 return;
1605 }
1606 get_dispatch_table(ot_device_table_map, device)
1607 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
1608}
1609
1610VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
1611 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
1612 bool skip_call = false;
1613 {
1614 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001615 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001616 if (pCreateInfo) {
1617 if (pCreateInfo->pAttachments) {
1618 for (uint32_t idx0 = 0; idx0 < pCreateInfo->attachmentCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001619 skip_call |= ValidateObject(device, pCreateInfo->pAttachments[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001620 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false);
1621 }
1622 }
1623 if (pCreateInfo->renderPass) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001624 skip_call |= ValidateObject(device, pCreateInfo->renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001625 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
1626 }
1627 }
1628 }
1629 if (skip_call) {
1630 return VK_ERROR_VALIDATION_FAILED_EXT;
1631 }
1632 VkResult result =
1633 get_dispatch_table(ot_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
1634 {
1635 std::lock_guard<std::mutex> lock(global_lock);
1636 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001637 CreateObject(device, *pFramebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001638 }
1639 }
1640 return result;
1641}
1642
1643VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
1644 bool skip_call = false;
1645 {
1646 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001647 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1648 skip_call |= ValidateObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001649 }
1650 if (skip_call) {
1651 return;
1652 }
1653 {
1654 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001655 DestroyObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001656 }
1657 get_dispatch_table(ot_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
1658}
1659
1660VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
1661 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
1662 bool skip_call = false;
1663 {
1664 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001665 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001666 }
1667 if (skip_call) {
1668 return VK_ERROR_VALIDATION_FAILED_EXT;
1669 }
1670 VkResult result =
1671 get_dispatch_table(ot_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
1672 {
1673 std::lock_guard<std::mutex> lock(global_lock);
1674 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001675 CreateObject(device, *pRenderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001676 }
1677 }
1678 return result;
1679}
1680
1681VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
1682 bool skip_call = false;
1683 {
1684 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001685 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1686 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001687 }
1688 if (skip_call) {
1689 return;
1690 }
1691 {
1692 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001693 DestroyObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001694 }
1695 get_dispatch_table(ot_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
1696}
1697
1698VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
1699 bool skip_call = false;
1700 {
1701 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001702 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1703 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001704 }
1705 if (skip_call) {
1706 return;
1707 }
1708 get_dispatch_table(ot_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
1709}
1710
1711VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1712 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
1713 bool skip_call = false;
1714 {
1715 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001716 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001717 }
1718 if (skip_call) {
1719 return VK_ERROR_VALIDATION_FAILED_EXT;
1720 }
1721 VkResult result =
1722 get_dispatch_table(ot_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
1723 {
1724 std::lock_guard<std::mutex> lock(global_lock);
1725 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001726 CreateObject(device, *pCommandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001727 }
1728 }
1729 return result;
1730}
1731
1732VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
1733 bool skip_call = false;
1734 {
1735 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001736 skip_call |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
1737 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001738 }
1739 if (skip_call) {
1740 return VK_ERROR_VALIDATION_FAILED_EXT;
1741 }
1742 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
1743 return result;
1744}
1745
1746VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer command_buffer, const VkCommandBufferBeginInfo *begin_info) {
1747 layer_data *device_data = get_my_data_ptr(get_dispatch_key(command_buffer), layer_data_map);
1748 bool skip_call = false;
1749 {
1750 std::lock_guard<std::mutex> lock(global_lock);
1751 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001752 ValidateObject(command_buffer, command_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001753 if (begin_info) {
1754 OBJTRACK_NODE *pNode =
1755 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<const uint64_t>(command_buffer)];
1756 if ((begin_info->pInheritanceInfo) && (pNode->status & OBJSTATUS_COMMAND_BUFFER_SECONDARY)) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001757 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->framebuffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001758 VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, true);
Chris Forbes2f271a72016-09-29 14:58:08 +13001759 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001760 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, true);
1761 }
1762 }
1763 }
1764 if (skip_call) {
1765 return VK_ERROR_VALIDATION_FAILED_EXT;
1766 }
1767 VkResult result = get_dispatch_table(ot_device_table_map, command_buffer)->BeginCommandBuffer(command_buffer, begin_info);
1768 return result;
1769}
1770
1771VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
1772 bool skip_call = false;
1773 {
1774 std::lock_guard<std::mutex> lock(global_lock);
1775 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001776 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001777 }
1778 if (skip_call) {
1779 return VK_ERROR_VALIDATION_FAILED_EXT;
1780 }
1781 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
1782 return result;
1783}
1784
1785VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
1786 bool skip_call = false;
1787 {
1788 std::lock_guard<std::mutex> lock(global_lock);
1789 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001790 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001791 }
1792 if (skip_call) {
1793 return VK_ERROR_VALIDATION_FAILED_EXT;
1794 }
1795 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
1796 return result;
1797}
1798
1799VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1800 VkPipeline pipeline) {
1801 bool skip_call = false;
1802 {
1803 std::lock_guard<std::mutex> lock(global_lock);
1804 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001805 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
1806 skip_call |= ValidateObject(commandBuffer, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001807 }
1808 if (skip_call) {
1809 return;
1810 }
1811 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
1812}
1813
1814VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
1815 const VkViewport *pViewports) {
1816 bool skip_call = false;
1817 {
1818 std::lock_guard<std::mutex> lock(global_lock);
1819 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001820 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001821 }
1822 if (skip_call) {
1823 return;
1824 }
1825 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
1826}
1827
1828VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
1829 const VkRect2D *pScissors) {
1830 bool skip_call = false;
1831 {
1832 std::lock_guard<std::mutex> lock(global_lock);
1833 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001834 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001835 }
1836 if (skip_call) {
1837 return;
1838 }
1839 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
1840}
1841
1842VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
1843 bool skip_call = false;
1844 {
1845 std::lock_guard<std::mutex> lock(global_lock);
1846 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001847 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001848 }
1849 if (skip_call) {
1850 return;
1851 }
1852 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
1853}
1854
1855VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
1856 float depthBiasSlopeFactor) {
1857 bool skip_call = false;
1858 {
1859 std::lock_guard<std::mutex> lock(global_lock);
1860 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001861 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001862 }
1863 if (skip_call) {
1864 return;
1865 }
1866 get_dispatch_table(ot_device_table_map, commandBuffer)
1867 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
1868}
1869
1870VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
1871 bool skip_call = false;
1872 {
1873 std::lock_guard<std::mutex> lock(global_lock);
1874 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001875 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001876 }
1877 if (skip_call) {
1878 return;
1879 }
1880 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
1881}
1882
1883VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
1884 bool skip_call = false;
1885 {
1886 std::lock_guard<std::mutex> lock(global_lock);
1887 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001888 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001889 }
1890 if (skip_call) {
1891 return;
1892 }
1893 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
1894}
1895
1896VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
1897 uint32_t compareMask) {
1898 bool skip_call = false;
1899 {
1900 std::lock_guard<std::mutex> lock(global_lock);
1901 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001902 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001903 }
1904 if (skip_call) {
1905 return;
1906 }
1907 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
1908}
1909
1910VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
1911 bool skip_call = false;
1912 {
1913 std::lock_guard<std::mutex> lock(global_lock);
1914 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001915 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001916 }
1917 if (skip_call) {
1918 return;
1919 }
1920 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
1921}
1922
1923VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
1924 bool skip_call = false;
1925 {
1926 std::lock_guard<std::mutex> lock(global_lock);
1927 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001928 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001929 }
1930 if (skip_call) {
1931 return;
1932 }
1933 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
1934}
1935
1936VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1937 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
1938 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
1939 const uint32_t *pDynamicOffsets) {
1940 bool skip_call = false;
1941 {
1942 std::lock_guard<std::mutex> lock(global_lock);
1943 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001944 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
1945 skip_call |= ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001946 if (pDescriptorSets) {
1947 for (uint32_t idx0 = 0; idx0 < descriptorSetCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001948 skip_call |= ValidateObject(commandBuffer, pDescriptorSets[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001949 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1950 }
1951 }
1952 }
1953 if (skip_call) {
1954 return;
1955 }
1956 get_dispatch_table(ot_device_table_map, commandBuffer)
1957 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
1958 dynamicOffsetCount, pDynamicOffsets);
1959}
1960
1961VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1962 VkIndexType indexType) {
1963 bool skip_call = false;
1964 {
1965 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001966 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001967 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001968 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001969 }
1970 if (skip_call) {
1971 return;
1972 }
1973 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
1974}
1975
1976VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
1977 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
1978 bool skip_call = false;
1979 {
1980 std::lock_guard<std::mutex> lock(global_lock);
1981 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001982 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001983 if (pBuffers) {
1984 for (uint32_t idx0 = 0; idx0 < bindingCount; ++idx0) {
1985 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001986 ValidateObject(commandBuffer, pBuffers[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001987 }
1988 }
1989 }
1990 if (skip_call) {
1991 return;
1992 }
1993 get_dispatch_table(ot_device_table_map, commandBuffer)
1994 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
1995}
1996
1997VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
1998 uint32_t firstVertex, uint32_t firstInstance) {
1999 bool skip_call = false;
2000 {
2001 std::lock_guard<std::mutex> lock(global_lock);
2002 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002003 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002004 }
2005 if (skip_call) {
2006 return;
2007 }
2008 get_dispatch_table(ot_device_table_map, commandBuffer)
2009 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
2010}
2011
2012VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
2013 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
2014 bool skip_call = false;
2015 {
2016 std::lock_guard<std::mutex> lock(global_lock);
2017 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002018 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002019 }
2020 if (skip_call) {
2021 return;
2022 }
2023 get_dispatch_table(ot_device_table_map, commandBuffer)
2024 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
2025}
2026
2027VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
2028 uint32_t stride) {
2029 bool skip_call = false;
2030 {
2031 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002032 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002033 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002034 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002035 }
2036 if (skip_call) {
2037 return;
2038 }
2039 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
2040}
2041
2042VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2043 uint32_t drawCount, uint32_t stride) {
2044 bool skip_call = false;
2045 {
2046 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002047 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002048 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002049 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002050 }
2051 if (skip_call) {
2052 return;
2053 }
2054 get_dispatch_table(ot_device_table_map, commandBuffer)
2055 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
2056}
2057
2058VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
2059 bool skip_call = false;
2060 {
2061 std::lock_guard<std::mutex> lock(global_lock);
2062 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002063 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002064 }
2065 if (skip_call) {
2066 return;
2067 }
2068 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
2069}
2070
2071VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
2072 bool skip_call = false;
2073 {
2074 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002075 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002076 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002077 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002078 }
2079 if (skip_call) {
2080 return;
2081 }
2082 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
2083}
2084
2085VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
2086 uint32_t regionCount, const VkBufferCopy *pRegions) {
2087 bool skip_call = false;
2088 {
2089 std::lock_guard<std::mutex> lock(global_lock);
2090 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002091 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2092 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2093 skip_call |= ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002094 }
2095 if (skip_call) {
2096 return;
2097 }
2098 get_dispatch_table(ot_device_table_map, commandBuffer)
2099 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
2100}
2101
2102VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2103 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2104 const VkImageCopy *pRegions) {
2105 bool skip_call = false;
2106 {
2107 std::lock_guard<std::mutex> lock(global_lock);
2108 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002109 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2110 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2111 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002112 }
2113 if (skip_call) {
2114 return;
2115 }
2116 get_dispatch_table(ot_device_table_map, commandBuffer)
2117 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2118}
2119
2120VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2121 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2122 const VkImageBlit *pRegions, VkFilter filter) {
2123 bool skip_call = false;
2124 {
2125 std::lock_guard<std::mutex> lock(global_lock);
2126 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002127 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2128 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2129 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002130 }
2131 if (skip_call) {
2132 return;
2133 }
2134 get_dispatch_table(ot_device_table_map, commandBuffer)
2135 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
2136}
2137
2138VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
2139 VkImageLayout dstImageLayout, uint32_t regionCount,
2140 const VkBufferImageCopy *pRegions) {
2141 bool skip_call = false;
2142 {
2143 std::lock_guard<std::mutex> lock(global_lock);
2144 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002145 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2146 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2147 skip_call |= ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002148 }
2149 if (skip_call) {
2150 return;
2151 }
2152 get_dispatch_table(ot_device_table_map, commandBuffer)
2153 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
2154}
2155
2156VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2157 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
2158 bool skip_call = false;
2159 {
2160 std::lock_guard<std::mutex> lock(global_lock);
2161 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002162 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2163 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2164 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002165 }
2166 if (skip_call) {
2167 return;
2168 }
2169 get_dispatch_table(ot_device_table_map, commandBuffer)
2170 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
2171}
2172
2173VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2174 VkDeviceSize dataSize, const uint32_t *pData) {
2175 bool skip_call = false;
2176 {
2177 std::lock_guard<std::mutex> lock(global_lock);
2178 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002179 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2180 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002181 }
2182 if (skip_call) {
2183 return;
2184 }
2185 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
2186}
2187
2188VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2189 VkDeviceSize size, uint32_t data) {
2190 bool skip_call = false;
2191 {
2192 std::lock_guard<std::mutex> lock(global_lock);
2193 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002194 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2195 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002196 }
2197 if (skip_call) {
2198 return;
2199 }
2200 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
2201}
2202
2203VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2204 const VkClearColorValue *pColor, uint32_t rangeCount,
2205 const VkImageSubresourceRange *pRanges) {
2206 bool skip_call = false;
2207 {
2208 std::lock_guard<std::mutex> lock(global_lock);
2209 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002210 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2211 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002212 }
2213 if (skip_call) {
2214 return;
2215 }
2216 get_dispatch_table(ot_device_table_map, commandBuffer)
2217 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
2218}
2219
2220VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2221 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
2222 const VkImageSubresourceRange *pRanges) {
2223 bool skip_call = false;
2224 {
2225 std::lock_guard<std::mutex> lock(global_lock);
2226 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002227 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2228 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002229 }
2230 if (skip_call) {
2231 return;
2232 }
2233 get_dispatch_table(ot_device_table_map, commandBuffer)
2234 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
2235}
2236
2237VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
2238 const VkClearAttachment *pAttachments, uint32_t rectCount,
2239 const VkClearRect *pRects) {
2240 bool skip_call = false;
2241 {
2242 std::lock_guard<std::mutex> lock(global_lock);
2243 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002244 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002245 }
2246 if (skip_call) {
2247 return;
2248 }
2249 get_dispatch_table(ot_device_table_map, commandBuffer)
2250 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
2251}
2252
2253VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2254 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2255 const VkImageResolve *pRegions) {
2256 bool skip_call = false;
2257 {
2258 std::lock_guard<std::mutex> lock(global_lock);
2259 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002260 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2261 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2262 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002263 }
2264 if (skip_call) {
2265 return;
2266 }
2267 get_dispatch_table(ot_device_table_map, commandBuffer)
2268 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2269}
2270
2271VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
2272 bool skip_call = false;
2273 {
2274 std::lock_guard<std::mutex> lock(global_lock);
2275 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002276 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2277 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002278 }
2279 if (skip_call) {
2280 return;
2281 }
2282 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
2283}
2284
2285VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
2286 bool skip_call = false;
2287 {
2288 std::lock_guard<std::mutex> lock(global_lock);
2289 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002290 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2291 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002292 }
2293 if (skip_call) {
2294 return;
2295 }
2296 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
2297}
2298
2299VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2300 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
2301 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2302 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2303 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
2304 bool skip_call = false;
2305 {
2306 std::lock_guard<std::mutex> lock(global_lock);
2307 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002308 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002309 if (pBufferMemoryBarriers) {
2310 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2311 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002312 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002313 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2314 }
2315 }
2316 }
2317 if (pEvents) {
2318 for (uint32_t idx1 = 0; idx1 < eventCount; ++idx1) {
2319 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002320 ValidateObject(commandBuffer, pEvents[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002321 }
2322 }
2323 if (pImageMemoryBarriers) {
2324 for (uint32_t idx2 = 0; idx2 < imageMemoryBarrierCount; ++idx2) {
2325 if (pImageMemoryBarriers[idx2].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002326 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx2].image,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002327 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2328 }
2329 }
2330 }
2331 }
2332 if (skip_call) {
2333 return;
2334 }
2335 get_dispatch_table(ot_device_table_map, commandBuffer)
2336 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
2337 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2338}
2339
2340VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2341 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2342 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2343 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2344 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
2345 bool skip_call = false;
2346 {
2347 std::lock_guard<std::mutex> lock(global_lock);
2348 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002349 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002350 if (pBufferMemoryBarriers) {
2351 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2352 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002353 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002354 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2355 }
2356 }
2357 }
2358 if (pImageMemoryBarriers) {
2359 for (uint32_t idx1 = 0; idx1 < imageMemoryBarrierCount; ++idx1) {
2360 if (pImageMemoryBarriers[idx1].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002361 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx1].image,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002362 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2363 }
2364 }
2365 }
2366 }
2367 if (skip_call) {
2368 return;
2369 }
2370 get_dispatch_table(ot_device_table_map, commandBuffer)
2371 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
2372 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2373}
2374
2375VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query,
2376 VkQueryControlFlags flags) {
2377 bool skip_call = false;
2378 {
2379 std::lock_guard<std::mutex> lock(global_lock);
2380 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002381 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2382 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002383 }
2384 if (skip_call) {
2385 return;
2386 }
2387 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, query, flags);
2388}
2389
2390VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query) {
2391 bool skip_call = false;
2392 {
2393 std::lock_guard<std::mutex> lock(global_lock);
2394 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002395 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2396 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002397 }
2398 if (skip_call) {
2399 return;
2400 }
2401 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, query);
2402}
2403
2404VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2405 uint32_t queryCount) {
2406 bool skip_call = false;
2407 {
2408 std::lock_guard<std::mutex> lock(global_lock);
2409 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002410 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2411 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002412 }
2413 if (skip_call) {
2414 return;
2415 }
2416 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
2417}
2418
2419VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2420 VkQueryPool queryPool, uint32_t query) {
2421 bool skip_call = false;
2422 {
2423 std::lock_guard<std::mutex> lock(global_lock);
2424 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002425 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2426 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002427 }
2428 if (skip_call) {
2429 return;
2430 }
2431 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
2432}
2433
2434VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2435 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2436 VkDeviceSize stride, VkQueryResultFlags flags) {
2437 bool skip_call = false;
2438 {
2439 std::lock_guard<std::mutex> lock(global_lock);
2440 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002441 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2442 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2443 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002444 }
2445 if (skip_call) {
2446 return;
2447 }
2448 get_dispatch_table(ot_device_table_map, commandBuffer)
2449 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
2450}
2451
2452VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
2453 uint32_t offset, uint32_t size, const void *pValues) {
2454 bool skip_call = false;
2455 {
2456 std::lock_guard<std::mutex> lock(global_lock);
2457 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002458 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2459 skip_call |= ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002460 }
2461 if (skip_call) {
2462 return;
2463 }
2464 get_dispatch_table(ot_device_table_map, commandBuffer)
2465 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
2466}
2467
2468VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
2469 VkSubpassContents contents) {
2470 bool skip_call = false;
2471 {
2472 std::lock_guard<std::mutex> lock(global_lock);
2473 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002474 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002475 if (pRenderPassBegin) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002476 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->framebuffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002477 VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, false);
Chris Forbes2f271a72016-09-29 14:58:08 +13002478 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002479 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
2480 }
2481 }
2482 if (skip_call) {
2483 return;
2484 }
2485 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
2486}
2487
2488VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
2489 bool skip_call = false;
2490 {
2491 std::lock_guard<std::mutex> lock(global_lock);
2492 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002493 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002494 }
2495 if (skip_call) {
2496 return;
2497 }
2498 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
2499}
2500
2501VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
2502 bool skip_call = false;
2503 {
2504 std::lock_guard<std::mutex> lock(global_lock);
2505 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002506 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002507 }
2508 if (skip_call) {
2509 return;
2510 }
2511 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
2512}
2513
2514VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
2515 const VkCommandBuffer *pCommandBuffers) {
2516 bool skip_call = false;
2517 {
2518 std::lock_guard<std::mutex> lock(global_lock);
2519 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002520 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002521 if (pCommandBuffers) {
2522 for (uint32_t idx0 = 0; idx0 < commandBufferCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002523 skip_call |= ValidateObject(commandBuffer, pCommandBuffers[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002524 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2525 }
2526 }
2527 }
2528 if (skip_call) {
2529 return;
2530 }
2531 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
2532}
2533
2534VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
2535 bool skip_call = false;
2536 {
2537 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002538 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
2539 skip_call |= ValidateObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002540 }
2541 if (skip_call) {
2542 return;
2543 }
2544 {
2545 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13002546 DestroyObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002547 }
2548 get_dispatch_table(ot_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
2549}
2550
2551VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
2552 VkSurfaceKHR surface, VkBool32 *pSupported) {
2553 bool skip_call = false;
2554 {
2555 std::lock_guard<std::mutex> lock(global_lock);
2556 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002557 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2558 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002559 }
2560 if (skip_call) {
2561 return VK_ERROR_VALIDATION_FAILED_EXT;
2562 }
2563 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2564 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
2565 return result;
2566}
2567
2568VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2569 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
2570 bool skip_call = false;
2571 {
2572 std::lock_guard<std::mutex> lock(global_lock);
2573 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002574 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2575 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002576 }
2577 if (skip_call) {
2578 return VK_ERROR_VALIDATION_FAILED_EXT;
2579 }
2580 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2581 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
2582 return result;
2583}
2584
2585VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2586 uint32_t *pSurfaceFormatCount,
2587 VkSurfaceFormatKHR *pSurfaceFormats) {
2588 bool skip_call = false;
2589 {
2590 std::lock_guard<std::mutex> lock(global_lock);
2591 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002592 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2593 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002594 }
2595 if (skip_call) {
2596 return VK_ERROR_VALIDATION_FAILED_EXT;
2597 }
2598 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2599 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
2600 return result;
2601}
2602
2603VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2604 uint32_t *pPresentModeCount,
2605 VkPresentModeKHR *pPresentModes) {
2606 bool skip_call = false;
2607 {
2608 std::lock_guard<std::mutex> lock(global_lock);
2609 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002610 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2611 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002612 }
2613 if (skip_call) {
2614 return VK_ERROR_VALIDATION_FAILED_EXT;
2615 }
2616 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2617 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
2618 return result;
2619}
2620
2621VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
2622 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
2623 bool skip_call = false;
2624 {
2625 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002626 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002627 if (pCreateInfo) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002628 skip_call |= ValidateObject(device, pCreateInfo->oldSwapchain,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002629 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, true);
2630 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002631 skip_call |= ValidateObject(device_data->physical_device, pCreateInfo->surface,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002632 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
2633 }
2634 }
2635 if (skip_call) {
2636 return VK_ERROR_VALIDATION_FAILED_EXT;
2637 }
2638 VkResult result =
2639 get_dispatch_table(ot_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
2640 {
2641 std::lock_guard<std::mutex> lock(global_lock);
2642 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002643 CreateObject(device, *pSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002644 }
2645 }
2646 return result;
2647}
2648
2649VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
2650 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
2651 bool skip_call = false;
2652 {
2653 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002654 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
2655 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true);
2656 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, true);
2657 skip_call |= ValidateObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002658 }
2659 if (skip_call) {
2660 return VK_ERROR_VALIDATION_FAILED_EXT;
2661 }
2662 VkResult result = get_dispatch_table(ot_device_table_map, device)
2663 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
2664 return result;
2665}
2666
2667VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
2668 bool skip_call = false;
2669 {
2670 std::lock_guard<std::mutex> lock(global_lock);
2671 if (pPresentInfo) {
2672 if (pPresentInfo->pSwapchains) {
2673 for (uint32_t idx0 = 0; idx0 < pPresentInfo->swapchainCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002674 skip_call |= ValidateObject(queue, pPresentInfo->pSwapchains[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002675 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false);
2676 }
2677 }
2678 if (pPresentInfo->pWaitSemaphores) {
2679 for (uint32_t idx1 = 0; idx1 < pPresentInfo->waitSemaphoreCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002680 skip_call |= ValidateObject(queue, pPresentInfo->pWaitSemaphores[idx1],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002681 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
2682 }
2683 }
2684 }
Chris Forbes2f271a72016-09-29 14:58:08 +13002685 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002686 }
2687 if (skip_call) {
2688 return VK_ERROR_VALIDATION_FAILED_EXT;
2689 }
2690 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
2691 return result;
2692}
2693
2694#ifdef VK_USE_PLATFORM_WIN32_KHR
2695VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
2696 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2697 bool skip_call = false;
2698 {
2699 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002700 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002701 }
2702 if (skip_call) {
2703 return VK_ERROR_VALIDATION_FAILED_EXT;
2704 }
2705 VkResult result =
2706 get_dispatch_table(ot_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2707 {
2708 std::lock_guard<std::mutex> lock(global_lock);
2709 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002710 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002711 }
2712 }
2713 return result;
2714}
2715
2716VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
2717 uint32_t queueFamilyIndex) {
2718 bool skip_call = false;
2719 {
2720 std::lock_guard<std::mutex> lock(global_lock);
2721 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002722 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002723 }
2724 if (skip_call) {
2725 return VK_FALSE;
2726 }
2727 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2728 ->GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
2729 return result;
2730}
2731#endif // VK_USE_PLATFORM_WIN32_KHR
2732
2733#ifdef VK_USE_PLATFORM_XCB_KHR
2734VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
2735 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2736 bool skip_call = false;
2737 {
2738 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002739 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002740 }
2741 if (skip_call) {
2742 return VK_ERROR_VALIDATION_FAILED_EXT;
2743 }
2744 VkResult result =
2745 get_dispatch_table(ot_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2746 {
2747 std::lock_guard<std::mutex> lock(global_lock);
2748 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002749 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002750 }
2751 }
2752 return result;
2753}
2754
2755VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2756 uint32_t queueFamilyIndex, xcb_connection_t *connection,
2757 xcb_visualid_t visual_id) {
2758 bool skip_call = false;
2759 {
2760 std::lock_guard<std::mutex> lock(global_lock);
2761 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002762 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002763 }
2764 if (skip_call) {
2765 return VK_FALSE;
2766 }
2767 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2768 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
2769 return result;
2770}
2771#endif // VK_USE_PLATFORM_XCB_KHR
2772
2773#ifdef VK_USE_PLATFORM_XLIB_KHR
2774VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
2775 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2776 bool skip_call = false;
2777 {
2778 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002779 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002780 }
2781 if (skip_call) {
2782 return VK_ERROR_VALIDATION_FAILED_EXT;
2783 }
2784 VkResult result =
2785 get_dispatch_table(ot_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2786 {
2787 std::lock_guard<std::mutex> lock(global_lock);
2788 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002789 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002790 }
2791 }
2792 return result;
2793}
2794
2795VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2796 uint32_t queueFamilyIndex, Display *dpy,
2797 VisualID visualID) {
2798 bool skip_call = false;
2799 {
2800 std::lock_guard<std::mutex> lock(global_lock);
2801 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002802 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002803 }
2804 if (skip_call) {
2805 return VK_FALSE;
2806 }
2807 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2808 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
2809 return result;
2810}
2811#endif // VK_USE_PLATFORM_XLIB_KHR
2812
2813#ifdef VK_USE_PLATFORM_MIR_KHR
2814VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
2815 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2816 bool skip_call = false;
2817 {
2818 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002819 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002820 }
2821 if (skip_call) {
2822 return VK_ERROR_VALIDATION_FAILED_EXT;
2823 }
2824 VkResult result =
2825 get_dispatch_table(ot_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2826 {
2827 std::lock_guard<std::mutex> lock(global_lock);
2828 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002829 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002830 }
2831 }
2832 return result;
2833}
2834
2835VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2836 uint32_t queueFamilyIndex, MirConnection *connection) {
2837 bool skip_call = false;
2838 {
2839 std::lock_guard<std::mutex> lock(global_lock);
2840 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002841 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002842 }
2843 if (skip_call) {
2844 return VK_FALSE;
2845 }
2846 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2847 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
2848 return result;
2849}
2850#endif // VK_USE_PLATFORM_MIR_KHR
2851
2852#ifdef VK_USE_PLATFORM_WAYLAND_KHR
2853VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
2854 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2855 bool skip_call = false;
2856 {
2857 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002858 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002859 }
2860 if (skip_call) {
2861 return VK_ERROR_VALIDATION_FAILED_EXT;
2862 }
2863 VkResult result =
2864 get_dispatch_table(ot_instance_table_map, instance)->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2865 {
2866 std::lock_guard<std::mutex> lock(global_lock);
2867 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002868 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002869 }
2870 }
2871 return result;
2872}
2873
2874VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2875 uint32_t queueFamilyIndex,
2876 struct wl_display *display) {
2877 bool skip_call = false;
2878 {
2879 std::lock_guard<std::mutex> lock(global_lock);
2880 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002881 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002882 }
2883 if (skip_call) {
2884 return VK_FALSE;
2885 }
2886 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2887 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
2888 return result;
2889}
2890#endif // VK_USE_PLATFORM_WAYLAND_KHR
2891
2892#ifdef VK_USE_PLATFORM_ANDROID_KHR
2893VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
2894 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2895 bool skip_call = false;
2896 {
2897 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002898 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002899 }
2900 if (skip_call) {
2901 return VK_ERROR_VALIDATION_FAILED_EXT;
2902 }
2903 VkResult result =
2904 get_dispatch_table(ot_instance_table_map, instance)->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2905 {
2906 std::lock_guard<std::mutex> lock(global_lock);
2907 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002908 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002909 }
2910 }
2911 return result;
2912}
2913#endif // VK_USE_PLATFORM_ANDROID_KHR
2914
Mark Youngead9b932016-09-08 12:28:38 -06002915VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
2916 const VkSwapchainCreateInfoKHR *pCreateInfos,
2917 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
2918 bool skip_call = false;
2919 uint32_t i = 0;
2920 {
2921 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002922 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Youngead9b932016-09-08 12:28:38 -06002923 if (NULL != pCreateInfos) {
2924 for (i = 0; i < swapchainCount; i++) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002925 skip_call |= ValidateObject(device, pCreateInfos[i].oldSwapchain,
Mark Youngead9b932016-09-08 12:28:38 -06002926 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, true);
2927 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002928 skip_call |= ValidateObject(device_data->physical_device, pCreateInfos[i].surface,
Mark Youngead9b932016-09-08 12:28:38 -06002929 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
2930 }
2931 }
2932 }
2933 if (skip_call) {
2934 return VK_ERROR_VALIDATION_FAILED_EXT;
2935 }
2936 VkResult result =
2937 get_dispatch_table(ot_device_table_map, device)->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
2938 {
2939 std::lock_guard<std::mutex> lock(global_lock);
2940 if (result == VK_SUCCESS) {
2941 for (i = 0; i < swapchainCount; i++) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002942 CreateObject(device, pSwapchains[i], VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Youngead9b932016-09-08 12:28:38 -06002943 }
2944 }
2945 }
2946 return result;
2947}
2948
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002949VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
2950 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
2951 const VkAllocationCallbacks *pAllocator,
2952 VkDebugReportCallbackEXT *pCallback) {
2953 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
2954 VkResult result = pInstanceTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback);
2955 if (VK_SUCCESS == result) {
2956 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2957 result = layer_create_msg_callback(instance_data->report_data, false, pCreateInfo, pAllocator, pCallback);
Chris Forbesfeecd402016-09-29 14:53:50 +13002958 CreateObject(instance, *pCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002959 }
2960 return result;
2961}
2962
2963VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
2964 const VkAllocationCallbacks *pAllocator) {
2965 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
2966 pInstanceTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
2967 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2968 layer_destroy_msg_callback(instance_data->report_data, msgCallback, pAllocator);
Chris Forbesec461992016-09-29 14:41:44 +13002969 DestroyObject(instance, msgCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002970}
2971
2972VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
2973 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
2974 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
2975 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
2976 pInstanceTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
2977}
2978
2979static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
2980
2981static const VkLayerProperties globalLayerProps = {"VK_LAYER_LUNARG_object_tracker",
2982 VK_LAYER_API_VERSION, // specVersion
2983 1, // implementationVersion
2984 "LunarG Validation Layer"};
2985
2986VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
2987 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
2988}
2989
2990VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
2991 VkLayerProperties *pProperties) {
2992 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
2993}
2994
2995VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
2996 VkExtensionProperties *pProperties) {
2997 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
2998 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
2999
3000 return VK_ERROR_LAYER_NOT_PRESENT;
3001}
3002
3003VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
3004 uint32_t *pCount, VkExtensionProperties *pProperties) {
3005 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3006 return util_GetExtensionProperties(0, nullptr, pCount, pProperties);
3007
3008 assert(physicalDevice);
3009 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, physicalDevice);
3010 return pTable->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
3011}
3012
3013static inline PFN_vkVoidFunction InterceptMsgCallbackGetProcAddrCommand(const char *name, VkInstance instance) {
3014 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3015 return debug_report_get_instance_proc_addr(instance_data->report_data, name);
3016}
3017
3018static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
3019 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, instance);
3020 if (instanceExtMap.size() == 0 || !instanceExtMap[pTable].wsi_enabled)
3021 return nullptr;
3022
3023 if (!strcmp("vkDestroySurfaceKHR", name))
3024 return reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR);
3025 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name))
3026 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR);
3027 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name))
3028 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR);
3029 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name))
3030 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR);
3031 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name))
3032 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR);
3033
3034#ifdef VK_USE_PLATFORM_WIN32_KHR
3035 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
3036 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
3037 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name))
3038 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR);
3039#endif // VK_USE_PLATFORM_WIN32_KHR
3040#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003041 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003042 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003043 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003044 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
3045#endif // VK_USE_PLATFORM_XCB_KHR
3046#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003047 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003048 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003049 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003050 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
3051#endif // VK_USE_PLATFORM_XLIB_KHR
3052#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003053 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003054 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003055 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003056 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
3057#endif // VK_USE_PLATFORM_MIR_KHR
3058#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003059 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003060 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003061 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003062 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
3063#endif // VK_USE_PLATFORM_WAYLAND_KHR
3064#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003065 if ((instanceExtMap[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003066 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
3067#endif // VK_USE_PLATFORM_ANDROID_KHR
3068
3069 return nullptr;
3070}
3071
3072static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
3073 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3074 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06003075 device_data->wsi_display_swapchain_enabled = false;
3076 device_data->objtrack_extensions_enabled = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003077
3078 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3079 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
3080 device_data->wsi_enabled = true;
3081 }
Mark Youngead9b932016-09-08 12:28:38 -06003082 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
3083 device_data->wsi_display_swapchain_enabled = true;
3084 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003085 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], "OBJTRACK_EXTENSIONS") == 0) {
3086 device_data->objtrack_extensions_enabled = true;
3087 }
3088 }
3089}
3090
3091static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
3092 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(ot_instance_table_map, instance);
3093
3094
3095 instanceExtMap[pDisp] = {};
3096
3097 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3098 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
3099 instanceExtMap[pDisp].wsi_enabled = true;
3100 }
3101#ifdef VK_USE_PLATFORM_XLIB_KHR
3102 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
3103 instanceExtMap[pDisp].xlib_enabled = true;
3104 }
3105#endif
3106#ifdef VK_USE_PLATFORM_XCB_KHR
3107 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
3108 instanceExtMap[pDisp].xcb_enabled = true;
3109 }
3110#endif
3111#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3112 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
3113 instanceExtMap[pDisp].wayland_enabled = true;
3114 }
3115#endif
3116#ifdef VK_USE_PLATFORM_MIR_KHR
3117 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
3118 instanceExtMap[pDisp].mir_enabled = true;
3119 }
3120#endif
3121#ifdef VK_USE_PLATFORM_ANDROID_KHR
3122 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
3123 instanceExtMap[pDisp].android_enabled = true;
3124 }
3125#endif
3126#ifdef VK_USE_PLATFORM_WIN32_KHR
3127 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
3128 instanceExtMap[pDisp].win32_enabled = true;
3129 }
3130#endif
3131 }
3132}
3133
3134VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
3135 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
3136 std::lock_guard<std::mutex> lock(global_lock);
3137 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3138 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3139
3140 assert(chain_info->u.pLayerInfo);
3141 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3142 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
3143 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(phy_dev_data->instance, "vkCreateDevice");
3144 if (fpCreateDevice == NULL) {
3145 return VK_ERROR_INITIALIZATION_FAILED;
3146 }
3147
3148 // Advance the link info for the next element on the chain
3149 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3150
3151 VkResult result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
3152 if (result != VK_SUCCESS) {
3153 return result;
3154 }
3155
3156 layer_data *device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
3157 device_data->report_data = layer_debug_report_create_device(phy_dev_data->report_data, *pDevice);
3158
3159 // Add link back to physDev
3160 device_data->physical_device = physicalDevice;
3161
3162 initDeviceTable(*pDevice, fpGetDeviceProcAddr, ot_device_table_map);
3163
3164 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
Chris Forbesfeecd402016-09-29 14:53:50 +13003165 CreateObject(*pDevice, *pDevice, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003166
3167 return result;
3168}
3169
3170VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3171 uint32_t *pQueueFamilyPropertyCount,
3172 VkQueueFamilyProperties *pQueueFamilyProperties) {
3173 get_dispatch_table(ot_instance_table_map, physicalDevice)
3174 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
3175 std::lock_guard<std::mutex> lock(global_lock);
3176 if (pQueueFamilyProperties != NULL) {
3177 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3178 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
3179 instance_data->queue_family_properties.emplace_back(pQueueFamilyProperties[i]);
3180 }
3181 }
3182}
3183
3184VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3185 VkInstance *pInstance) {
3186 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3187
3188 assert(chain_info->u.pLayerInfo);
3189 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3190 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
3191 if (fpCreateInstance == NULL) {
3192 return VK_ERROR_INITIALIZATION_FAILED;
3193 }
3194
3195 // Advance the link info for the next element on the chain
3196 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3197
3198 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
3199 if (result != VK_SUCCESS) {
3200 return result;
3201 }
3202
3203 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
3204 instance_data->instance = *pInstance;
3205 initInstanceTable(*pInstance, fpGetInstanceProcAddr, ot_instance_table_map);
3206 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, *pInstance);
3207
3208 // Look for one or more debug report create info structures, and copy the
3209 // callback(s) for each one found (for use by vkDestroyInstance)
3210 layer_copy_tmp_callbacks(pCreateInfo->pNext, &instance_data->num_tmp_callbacks, &instance_data->tmp_dbg_create_infos,
3211 &instance_data->tmp_callbacks);
3212
3213 instance_data->report_data = debug_report_create_instance(pInstanceTable, *pInstance, pCreateInfo->enabledExtensionCount,
3214 pCreateInfo->ppEnabledExtensionNames);
3215
3216 InitObjectTracker(instance_data, pAllocator);
3217 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
3218
Chris Forbesfeecd402016-09-29 14:53:50 +13003219 CreateObject(*pInstance, *pInstance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003220
3221 return result;
3222}
3223
3224VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
3225 VkPhysicalDevice *pPhysicalDevices) {
3226 bool skip_call = VK_FALSE;
3227 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003228 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003229 lock.unlock();
3230 if (skip_call) {
3231 return VK_ERROR_VALIDATION_FAILED_EXT;
3232 }
3233 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
3234 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
3235 lock.lock();
3236 if (result == VK_SUCCESS) {
3237 if (pPhysicalDevices) {
3238 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003239 CreateObject(instance, pPhysicalDevices[i], VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003240 }
3241 }
3242 }
3243 lock.unlock();
3244 return result;
3245}
3246
3247VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
3248 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003249 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003250 lock.unlock();
3251
3252 get_dispatch_table(ot_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
3253
3254 lock.lock();
3255
3256 CreateQueue(device, *pQueue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT);
3257 AddQueueInfo(device, queueFamilyIndex, *pQueue);
3258}
3259
3260VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
3261 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003262 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003263 lock.unlock();
3264
3265 get_dispatch_table(ot_device_table_map, device)->FreeMemory(device, memory, pAllocator);
3266
3267 lock.lock();
Chris Forbesec461992016-09-29 14:41:44 +13003268 DestroyObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003269}
3270
3271VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
3272 VkMemoryMapFlags flags, void **ppData) {
3273 bool skip_call = VK_FALSE;
3274 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003275 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003276 lock.unlock();
3277 if (skip_call == VK_TRUE) {
3278 return VK_ERROR_VALIDATION_FAILED_EXT;
3279 }
3280 VkResult result = get_dispatch_table(ot_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
3281 return result;
3282}
3283
3284VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
3285 bool skip_call = VK_FALSE;
3286 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003287 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003288 lock.unlock();
3289 if (skip_call == VK_TRUE) {
3290 return;
3291 }
3292
3293 get_dispatch_table(ot_device_table_map, device)->UnmapMemory(device, memory);
3294}
3295VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
3296 VkFence fence) {
3297 std::unique_lock<std::mutex> lock(global_lock);
3298 ValidateQueueFlags(queue, "QueueBindSparse");
3299
3300 for (uint32_t i = 0; i < bindInfoCount; i++) {
3301 for (uint32_t j = 0; j < pBindInfo[i].bufferBindCount; j++)
Chris Forbes2f271a72016-09-29 14:58:08 +13003302 ValidateObject(queue, pBindInfo[i].pBufferBinds[j].buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003303 false);
3304 for (uint32_t j = 0; j < pBindInfo[i].imageOpaqueBindCount; j++)
Chris Forbes2f271a72016-09-29 14:58:08 +13003305 ValidateObject(queue, pBindInfo[i].pImageOpaqueBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003306 false);
3307 for (uint32_t j = 0; j < pBindInfo[i].imageBindCount; j++)
Chris Forbes2f271a72016-09-29 14:58:08 +13003308 ValidateObject(queue, pBindInfo[i].pImageBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003309 }
3310 lock.unlock();
3311
3312 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
3313 return result;
3314}
3315
3316VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3317 VkCommandBuffer *pCommandBuffers) {
3318 bool skip_call = VK_FALSE;
3319 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003320 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003321 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13003322 ValidateObject(device, pAllocateInfo->commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003323 lock.unlock();
3324
3325 if (skip_call) {
3326 return VK_ERROR_VALIDATION_FAILED_EXT;
3327 }
3328
3329 VkResult result =
3330 get_dispatch_table(ot_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3331
3332 lock.lock();
3333 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {
3334 AllocateCommandBuffer(device, pAllocateInfo->commandPool, pCommandBuffers[i],
3335 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, pAllocateInfo->level);
3336 }
3337 lock.unlock();
3338
3339 return result;
3340}
3341
3342VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3343 VkDescriptorSet *pDescriptorSets) {
3344 bool skip_call = VK_FALSE;
3345 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003346 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3347 skip_call |= ValidateObject(device, pAllocateInfo->descriptorPool,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003348 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
3349 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003350 skip_call |= ValidateObject(device, pAllocateInfo->pSetLayouts[i],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003351 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false);
3352 }
3353 lock.unlock();
3354 if (skip_call) {
3355 return VK_ERROR_VALIDATION_FAILED_EXT;
3356 }
3357
3358 VkResult result =
3359 get_dispatch_table(ot_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3360
3361 if (VK_SUCCESS == result) {
3362 lock.lock();
3363 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
3364 AllocateDescriptorSet(device, pAllocateInfo->descriptorPool, pDescriptorSets[i],
3365 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
3366 }
3367 lock.unlock();
3368 }
3369
3370 return result;
3371}
3372
3373VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
3374 const VkCommandBuffer *pCommandBuffers) {
3375 bool skip_call = false;
3376 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003377 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
3378 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003379 for (uint32_t i = 0; i < commandBufferCount; i++) {
3380 skip_call |= ValidateCommandBuffer(device, commandPool, pCommandBuffers[i]);
3381 }
3382
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003383 for (uint32_t i = 0; i < commandBufferCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003384 DestroyObject(device, pCommandBuffers[i], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003385 }
3386
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003387 lock.unlock();
3388 if (!skip_call) {
3389 get_dispatch_table(ot_device_table_map, device)
3390 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
3391 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003392}
3393VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
3394 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3395 std::unique_lock<std::mutex> lock(global_lock);
3396 // A swapchain's images are implicitly deleted when the swapchain is deleted.
3397 // Remove this swapchain's images from our map of such images.
3398 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr = device_data->swapchainImageMap.begin();
3399 while (itr != device_data->swapchainImageMap.end()) {
3400 OBJTRACK_NODE *pNode = (*itr).second;
3401 if (pNode->parent_object == reinterpret_cast<uint64_t &>(swapchain)) {
3402 delete pNode;
3403 auto delete_item = itr++;
3404 device_data->swapchainImageMap.erase(delete_item);
3405 } else {
3406 ++itr;
3407 }
3408 }
Chris Forbesec461992016-09-29 14:41:44 +13003409 DestroyObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003410 lock.unlock();
3411
3412 get_dispatch_table(ot_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
3413}
3414
3415VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
3416 const VkDescriptorSet *pDescriptorSets) {
3417 bool skip_call = false;
3418 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3419 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003420 skip_call |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
3421 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003422 for (uint32_t i = 0; i < descriptorSetCount; i++) {
3423 skip_call |= ValidateDescriptorSet(device, descriptorPool, pDescriptorSets[i]);
3424 }
3425
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003426 for (uint32_t i = 0; i < descriptorSetCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003427 DestroyObject(device, pDescriptorSets[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003428 }
3429
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003430 lock.unlock();
3431 if (!skip_call) {
3432 result = get_dispatch_table(ot_device_table_map, device)
3433 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
3434 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003435 return result;
3436}
3437
3438VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3439 const VkAllocationCallbacks *pAllocator) {
3440 bool skip_call = VK_FALSE;
3441 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3442 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003443 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3444 skip_call |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003445 lock.unlock();
3446 if (skip_call) {
3447 return;
3448 }
3449 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is deleted.
3450 // Remove this pool's descriptor sets from our descriptorSet map.
3451 lock.lock();
3452 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr =
3453 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
3454 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
3455 OBJTRACK_NODE *pNode = (*itr).second;
3456 auto del_itr = itr++;
3457 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
Chris Forbesec461992016-09-29 14:41:44 +13003458 DestroyObject(device, (VkDescriptorSet)((*del_itr).first),
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003459 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003460 }
3461 }
Chris Forbesec461992016-09-29 14:41:44 +13003462 DestroyObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003463 lock.unlock();
3464 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
3465}
3466
3467VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3468 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3469 bool skip_call = false;
3470 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003471 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3472 skip_call |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003473 lock.unlock();
3474 if (skip_call) {
3475 return;
3476 }
3477 lock.lock();
3478 // A CommandPool's command buffers are implicitly deleted when the pool is deleted.
3479 // Remove this pool's cmdBuffers from our cmd buffer map.
3480 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].begin();
3481 auto del_itr = itr;
3482 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
3483 OBJTRACK_NODE *pNode = (*itr).second;
3484 del_itr = itr++;
3485 if (pNode->parent_object == reinterpret_cast<uint64_t &>(commandPool)) {
3486 skip_call |= ValidateCommandBuffer(device, commandPool, reinterpret_cast<VkCommandBuffer>((*del_itr).first));
Chris Forbesec461992016-09-29 14:41:44 +13003487 DestroyObject(device, reinterpret_cast<VkCommandBuffer>((*del_itr).first),
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003488 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003489 }
3490 }
Chris Forbesec461992016-09-29 14:41:44 +13003491 DestroyObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003492 lock.unlock();
3493 get_dispatch_table(ot_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
3494}
3495
3496VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
3497 VkImage *pSwapchainImages) {
3498 bool skip_call = VK_FALSE;
3499 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003500 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003501 lock.unlock();
3502 if (skip_call) {
3503 return VK_ERROR_VALIDATION_FAILED_EXT;
3504 }
3505 VkResult result = get_dispatch_table(ot_device_table_map, device)
3506 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
3507 if (pSwapchainImages != NULL) {
3508 lock.lock();
3509 for (uint32_t i = 0; i < *pSwapchainImageCount; i++) {
3510 CreateSwapchainImageObject(device, pSwapchainImages[i], swapchain);
3511 }
3512 lock.unlock();
3513 }
3514 return result;
3515}
3516
3517VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3518 const VkGraphicsPipelineCreateInfo *pCreateInfos,
3519 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3520 bool skip_call = VK_FALSE;
3521 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003522 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003523 if (pCreateInfos) {
3524 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3525 if (pCreateInfos[idx0].basePipelineHandle) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003526 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003527 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, true);
3528 }
3529 if (pCreateInfos[idx0].layout) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003530 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003531 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
3532 }
3533 if (pCreateInfos[idx0].pStages) {
3534 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
3535 if (pCreateInfos[idx0].pStages[idx1].module) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003536 skip_call |= ValidateObject(device, pCreateInfos[idx0].pStages[idx1].module,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003537 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false);
3538 }
3539 }
3540 }
3541 if (pCreateInfos[idx0].renderPass) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003542 skip_call |= ValidateObject(device, pCreateInfos[idx0].renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003543 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
3544 }
3545 }
3546 }
3547 if (pipelineCache) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003548 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003549 }
3550 lock.unlock();
3551 if (skip_call) {
3552 return VK_ERROR_VALIDATION_FAILED_EXT;
3553 }
3554 VkResult result = get_dispatch_table(ot_device_table_map, device)
3555 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3556 lock.lock();
3557 if (result == VK_SUCCESS) {
3558 for (uint32_t idx2 = 0; idx2 < createInfoCount; ++idx2) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003559 CreateObject(device, pPipelines[idx2], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003560 }
3561 }
3562 lock.unlock();
3563 return result;
3564}
3565
3566VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3567 const VkComputePipelineCreateInfo *pCreateInfos,
3568 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3569 bool skip_call = VK_FALSE;
3570 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003571 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003572 if (pCreateInfos) {
3573 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3574 if (pCreateInfos[idx0].basePipelineHandle) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003575 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003576 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, true);
3577 }
3578 if (pCreateInfos[idx0].layout) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003579 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003580 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
3581 }
3582 if (pCreateInfos[idx0].stage.module) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003583 skip_call |= ValidateObject(device, pCreateInfos[idx0].stage.module,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003584 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false);
3585 }
3586 }
3587 }
3588 if (pipelineCache) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003589 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003590 }
3591 lock.unlock();
3592 if (skip_call) {
3593 return VK_ERROR_VALIDATION_FAILED_EXT;
3594 }
3595 VkResult result = get_dispatch_table(ot_device_table_map, device)
3596 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3597 lock.lock();
3598 if (result == VK_SUCCESS) {
3599 for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003600 CreateObject(device, pPipelines[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003601 }
3602 }
3603 lock.unlock();
3604 return result;
3605}
3606
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003607// VK_EXT_debug_marker Extension
3608VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
3609 bool skip_call = VK_FALSE;
3610 std::unique_lock<std::mutex> lock(global_lock);
3611 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3612 lock.unlock();
3613 if (skip_call) {
3614 return VK_ERROR_VALIDATION_FAILED_EXT;
3615 }
3616 VkResult result = get_dispatch_table(ot_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
3617 return result;
3618}
3619
3620VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
3621 bool skip_call = VK_FALSE;
3622 std::unique_lock<std::mutex> lock(global_lock);
3623 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3624 lock.unlock();
3625 if (skip_call) {
3626 return VK_ERROR_VALIDATION_FAILED_EXT;
3627 }
3628 VkResult result = get_dispatch_table(ot_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
3629 return result;
3630}
3631
3632VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3633 bool skip_call = VK_FALSE;
3634 std::unique_lock<std::mutex> lock(global_lock);
3635 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
3636 lock.unlock();
3637 if (!skip_call) {
3638 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
3639 }
3640}
3641
3642VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerEndEXT(VkCommandBuffer commandBuffer) {
3643 bool skip_call = VK_FALSE;
3644 std::unique_lock<std::mutex> lock(global_lock);
3645 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
3646 lock.unlock();
3647 if (!skip_call) {
3648 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerEndEXT(commandBuffer);
3649 }
3650}
3651
3652VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3653 bool skip_call = VK_FALSE;
3654 std::unique_lock<std::mutex> lock(global_lock);
3655 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
3656 lock.unlock();
3657 if (!skip_call) {
3658 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
3659 }
3660}
3661
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003662// VK_NV_external_memory_capabilities Extension
3663VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
3664 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
3665 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
3666 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
3667
3668 bool skip_call = false;
3669 {
3670 std::lock_guard<std::mutex> lock(global_lock);
3671 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
3672 }
3673 if (skip_call) {
3674 return VK_ERROR_VALIDATION_FAILED_EXT;
3675 }
3676 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3677 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
3678 externalHandleType, pExternalImageFormatProperties);
3679 return result;
3680}
3681
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003682#ifdef VK_USE_PLATFORM_WIN32_KHR
3683// VK_NV_external_memory_win32 Extension
3684VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
3685 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
3686 bool skip_call = VK_FALSE;
3687 std::unique_lock<std::mutex> lock(global_lock);
3688 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3689 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
3690 lock.unlock();
3691 if (skip_call) {
3692 return VK_ERROR_VALIDATION_FAILED_EXT;
3693 }
3694 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
3695 return result;
3696}
3697#endif // VK_USE_PLATFORM_WIN32_KHR
3698
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003699// VK_AMD_draw_indirect_count Extension
3700VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3701 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3702 uint32_t stride) {
3703 bool skip_call = VK_FALSE;
3704 std::unique_lock<std::mutex> lock(global_lock);
3705 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3706 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
3707 lock.unlock();
3708 if (!skip_call) {
3709 get_dispatch_table(ot_device_table_map, commandBuffer)
3710 ->CmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3711 }
3712}
3713
3714VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3715 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3716 uint32_t maxDrawCount, uint32_t stride) {
3717 bool skip_call = VK_FALSE;
3718 std::unique_lock<std::mutex> lock(global_lock);
3719 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3720 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
3721 lock.unlock();
3722 if (!skip_call) {
3723 get_dispatch_table(ot_device_table_map, commandBuffer)
3724 ->CmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3725 }
3726}
3727
3728
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003729static inline PFN_vkVoidFunction InterceptCoreDeviceCommand(const char *name) {
3730 if (!name || name[0] != 'v' || name[1] != 'k')
3731 return NULL;
3732
3733 name += 2;
3734 if (!strcmp(name, "GetDeviceProcAddr"))
3735 return (PFN_vkVoidFunction)GetDeviceProcAddr;
3736 if (!strcmp(name, "DestroyDevice"))
3737 return (PFN_vkVoidFunction)DestroyDevice;
3738 if (!strcmp(name, "GetDeviceQueue"))
3739 return (PFN_vkVoidFunction)GetDeviceQueue;
3740 if (!strcmp(name, "QueueSubmit"))
3741 return (PFN_vkVoidFunction)QueueSubmit;
3742 if (!strcmp(name, "QueueWaitIdle"))
3743 return (PFN_vkVoidFunction)QueueWaitIdle;
3744 if (!strcmp(name, "DeviceWaitIdle"))
3745 return (PFN_vkVoidFunction)DeviceWaitIdle;
3746 if (!strcmp(name, "AllocateMemory"))
3747 return (PFN_vkVoidFunction)AllocateMemory;
3748 if (!strcmp(name, "FreeMemory"))
3749 return (PFN_vkVoidFunction)FreeMemory;
3750 if (!strcmp(name, "MapMemory"))
3751 return (PFN_vkVoidFunction)MapMemory;
3752 if (!strcmp(name, "UnmapMemory"))
3753 return (PFN_vkVoidFunction)UnmapMemory;
3754 if (!strcmp(name, "FlushMappedMemoryRanges"))
3755 return (PFN_vkVoidFunction)FlushMappedMemoryRanges;
3756 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
3757 return (PFN_vkVoidFunction)InvalidateMappedMemoryRanges;
3758 if (!strcmp(name, "GetDeviceMemoryCommitment"))
3759 return (PFN_vkVoidFunction)GetDeviceMemoryCommitment;
3760 if (!strcmp(name, "BindBufferMemory"))
3761 return (PFN_vkVoidFunction)BindBufferMemory;
3762 if (!strcmp(name, "BindImageMemory"))
3763 return (PFN_vkVoidFunction)BindImageMemory;
3764 if (!strcmp(name, "GetBufferMemoryRequirements"))
3765 return (PFN_vkVoidFunction)GetBufferMemoryRequirements;
3766 if (!strcmp(name, "GetImageMemoryRequirements"))
3767 return (PFN_vkVoidFunction)GetImageMemoryRequirements;
3768 if (!strcmp(name, "GetImageSparseMemoryRequirements"))
3769 return (PFN_vkVoidFunction)GetImageSparseMemoryRequirements;
3770 if (!strcmp(name, "QueueBindSparse"))
3771 return (PFN_vkVoidFunction)QueueBindSparse;
3772 if (!strcmp(name, "CreateFence"))
3773 return (PFN_vkVoidFunction)CreateFence;
3774 if (!strcmp(name, "DestroyFence"))
3775 return (PFN_vkVoidFunction)DestroyFence;
3776 if (!strcmp(name, "ResetFences"))
3777 return (PFN_vkVoidFunction)ResetFences;
3778 if (!strcmp(name, "GetFenceStatus"))
3779 return (PFN_vkVoidFunction)GetFenceStatus;
3780 if (!strcmp(name, "WaitForFences"))
3781 return (PFN_vkVoidFunction)WaitForFences;
3782 if (!strcmp(name, "CreateSemaphore"))
3783 return (PFN_vkVoidFunction)CreateSemaphore;
3784 if (!strcmp(name, "DestroySemaphore"))
3785 return (PFN_vkVoidFunction)DestroySemaphore;
3786 if (!strcmp(name, "CreateEvent"))
3787 return (PFN_vkVoidFunction)CreateEvent;
3788 if (!strcmp(name, "DestroyEvent"))
3789 return (PFN_vkVoidFunction)DestroyEvent;
3790 if (!strcmp(name, "GetEventStatus"))
3791 return (PFN_vkVoidFunction)GetEventStatus;
3792 if (!strcmp(name, "SetEvent"))
3793 return (PFN_vkVoidFunction)SetEvent;
3794 if (!strcmp(name, "ResetEvent"))
3795 return (PFN_vkVoidFunction)ResetEvent;
3796 if (!strcmp(name, "CreateQueryPool"))
3797 return (PFN_vkVoidFunction)CreateQueryPool;
3798 if (!strcmp(name, "DestroyQueryPool"))
3799 return (PFN_vkVoidFunction)DestroyQueryPool;
3800 if (!strcmp(name, "GetQueryPoolResults"))
3801 return (PFN_vkVoidFunction)GetQueryPoolResults;
3802 if (!strcmp(name, "CreateBuffer"))
3803 return (PFN_vkVoidFunction)CreateBuffer;
3804 if (!strcmp(name, "DestroyBuffer"))
3805 return (PFN_vkVoidFunction)DestroyBuffer;
3806 if (!strcmp(name, "CreateBufferView"))
3807 return (PFN_vkVoidFunction)CreateBufferView;
3808 if (!strcmp(name, "DestroyBufferView"))
3809 return (PFN_vkVoidFunction)DestroyBufferView;
3810 if (!strcmp(name, "CreateImage"))
3811 return (PFN_vkVoidFunction)CreateImage;
3812 if (!strcmp(name, "DestroyImage"))
3813 return (PFN_vkVoidFunction)DestroyImage;
3814 if (!strcmp(name, "GetImageSubresourceLayout"))
3815 return (PFN_vkVoidFunction)GetImageSubresourceLayout;
3816 if (!strcmp(name, "CreateImageView"))
3817 return (PFN_vkVoidFunction)CreateImageView;
3818 if (!strcmp(name, "DestroyImageView"))
3819 return (PFN_vkVoidFunction)DestroyImageView;
3820 if (!strcmp(name, "CreateShaderModule"))
3821 return (PFN_vkVoidFunction)CreateShaderModule;
3822 if (!strcmp(name, "DestroyShaderModule"))
3823 return (PFN_vkVoidFunction)DestroyShaderModule;
3824 if (!strcmp(name, "CreatePipelineCache"))
3825 return (PFN_vkVoidFunction)CreatePipelineCache;
3826 if (!strcmp(name, "DestroyPipelineCache"))
3827 return (PFN_vkVoidFunction)DestroyPipelineCache;
3828 if (!strcmp(name, "GetPipelineCacheData"))
3829 return (PFN_vkVoidFunction)GetPipelineCacheData;
3830 if (!strcmp(name, "MergePipelineCaches"))
3831 return (PFN_vkVoidFunction)MergePipelineCaches;
3832 if (!strcmp(name, "CreateGraphicsPipelines"))
3833 return (PFN_vkVoidFunction)CreateGraphicsPipelines;
3834 if (!strcmp(name, "CreateComputePipelines"))
3835 return (PFN_vkVoidFunction)CreateComputePipelines;
3836 if (!strcmp(name, "DestroyPipeline"))
3837 return (PFN_vkVoidFunction)DestroyPipeline;
3838 if (!strcmp(name, "CreatePipelineLayout"))
3839 return (PFN_vkVoidFunction)CreatePipelineLayout;
3840 if (!strcmp(name, "DestroyPipelineLayout"))
3841 return (PFN_vkVoidFunction)DestroyPipelineLayout;
3842 if (!strcmp(name, "CreateSampler"))
3843 return (PFN_vkVoidFunction)CreateSampler;
3844 if (!strcmp(name, "DestroySampler"))
3845 return (PFN_vkVoidFunction)DestroySampler;
3846 if (!strcmp(name, "CreateDescriptorSetLayout"))
3847 return (PFN_vkVoidFunction)CreateDescriptorSetLayout;
3848 if (!strcmp(name, "DestroyDescriptorSetLayout"))
3849 return (PFN_vkVoidFunction)DestroyDescriptorSetLayout;
3850 if (!strcmp(name, "CreateDescriptorPool"))
3851 return (PFN_vkVoidFunction)CreateDescriptorPool;
3852 if (!strcmp(name, "DestroyDescriptorPool"))
3853 return (PFN_vkVoidFunction)DestroyDescriptorPool;
3854 if (!strcmp(name, "ResetDescriptorPool"))
3855 return (PFN_vkVoidFunction)ResetDescriptorPool;
3856 if (!strcmp(name, "AllocateDescriptorSets"))
3857 return (PFN_vkVoidFunction)AllocateDescriptorSets;
3858 if (!strcmp(name, "FreeDescriptorSets"))
3859 return (PFN_vkVoidFunction)FreeDescriptorSets;
3860 if (!strcmp(name, "UpdateDescriptorSets"))
3861 return (PFN_vkVoidFunction)UpdateDescriptorSets;
3862 if (!strcmp(name, "CreateFramebuffer"))
3863 return (PFN_vkVoidFunction)CreateFramebuffer;
3864 if (!strcmp(name, "DestroyFramebuffer"))
3865 return (PFN_vkVoidFunction)DestroyFramebuffer;
3866 if (!strcmp(name, "CreateRenderPass"))
3867 return (PFN_vkVoidFunction)CreateRenderPass;
3868 if (!strcmp(name, "DestroyRenderPass"))
3869 return (PFN_vkVoidFunction)DestroyRenderPass;
3870 if (!strcmp(name, "GetRenderAreaGranularity"))
3871 return (PFN_vkVoidFunction)GetRenderAreaGranularity;
3872 if (!strcmp(name, "CreateCommandPool"))
3873 return (PFN_vkVoidFunction)CreateCommandPool;
3874 if (!strcmp(name, "DestroyCommandPool"))
3875 return (PFN_vkVoidFunction)DestroyCommandPool;
3876 if (!strcmp(name, "ResetCommandPool"))
3877 return (PFN_vkVoidFunction)ResetCommandPool;
3878 if (!strcmp(name, "AllocateCommandBuffers"))
3879 return (PFN_vkVoidFunction)AllocateCommandBuffers;
3880 if (!strcmp(name, "FreeCommandBuffers"))
3881 return (PFN_vkVoidFunction)FreeCommandBuffers;
3882 if (!strcmp(name, "BeginCommandBuffer"))
3883 return (PFN_vkVoidFunction)BeginCommandBuffer;
3884 if (!strcmp(name, "EndCommandBuffer"))
3885 return (PFN_vkVoidFunction)EndCommandBuffer;
3886 if (!strcmp(name, "ResetCommandBuffer"))
3887 return (PFN_vkVoidFunction)ResetCommandBuffer;
3888 if (!strcmp(name, "CmdBindPipeline"))
3889 return (PFN_vkVoidFunction)CmdBindPipeline;
3890 if (!strcmp(name, "CmdSetViewport"))
3891 return (PFN_vkVoidFunction)CmdSetViewport;
3892 if (!strcmp(name, "CmdSetScissor"))
3893 return (PFN_vkVoidFunction)CmdSetScissor;
3894 if (!strcmp(name, "CmdSetLineWidth"))
3895 return (PFN_vkVoidFunction)CmdSetLineWidth;
3896 if (!strcmp(name, "CmdSetDepthBias"))
3897 return (PFN_vkVoidFunction)CmdSetDepthBias;
3898 if (!strcmp(name, "CmdSetBlendConstants"))
3899 return (PFN_vkVoidFunction)CmdSetBlendConstants;
3900 if (!strcmp(name, "CmdSetDepthBounds"))
3901 return (PFN_vkVoidFunction)CmdSetDepthBounds;
3902 if (!strcmp(name, "CmdSetStencilCompareMask"))
3903 return (PFN_vkVoidFunction)CmdSetStencilCompareMask;
3904 if (!strcmp(name, "CmdSetStencilWriteMask"))
3905 return (PFN_vkVoidFunction)CmdSetStencilWriteMask;
3906 if (!strcmp(name, "CmdSetStencilReference"))
3907 return (PFN_vkVoidFunction)CmdSetStencilReference;
3908 if (!strcmp(name, "CmdBindDescriptorSets"))
3909 return (PFN_vkVoidFunction)CmdBindDescriptorSets;
3910 if (!strcmp(name, "CmdBindIndexBuffer"))
3911 return (PFN_vkVoidFunction)CmdBindIndexBuffer;
3912 if (!strcmp(name, "CmdBindVertexBuffers"))
3913 return (PFN_vkVoidFunction)CmdBindVertexBuffers;
3914 if (!strcmp(name, "CmdDraw"))
3915 return (PFN_vkVoidFunction)CmdDraw;
3916 if (!strcmp(name, "CmdDrawIndexed"))
3917 return (PFN_vkVoidFunction)CmdDrawIndexed;
3918 if (!strcmp(name, "CmdDrawIndirect"))
3919 return (PFN_vkVoidFunction)CmdDrawIndirect;
3920 if (!strcmp(name, "CmdDrawIndexedIndirect"))
3921 return (PFN_vkVoidFunction)CmdDrawIndexedIndirect;
3922 if (!strcmp(name, "CmdDispatch"))
3923 return (PFN_vkVoidFunction)CmdDispatch;
3924 if (!strcmp(name, "CmdDispatchIndirect"))
3925 return (PFN_vkVoidFunction)CmdDispatchIndirect;
3926 if (!strcmp(name, "CmdCopyBuffer"))
3927 return (PFN_vkVoidFunction)CmdCopyBuffer;
3928 if (!strcmp(name, "CmdCopyImage"))
3929 return (PFN_vkVoidFunction)CmdCopyImage;
3930 if (!strcmp(name, "CmdBlitImage"))
3931 return (PFN_vkVoidFunction)CmdBlitImage;
3932 if (!strcmp(name, "CmdCopyBufferToImage"))
3933 return (PFN_vkVoidFunction)CmdCopyBufferToImage;
3934 if (!strcmp(name, "CmdCopyImageToBuffer"))
3935 return (PFN_vkVoidFunction)CmdCopyImageToBuffer;
3936 if (!strcmp(name, "CmdUpdateBuffer"))
3937 return (PFN_vkVoidFunction)CmdUpdateBuffer;
3938 if (!strcmp(name, "CmdFillBuffer"))
3939 return (PFN_vkVoidFunction)CmdFillBuffer;
3940 if (!strcmp(name, "CmdClearColorImage"))
3941 return (PFN_vkVoidFunction)CmdClearColorImage;
3942 if (!strcmp(name, "CmdClearDepthStencilImage"))
3943 return (PFN_vkVoidFunction)CmdClearDepthStencilImage;
3944 if (!strcmp(name, "CmdClearAttachments"))
3945 return (PFN_vkVoidFunction)CmdClearAttachments;
3946 if (!strcmp(name, "CmdResolveImage"))
3947 return (PFN_vkVoidFunction)CmdResolveImage;
3948 if (!strcmp(name, "CmdSetEvent"))
3949 return (PFN_vkVoidFunction)CmdSetEvent;
3950 if (!strcmp(name, "CmdResetEvent"))
3951 return (PFN_vkVoidFunction)CmdResetEvent;
3952 if (!strcmp(name, "CmdWaitEvents"))
3953 return (PFN_vkVoidFunction)CmdWaitEvents;
3954 if (!strcmp(name, "CmdPipelineBarrier"))
3955 return (PFN_vkVoidFunction)CmdPipelineBarrier;
3956 if (!strcmp(name, "CmdBeginQuery"))
3957 return (PFN_vkVoidFunction)CmdBeginQuery;
3958 if (!strcmp(name, "CmdEndQuery"))
3959 return (PFN_vkVoidFunction)CmdEndQuery;
3960 if (!strcmp(name, "CmdResetQueryPool"))
3961 return (PFN_vkVoidFunction)CmdResetQueryPool;
3962 if (!strcmp(name, "CmdWriteTimestamp"))
3963 return (PFN_vkVoidFunction)CmdWriteTimestamp;
3964 if (!strcmp(name, "CmdCopyQueryPoolResults"))
3965 return (PFN_vkVoidFunction)CmdCopyQueryPoolResults;
3966 if (!strcmp(name, "CmdPushConstants"))
3967 return (PFN_vkVoidFunction)CmdPushConstants;
3968 if (!strcmp(name, "CmdBeginRenderPass"))
3969 return (PFN_vkVoidFunction)CmdBeginRenderPass;
3970 if (!strcmp(name, "CmdNextSubpass"))
3971 return (PFN_vkVoidFunction)CmdNextSubpass;
3972 if (!strcmp(name, "CmdEndRenderPass"))
3973 return (PFN_vkVoidFunction)CmdEndRenderPass;
3974 if (!strcmp(name, "CmdExecuteCommands"))
3975 return (PFN_vkVoidFunction)CmdExecuteCommands;
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003976 if (!strcmp(name, "DebugMarkerSetObjectTagEXT"))
3977 return (PFN_vkVoidFunction)DebugMarkerSetObjectTagEXT;
3978 if (!strcmp(name, "DebugMarkerSetObjectNameEXT"))
3979 return (PFN_vkVoidFunction)DebugMarkerSetObjectNameEXT;
3980 if (!strcmp(name, "CmdDebugMarkerBeginEXT"))
3981 return (PFN_vkVoidFunction)CmdDebugMarkerBeginEXT;
3982 if (!strcmp(name, "CmdDebugMarkerEndEXT"))
3983 return (PFN_vkVoidFunction)CmdDebugMarkerEndEXT;
3984 if (!strcmp(name, "CmdDebugMarkerInsertEXT"))
3985 return (PFN_vkVoidFunction)CmdDebugMarkerInsertEXT;
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003986#ifdef VK_USE_PLATFORM_WIN32_KHR
3987 if (!strcmp(name, "GetMemoryWin32HandleNV"))
3988 return (PFN_vkVoidFunction)GetMemoryWin32HandleNV;
3989#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003990 if (!strcmp(name, "CmdDrawIndirectCountAMD"))
3991 return (PFN_vkVoidFunction)CmdDrawIndirectCountAMD;
3992 if (!strcmp(name, "CmdDrawIndexedIndirectCountAMD"))
3993 return (PFN_vkVoidFunction)CmdDrawIndexedIndirectCountAMD;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003994
3995 return NULL;
3996}
3997static inline PFN_vkVoidFunction InterceptCoreInstanceCommand(const char *name) {
3998 if (!name || name[0] != 'v' || name[1] != 'k')
3999 return NULL;
4000
4001 name += 2;
4002 if (!strcmp(name, "CreateInstance"))
4003 return (PFN_vkVoidFunction)CreateInstance;
4004 if (!strcmp(name, "DestroyInstance"))
4005 return (PFN_vkVoidFunction)DestroyInstance;
4006 if (!strcmp(name, "EnumeratePhysicalDevices"))
4007 return (PFN_vkVoidFunction)EnumeratePhysicalDevices;
4008 if (!strcmp(name, "GetPhysicalDeviceFeatures"))
4009 return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures;
4010 if (!strcmp(name, "GetPhysicalDeviceFormatProperties"))
4011 return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties;
4012 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties"))
4013 return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties;
4014 if (!strcmp(name, "GetPhysicalDeviceProperties"))
4015 return (PFN_vkVoidFunction)GetPhysicalDeviceProperties;
4016 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties"))
4017 return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties;
4018 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties"))
4019 return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties;
4020 if (!strcmp(name, "GetInstanceProcAddr"))
4021 return (PFN_vkVoidFunction)GetInstanceProcAddr;
4022 if (!strcmp(name, "CreateDevice"))
4023 return (PFN_vkVoidFunction)CreateDevice;
4024 if (!strcmp(name, "EnumerateInstanceExtensionProperties"))
4025 return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
4026 if (!strcmp(name, "EnumerateInstanceLayerProperties"))
4027 return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties;
4028 if (!strcmp(name, "EnumerateDeviceLayerProperties"))
4029 return (PFN_vkVoidFunction)EnumerateDeviceLayerProperties;
4030 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties"))
4031 return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties;
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06004032 if (!strcmp(name, "GetPhysicalDeviceExternalImageFormatPropertiesNV"))
4033 return (PFN_vkVoidFunction)GetPhysicalDeviceExternalImageFormatPropertiesNV;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004034
4035 return NULL;
4036}
4037
4038static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
4039 if (device) {
4040 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06004041
4042 if (device_data->wsi_enabled) {
4043 if (!strcmp("vkCreateSwapchainKHR", name))
4044 return reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR);
4045 if (!strcmp("vkDestroySwapchainKHR", name))
4046 return reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR);
4047 if (!strcmp("vkGetSwapchainImagesKHR", name))
4048 return reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR);
4049 if (!strcmp("vkAcquireNextImageKHR", name))
4050 return reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR);
4051 if (!strcmp("vkQueuePresentKHR", name))
4052 return reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR);
4053 }
4054
4055 if (device_data->wsi_display_swapchain_enabled) {
4056 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
4057 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
4058 }
4059 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004060 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004061
4062 return nullptr;
4063}
4064
4065VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
4066 PFN_vkVoidFunction addr;
4067 addr = InterceptCoreDeviceCommand(funcName);
4068 if (addr) {
4069 return addr;
4070 }
4071 assert(device);
4072
4073 addr = InterceptWsiEnabledCommand(funcName, device);
4074 if (addr) {
4075 return addr;
4076 }
4077 if (get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr == NULL) {
4078 return NULL;
4079 }
4080 return get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr(device, funcName);
4081}
4082
4083VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
4084 PFN_vkVoidFunction addr;
4085 addr = InterceptCoreInstanceCommand(funcName);
4086 if (!addr) {
4087 addr = InterceptCoreDeviceCommand(funcName);
4088 }
4089 if (!addr) {
4090 addr = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
4091 }
4092 if (addr) {
4093 return addr;
4094 }
4095 assert(instance);
4096
4097 addr = InterceptMsgCallbackGetProcAddrCommand(funcName, instance);
4098 if (addr) {
4099 return addr;
4100 }
4101 addr = InterceptWsiEnabledCommand(funcName, instance);
4102 if (addr) {
4103 return addr;
4104 }
4105 if (get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr == NULL) {
4106 return NULL;
4107 }
4108 return get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
4109}
4110
4111} // namespace object_tracker
4112
4113// vk_layer_logging.h expects these to be defined
4114VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
4115 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4116 const VkAllocationCallbacks *pAllocator,
4117 VkDebugReportCallbackEXT *pMsgCallback) {
4118 return object_tracker::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
4119}
4120
4121VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
4122 const VkAllocationCallbacks *pAllocator) {
4123 object_tracker::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
4124}
4125
4126VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
4127 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
4128 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
4129 object_tracker::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
4130}
4131
4132// Loader-layer interface v0, just wrappers since there is only a layer
4133VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4134 VkExtensionProperties *pProperties) {
4135 return object_tracker::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
4136}
4137
4138VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
4139 VkLayerProperties *pProperties) {
4140 return object_tracker::EnumerateInstanceLayerProperties(pCount, pProperties);
4141}
4142
4143VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4144 VkLayerProperties *pProperties) {
4145 // The layer command handles VK_NULL_HANDLE just fine internally
4146 assert(physicalDevice == VK_NULL_HANDLE);
4147 return object_tracker::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
4148}
4149
4150VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
4151 return object_tracker::GetDeviceProcAddr(dev, funcName);
4152}
4153
4154VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
4155 return object_tracker::GetInstanceProcAddr(instance, funcName);
4156}
4157
4158VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4159 const char *pLayerName, uint32_t *pCount,
4160 VkExtensionProperties *pProperties) {
4161 // The layer command handles VK_NULL_HANDLE just fine internally
4162 assert(physicalDevice == VK_NULL_HANDLE);
4163 return object_tracker::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Mark Lobodzinski38080682016-07-22 15:30:27 -06004164}