blob: cbf5f3cda9037df9b289dfebc347b0be70e644d3 [file] [log] [blame]
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
5 * Copyright (c) 2015-2016 Google, Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * Author: Mark Lobodzinski <mark@lunarg.com>
20 * Author: Tobin Ehlis <tobine@google.com>
21 * Author: Courtney Goeltzenleuchter <courtneygo@google.com>
22 * Author: Jon Ashburn <jon@lunarg.com>
23 * Author: Mike Stroyan <stroyan@google.com>
24 * Author: Tony Barbour <tony@LunarG.com>
25 */
26
27#include "vk_loader_platform.h"
28#include "vulkan/vulkan.h"
29
30#include <cinttypes>
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34
35#include <unordered_map>
36
37#include "vk_layer_config.h"
38#include "vk_layer_data.h"
39#include "vk_layer_logging.h"
40#include "vk_layer_table.h"
41#include "vulkan/vk_layer.h"
42
43#include "object_tracker.h"
44
45namespace object_tracker {
46
47static void InitObjectTracker(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
48
49 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_object_tracker");
50}
51
52// Add new queue to head of global queue list
53static void AddQueueInfo(VkDevice device, uint32_t queue_node_index, VkQueue queue) {
54 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
55 auto queueItem = device_data->queue_info_map.find(queue);
56 if (queueItem == device_data->queue_info_map.end()) {
57 OT_QUEUE_INFO *p_queue_info = new OT_QUEUE_INFO;
58 if (p_queue_info != NULL) {
59 memset(p_queue_info, 0, sizeof(OT_QUEUE_INFO));
60 p_queue_info->queue = queue;
61 p_queue_info->queue_node_index = queue_node_index;
62 device_data->queue_info_map[queue] = p_queue_info;
63 } else {
64 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
65 reinterpret_cast<uint64_t>(queue), __LINE__, OBJTRACK_INTERNAL_ERROR, LayerName,
66 "ERROR: VK_ERROR_OUT_OF_HOST_MEMORY -- could not allocate memory for Queue Information");
67 }
68 }
69}
70
71// Destroy memRef lists and free all memory
72static void DestroyQueueDataStructures(VkDevice device) {
73 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
74
75 for (auto queue_item : device_data->queue_info_map) {
76 delete queue_item.second;
77 }
78 device_data->queue_info_map.clear();
79
80 // Destroy the items in the queue map
81 auto queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].begin();
82 while (queue != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
83 uint32_t obj_index = queue->second->object_type;
84 assert(device_data->num_total_objects > 0);
85 device_data->num_total_objects--;
86 assert(device_data->num_objects[obj_index] > 0);
87 device_data->num_objects[obj_index]--;
88 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, queue->second->object_type, queue->second->handle,
89 __LINE__, OBJTRACK_NONE, LayerName,
90 "OBJ_STAT Destroy Queue obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " Queue objs).",
91 queue->second->handle, device_data->num_total_objects, device_data->num_objects[obj_index]);
92 delete queue->second;
93 queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].erase(queue);
94 }
95}
96
97// Check Queue type flags for selected queue operations
98static void ValidateQueueFlags(VkQueue queue, const char *function) {
99 layer_data *device_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
100 auto queue_item = device_data->queue_info_map.find(queue);
101 if (queue_item != device_data->queue_info_map.end()) {
102 OT_QUEUE_INFO *pQueueInfo = queue_item->second;
103 if (pQueueInfo != NULL) {
104 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(device_data->physical_device), layer_data_map);
105 if ((instance_data->queue_family_properties[pQueueInfo->queue_node_index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) ==
106 0) {
107 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
108 reinterpret_cast<uint64_t>(queue), __LINE__, OBJTRACK_UNKNOWN_OBJECT, LayerName,
109 "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_SPARSE_BINDING_BIT not set", function);
110 }
111 }
112 }
113}
114
115static void AllocateCommandBuffer(VkDevice device, const VkCommandPool command_pool, const VkCommandBuffer command_buffer,
116 VkDebugReportObjectTypeEXT object_type, VkCommandBufferLevel level) {
117 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
118
119 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<const uint64_t>(command_buffer),
120 __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
121 string_VkDebugReportObjectTypeEXT(object_type), reinterpret_cast<const uint64_t>(command_buffer));
122
123 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
124 pNewObjNode->object_type = object_type;
125 pNewObjNode->handle = reinterpret_cast<const uint64_t>(command_buffer);
126 pNewObjNode->parent_object = reinterpret_cast<const uint64_t &>(command_pool);
127 if (level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) {
128 pNewObjNode->status = OBJSTATUS_COMMAND_BUFFER_SECONDARY;
129 } else {
130 pNewObjNode->status = OBJSTATUS_NONE;
131 }
132 device_data->object_map[object_type][reinterpret_cast<const uint64_t>(command_buffer)] = pNewObjNode;
133 device_data->num_objects[object_type]++;
134 device_data->num_total_objects++;
135}
136
137static bool ValidateCommandBuffer(VkDevice device, VkCommandPool command_pool, VkCommandBuffer command_buffer) {
138 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
139 bool skip_call = false;
140 uint64_t object_handle = reinterpret_cast<uint64_t>(command_buffer);
141 if (device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].find(object_handle) !=
142 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
143 OBJTRACK_NODE *pNode =
144 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<uint64_t>(command_buffer)];
145
146 if (pNode->parent_object != reinterpret_cast<uint64_t &>(command_pool)) {
147 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
148 __LINE__, OBJTRACK_COMMAND_POOL_MISMATCH, LayerName,
149 "FreeCommandBuffers is attempting to free Command Buffer 0x%" PRIxLEAST64
150 " belonging to Command Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").",
151 reinterpret_cast<uint64_t>(command_buffer), pNode->parent_object,
152 reinterpret_cast<uint64_t &>(command_pool));
153 }
154 } else {
Mark Lobodzinski45e68612016-07-18 17:06:52 -0600155 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle,
156 __LINE__, OBJTRACK_NONE, LayerName, "Unable to remove command buffer obj 0x%" PRIxLEAST64
157 ". Was it created? Has it already been destroyed?",
158 object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600159 }
160 return skip_call;
161}
162
163static void AllocateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set,
164 VkDebugReportObjectTypeEXT object_type) {
165 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
166
167 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type,
168 reinterpret_cast<uint64_t &>(descriptor_set), __LINE__, OBJTRACK_NONE, LayerName,
169 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, object_name[object_type],
170 reinterpret_cast<uint64_t &>(descriptor_set));
171
172 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
173 pNewObjNode->object_type = object_type;
174 pNewObjNode->status = OBJSTATUS_NONE;
175 pNewObjNode->handle = reinterpret_cast<uint64_t &>(descriptor_set);
176 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(descriptor_pool);
177 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT][reinterpret_cast<uint64_t &>(descriptor_set)] =
178 pNewObjNode;
179 device_data->num_objects[object_type]++;
180 device_data->num_total_objects++;
181}
182
183static bool ValidateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set) {
184 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
185 bool skip_call = false;
186 uint64_t object_handle = reinterpret_cast<uint64_t &>(descriptor_set);
187 auto dsItem = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].find(object_handle);
188 if (dsItem != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
189 OBJTRACK_NODE *pNode = dsItem->second;
190
191 if (pNode->parent_object != reinterpret_cast<uint64_t &>(descriptor_pool)) {
192 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
193 __LINE__, OBJTRACK_DESCRIPTOR_POOL_MISMATCH, LayerName,
194 "FreeDescriptorSets is attempting to free descriptorSet 0x%" PRIxLEAST64
195 " belonging to Descriptor Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").",
196 reinterpret_cast<uint64_t &>(descriptor_set), pNode->parent_object,
197 reinterpret_cast<uint64_t &>(descriptor_pool));
198 }
199 } else {
Mark Lobodzinski45e68612016-07-18 17:06:52 -0600200 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle,
201 __LINE__, OBJTRACK_NONE, LayerName, "Unable to remove descriptor set obj 0x%" PRIxLEAST64
202 ". Was it created? Has it already been destroyed?",
203 object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600204 }
205 return skip_call;
206}
207
208static void CreateQueue(VkDevice device, VkQueue vkObj, VkDebugReportObjectTypeEXT object_type) {
209 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
210
211 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<uint64_t>(vkObj), __LINE__,
212 OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
213 object_name[object_type], reinterpret_cast<uint64_t>(vkObj));
214
215 OBJTRACK_NODE *p_obj_node = NULL;
216 auto queue_item = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].find(reinterpret_cast<uint64_t>(vkObj));
217 if (queue_item == device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
218 p_obj_node = new OBJTRACK_NODE;
219 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT][reinterpret_cast<uint64_t>(vkObj)] = p_obj_node;
220 device_data->num_objects[object_type]++;
221 device_data->num_total_objects++;
222 } else {
223 p_obj_node = queue_item->second;
224 }
225 p_obj_node->object_type = object_type;
226 p_obj_node->status = OBJSTATUS_NONE;
227 p_obj_node->handle = reinterpret_cast<uint64_t>(vkObj);
228}
229
230static void CreateSwapchainImageObject(VkDevice dispatchable_object, VkImage swapchain_image, VkSwapchainKHR swapchain) {
231 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
232 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
233 reinterpret_cast<uint64_t &>(swapchain_image), __LINE__, OBJTRACK_NONE, LayerName,
234 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, "SwapchainImage",
235 reinterpret_cast<uint64_t &>(swapchain_image));
236
237 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
238 pNewObjNode->object_type = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT;
239 pNewObjNode->status = OBJSTATUS_NONE;
240 pNewObjNode->handle = reinterpret_cast<uint64_t &>(swapchain_image);
241 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(swapchain);
242 device_data->swapchainImageMap[reinterpret_cast<uint64_t &>(swapchain_image)] = pNewObjNode;
243}
244
245template <typename T1, typename T2>
Chris Forbesfeecd402016-09-29 14:53:50 +1300246static void CreateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool custom_allocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600247 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbesfeecd402016-09-29 14:53:50 +1300248 auto object_handle = reinterpret_cast<uint64_t &>(object);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600249
Chris Forbesfeecd402016-09-29 14:53:50 +1300250 log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, object_handle,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600251 __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
Chris Forbesfeecd402016-09-29 14:53:50 +1300252 object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600253
254 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
255 pNewObjNode->object_type = object_type;
Chris Forbesdbfe96a2016-09-29 13:51:10 +1300256 pNewObjNode->status = custom_allocator ? OBJSTATUS_CUSTOM_ALLOCATOR : OBJSTATUS_NONE;
Chris Forbesfeecd402016-09-29 14:53:50 +1300257 pNewObjNode->handle = object_handle;
258 instance_data->object_map[object_type][object_handle] = pNewObjNode;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600259 instance_data->num_objects[object_type]++;
260 instance_data->num_total_objects++;
261}
262
263template <typename T1, typename T2>
Chris Forbesec461992016-09-29 14:41:44 +1300264static void DestroyObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool custom_allocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600265 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
266
267 uint64_t object_handle = reinterpret_cast<uint64_t &>(object);
268
269 auto item = device_data->object_map[object_type].find(object_handle);
270 if (item != device_data->object_map[object_type].end()) {
271
272 OBJTRACK_NODE *pNode = item->second;
273 assert(device_data->num_total_objects > 0);
274 device_data->num_total_objects--;
275 assert(device_data->num_objects[pNode->object_type] > 0);
276 device_data->num_objects[pNode->object_type]--;
277
278 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, pNode->object_type, object_handle, __LINE__,
279 OBJTRACK_NONE, LayerName,
280 "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " %s objs).",
281 object_name[pNode->object_type], reinterpret_cast<uint64_t &>(object), device_data->num_total_objects,
282 device_data->num_objects[pNode->object_type], object_name[pNode->object_type]);
283
Chris Forbes3e51a202016-09-29 14:35:09 +1300284 auto allocated_with_custom = pNode->status & OBJSTATUS_CUSTOM_ALLOCATOR;
285 if (custom_allocator ^ allocated_with_custom) {
286 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
287 OBJTRACK_ALLOCATOR_MISMATCH, LayerName,
288 "Custom allocator %sspecified while destroying %s obj 0x%" PRIxLEAST64 " but %sspecified at creation",
289 (custom_allocator ? "" : "not "), object_name[object_type], object_handle,
290 (allocated_with_custom ? "" : "not "));
291 }
292
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600293 delete pNode;
294 device_data->object_map[object_type].erase(item);
295 } else {
296 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle, __LINE__,
297 OBJTRACK_UNKNOWN_OBJECT, LayerName,
Mark Lobodzinski45e68612016-07-18 17:06:52 -0600298 "Unable to remove %s obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",
299 object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600300 }
301}
302
303template <typename T1, typename T2>
Chris Forbes2f271a72016-09-29 14:58:08 +1300304static bool ValidateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool null_allowed) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600305 if (null_allowed && (object == VK_NULL_HANDLE)) {
306 return false;
307 }
Chris Forbes2f271a72016-09-29 14:58:08 +1300308 auto object_handle = reinterpret_cast<uint64_t &>(object);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600309 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +1300310 if (device_data->object_map[object_type].find(object_handle) == device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600311 // If object is an image, also look for it in the swapchain image map
312 if ((object_type != VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT) ||
Chris Forbes2f271a72016-09-29 14:58:08 +1300313 (device_data->swapchainImageMap.find(object_handle) == device_data->swapchainImageMap.end())) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600314 return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type,
Chris Forbes2f271a72016-09-29 14:58:08 +1300315 object_handle, __LINE__, OBJTRACK_INVALID_OBJECT, LayerName,
316 "Invalid %s Object 0x%" PRIxLEAST64, object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600317 }
318 }
319 return false;
320}
321
322static void DeviceReportUndestroyedObjects(VkDevice device, VkDebugReportObjectTypeEXT object_type) {
323 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
324 for (auto item = device_data->object_map[object_type].begin(); item != device_data->object_map[object_type].end();) {
325 OBJTRACK_NODE *object_info = item->second;
326 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_info->object_type, object_info->handle, __LINE__,
327 OBJTRACK_OBJECT_LEAK, LayerName,
328 "OBJ ERROR : For device 0x%" PRIxLEAST64 ", %s object 0x%" PRIxLEAST64 " has not been destroyed.",
329 reinterpret_cast<uint64_t>(device), object_name[object_type], object_info->handle);
330 item = device_data->object_map[object_type].erase(item);
331 }
332}
333
334VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
335 std::unique_lock<std::mutex> lock(global_lock);
336
337 dispatch_key key = get_dispatch_key(instance);
338 layer_data *instance_data = get_my_data_ptr(key, layer_data_map);
339
340 // Enable the temporary callback(s) here to catch cleanup issues:
341 bool callback_setup = false;
342 if (instance_data->num_tmp_callbacks > 0) {
343 if (!layer_enable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks,
344 instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks)) {
345 callback_setup = true;
346 }
347 }
348
Chris Forbes2f271a72016-09-29 14:58:08 +1300349 ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600350
Chris Forbesec461992016-09-29 14:41:44 +1300351 DestroyObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600352 // Report any remaining objects in LL
353
354 for (auto iit = instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].begin();
355 iit != instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].end();) {
356 OBJTRACK_NODE *pNode = iit->second;
357
358 VkDevice device = reinterpret_cast<VkDevice>(pNode->handle);
359
360 log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, pNode->handle, __LINE__,
361 OBJTRACK_OBJECT_LEAK, LayerName, "OBJ ERROR : %s object 0x%" PRIxLEAST64 " has not been destroyed.",
362 string_VkDebugReportObjectTypeEXT(pNode->object_type), pNode->handle);
363 // Semaphore:
364 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT);
365 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT);
366 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT);
367 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT);
368 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
369 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
370 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT);
371 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT);
372 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT);
373 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT);
374 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT);
375 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT);
376 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT);
377 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT);
378 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT);
379 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT);
380 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT);
381 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT);
382 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
383 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT);
384 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT);
385 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT);
386 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
387 }
388 instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].clear();
389
390 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
391 pInstanceTable->DestroyInstance(instance, pAllocator);
392
393 // Disable and cleanup the temporary callback(s):
394 if (callback_setup) {
395 layer_disable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks, instance_data->tmp_callbacks);
396 }
397 if (instance_data->num_tmp_callbacks > 0) {
398 layer_free_tmp_callbacks(instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks);
399 instance_data->num_tmp_callbacks = 0;
400 }
401
402 // Clean up logging callback, if any
403 while (instance_data->logging_callback.size() > 0) {
404 VkDebugReportCallbackEXT callback = instance_data->logging_callback.back();
405 layer_destroy_msg_callback(instance_data->report_data, callback, pAllocator);
406 instance_data->logging_callback.pop_back();
407 }
408
409 layer_debug_report_destroy_instance(instance_data->report_data);
410 layer_data_map.erase(key);
411
412 instanceExtMap.erase(pInstanceTable);
413 lock.unlock();
414 ot_instance_table_map.erase(key);
415}
416
417VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
418
419 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300420 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Chris Forbesec461992016-09-29 14:41:44 +1300421 DestroyObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600422
423 // Report any remaining objects associated with this VkDevice object in LL
424 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT);
425 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT);
426 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT);
427 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
428 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
429 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT);
430 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT);
431 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT);
432 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT);
433 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT);
434 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT);
435 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT);
436 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT);
437 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT);
438 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT);
439 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT);
440 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT);
441 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
442 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT);
443 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT);
444 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT);
445 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT);
446 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
447
448 // Clean up Queue's MemRef Linked Lists
449 DestroyQueueDataStructures(device);
450
451 lock.unlock();
452
453 dispatch_key key = get_dispatch_key(device);
454 VkLayerDispatchTable *pDisp = get_dispatch_table(ot_device_table_map, device);
455 pDisp->DestroyDevice(device, pAllocator);
456 ot_device_table_map.erase(key);
457}
458
459VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
460 bool skip_call = false;
461 {
462 std::lock_guard<std::mutex> lock(global_lock);
463 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300464 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600465 }
466 if (skip_call) {
467 return;
468 }
469 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
470}
471
472VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
473 VkFormatProperties *pFormatProperties) {
474 bool skip_call = false;
475 {
476 std::lock_guard<std::mutex> lock(global_lock);
477 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300478 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600479 }
480 if (skip_call) {
481 return;
482 }
483 get_dispatch_table(ot_instance_table_map, physicalDevice)
484 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
485}
486
487VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
488 VkImageType type, VkImageTiling tiling,
489 VkImageUsageFlags usage, VkImageCreateFlags flags,
490 VkImageFormatProperties *pImageFormatProperties) {
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 VK_ERROR_VALIDATION_FAILED_EXT;
499 }
500 VkResult result =
501 get_dispatch_table(ot_instance_table_map, physicalDevice)
502 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
503 return result;
504}
505
506VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
507 bool skip_call = false;
508 {
509 std::lock_guard<std::mutex> lock(global_lock);
510 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300511 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600512 }
513 if (skip_call) {
514 return;
515 }
516 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
517}
518
519VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
520 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
521 bool skip_call = false;
522 {
523 std::lock_guard<std::mutex> lock(global_lock);
524 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300525 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600526 }
527 if (skip_call) {
528 return;
529 }
530 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
531}
532
533VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *pName);
534
535VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *pName);
536
537VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount,
538 VkExtensionProperties *pProperties);
539
540VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pPropertyCount, VkLayerProperties *pProperties);
541
542VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
543 VkLayerProperties *pProperties);
544
545VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
546 bool skip_call = false;
547 {
548 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300549 skip_call |= ValidateObject(queue, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600550 if (pSubmits) {
551 for (uint32_t idx0 = 0; idx0 < submitCount; ++idx0) {
552 if (pSubmits[idx0].pCommandBuffers) {
553 for (uint32_t idx1 = 0; idx1 < pSubmits[idx0].commandBufferCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300554 skip_call |= ValidateObject(queue, pSubmits[idx0].pCommandBuffers[idx1],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600555 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
556 }
557 }
558 if (pSubmits[idx0].pSignalSemaphores) {
559 for (uint32_t idx2 = 0; idx2 < pSubmits[idx0].signalSemaphoreCount; ++idx2) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300560 skip_call |= ValidateObject(queue, pSubmits[idx0].pSignalSemaphores[idx2],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600561 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
562 }
563 }
564 if (pSubmits[idx0].pWaitSemaphores) {
565 for (uint32_t idx3 = 0; idx3 < pSubmits[idx0].waitSemaphoreCount; ++idx3) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300566 skip_call |= ValidateObject(queue, pSubmits[idx0].pWaitSemaphores[idx3],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600567 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
568 }
569 }
570 }
571 }
572 if (queue) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300573 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600574 }
575 }
576 if (skip_call) {
577 return VK_ERROR_VALIDATION_FAILED_EXT;
578 }
579 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
580 return result;
581}
582
583VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
584 bool skip_call = false;
585 {
586 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300587 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600588 }
589 if (skip_call) {
590 return VK_ERROR_VALIDATION_FAILED_EXT;
591 }
592 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueWaitIdle(queue);
593 return result;
594}
595
596VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
597 bool skip_call = false;
598 {
599 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300600 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600601 }
602 if (skip_call) {
603 return VK_ERROR_VALIDATION_FAILED_EXT;
604 }
605 VkResult result = get_dispatch_table(ot_device_table_map, device)->DeviceWaitIdle(device);
606 return result;
607}
608
609VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
610 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
611 bool skip_call = false;
612 {
613 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300614 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600615 }
616 if (skip_call) {
617 return VK_ERROR_VALIDATION_FAILED_EXT;
618 }
619 VkResult result = get_dispatch_table(ot_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
620 {
621 std::lock_guard<std::mutex> lock(global_lock);
622 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300623 CreateObject(device, *pMemory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600624 }
625 }
626 return result;
627}
628
629VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
630 const VkMappedMemoryRange *pMemoryRanges) {
631 bool skip_call = false;
632 {
633 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300634 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600635 if (pMemoryRanges) {
636 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
637 if (pMemoryRanges[idx0].memory) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300638 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600639 VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
640 }
641 }
642 }
643 }
644 if (skip_call) {
645 return VK_ERROR_VALIDATION_FAILED_EXT;
646 }
647 VkResult result =
648 get_dispatch_table(ot_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
649 return result;
650}
651
652VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
653 const VkMappedMemoryRange *pMemoryRanges) {
654 bool skip_call = false;
655 {
656 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300657 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600658 if (pMemoryRanges) {
659 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
660 if (pMemoryRanges[idx0].memory) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300661 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600662 VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
663 }
664 }
665 }
666 }
667 if (skip_call) {
668 return VK_ERROR_VALIDATION_FAILED_EXT;
669 }
670 VkResult result =
671 get_dispatch_table(ot_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
672 return result;
673}
674
675VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
676 VkDeviceSize *pCommittedMemoryInBytes) {
677 bool skip_call = false;
678 {
679 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300680 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
681 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600682 }
683 if (skip_call) {
684 return;
685 }
686 get_dispatch_table(ot_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
687}
688
689VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
690 VkDeviceSize memoryOffset) {
691 bool skip_call = false;
692 {
693 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300694 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
695 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
696 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600697 }
698 if (skip_call) {
699 return VK_ERROR_VALIDATION_FAILED_EXT;
700 }
701 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
702 return result;
703}
704
705VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
706 bool skip_call = false;
707 {
708 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300709 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
710 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
711 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600712 }
713 if (skip_call) {
714 return VK_ERROR_VALIDATION_FAILED_EXT;
715 }
716 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
717 return result;
718}
719
720VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
721 VkMemoryRequirements *pMemoryRequirements) {
722 bool skip_call = false;
723 {
724 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300725 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
726 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600727 }
728 if (skip_call) {
729 return;
730 }
731 get_dispatch_table(ot_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
732}
733
734VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
735 bool skip_call = false;
736 {
737 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300738 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
739 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600740 }
741 if (skip_call) {
742 return;
743 }
744 get_dispatch_table(ot_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
745}
746
747VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
748 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
749 bool skip_call = false;
750 {
751 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300752 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
753 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600754 }
755 if (skip_call) {
756 return;
757 }
758 get_dispatch_table(ot_device_table_map, device)
759 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
760}
761
762VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
763 VkImageType type, VkSampleCountFlagBits samples,
764 VkImageUsageFlags usage, VkImageTiling tiling,
765 uint32_t *pPropertyCount,
766 VkSparseImageFormatProperties *pProperties) {
767 bool skip_call = false;
768 {
769 std::lock_guard<std::mutex> lock(global_lock);
770 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +1300771 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600772 }
773 if (skip_call) {
774 return;
775 }
776 get_dispatch_table(ot_instance_table_map, physicalDevice)
777 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
778 pProperties);
779}
780
781VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
782 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
783 bool skip_call = false;
784 {
785 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300786 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600787 }
788 if (skip_call) {
789 return VK_ERROR_VALIDATION_FAILED_EXT;
790 }
791 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
792 {
793 std::lock_guard<std::mutex> lock(global_lock);
794 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300795 CreateObject(device, *pFence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600796 }
797 }
798 return result;
799}
800
801VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
802 bool skip_call = false;
803 {
804 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300805 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
806 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600807 }
808 if (skip_call) {
809 return;
810 }
811 {
812 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300813 DestroyObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600814 }
815 get_dispatch_table(ot_device_table_map, device)->DestroyFence(device, fence, pAllocator);
816}
817
818VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
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);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600823 if (pFences) {
824 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300825 skip_call |= ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600826 }
827 }
828 }
829 if (skip_call) {
830 return VK_ERROR_VALIDATION_FAILED_EXT;
831 }
832 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetFences(device, fenceCount, pFences);
833 return result;
834}
835
836VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
837 bool skip_call = false;
838 {
839 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300840 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
841 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600842 }
843 if (skip_call) {
844 return VK_ERROR_VALIDATION_FAILED_EXT;
845 }
846 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetFenceStatus(device, fence);
847 return result;
848}
849
850VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
851 uint64_t timeout) {
852 bool skip_call = false;
853 {
854 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300855 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600856 if (pFences) {
857 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300858 skip_call |= ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600859 }
860 }
861 }
862 if (skip_call) {
863 return VK_ERROR_VALIDATION_FAILED_EXT;
864 }
865 VkResult result = get_dispatch_table(ot_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
866 return result;
867}
868
869VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
870 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
871 bool skip_call = false;
872 {
873 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300874 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600875 }
876 if (skip_call) {
877 return VK_ERROR_VALIDATION_FAILED_EXT;
878 }
879 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
880 {
881 std::lock_guard<std::mutex> lock(global_lock);
882 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300883 CreateObject(device, *pSemaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600884 }
885 }
886 return result;
887}
888
889VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
890 bool skip_call = false;
891 {
892 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300893 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
894 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600895 }
896 if (skip_call) {
897 return;
898 }
899 {
900 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300901 DestroyObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600902 }
903 get_dispatch_table(ot_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
904}
905
906VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
907 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
908 bool skip_call = false;
909 {
910 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300911 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600912 }
913 if (skip_call) {
914 return VK_ERROR_VALIDATION_FAILED_EXT;
915 }
916 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
917 {
918 std::lock_guard<std::mutex> lock(global_lock);
919 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300920 CreateObject(device, *pEvent, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600921 }
922 }
923 return result;
924}
925
926VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
927 bool skip_call = false;
928 {
929 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300930 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
931 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600932 }
933 if (skip_call) {
934 return;
935 }
936 {
937 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300938 DestroyObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600939 }
940 get_dispatch_table(ot_device_table_map, device)->DestroyEvent(device, event, pAllocator);
941}
942
943VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
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 VK_ERROR_VALIDATION_FAILED_EXT;
952 }
953 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetEventStatus(device, event);
954 return result;
955}
956
957VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
958 bool skip_call = false;
959 {
960 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300961 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
962 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600963 }
964 if (skip_call) {
965 return VK_ERROR_VALIDATION_FAILED_EXT;
966 }
967 VkResult result = get_dispatch_table(ot_device_table_map, device)->SetEvent(device, event);
968 return result;
969}
970
971VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
972 bool skip_call = false;
973 {
974 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300975 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
976 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600977 }
978 if (skip_call) {
979 return VK_ERROR_VALIDATION_FAILED_EXT;
980 }
981 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetEvent(device, event);
982 return result;
983}
984
985VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
986 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
987 bool skip_call = false;
988 {
989 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +1300990 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600991 }
992 if (skip_call) {
993 return VK_ERROR_VALIDATION_FAILED_EXT;
994 }
995 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
996 {
997 std::lock_guard<std::mutex> lock(global_lock);
998 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300999 CreateObject(device, *pQueryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001000 }
1001 }
1002 return result;
1003}
1004
1005VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
1006 bool skip_call = false;
1007 {
1008 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001009 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1010 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001011 }
1012 if (skip_call) {
1013 return;
1014 }
1015 {
1016 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001017 DestroyObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001018 }
1019 get_dispatch_table(ot_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
1020}
1021
1022VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
1023 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
1024 bool skip_call = false;
1025 {
1026 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001027 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1028 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001029 }
1030 if (skip_call) {
1031 return VK_ERROR_VALIDATION_FAILED_EXT;
1032 }
1033 VkResult result = get_dispatch_table(ot_device_table_map, device)
1034 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
1035 return result;
1036}
1037
1038VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
1039 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
1040 bool skip_call = false;
1041 {
1042 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001043 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001044 }
1045 if (skip_call) {
1046 return VK_ERROR_VALIDATION_FAILED_EXT;
1047 }
1048 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
1049 {
1050 std::lock_guard<std::mutex> lock(global_lock);
1051 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001052 CreateObject(device, *pBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001053 }
1054 }
1055 return result;
1056}
1057
1058VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
1059 bool skip_call = false;
1060 {
1061 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001062 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
1063 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001064 }
1065 if (skip_call) {
1066 return;
1067 }
1068 {
1069 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001070 DestroyObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001071 }
1072 get_dispatch_table(ot_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
1073}
1074
1075VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
1076 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
1077 bool skip_call = false;
1078 {
1079 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001080 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001081 if (pCreateInfo) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001082 skip_call |= ValidateObject(device, pCreateInfo->buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001083 }
1084 }
1085 if (skip_call) {
1086 return VK_ERROR_VALIDATION_FAILED_EXT;
1087 }
1088 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
1089 {
1090 std::lock_guard<std::mutex> lock(global_lock);
1091 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001092 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001093 }
1094 }
1095 return result;
1096}
1097
1098VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
1099 bool skip_call = false;
1100 {
1101 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001102 skip_call |= ValidateObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, false);
1103 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001104 }
1105 if (skip_call) {
1106 return;
1107 }
1108 {
1109 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001110 DestroyObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001111 }
1112 get_dispatch_table(ot_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
1113}
1114
1115VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
1116 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
1117 bool skip_call = false;
1118 {
1119 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001120 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 VK_ERROR_VALIDATION_FAILED_EXT;
1124 }
1125 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
1126 {
1127 std::lock_guard<std::mutex> lock(global_lock);
1128 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001129 CreateObject(device, *pImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001130 }
1131 }
1132 return result;
1133}
1134
1135VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
1136 bool skip_call = false;
1137 {
1138 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001139 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1140 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001141 }
1142 if (skip_call) {
1143 return;
1144 }
1145 {
1146 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001147 DestroyObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001148 }
1149 get_dispatch_table(ot_device_table_map, device)->DestroyImage(device, image, pAllocator);
1150}
1151
1152VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
1153 VkSubresourceLayout *pLayout) {
1154 bool skip_call = false;
1155 {
1156 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001157 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1158 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001159 }
1160 if (skip_call) {
1161 return;
1162 }
1163 get_dispatch_table(ot_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
1164}
1165
1166VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
1167 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
1168 bool skip_call = false;
1169 {
1170 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001171 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001172 if (pCreateInfo) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001173 skip_call |= ValidateObject(device, pCreateInfo->image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001174 }
1175 }
1176 if (skip_call) {
1177 return VK_ERROR_VALIDATION_FAILED_EXT;
1178 }
1179 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
1180 {
1181 std::lock_guard<std::mutex> lock(global_lock);
1182 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001183 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001184 }
1185 }
1186 return result;
1187}
1188
1189VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
1190 bool skip_call = false;
1191 {
1192 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001193 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1194 skip_call |= ValidateObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001195 }
1196 if (skip_call) {
1197 return;
1198 }
1199 {
1200 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001201 DestroyObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001202 }
1203 get_dispatch_table(ot_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
1204}
1205
1206VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
1207 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
1208 bool skip_call = false;
1209 {
1210 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001211 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001212 }
1213 if (skip_call) {
1214 return VK_ERROR_VALIDATION_FAILED_EXT;
1215 }
1216 VkResult result =
1217 get_dispatch_table(ot_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
1218 {
1219 std::lock_guard<std::mutex> lock(global_lock);
1220 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001221 CreateObject(device, *pShaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001222 }
1223 }
1224 return result;
1225}
1226
1227VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1228 const VkAllocationCallbacks *pAllocator) {
1229 bool skip_call = false;
1230 {
1231 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001232 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1233 skip_call |= ValidateObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001234 }
1235 if (skip_call) {
1236 return;
1237 }
1238 {
1239 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001240 DestroyObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001241 }
1242 get_dispatch_table(ot_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
1243}
1244
1245VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
1246 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
1247 bool skip_call = false;
1248 {
1249 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001250 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001251 }
1252 if (skip_call) {
1253 return VK_ERROR_VALIDATION_FAILED_EXT;
1254 }
1255 VkResult result =
1256 get_dispatch_table(ot_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
1257 {
1258 std::lock_guard<std::mutex> lock(global_lock);
1259 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001260 CreateObject(device, *pPipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001261 }
1262 }
1263 return result;
1264}
1265
1266VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
1267 const VkAllocationCallbacks *pAllocator) {
1268 bool skip_call = false;
1269 {
1270 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001271 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1272 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001273 }
1274 if (skip_call) {
1275 return;
1276 }
1277 {
1278 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001279 DestroyObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001280 }
1281 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
1282}
1283
1284VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
1285 void *pData) {
1286 bool skip_call = false;
1287 {
1288 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001289 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1290 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001291 }
1292 if (skip_call) {
1293 return VK_ERROR_VALIDATION_FAILED_EXT;
1294 }
1295 VkResult result =
1296 get_dispatch_table(ot_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
1297 return result;
1298}
1299
1300VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
1301 const VkPipelineCache *pSrcCaches) {
1302 bool skip_call = false;
1303 {
1304 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001305 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1306 skip_call |= ValidateObject(device, dstCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001307 if (pSrcCaches) {
1308 for (uint32_t idx0 = 0; idx0 < srcCacheCount; ++idx0) {
1309 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001310 ValidateObject(device, pSrcCaches[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001311 }
1312 }
1313 }
1314 if (skip_call) {
1315 return VK_ERROR_VALIDATION_FAILED_EXT;
1316 }
1317 VkResult result =
1318 get_dispatch_table(ot_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
1319 return result;
1320}
1321
1322VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
1323 bool skip_call = false;
1324 {
1325 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001326 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1327 skip_call |= ValidateObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001328 }
1329 if (skip_call) {
1330 return;
1331 }
1332 {
1333 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001334 DestroyObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001335 }
1336 get_dispatch_table(ot_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
1337}
1338
1339VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
1340 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
1341 bool skip_call = false;
1342 {
1343 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001344 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001345 if (pCreateInfo) {
1346 if (pCreateInfo->pSetLayouts) {
1347 for (uint32_t idx0 = 0; idx0 < pCreateInfo->setLayoutCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001348 skip_call |= ValidateObject(device, pCreateInfo->pSetLayouts[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001349 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false);
1350 }
1351 }
1352 }
1353 }
1354 if (skip_call) {
1355 return VK_ERROR_VALIDATION_FAILED_EXT;
1356 }
1357 VkResult result =
1358 get_dispatch_table(ot_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
1359 {
1360 std::lock_guard<std::mutex> lock(global_lock);
1361 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001362 CreateObject(device, *pPipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001363 }
1364 }
1365 return result;
1366}
1367
1368VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1369 const VkAllocationCallbacks *pAllocator) {
1370 bool skip_call = false;
1371 {
1372 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001373 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1374 skip_call |= ValidateObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001375 }
1376 if (skip_call) {
1377 return;
1378 }
1379 {
1380 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001381 DestroyObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001382 }
1383 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
1384}
1385
1386VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
1387 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
1388 bool skip_call = false;
1389 {
1390 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001391 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001392 }
1393 if (skip_call) {
1394 return VK_ERROR_VALIDATION_FAILED_EXT;
1395 }
1396 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
1397 {
1398 std::lock_guard<std::mutex> lock(global_lock);
1399 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001400 CreateObject(device, *pSampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001401 }
1402 }
1403 return result;
1404}
1405
1406VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
1407 bool skip_call = false;
1408 {
1409 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001410 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1411 skip_call |= ValidateObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001412 }
1413 if (skip_call) {
1414 return;
1415 }
1416 {
1417 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001418 DestroyObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001419 }
1420 get_dispatch_table(ot_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
1421}
1422
1423VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
1424 const VkAllocationCallbacks *pAllocator,
1425 VkDescriptorSetLayout *pSetLayout) {
1426 bool skip_call = false;
1427 {
1428 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001429 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001430 if (pCreateInfo) {
1431 if (pCreateInfo->pBindings) {
1432 for (uint32_t idx0 = 0; idx0 < pCreateInfo->bindingCount; ++idx0) {
1433 if (pCreateInfo->pBindings[idx0].pImmutableSamplers) {
1434 for (uint32_t idx1 = 0; idx1 < pCreateInfo->pBindings[idx0].descriptorCount; ++idx1) {
1435 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001436 ValidateObject(device, pCreateInfo->pBindings[idx0].pImmutableSamplers[idx1],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001437 VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false);
1438 }
1439 }
1440 }
1441 }
1442 }
1443 }
1444 if (skip_call) {
1445 return VK_ERROR_VALIDATION_FAILED_EXT;
1446 }
1447 VkResult result =
1448 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
1449 {
1450 std::lock_guard<std::mutex> lock(global_lock);
1451 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001452 CreateObject(device, *pSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001453 }
1454 }
1455 return result;
1456}
1457
1458VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1459 const VkAllocationCallbacks *pAllocator) {
1460 bool skip_call = false;
1461 {
1462 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001463 skip_call |= ValidateObject(device, descriptorSetLayout,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001464 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false);
Chris Forbes2f271a72016-09-29 14:58:08 +13001465 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001466 }
1467 if (skip_call) {
1468 return;
1469 }
1470 {
1471 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001472 DestroyObject(device, descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001473 }
1474 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
1475}
1476
1477VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
1478 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
1479 bool skip_call = false;
1480 {
1481 std::lock_guard<std::mutex> lock(global_lock);
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 VK_ERROR_VALIDATION_FAILED_EXT;
1486 }
1487 VkResult result =
1488 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
1489 {
1490 std::lock_guard<std::mutex> lock(global_lock);
1491 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001492 CreateObject(device, *pDescriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001493 }
1494 }
1495 return result;
1496}
1497
1498VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1499 VkDescriptorPoolResetFlags flags) {
1500 bool skip_call = false;
1501 {
1502 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001503 skip_call |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
1504 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001505 }
1506 if (skip_call) {
1507 return VK_ERROR_VALIDATION_FAILED_EXT;
1508 }
1509 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
1510 return result;
1511}
1512
1513VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
1514 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
1515 const VkCopyDescriptorSet *pDescriptorCopies) {
1516 bool skip_call = false;
1517 {
1518 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001519 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001520 if (pDescriptorCopies) {
1521 for (uint32_t idx0 = 0; idx0 < descriptorCopyCount; ++idx0) {
1522 if (pDescriptorCopies[idx0].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001523 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].dstSet,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001524 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1525 }
1526 if (pDescriptorCopies[idx0].srcSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001527 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].srcSet,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001528 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1529 }
1530 }
1531 }
1532 if (pDescriptorWrites) {
1533 for (uint32_t idx1 = 0; idx1 < descriptorWriteCount; ++idx1) {
1534 if (pDescriptorWrites[idx1].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001535 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].dstSet,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001536 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1537 }
1538 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
1539 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
1540 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
1541 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
1542 for (uint32_t idx2 = 0; idx2 < pDescriptorWrites[idx1].descriptorCount; ++idx2) {
1543 if (pDescriptorWrites[idx1].pBufferInfo[idx2].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001544 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pBufferInfo[idx2].buffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001545 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
1546 }
1547 }
1548 }
1549 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
1550 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
1551 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) ||
1552 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
1553 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)) {
1554 for (uint32_t idx3 = 0; idx3 < pDescriptorWrites[idx1].descriptorCount; ++idx3) {
1555 if (pDescriptorWrites[idx1].pImageInfo[idx3].imageView) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001556 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pImageInfo[idx3].imageView,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001557 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false);
1558 }
1559 if (pDescriptorWrites[idx1].pImageInfo[idx3].sampler) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001560 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pImageInfo[idx3].sampler,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001561 VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false);
1562 }
1563 }
1564 }
1565 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
1566 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
1567 for (uint32_t idx4 = 0; idx4 < pDescriptorWrites[idx1].descriptorCount; ++idx4) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001568 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pTexelBufferView[idx4],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001569 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, true);
1570 }
1571 }
1572 }
1573 }
1574 }
1575 if (skip_call) {
1576 return;
1577 }
1578 get_dispatch_table(ot_device_table_map, device)
1579 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
1580}
1581
1582VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
1583 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
1584 bool skip_call = false;
1585 {
1586 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001587 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001588 if (pCreateInfo) {
1589 if (pCreateInfo->pAttachments) {
1590 for (uint32_t idx0 = 0; idx0 < pCreateInfo->attachmentCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001591 skip_call |= ValidateObject(device, pCreateInfo->pAttachments[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001592 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false);
1593 }
1594 }
1595 if (pCreateInfo->renderPass) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001596 skip_call |= ValidateObject(device, pCreateInfo->renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001597 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
1598 }
1599 }
1600 }
1601 if (skip_call) {
1602 return VK_ERROR_VALIDATION_FAILED_EXT;
1603 }
1604 VkResult result =
1605 get_dispatch_table(ot_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
1606 {
1607 std::lock_guard<std::mutex> lock(global_lock);
1608 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001609 CreateObject(device, *pFramebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001610 }
1611 }
1612 return result;
1613}
1614
1615VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
1616 bool skip_call = false;
1617 {
1618 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001619 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1620 skip_call |= ValidateObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001621 }
1622 if (skip_call) {
1623 return;
1624 }
1625 {
1626 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001627 DestroyObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001628 }
1629 get_dispatch_table(ot_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
1630}
1631
1632VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
1633 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
1634 bool skip_call = false;
1635 {
1636 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001637 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001638 }
1639 if (skip_call) {
1640 return VK_ERROR_VALIDATION_FAILED_EXT;
1641 }
1642 VkResult result =
1643 get_dispatch_table(ot_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
1644 {
1645 std::lock_guard<std::mutex> lock(global_lock);
1646 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001647 CreateObject(device, *pRenderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001648 }
1649 }
1650 return result;
1651}
1652
1653VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
1654 bool skip_call = false;
1655 {
1656 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001657 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1658 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001659 }
1660 if (skip_call) {
1661 return;
1662 }
1663 {
1664 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001665 DestroyObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001666 }
1667 get_dispatch_table(ot_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
1668}
1669
1670VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
1671 bool skip_call = false;
1672 {
1673 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001674 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
1675 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001676 }
1677 if (skip_call) {
1678 return;
1679 }
1680 get_dispatch_table(ot_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
1681}
1682
1683VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1684 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
1685 bool skip_call = false;
1686 {
1687 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001688 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001689 }
1690 if (skip_call) {
1691 return VK_ERROR_VALIDATION_FAILED_EXT;
1692 }
1693 VkResult result =
1694 get_dispatch_table(ot_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
1695 {
1696 std::lock_guard<std::mutex> lock(global_lock);
1697 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001698 CreateObject(device, *pCommandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001699 }
1700 }
1701 return result;
1702}
1703
1704VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
1705 bool skip_call = false;
1706 {
1707 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001708 skip_call |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
1709 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001710 }
1711 if (skip_call) {
1712 return VK_ERROR_VALIDATION_FAILED_EXT;
1713 }
1714 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
1715 return result;
1716}
1717
1718VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer command_buffer, const VkCommandBufferBeginInfo *begin_info) {
1719 layer_data *device_data = get_my_data_ptr(get_dispatch_key(command_buffer), layer_data_map);
1720 bool skip_call = false;
1721 {
1722 std::lock_guard<std::mutex> lock(global_lock);
1723 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001724 ValidateObject(command_buffer, command_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001725 if (begin_info) {
1726 OBJTRACK_NODE *pNode =
1727 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<const uint64_t>(command_buffer)];
1728 if ((begin_info->pInheritanceInfo) && (pNode->status & OBJSTATUS_COMMAND_BUFFER_SECONDARY)) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001729 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->framebuffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001730 VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, true);
Chris Forbes2f271a72016-09-29 14:58:08 +13001731 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001732 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, true);
1733 }
1734 }
1735 }
1736 if (skip_call) {
1737 return VK_ERROR_VALIDATION_FAILED_EXT;
1738 }
1739 VkResult result = get_dispatch_table(ot_device_table_map, command_buffer)->BeginCommandBuffer(command_buffer, begin_info);
1740 return result;
1741}
1742
1743VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
1744 bool skip_call = false;
1745 {
1746 std::lock_guard<std::mutex> lock(global_lock);
1747 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001748 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001749 }
1750 if (skip_call) {
1751 return VK_ERROR_VALIDATION_FAILED_EXT;
1752 }
1753 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
1754 return result;
1755}
1756
1757VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
1758 bool skip_call = false;
1759 {
1760 std::lock_guard<std::mutex> lock(global_lock);
1761 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001762 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001763 }
1764 if (skip_call) {
1765 return VK_ERROR_VALIDATION_FAILED_EXT;
1766 }
1767 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
1768 return result;
1769}
1770
1771VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1772 VkPipeline pipeline) {
1773 bool skip_call = false;
1774 {
1775 std::lock_guard<std::mutex> lock(global_lock);
1776 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001777 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
1778 skip_call |= ValidateObject(commandBuffer, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001779 }
1780 if (skip_call) {
1781 return;
1782 }
1783 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
1784}
1785
1786VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
1787 const VkViewport *pViewports) {
1788 bool skip_call = false;
1789 {
1790 std::lock_guard<std::mutex> lock(global_lock);
1791 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001792 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001793 }
1794 if (skip_call) {
1795 return;
1796 }
1797 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
1798}
1799
1800VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
1801 const VkRect2D *pScissors) {
1802 bool skip_call = false;
1803 {
1804 std::lock_guard<std::mutex> lock(global_lock);
1805 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001806 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_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)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
1812}
1813
1814VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
1815 bool skip_call = false;
1816 {
1817 std::lock_guard<std::mutex> lock(global_lock);
1818 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001819 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001820 }
1821 if (skip_call) {
1822 return;
1823 }
1824 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
1825}
1826
1827VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
1828 float depthBiasSlopeFactor) {
1829 bool skip_call = false;
1830 {
1831 std::lock_guard<std::mutex> lock(global_lock);
1832 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001833 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001834 }
1835 if (skip_call) {
1836 return;
1837 }
1838 get_dispatch_table(ot_device_table_map, commandBuffer)
1839 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
1840}
1841
1842VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
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)->CmdSetBlendConstants(commandBuffer, blendConstants);
1853}
1854
1855VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
1856 bool skip_call = false;
1857 {
1858 std::lock_guard<std::mutex> lock(global_lock);
1859 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001860 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001861 }
1862 if (skip_call) {
1863 return;
1864 }
1865 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
1866}
1867
1868VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
1869 uint32_t compareMask) {
1870 bool skip_call = false;
1871 {
1872 std::lock_guard<std::mutex> lock(global_lock);
1873 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001874 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001875 }
1876 if (skip_call) {
1877 return;
1878 }
1879 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
1880}
1881
1882VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
1883 bool skip_call = false;
1884 {
1885 std::lock_guard<std::mutex> lock(global_lock);
1886 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001887 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001888 }
1889 if (skip_call) {
1890 return;
1891 }
1892 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
1893}
1894
1895VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
1896 bool skip_call = false;
1897 {
1898 std::lock_guard<std::mutex> lock(global_lock);
1899 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001900 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001901 }
1902 if (skip_call) {
1903 return;
1904 }
1905 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
1906}
1907
1908VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1909 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
1910 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
1911 const uint32_t *pDynamicOffsets) {
1912 bool skip_call = false;
1913 {
1914 std::lock_guard<std::mutex> lock(global_lock);
1915 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001916 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
1917 skip_call |= ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001918 if (pDescriptorSets) {
1919 for (uint32_t idx0 = 0; idx0 < descriptorSetCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001920 skip_call |= ValidateObject(commandBuffer, pDescriptorSets[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001921 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
1922 }
1923 }
1924 }
1925 if (skip_call) {
1926 return;
1927 }
1928 get_dispatch_table(ot_device_table_map, commandBuffer)
1929 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
1930 dynamicOffsetCount, pDynamicOffsets);
1931}
1932
1933VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1934 VkIndexType indexType) {
1935 bool skip_call = false;
1936 {
1937 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13001938 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001939 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001940 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001941 }
1942 if (skip_call) {
1943 return;
1944 }
1945 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
1946}
1947
1948VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
1949 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
1950 bool skip_call = false;
1951 {
1952 std::lock_guard<std::mutex> lock(global_lock);
1953 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001954 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001955 if (pBuffers) {
1956 for (uint32_t idx0 = 0; idx0 < bindingCount; ++idx0) {
1957 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001958 ValidateObject(commandBuffer, pBuffers[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001959 }
1960 }
1961 }
1962 if (skip_call) {
1963 return;
1964 }
1965 get_dispatch_table(ot_device_table_map, commandBuffer)
1966 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
1967}
1968
1969VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
1970 uint32_t firstVertex, uint32_t firstInstance) {
1971 bool skip_call = false;
1972 {
1973 std::lock_guard<std::mutex> lock(global_lock);
1974 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001975 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001976 }
1977 if (skip_call) {
1978 return;
1979 }
1980 get_dispatch_table(ot_device_table_map, commandBuffer)
1981 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
1982}
1983
1984VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
1985 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
1986 bool skip_call = false;
1987 {
1988 std::lock_guard<std::mutex> lock(global_lock);
1989 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13001990 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001991 }
1992 if (skip_call) {
1993 return;
1994 }
1995 get_dispatch_table(ot_device_table_map, commandBuffer)
1996 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
1997}
1998
1999VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
2000 uint32_t stride) {
2001 bool skip_call = false;
2002 {
2003 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002004 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002005 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002006 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002007 }
2008 if (skip_call) {
2009 return;
2010 }
2011 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
2012}
2013
2014VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2015 uint32_t drawCount, uint32_t stride) {
2016 bool skip_call = false;
2017 {
2018 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002019 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002020 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002021 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002022 }
2023 if (skip_call) {
2024 return;
2025 }
2026 get_dispatch_table(ot_device_table_map, commandBuffer)
2027 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
2028}
2029
2030VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
2031 bool skip_call = false;
2032 {
2033 std::lock_guard<std::mutex> lock(global_lock);
2034 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002035 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002036 }
2037 if (skip_call) {
2038 return;
2039 }
2040 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
2041}
2042
2043VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
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)->CmdDispatchIndirect(commandBuffer, buffer, offset);
2055}
2056
2057VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
2058 uint32_t regionCount, const VkBufferCopy *pRegions) {
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);
2064 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2065 skip_call |= ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002066 }
2067 if (skip_call) {
2068 return;
2069 }
2070 get_dispatch_table(ot_device_table_map, commandBuffer)
2071 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
2072}
2073
2074VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2075 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2076 const VkImageCopy *pRegions) {
2077 bool skip_call = false;
2078 {
2079 std::lock_guard<std::mutex> lock(global_lock);
2080 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002081 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2082 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2083 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002084 }
2085 if (skip_call) {
2086 return;
2087 }
2088 get_dispatch_table(ot_device_table_map, commandBuffer)
2089 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2090}
2091
2092VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2093 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2094 const VkImageBlit *pRegions, VkFilter filter) {
2095 bool skip_call = false;
2096 {
2097 std::lock_guard<std::mutex> lock(global_lock);
2098 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002099 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2100 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2101 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002102 }
2103 if (skip_call) {
2104 return;
2105 }
2106 get_dispatch_table(ot_device_table_map, commandBuffer)
2107 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
2108}
2109
2110VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
2111 VkImageLayout dstImageLayout, uint32_t regionCount,
2112 const VkBufferImageCopy *pRegions) {
2113 bool skip_call = false;
2114 {
2115 std::lock_guard<std::mutex> lock(global_lock);
2116 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002117 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2118 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2119 skip_call |= ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002120 }
2121 if (skip_call) {
2122 return;
2123 }
2124 get_dispatch_table(ot_device_table_map, commandBuffer)
2125 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
2126}
2127
2128VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2129 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
2130 bool skip_call = false;
2131 {
2132 std::lock_guard<std::mutex> lock(global_lock);
2133 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002134 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2135 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2136 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002137 }
2138 if (skip_call) {
2139 return;
2140 }
2141 get_dispatch_table(ot_device_table_map, commandBuffer)
2142 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
2143}
2144
2145VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2146 VkDeviceSize dataSize, const uint32_t *pData) {
2147 bool skip_call = false;
2148 {
2149 std::lock_guard<std::mutex> lock(global_lock);
2150 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002151 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2152 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002153 }
2154 if (skip_call) {
2155 return;
2156 }
2157 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
2158}
2159
2160VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2161 VkDeviceSize size, uint32_t data) {
2162 bool skip_call = false;
2163 {
2164 std::lock_guard<std::mutex> lock(global_lock);
2165 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002166 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2167 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002168 }
2169 if (skip_call) {
2170 return;
2171 }
2172 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
2173}
2174
2175VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2176 const VkClearColorValue *pColor, uint32_t rangeCount,
2177 const VkImageSubresourceRange *pRanges) {
2178 bool skip_call = false;
2179 {
2180 std::lock_guard<std::mutex> lock(global_lock);
2181 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002182 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2183 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002184 }
2185 if (skip_call) {
2186 return;
2187 }
2188 get_dispatch_table(ot_device_table_map, commandBuffer)
2189 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
2190}
2191
2192VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2193 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
2194 const VkImageSubresourceRange *pRanges) {
2195 bool skip_call = false;
2196 {
2197 std::lock_guard<std::mutex> lock(global_lock);
2198 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002199 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2200 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002201 }
2202 if (skip_call) {
2203 return;
2204 }
2205 get_dispatch_table(ot_device_table_map, commandBuffer)
2206 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
2207}
2208
2209VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
2210 const VkClearAttachment *pAttachments, uint32_t rectCount,
2211 const VkClearRect *pRects) {
2212 bool skip_call = false;
2213 {
2214 std::lock_guard<std::mutex> lock(global_lock);
2215 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002216 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002217 }
2218 if (skip_call) {
2219 return;
2220 }
2221 get_dispatch_table(ot_device_table_map, commandBuffer)
2222 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
2223}
2224
2225VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2226 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2227 const VkImageResolve *pRegions) {
2228 bool skip_call = false;
2229 {
2230 std::lock_guard<std::mutex> lock(global_lock);
2231 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002232 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2233 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2234 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002235 }
2236 if (skip_call) {
2237 return;
2238 }
2239 get_dispatch_table(ot_device_table_map, commandBuffer)
2240 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2241}
2242
2243VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
2244 bool skip_call = false;
2245 {
2246 std::lock_guard<std::mutex> lock(global_lock);
2247 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002248 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2249 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002250 }
2251 if (skip_call) {
2252 return;
2253 }
2254 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
2255}
2256
2257VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
2258 bool skip_call = false;
2259 {
2260 std::lock_guard<std::mutex> lock(global_lock);
2261 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002262 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2263 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002264 }
2265 if (skip_call) {
2266 return;
2267 }
2268 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
2269}
2270
2271VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2272 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
2273 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2274 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2275 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
2276 bool skip_call = false;
2277 {
2278 std::lock_guard<std::mutex> lock(global_lock);
2279 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002280 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002281 if (pBufferMemoryBarriers) {
2282 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2283 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002284 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002285 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2286 }
2287 }
2288 }
2289 if (pEvents) {
2290 for (uint32_t idx1 = 0; idx1 < eventCount; ++idx1) {
2291 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002292 ValidateObject(commandBuffer, pEvents[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002293 }
2294 }
2295 if (pImageMemoryBarriers) {
2296 for (uint32_t idx2 = 0; idx2 < imageMemoryBarrierCount; ++idx2) {
2297 if (pImageMemoryBarriers[idx2].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002298 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx2].image,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002299 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2300 }
2301 }
2302 }
2303 }
2304 if (skip_call) {
2305 return;
2306 }
2307 get_dispatch_table(ot_device_table_map, commandBuffer)
2308 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
2309 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2310}
2311
2312VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2313 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2314 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2315 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2316 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
2317 bool skip_call = false;
2318 {
2319 std::lock_guard<std::mutex> lock(global_lock);
2320 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002321 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002322 if (pBufferMemoryBarriers) {
2323 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2324 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002325 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002326 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2327 }
2328 }
2329 }
2330 if (pImageMemoryBarriers) {
2331 for (uint32_t idx1 = 0; idx1 < imageMemoryBarrierCount; ++idx1) {
2332 if (pImageMemoryBarriers[idx1].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002333 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx1].image,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002334 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
2335 }
2336 }
2337 }
2338 }
2339 if (skip_call) {
2340 return;
2341 }
2342 get_dispatch_table(ot_device_table_map, commandBuffer)
2343 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
2344 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2345}
2346
2347VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query,
2348 VkQueryControlFlags flags) {
2349 bool skip_call = false;
2350 {
2351 std::lock_guard<std::mutex> lock(global_lock);
2352 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002353 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2354 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002355 }
2356 if (skip_call) {
2357 return;
2358 }
2359 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, query, flags);
2360}
2361
2362VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query) {
2363 bool skip_call = false;
2364 {
2365 std::lock_guard<std::mutex> lock(global_lock);
2366 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002367 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2368 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002369 }
2370 if (skip_call) {
2371 return;
2372 }
2373 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, query);
2374}
2375
2376VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2377 uint32_t queryCount) {
2378 bool skip_call = false;
2379 {
2380 std::lock_guard<std::mutex> lock(global_lock);
2381 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002382 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2383 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002384 }
2385 if (skip_call) {
2386 return;
2387 }
2388 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
2389}
2390
2391VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2392 VkQueryPool queryPool, uint32_t query) {
2393 bool skip_call = false;
2394 {
2395 std::lock_guard<std::mutex> lock(global_lock);
2396 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002397 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2398 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002399 }
2400 if (skip_call) {
2401 return;
2402 }
2403 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
2404}
2405
2406VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2407 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2408 VkDeviceSize stride, VkQueryResultFlags flags) {
2409 bool skip_call = false;
2410 {
2411 std::lock_guard<std::mutex> lock(global_lock);
2412 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002413 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2414 skip_call |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false);
2415 skip_call |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002416 }
2417 if (skip_call) {
2418 return;
2419 }
2420 get_dispatch_table(ot_device_table_map, commandBuffer)
2421 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
2422}
2423
2424VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
2425 uint32_t offset, uint32_t size, const void *pValues) {
2426 bool skip_call = false;
2427 {
2428 std::lock_guard<std::mutex> lock(global_lock);
2429 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002430 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2431 skip_call |= ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002432 }
2433 if (skip_call) {
2434 return;
2435 }
2436 get_dispatch_table(ot_device_table_map, commandBuffer)
2437 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
2438}
2439
2440VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
2441 VkSubpassContents contents) {
2442 bool skip_call = false;
2443 {
2444 std::lock_guard<std::mutex> lock(global_lock);
2445 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002446 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002447 if (pRenderPassBegin) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002448 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->framebuffer,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002449 VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, false);
Chris Forbes2f271a72016-09-29 14:58:08 +13002450 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002451 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
2452 }
2453 }
2454 if (skip_call) {
2455 return;
2456 }
2457 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
2458}
2459
2460VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
2461 bool skip_call = false;
2462 {
2463 std::lock_guard<std::mutex> lock(global_lock);
2464 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002465 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002466 }
2467 if (skip_call) {
2468 return;
2469 }
2470 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
2471}
2472
2473VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
2474 bool skip_call = false;
2475 {
2476 std::lock_guard<std::mutex> lock(global_lock);
2477 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002478 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002479 }
2480 if (skip_call) {
2481 return;
2482 }
2483 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
2484}
2485
2486VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
2487 const VkCommandBuffer *pCommandBuffers) {
2488 bool skip_call = false;
2489 {
2490 std::lock_guard<std::mutex> lock(global_lock);
2491 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002492 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002493 if (pCommandBuffers) {
2494 for (uint32_t idx0 = 0; idx0 < commandBufferCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002495 skip_call |= ValidateObject(commandBuffer, pCommandBuffers[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002496 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
2497 }
2498 }
2499 }
2500 if (skip_call) {
2501 return;
2502 }
2503 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
2504}
2505
2506VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
2507 bool skip_call = false;
2508 {
2509 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002510 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
2511 skip_call |= ValidateObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002512 }
2513 if (skip_call) {
2514 return;
2515 }
2516 {
2517 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13002518 DestroyObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002519 }
2520 get_dispatch_table(ot_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
2521}
2522
2523VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
2524 VkSurfaceKHR surface, VkBool32 *pSupported) {
2525 bool skip_call = false;
2526 {
2527 std::lock_guard<std::mutex> lock(global_lock);
2528 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002529 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2530 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002531 }
2532 if (skip_call) {
2533 return VK_ERROR_VALIDATION_FAILED_EXT;
2534 }
2535 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2536 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
2537 return result;
2538}
2539
2540VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2541 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
2542 bool skip_call = false;
2543 {
2544 std::lock_guard<std::mutex> lock(global_lock);
2545 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002546 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2547 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002548 }
2549 if (skip_call) {
2550 return VK_ERROR_VALIDATION_FAILED_EXT;
2551 }
2552 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2553 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
2554 return result;
2555}
2556
2557VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2558 uint32_t *pSurfaceFormatCount,
2559 VkSurfaceFormatKHR *pSurfaceFormats) {
2560 bool skip_call = false;
2561 {
2562 std::lock_guard<std::mutex> lock(global_lock);
2563 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002564 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2565 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002566 }
2567 if (skip_call) {
2568 return VK_ERROR_VALIDATION_FAILED_EXT;
2569 }
2570 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2571 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
2572 return result;
2573}
2574
2575VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2576 uint32_t *pPresentModeCount,
2577 VkPresentModeKHR *pPresentModes) {
2578 bool skip_call = false;
2579 {
2580 std::lock_guard<std::mutex> lock(global_lock);
2581 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002582 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
2583 skip_call |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002584 }
2585 if (skip_call) {
2586 return VK_ERROR_VALIDATION_FAILED_EXT;
2587 }
2588 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2589 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
2590 return result;
2591}
2592
2593VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
2594 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
2595 bool skip_call = false;
2596 {
2597 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002598 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002599 if (pCreateInfo) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002600 skip_call |= ValidateObject(device, pCreateInfo->oldSwapchain,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002601 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, true);
2602 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002603 skip_call |= ValidateObject(device_data->physical_device, pCreateInfo->surface,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002604 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
2605 }
2606 }
2607 if (skip_call) {
2608 return VK_ERROR_VALIDATION_FAILED_EXT;
2609 }
2610 VkResult result =
2611 get_dispatch_table(ot_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
2612 {
2613 std::lock_guard<std::mutex> lock(global_lock);
2614 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002615 CreateObject(device, *pSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002616 }
2617 }
2618 return result;
2619}
2620
2621VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
2622 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
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);
2627 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true);
2628 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, true);
2629 skip_call |= ValidateObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002630 }
2631 if (skip_call) {
2632 return VK_ERROR_VALIDATION_FAILED_EXT;
2633 }
2634 VkResult result = get_dispatch_table(ot_device_table_map, device)
2635 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
2636 return result;
2637}
2638
2639VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
2640 bool skip_call = false;
2641 {
2642 std::lock_guard<std::mutex> lock(global_lock);
2643 if (pPresentInfo) {
2644 if (pPresentInfo->pSwapchains) {
2645 for (uint32_t idx0 = 0; idx0 < pPresentInfo->swapchainCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002646 skip_call |= ValidateObject(queue, pPresentInfo->pSwapchains[idx0],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002647 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false);
2648 }
2649 }
2650 if (pPresentInfo->pWaitSemaphores) {
2651 for (uint32_t idx1 = 0; idx1 < pPresentInfo->waitSemaphoreCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002652 skip_call |= ValidateObject(queue, pPresentInfo->pWaitSemaphores[idx1],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002653 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false);
2654 }
2655 }
2656 }
Chris Forbes2f271a72016-09-29 14:58:08 +13002657 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_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, queue)->QueuePresentKHR(queue, pPresentInfo);
2663 return result;
2664}
2665
2666#ifdef VK_USE_PLATFORM_WIN32_KHR
2667VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
2668 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2669 bool skip_call = false;
2670 {
2671 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002672 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002673 }
2674 if (skip_call) {
2675 return VK_ERROR_VALIDATION_FAILED_EXT;
2676 }
2677 VkResult result =
2678 get_dispatch_table(ot_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2679 {
2680 std::lock_guard<std::mutex> lock(global_lock);
2681 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002682 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002683 }
2684 }
2685 return result;
2686}
2687
2688VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
2689 uint32_t queueFamilyIndex) {
2690 bool skip_call = false;
2691 {
2692 std::lock_guard<std::mutex> lock(global_lock);
2693 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002694 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002695 }
2696 if (skip_call) {
2697 return VK_FALSE;
2698 }
2699 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2700 ->GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
2701 return result;
2702}
2703#endif // VK_USE_PLATFORM_WIN32_KHR
2704
2705#ifdef VK_USE_PLATFORM_XCB_KHR
2706VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
2707 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2708 bool skip_call = false;
2709 {
2710 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002711 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002712 }
2713 if (skip_call) {
2714 return VK_ERROR_VALIDATION_FAILED_EXT;
2715 }
2716 VkResult result =
2717 get_dispatch_table(ot_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2718 {
2719 std::lock_guard<std::mutex> lock(global_lock);
2720 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002721 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002722 }
2723 }
2724 return result;
2725}
2726
2727VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2728 uint32_t queueFamilyIndex, xcb_connection_t *connection,
2729 xcb_visualid_t visual_id) {
2730 bool skip_call = false;
2731 {
2732 std::lock_guard<std::mutex> lock(global_lock);
2733 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002734 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002735 }
2736 if (skip_call) {
2737 return VK_FALSE;
2738 }
2739 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2740 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
2741 return result;
2742}
2743#endif // VK_USE_PLATFORM_XCB_KHR
2744
2745#ifdef VK_USE_PLATFORM_XLIB_KHR
2746VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
2747 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2748 bool skip_call = false;
2749 {
2750 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002751 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002752 }
2753 if (skip_call) {
2754 return VK_ERROR_VALIDATION_FAILED_EXT;
2755 }
2756 VkResult result =
2757 get_dispatch_table(ot_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2758 {
2759 std::lock_guard<std::mutex> lock(global_lock);
2760 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002761 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002762 }
2763 }
2764 return result;
2765}
2766
2767VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2768 uint32_t queueFamilyIndex, Display *dpy,
2769 VisualID visualID) {
2770 bool skip_call = false;
2771 {
2772 std::lock_guard<std::mutex> lock(global_lock);
2773 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002774 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002775 }
2776 if (skip_call) {
2777 return VK_FALSE;
2778 }
2779 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2780 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
2781 return result;
2782}
2783#endif // VK_USE_PLATFORM_XLIB_KHR
2784
2785#ifdef VK_USE_PLATFORM_MIR_KHR
2786VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
2787 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2788 bool skip_call = false;
2789 {
2790 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002791 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002792 }
2793 if (skip_call) {
2794 return VK_ERROR_VALIDATION_FAILED_EXT;
2795 }
2796 VkResult result =
2797 get_dispatch_table(ot_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2798 {
2799 std::lock_guard<std::mutex> lock(global_lock);
2800 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002801 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002802 }
2803 }
2804 return result;
2805}
2806
2807VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2808 uint32_t queueFamilyIndex, MirConnection *connection) {
2809 bool skip_call = false;
2810 {
2811 std::lock_guard<std::mutex> lock(global_lock);
2812 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002813 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002814 }
2815 if (skip_call) {
2816 return VK_FALSE;
2817 }
2818 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2819 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
2820 return result;
2821}
2822#endif // VK_USE_PLATFORM_MIR_KHR
2823
2824#ifdef VK_USE_PLATFORM_WAYLAND_KHR
2825VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
2826 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2827 bool skip_call = false;
2828 {
2829 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002830 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002831 }
2832 if (skip_call) {
2833 return VK_ERROR_VALIDATION_FAILED_EXT;
2834 }
2835 VkResult result =
2836 get_dispatch_table(ot_instance_table_map, instance)->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2837 {
2838 std::lock_guard<std::mutex> lock(global_lock);
2839 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002840 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002841 }
2842 }
2843 return result;
2844}
2845
2846VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2847 uint32_t queueFamilyIndex,
2848 struct wl_display *display) {
2849 bool skip_call = false;
2850 {
2851 std::lock_guard<std::mutex> lock(global_lock);
2852 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13002853 ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002854 }
2855 if (skip_call) {
2856 return VK_FALSE;
2857 }
2858 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2859 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
2860 return result;
2861}
2862#endif // VK_USE_PLATFORM_WAYLAND_KHR
2863
2864#ifdef VK_USE_PLATFORM_ANDROID_KHR
2865VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
2866 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2867 bool skip_call = false;
2868 {
2869 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002870 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002871 }
2872 if (skip_call) {
2873 return VK_ERROR_VALIDATION_FAILED_EXT;
2874 }
2875 VkResult result =
2876 get_dispatch_table(ot_instance_table_map, instance)->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2877 {
2878 std::lock_guard<std::mutex> lock(global_lock);
2879 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002880 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002881 }
2882 }
2883 return result;
2884}
2885#endif // VK_USE_PLATFORM_ANDROID_KHR
2886
Mark Youngead9b932016-09-08 12:28:38 -06002887VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
2888 const VkSwapchainCreateInfoKHR *pCreateInfos,
2889 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
2890 bool skip_call = false;
2891 uint32_t i = 0;
2892 {
2893 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13002894 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Youngead9b932016-09-08 12:28:38 -06002895 if (NULL != pCreateInfos) {
2896 for (i = 0; i < swapchainCount; i++) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002897 skip_call |= ValidateObject(device, pCreateInfos[i].oldSwapchain,
Mark Youngead9b932016-09-08 12:28:38 -06002898 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, true);
2899 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002900 skip_call |= ValidateObject(device_data->physical_device, pCreateInfos[i].surface,
Mark Youngead9b932016-09-08 12:28:38 -06002901 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false);
2902 }
2903 }
2904 }
2905 if (skip_call) {
2906 return VK_ERROR_VALIDATION_FAILED_EXT;
2907 }
2908 VkResult result =
2909 get_dispatch_table(ot_device_table_map, device)->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
2910 {
2911 std::lock_guard<std::mutex> lock(global_lock);
2912 if (result == VK_SUCCESS) {
2913 for (i = 0; i < swapchainCount; i++) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002914 CreateObject(device, pSwapchains[i], VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Youngead9b932016-09-08 12:28:38 -06002915 }
2916 }
2917 }
2918 return result;
2919}
2920
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002921VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
2922 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
2923 const VkAllocationCallbacks *pAllocator,
2924 VkDebugReportCallbackEXT *pCallback) {
2925 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
2926 VkResult result = pInstanceTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback);
2927 if (VK_SUCCESS == result) {
2928 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2929 result = layer_create_msg_callback(instance_data->report_data, false, pCreateInfo, pAllocator, pCallback);
Chris Forbesfeecd402016-09-29 14:53:50 +13002930 CreateObject(instance, *pCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002931 }
2932 return result;
2933}
2934
2935VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
2936 const VkAllocationCallbacks *pAllocator) {
2937 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
2938 pInstanceTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
2939 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2940 layer_destroy_msg_callback(instance_data->report_data, msgCallback, pAllocator);
Chris Forbesec461992016-09-29 14:41:44 +13002941 DestroyObject(instance, msgCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002942}
2943
2944VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
2945 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
2946 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
2947 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
2948 pInstanceTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
2949}
2950
2951static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
2952
2953static const VkLayerProperties globalLayerProps = {"VK_LAYER_LUNARG_object_tracker",
2954 VK_LAYER_API_VERSION, // specVersion
2955 1, // implementationVersion
2956 "LunarG Validation Layer"};
2957
2958VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
2959 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
2960}
2961
2962VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
2963 VkLayerProperties *pProperties) {
2964 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
2965}
2966
2967VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
2968 VkExtensionProperties *pProperties) {
2969 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
2970 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
2971
2972 return VK_ERROR_LAYER_NOT_PRESENT;
2973}
2974
2975VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
2976 uint32_t *pCount, VkExtensionProperties *pProperties) {
2977 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
2978 return util_GetExtensionProperties(0, nullptr, pCount, pProperties);
2979
2980 assert(physicalDevice);
2981 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, physicalDevice);
2982 return pTable->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
2983}
2984
2985static inline PFN_vkVoidFunction InterceptMsgCallbackGetProcAddrCommand(const char *name, VkInstance instance) {
2986 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2987 return debug_report_get_instance_proc_addr(instance_data->report_data, name);
2988}
2989
2990static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
2991 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, instance);
2992 if (instanceExtMap.size() == 0 || !instanceExtMap[pTable].wsi_enabled)
2993 return nullptr;
2994
2995 if (!strcmp("vkDestroySurfaceKHR", name))
2996 return reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR);
2997 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name))
2998 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR);
2999 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name))
3000 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR);
3001 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name))
3002 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR);
3003 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name))
3004 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR);
3005
3006#ifdef VK_USE_PLATFORM_WIN32_KHR
3007 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
3008 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
3009 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name))
3010 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR);
3011#endif // VK_USE_PLATFORM_WIN32_KHR
3012#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003013 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003014 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003015 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003016 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
3017#endif // VK_USE_PLATFORM_XCB_KHR
3018#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003019 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003020 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003021 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003022 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
3023#endif // VK_USE_PLATFORM_XLIB_KHR
3024#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003025 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003026 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003027 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003028 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
3029#endif // VK_USE_PLATFORM_MIR_KHR
3030#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003031 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003032 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003033 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003034 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
3035#endif // VK_USE_PLATFORM_WAYLAND_KHR
3036#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003037 if ((instanceExtMap[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003038 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
3039#endif // VK_USE_PLATFORM_ANDROID_KHR
3040
3041 return nullptr;
3042}
3043
3044static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
3045 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3046 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06003047 device_data->wsi_display_swapchain_enabled = false;
3048 device_data->objtrack_extensions_enabled = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003049
3050 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3051 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
3052 device_data->wsi_enabled = true;
3053 }
Mark Youngead9b932016-09-08 12:28:38 -06003054 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
3055 device_data->wsi_display_swapchain_enabled = true;
3056 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003057 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], "OBJTRACK_EXTENSIONS") == 0) {
3058 device_data->objtrack_extensions_enabled = true;
3059 }
3060 }
3061}
3062
3063static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
3064 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(ot_instance_table_map, instance);
3065
3066
3067 instanceExtMap[pDisp] = {};
3068
3069 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3070 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
3071 instanceExtMap[pDisp].wsi_enabled = true;
3072 }
3073#ifdef VK_USE_PLATFORM_XLIB_KHR
3074 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
3075 instanceExtMap[pDisp].xlib_enabled = true;
3076 }
3077#endif
3078#ifdef VK_USE_PLATFORM_XCB_KHR
3079 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
3080 instanceExtMap[pDisp].xcb_enabled = true;
3081 }
3082#endif
3083#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3084 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
3085 instanceExtMap[pDisp].wayland_enabled = true;
3086 }
3087#endif
3088#ifdef VK_USE_PLATFORM_MIR_KHR
3089 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
3090 instanceExtMap[pDisp].mir_enabled = true;
3091 }
3092#endif
3093#ifdef VK_USE_PLATFORM_ANDROID_KHR
3094 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
3095 instanceExtMap[pDisp].android_enabled = true;
3096 }
3097#endif
3098#ifdef VK_USE_PLATFORM_WIN32_KHR
3099 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
3100 instanceExtMap[pDisp].win32_enabled = true;
3101 }
3102#endif
3103 }
3104}
3105
3106VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
3107 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
3108 std::lock_guard<std::mutex> lock(global_lock);
3109 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3110 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3111
3112 assert(chain_info->u.pLayerInfo);
3113 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3114 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
3115 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(phy_dev_data->instance, "vkCreateDevice");
3116 if (fpCreateDevice == NULL) {
3117 return VK_ERROR_INITIALIZATION_FAILED;
3118 }
3119
3120 // Advance the link info for the next element on the chain
3121 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3122
3123 VkResult result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
3124 if (result != VK_SUCCESS) {
3125 return result;
3126 }
3127
3128 layer_data *device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
3129 device_data->report_data = layer_debug_report_create_device(phy_dev_data->report_data, *pDevice);
3130
3131 // Add link back to physDev
3132 device_data->physical_device = physicalDevice;
3133
3134 initDeviceTable(*pDevice, fpGetDeviceProcAddr, ot_device_table_map);
3135
3136 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
Chris Forbesfeecd402016-09-29 14:53:50 +13003137 CreateObject(*pDevice, *pDevice, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003138
3139 return result;
3140}
3141
3142VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3143 uint32_t *pQueueFamilyPropertyCount,
3144 VkQueueFamilyProperties *pQueueFamilyProperties) {
3145 get_dispatch_table(ot_instance_table_map, physicalDevice)
3146 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
3147 std::lock_guard<std::mutex> lock(global_lock);
3148 if (pQueueFamilyProperties != NULL) {
3149 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3150 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
3151 instance_data->queue_family_properties.emplace_back(pQueueFamilyProperties[i]);
3152 }
3153 }
3154}
3155
3156VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3157 VkInstance *pInstance) {
3158 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3159
3160 assert(chain_info->u.pLayerInfo);
3161 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3162 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
3163 if (fpCreateInstance == NULL) {
3164 return VK_ERROR_INITIALIZATION_FAILED;
3165 }
3166
3167 // Advance the link info for the next element on the chain
3168 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3169
3170 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
3171 if (result != VK_SUCCESS) {
3172 return result;
3173 }
3174
3175 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
3176 instance_data->instance = *pInstance;
3177 initInstanceTable(*pInstance, fpGetInstanceProcAddr, ot_instance_table_map);
3178 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, *pInstance);
3179
3180 // Look for one or more debug report create info structures, and copy the
3181 // callback(s) for each one found (for use by vkDestroyInstance)
3182 layer_copy_tmp_callbacks(pCreateInfo->pNext, &instance_data->num_tmp_callbacks, &instance_data->tmp_dbg_create_infos,
3183 &instance_data->tmp_callbacks);
3184
3185 instance_data->report_data = debug_report_create_instance(pInstanceTable, *pInstance, pCreateInfo->enabledExtensionCount,
3186 pCreateInfo->ppEnabledExtensionNames);
3187
3188 InitObjectTracker(instance_data, pAllocator);
3189 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
3190
Chris Forbesfeecd402016-09-29 14:53:50 +13003191 CreateObject(*pInstance, *pInstance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003192
3193 return result;
3194}
3195
3196VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
3197 VkPhysicalDevice *pPhysicalDevices) {
3198 bool skip_call = VK_FALSE;
3199 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003200 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003201 lock.unlock();
3202 if (skip_call) {
3203 return VK_ERROR_VALIDATION_FAILED_EXT;
3204 }
3205 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
3206 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
3207 lock.lock();
3208 if (result == VK_SUCCESS) {
3209 if (pPhysicalDevices) {
3210 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003211 CreateObject(instance, pPhysicalDevices[i], VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003212 }
3213 }
3214 }
3215 lock.unlock();
3216 return result;
3217}
3218
3219VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
3220 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003221 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003222 lock.unlock();
3223
3224 get_dispatch_table(ot_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
3225
3226 lock.lock();
3227
3228 CreateQueue(device, *pQueue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT);
3229 AddQueueInfo(device, queueFamilyIndex, *pQueue);
3230}
3231
3232VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
3233 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003234 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003235 lock.unlock();
3236
3237 get_dispatch_table(ot_device_table_map, device)->FreeMemory(device, memory, pAllocator);
3238
3239 lock.lock();
Chris Forbesec461992016-09-29 14:41:44 +13003240 DestroyObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003241}
3242
3243VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
3244 VkMemoryMapFlags flags, void **ppData) {
3245 bool skip_call = VK_FALSE;
3246 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003247 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003248 lock.unlock();
3249 if (skip_call == VK_TRUE) {
3250 return VK_ERROR_VALIDATION_FAILED_EXT;
3251 }
3252 VkResult result = get_dispatch_table(ot_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
3253 return result;
3254}
3255
3256VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
3257 bool skip_call = VK_FALSE;
3258 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003259 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003260 lock.unlock();
3261 if (skip_call == VK_TRUE) {
3262 return;
3263 }
3264
3265 get_dispatch_table(ot_device_table_map, device)->UnmapMemory(device, memory);
3266}
3267VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
3268 VkFence fence) {
3269 std::unique_lock<std::mutex> lock(global_lock);
3270 ValidateQueueFlags(queue, "QueueBindSparse");
3271
3272 for (uint32_t i = 0; i < bindInfoCount; i++) {
3273 for (uint32_t j = 0; j < pBindInfo[i].bufferBindCount; j++)
Chris Forbes2f271a72016-09-29 14:58:08 +13003274 ValidateObject(queue, pBindInfo[i].pBufferBinds[j].buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003275 false);
3276 for (uint32_t j = 0; j < pBindInfo[i].imageOpaqueBindCount; j++)
Chris Forbes2f271a72016-09-29 14:58:08 +13003277 ValidateObject(queue, pBindInfo[i].pImageOpaqueBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003278 false);
3279 for (uint32_t j = 0; j < pBindInfo[i].imageBindCount; j++)
Chris Forbes2f271a72016-09-29 14:58:08 +13003280 ValidateObject(queue, pBindInfo[i].pImageBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003281 }
3282 lock.unlock();
3283
3284 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
3285 return result;
3286}
3287
3288VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3289 VkCommandBuffer *pCommandBuffers) {
3290 bool skip_call = VK_FALSE;
3291 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003292 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003293 skip_call |=
Chris Forbes2f271a72016-09-29 14:58:08 +13003294 ValidateObject(device, pAllocateInfo->commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003295 lock.unlock();
3296
3297 if (skip_call) {
3298 return VK_ERROR_VALIDATION_FAILED_EXT;
3299 }
3300
3301 VkResult result =
3302 get_dispatch_table(ot_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3303
3304 lock.lock();
3305 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {
3306 AllocateCommandBuffer(device, pAllocateInfo->commandPool, pCommandBuffers[i],
3307 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, pAllocateInfo->level);
3308 }
3309 lock.unlock();
3310
3311 return result;
3312}
3313
3314VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3315 VkDescriptorSet *pDescriptorSets) {
3316 bool skip_call = VK_FALSE;
3317 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003318 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3319 skip_call |= ValidateObject(device, pAllocateInfo->descriptorPool,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003320 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
3321 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003322 skip_call |= ValidateObject(device, pAllocateInfo->pSetLayouts[i],
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003323 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false);
3324 }
3325 lock.unlock();
3326 if (skip_call) {
3327 return VK_ERROR_VALIDATION_FAILED_EXT;
3328 }
3329
3330 VkResult result =
3331 get_dispatch_table(ot_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3332
3333 if (VK_SUCCESS == result) {
3334 lock.lock();
3335 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
3336 AllocateDescriptorSet(device, pAllocateInfo->descriptorPool, pDescriptorSets[i],
3337 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
3338 }
3339 lock.unlock();
3340 }
3341
3342 return result;
3343}
3344
3345VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
3346 const VkCommandBuffer *pCommandBuffers) {
3347 bool skip_call = false;
3348 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003349 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
3350 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003351 for (uint32_t i = 0; i < commandBufferCount; i++) {
3352 skip_call |= ValidateCommandBuffer(device, commandPool, pCommandBuffers[i]);
3353 }
3354
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003355 for (uint32_t i = 0; i < commandBufferCount; i++) {
Chris Forbesec461992016-09-29 14:41:44 +13003356 DestroyObject(device, pCommandBuffers[i], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003357 }
3358
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003359 lock.unlock();
3360 if (!skip_call) {
3361 get_dispatch_table(ot_device_table_map, device)
3362 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
3363 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003364}
3365VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
3366 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3367 std::unique_lock<std::mutex> lock(global_lock);
3368 // A swapchain's images are implicitly deleted when the swapchain is deleted.
3369 // Remove this swapchain's images from our map of such images.
3370 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr = device_data->swapchainImageMap.begin();
3371 while (itr != device_data->swapchainImageMap.end()) {
3372 OBJTRACK_NODE *pNode = (*itr).second;
3373 if (pNode->parent_object == reinterpret_cast<uint64_t &>(swapchain)) {
3374 delete pNode;
3375 auto delete_item = itr++;
3376 device_data->swapchainImageMap.erase(delete_item);
3377 } else {
3378 ++itr;
3379 }
3380 }
Chris Forbesec461992016-09-29 14:41:44 +13003381 DestroyObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003382 lock.unlock();
3383
3384 get_dispatch_table(ot_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
3385}
3386
3387VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
3388 const VkDescriptorSet *pDescriptorSets) {
3389 bool skip_call = false;
3390 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3391 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003392 skip_call |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
3393 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003394 for (uint32_t i = 0; i < descriptorSetCount; i++) {
3395 skip_call |= ValidateDescriptorSet(device, descriptorPool, pDescriptorSets[i]);
3396 }
3397
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003398 for (uint32_t i = 0; i < descriptorSetCount; i++) {
Chris Forbesec461992016-09-29 14:41:44 +13003399 DestroyObject(device, pDescriptorSets[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003400 }
3401
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003402 lock.unlock();
3403 if (!skip_call) {
3404 result = get_dispatch_table(ot_device_table_map, device)
3405 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
3406 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003407 return result;
3408}
3409
3410VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3411 const VkAllocationCallbacks *pAllocator) {
3412 bool skip_call = VK_FALSE;
3413 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3414 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003415 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
3416 skip_call |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003417 lock.unlock();
3418 if (skip_call) {
3419 return;
3420 }
3421 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is deleted.
3422 // Remove this pool's descriptor sets from our descriptorSet map.
3423 lock.lock();
3424 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr =
3425 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
3426 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
3427 OBJTRACK_NODE *pNode = (*itr).second;
3428 auto del_itr = itr++;
3429 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
Chris Forbesec461992016-09-29 14:41:44 +13003430 DestroyObject(device, (VkDescriptorSet)((*del_itr).first),
Chris Forbes3e51a202016-09-29 14:35:09 +13003431 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003432 }
3433 }
Chris Forbesec461992016-09-29 14:41:44 +13003434 DestroyObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003435 lock.unlock();
3436 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
3437}
3438
3439VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3440 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3441 bool skip_call = false;
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, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003445 lock.unlock();
3446 if (skip_call) {
3447 return;
3448 }
3449 lock.lock();
3450 // A CommandPool's command buffers are implicitly deleted when the pool is deleted.
3451 // Remove this pool's cmdBuffers from our cmd buffer map.
3452 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].begin();
3453 auto del_itr = itr;
3454 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
3455 OBJTRACK_NODE *pNode = (*itr).second;
3456 del_itr = itr++;
3457 if (pNode->parent_object == reinterpret_cast<uint64_t &>(commandPool)) {
3458 skip_call |= ValidateCommandBuffer(device, commandPool, reinterpret_cast<VkCommandBuffer>((*del_itr).first));
Chris Forbesec461992016-09-29 14:41:44 +13003459 DestroyObject(device, reinterpret_cast<VkCommandBuffer>((*del_itr).first),
Chris Forbes3e51a202016-09-29 14:35:09 +13003460 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003461 }
3462 }
Chris Forbesec461992016-09-29 14:41:44 +13003463 DestroyObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003464 lock.unlock();
3465 get_dispatch_table(ot_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
3466}
3467
3468VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
3469 VkImage *pSwapchainImages) {
3470 bool skip_call = VK_FALSE;
3471 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003472 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003473 lock.unlock();
3474 if (skip_call) {
3475 return VK_ERROR_VALIDATION_FAILED_EXT;
3476 }
3477 VkResult result = get_dispatch_table(ot_device_table_map, device)
3478 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
3479 if (pSwapchainImages != NULL) {
3480 lock.lock();
3481 for (uint32_t i = 0; i < *pSwapchainImageCount; i++) {
3482 CreateSwapchainImageObject(device, pSwapchainImages[i], swapchain);
3483 }
3484 lock.unlock();
3485 }
3486 return result;
3487}
3488
3489VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3490 const VkGraphicsPipelineCreateInfo *pCreateInfos,
3491 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3492 bool skip_call = VK_FALSE;
3493 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003494 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003495 if (pCreateInfos) {
3496 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3497 if (pCreateInfos[idx0].basePipelineHandle) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003498 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003499 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, true);
3500 }
3501 if (pCreateInfos[idx0].layout) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003502 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003503 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
3504 }
3505 if (pCreateInfos[idx0].pStages) {
3506 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
3507 if (pCreateInfos[idx0].pStages[idx1].module) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003508 skip_call |= ValidateObject(device, pCreateInfos[idx0].pStages[idx1].module,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003509 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false);
3510 }
3511 }
3512 }
3513 if (pCreateInfos[idx0].renderPass) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003514 skip_call |= ValidateObject(device, pCreateInfos[idx0].renderPass,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003515 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false);
3516 }
3517 }
3518 }
3519 if (pipelineCache) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003520 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003521 }
3522 lock.unlock();
3523 if (skip_call) {
3524 return VK_ERROR_VALIDATION_FAILED_EXT;
3525 }
3526 VkResult result = get_dispatch_table(ot_device_table_map, device)
3527 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3528 lock.lock();
3529 if (result == VK_SUCCESS) {
3530 for (uint32_t idx2 = 0; idx2 < createInfoCount; ++idx2) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003531 CreateObject(device, pPipelines[idx2], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003532 }
3533 }
3534 lock.unlock();
3535 return result;
3536}
3537
3538VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3539 const VkComputePipelineCreateInfo *pCreateInfos,
3540 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3541 bool skip_call = VK_FALSE;
3542 std::unique_lock<std::mutex> lock(global_lock);
Chris Forbes2f271a72016-09-29 14:58:08 +13003543 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003544 if (pCreateInfos) {
3545 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3546 if (pCreateInfos[idx0].basePipelineHandle) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003547 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003548 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, true);
3549 }
3550 if (pCreateInfos[idx0].layout) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003551 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003552 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false);
3553 }
3554 if (pCreateInfos[idx0].stage.module) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003555 skip_call |= ValidateObject(device, pCreateInfos[idx0].stage.module,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003556 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false);
3557 }
3558 }
3559 }
3560 if (pipelineCache) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003561 skip_call |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003562 }
3563 lock.unlock();
3564 if (skip_call) {
3565 return VK_ERROR_VALIDATION_FAILED_EXT;
3566 }
3567 VkResult result = get_dispatch_table(ot_device_table_map, device)
3568 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3569 lock.lock();
3570 if (result == VK_SUCCESS) {
3571 for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003572 CreateObject(device, pPipelines[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003573 }
3574 }
3575 lock.unlock();
3576 return result;
3577}
3578
3579static inline PFN_vkVoidFunction InterceptCoreDeviceCommand(const char *name) {
3580 if (!name || name[0] != 'v' || name[1] != 'k')
3581 return NULL;
3582
3583 name += 2;
3584 if (!strcmp(name, "GetDeviceProcAddr"))
3585 return (PFN_vkVoidFunction)GetDeviceProcAddr;
3586 if (!strcmp(name, "DestroyDevice"))
3587 return (PFN_vkVoidFunction)DestroyDevice;
3588 if (!strcmp(name, "GetDeviceQueue"))
3589 return (PFN_vkVoidFunction)GetDeviceQueue;
3590 if (!strcmp(name, "QueueSubmit"))
3591 return (PFN_vkVoidFunction)QueueSubmit;
3592 if (!strcmp(name, "QueueWaitIdle"))
3593 return (PFN_vkVoidFunction)QueueWaitIdle;
3594 if (!strcmp(name, "DeviceWaitIdle"))
3595 return (PFN_vkVoidFunction)DeviceWaitIdle;
3596 if (!strcmp(name, "AllocateMemory"))
3597 return (PFN_vkVoidFunction)AllocateMemory;
3598 if (!strcmp(name, "FreeMemory"))
3599 return (PFN_vkVoidFunction)FreeMemory;
3600 if (!strcmp(name, "MapMemory"))
3601 return (PFN_vkVoidFunction)MapMemory;
3602 if (!strcmp(name, "UnmapMemory"))
3603 return (PFN_vkVoidFunction)UnmapMemory;
3604 if (!strcmp(name, "FlushMappedMemoryRanges"))
3605 return (PFN_vkVoidFunction)FlushMappedMemoryRanges;
3606 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
3607 return (PFN_vkVoidFunction)InvalidateMappedMemoryRanges;
3608 if (!strcmp(name, "GetDeviceMemoryCommitment"))
3609 return (PFN_vkVoidFunction)GetDeviceMemoryCommitment;
3610 if (!strcmp(name, "BindBufferMemory"))
3611 return (PFN_vkVoidFunction)BindBufferMemory;
3612 if (!strcmp(name, "BindImageMemory"))
3613 return (PFN_vkVoidFunction)BindImageMemory;
3614 if (!strcmp(name, "GetBufferMemoryRequirements"))
3615 return (PFN_vkVoidFunction)GetBufferMemoryRequirements;
3616 if (!strcmp(name, "GetImageMemoryRequirements"))
3617 return (PFN_vkVoidFunction)GetImageMemoryRequirements;
3618 if (!strcmp(name, "GetImageSparseMemoryRequirements"))
3619 return (PFN_vkVoidFunction)GetImageSparseMemoryRequirements;
3620 if (!strcmp(name, "QueueBindSparse"))
3621 return (PFN_vkVoidFunction)QueueBindSparse;
3622 if (!strcmp(name, "CreateFence"))
3623 return (PFN_vkVoidFunction)CreateFence;
3624 if (!strcmp(name, "DestroyFence"))
3625 return (PFN_vkVoidFunction)DestroyFence;
3626 if (!strcmp(name, "ResetFences"))
3627 return (PFN_vkVoidFunction)ResetFences;
3628 if (!strcmp(name, "GetFenceStatus"))
3629 return (PFN_vkVoidFunction)GetFenceStatus;
3630 if (!strcmp(name, "WaitForFences"))
3631 return (PFN_vkVoidFunction)WaitForFences;
3632 if (!strcmp(name, "CreateSemaphore"))
3633 return (PFN_vkVoidFunction)CreateSemaphore;
3634 if (!strcmp(name, "DestroySemaphore"))
3635 return (PFN_vkVoidFunction)DestroySemaphore;
3636 if (!strcmp(name, "CreateEvent"))
3637 return (PFN_vkVoidFunction)CreateEvent;
3638 if (!strcmp(name, "DestroyEvent"))
3639 return (PFN_vkVoidFunction)DestroyEvent;
3640 if (!strcmp(name, "GetEventStatus"))
3641 return (PFN_vkVoidFunction)GetEventStatus;
3642 if (!strcmp(name, "SetEvent"))
3643 return (PFN_vkVoidFunction)SetEvent;
3644 if (!strcmp(name, "ResetEvent"))
3645 return (PFN_vkVoidFunction)ResetEvent;
3646 if (!strcmp(name, "CreateQueryPool"))
3647 return (PFN_vkVoidFunction)CreateQueryPool;
3648 if (!strcmp(name, "DestroyQueryPool"))
3649 return (PFN_vkVoidFunction)DestroyQueryPool;
3650 if (!strcmp(name, "GetQueryPoolResults"))
3651 return (PFN_vkVoidFunction)GetQueryPoolResults;
3652 if (!strcmp(name, "CreateBuffer"))
3653 return (PFN_vkVoidFunction)CreateBuffer;
3654 if (!strcmp(name, "DestroyBuffer"))
3655 return (PFN_vkVoidFunction)DestroyBuffer;
3656 if (!strcmp(name, "CreateBufferView"))
3657 return (PFN_vkVoidFunction)CreateBufferView;
3658 if (!strcmp(name, "DestroyBufferView"))
3659 return (PFN_vkVoidFunction)DestroyBufferView;
3660 if (!strcmp(name, "CreateImage"))
3661 return (PFN_vkVoidFunction)CreateImage;
3662 if (!strcmp(name, "DestroyImage"))
3663 return (PFN_vkVoidFunction)DestroyImage;
3664 if (!strcmp(name, "GetImageSubresourceLayout"))
3665 return (PFN_vkVoidFunction)GetImageSubresourceLayout;
3666 if (!strcmp(name, "CreateImageView"))
3667 return (PFN_vkVoidFunction)CreateImageView;
3668 if (!strcmp(name, "DestroyImageView"))
3669 return (PFN_vkVoidFunction)DestroyImageView;
3670 if (!strcmp(name, "CreateShaderModule"))
3671 return (PFN_vkVoidFunction)CreateShaderModule;
3672 if (!strcmp(name, "DestroyShaderModule"))
3673 return (PFN_vkVoidFunction)DestroyShaderModule;
3674 if (!strcmp(name, "CreatePipelineCache"))
3675 return (PFN_vkVoidFunction)CreatePipelineCache;
3676 if (!strcmp(name, "DestroyPipelineCache"))
3677 return (PFN_vkVoidFunction)DestroyPipelineCache;
3678 if (!strcmp(name, "GetPipelineCacheData"))
3679 return (PFN_vkVoidFunction)GetPipelineCacheData;
3680 if (!strcmp(name, "MergePipelineCaches"))
3681 return (PFN_vkVoidFunction)MergePipelineCaches;
3682 if (!strcmp(name, "CreateGraphicsPipelines"))
3683 return (PFN_vkVoidFunction)CreateGraphicsPipelines;
3684 if (!strcmp(name, "CreateComputePipelines"))
3685 return (PFN_vkVoidFunction)CreateComputePipelines;
3686 if (!strcmp(name, "DestroyPipeline"))
3687 return (PFN_vkVoidFunction)DestroyPipeline;
3688 if (!strcmp(name, "CreatePipelineLayout"))
3689 return (PFN_vkVoidFunction)CreatePipelineLayout;
3690 if (!strcmp(name, "DestroyPipelineLayout"))
3691 return (PFN_vkVoidFunction)DestroyPipelineLayout;
3692 if (!strcmp(name, "CreateSampler"))
3693 return (PFN_vkVoidFunction)CreateSampler;
3694 if (!strcmp(name, "DestroySampler"))
3695 return (PFN_vkVoidFunction)DestroySampler;
3696 if (!strcmp(name, "CreateDescriptorSetLayout"))
3697 return (PFN_vkVoidFunction)CreateDescriptorSetLayout;
3698 if (!strcmp(name, "DestroyDescriptorSetLayout"))
3699 return (PFN_vkVoidFunction)DestroyDescriptorSetLayout;
3700 if (!strcmp(name, "CreateDescriptorPool"))
3701 return (PFN_vkVoidFunction)CreateDescriptorPool;
3702 if (!strcmp(name, "DestroyDescriptorPool"))
3703 return (PFN_vkVoidFunction)DestroyDescriptorPool;
3704 if (!strcmp(name, "ResetDescriptorPool"))
3705 return (PFN_vkVoidFunction)ResetDescriptorPool;
3706 if (!strcmp(name, "AllocateDescriptorSets"))
3707 return (PFN_vkVoidFunction)AllocateDescriptorSets;
3708 if (!strcmp(name, "FreeDescriptorSets"))
3709 return (PFN_vkVoidFunction)FreeDescriptorSets;
3710 if (!strcmp(name, "UpdateDescriptorSets"))
3711 return (PFN_vkVoidFunction)UpdateDescriptorSets;
3712 if (!strcmp(name, "CreateFramebuffer"))
3713 return (PFN_vkVoidFunction)CreateFramebuffer;
3714 if (!strcmp(name, "DestroyFramebuffer"))
3715 return (PFN_vkVoidFunction)DestroyFramebuffer;
3716 if (!strcmp(name, "CreateRenderPass"))
3717 return (PFN_vkVoidFunction)CreateRenderPass;
3718 if (!strcmp(name, "DestroyRenderPass"))
3719 return (PFN_vkVoidFunction)DestroyRenderPass;
3720 if (!strcmp(name, "GetRenderAreaGranularity"))
3721 return (PFN_vkVoidFunction)GetRenderAreaGranularity;
3722 if (!strcmp(name, "CreateCommandPool"))
3723 return (PFN_vkVoidFunction)CreateCommandPool;
3724 if (!strcmp(name, "DestroyCommandPool"))
3725 return (PFN_vkVoidFunction)DestroyCommandPool;
3726 if (!strcmp(name, "ResetCommandPool"))
3727 return (PFN_vkVoidFunction)ResetCommandPool;
3728 if (!strcmp(name, "AllocateCommandBuffers"))
3729 return (PFN_vkVoidFunction)AllocateCommandBuffers;
3730 if (!strcmp(name, "FreeCommandBuffers"))
3731 return (PFN_vkVoidFunction)FreeCommandBuffers;
3732 if (!strcmp(name, "BeginCommandBuffer"))
3733 return (PFN_vkVoidFunction)BeginCommandBuffer;
3734 if (!strcmp(name, "EndCommandBuffer"))
3735 return (PFN_vkVoidFunction)EndCommandBuffer;
3736 if (!strcmp(name, "ResetCommandBuffer"))
3737 return (PFN_vkVoidFunction)ResetCommandBuffer;
3738 if (!strcmp(name, "CmdBindPipeline"))
3739 return (PFN_vkVoidFunction)CmdBindPipeline;
3740 if (!strcmp(name, "CmdSetViewport"))
3741 return (PFN_vkVoidFunction)CmdSetViewport;
3742 if (!strcmp(name, "CmdSetScissor"))
3743 return (PFN_vkVoidFunction)CmdSetScissor;
3744 if (!strcmp(name, "CmdSetLineWidth"))
3745 return (PFN_vkVoidFunction)CmdSetLineWidth;
3746 if (!strcmp(name, "CmdSetDepthBias"))
3747 return (PFN_vkVoidFunction)CmdSetDepthBias;
3748 if (!strcmp(name, "CmdSetBlendConstants"))
3749 return (PFN_vkVoidFunction)CmdSetBlendConstants;
3750 if (!strcmp(name, "CmdSetDepthBounds"))
3751 return (PFN_vkVoidFunction)CmdSetDepthBounds;
3752 if (!strcmp(name, "CmdSetStencilCompareMask"))
3753 return (PFN_vkVoidFunction)CmdSetStencilCompareMask;
3754 if (!strcmp(name, "CmdSetStencilWriteMask"))
3755 return (PFN_vkVoidFunction)CmdSetStencilWriteMask;
3756 if (!strcmp(name, "CmdSetStencilReference"))
3757 return (PFN_vkVoidFunction)CmdSetStencilReference;
3758 if (!strcmp(name, "CmdBindDescriptorSets"))
3759 return (PFN_vkVoidFunction)CmdBindDescriptorSets;
3760 if (!strcmp(name, "CmdBindIndexBuffer"))
3761 return (PFN_vkVoidFunction)CmdBindIndexBuffer;
3762 if (!strcmp(name, "CmdBindVertexBuffers"))
3763 return (PFN_vkVoidFunction)CmdBindVertexBuffers;
3764 if (!strcmp(name, "CmdDraw"))
3765 return (PFN_vkVoidFunction)CmdDraw;
3766 if (!strcmp(name, "CmdDrawIndexed"))
3767 return (PFN_vkVoidFunction)CmdDrawIndexed;
3768 if (!strcmp(name, "CmdDrawIndirect"))
3769 return (PFN_vkVoidFunction)CmdDrawIndirect;
3770 if (!strcmp(name, "CmdDrawIndexedIndirect"))
3771 return (PFN_vkVoidFunction)CmdDrawIndexedIndirect;
3772 if (!strcmp(name, "CmdDispatch"))
3773 return (PFN_vkVoidFunction)CmdDispatch;
3774 if (!strcmp(name, "CmdDispatchIndirect"))
3775 return (PFN_vkVoidFunction)CmdDispatchIndirect;
3776 if (!strcmp(name, "CmdCopyBuffer"))
3777 return (PFN_vkVoidFunction)CmdCopyBuffer;
3778 if (!strcmp(name, "CmdCopyImage"))
3779 return (PFN_vkVoidFunction)CmdCopyImage;
3780 if (!strcmp(name, "CmdBlitImage"))
3781 return (PFN_vkVoidFunction)CmdBlitImage;
3782 if (!strcmp(name, "CmdCopyBufferToImage"))
3783 return (PFN_vkVoidFunction)CmdCopyBufferToImage;
3784 if (!strcmp(name, "CmdCopyImageToBuffer"))
3785 return (PFN_vkVoidFunction)CmdCopyImageToBuffer;
3786 if (!strcmp(name, "CmdUpdateBuffer"))
3787 return (PFN_vkVoidFunction)CmdUpdateBuffer;
3788 if (!strcmp(name, "CmdFillBuffer"))
3789 return (PFN_vkVoidFunction)CmdFillBuffer;
3790 if (!strcmp(name, "CmdClearColorImage"))
3791 return (PFN_vkVoidFunction)CmdClearColorImage;
3792 if (!strcmp(name, "CmdClearDepthStencilImage"))
3793 return (PFN_vkVoidFunction)CmdClearDepthStencilImage;
3794 if (!strcmp(name, "CmdClearAttachments"))
3795 return (PFN_vkVoidFunction)CmdClearAttachments;
3796 if (!strcmp(name, "CmdResolveImage"))
3797 return (PFN_vkVoidFunction)CmdResolveImage;
3798 if (!strcmp(name, "CmdSetEvent"))
3799 return (PFN_vkVoidFunction)CmdSetEvent;
3800 if (!strcmp(name, "CmdResetEvent"))
3801 return (PFN_vkVoidFunction)CmdResetEvent;
3802 if (!strcmp(name, "CmdWaitEvents"))
3803 return (PFN_vkVoidFunction)CmdWaitEvents;
3804 if (!strcmp(name, "CmdPipelineBarrier"))
3805 return (PFN_vkVoidFunction)CmdPipelineBarrier;
3806 if (!strcmp(name, "CmdBeginQuery"))
3807 return (PFN_vkVoidFunction)CmdBeginQuery;
3808 if (!strcmp(name, "CmdEndQuery"))
3809 return (PFN_vkVoidFunction)CmdEndQuery;
3810 if (!strcmp(name, "CmdResetQueryPool"))
3811 return (PFN_vkVoidFunction)CmdResetQueryPool;
3812 if (!strcmp(name, "CmdWriteTimestamp"))
3813 return (PFN_vkVoidFunction)CmdWriteTimestamp;
3814 if (!strcmp(name, "CmdCopyQueryPoolResults"))
3815 return (PFN_vkVoidFunction)CmdCopyQueryPoolResults;
3816 if (!strcmp(name, "CmdPushConstants"))
3817 return (PFN_vkVoidFunction)CmdPushConstants;
3818 if (!strcmp(name, "CmdBeginRenderPass"))
3819 return (PFN_vkVoidFunction)CmdBeginRenderPass;
3820 if (!strcmp(name, "CmdNextSubpass"))
3821 return (PFN_vkVoidFunction)CmdNextSubpass;
3822 if (!strcmp(name, "CmdEndRenderPass"))
3823 return (PFN_vkVoidFunction)CmdEndRenderPass;
3824 if (!strcmp(name, "CmdExecuteCommands"))
3825 return (PFN_vkVoidFunction)CmdExecuteCommands;
3826
3827 return NULL;
3828}
3829static inline PFN_vkVoidFunction InterceptCoreInstanceCommand(const char *name) {
3830 if (!name || name[0] != 'v' || name[1] != 'k')
3831 return NULL;
3832
3833 name += 2;
3834 if (!strcmp(name, "CreateInstance"))
3835 return (PFN_vkVoidFunction)CreateInstance;
3836 if (!strcmp(name, "DestroyInstance"))
3837 return (PFN_vkVoidFunction)DestroyInstance;
3838 if (!strcmp(name, "EnumeratePhysicalDevices"))
3839 return (PFN_vkVoidFunction)EnumeratePhysicalDevices;
3840 if (!strcmp(name, "GetPhysicalDeviceFeatures"))
3841 return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures;
3842 if (!strcmp(name, "GetPhysicalDeviceFormatProperties"))
3843 return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties;
3844 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties"))
3845 return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties;
3846 if (!strcmp(name, "GetPhysicalDeviceProperties"))
3847 return (PFN_vkVoidFunction)GetPhysicalDeviceProperties;
3848 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties"))
3849 return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties;
3850 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties"))
3851 return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties;
3852 if (!strcmp(name, "GetInstanceProcAddr"))
3853 return (PFN_vkVoidFunction)GetInstanceProcAddr;
3854 if (!strcmp(name, "CreateDevice"))
3855 return (PFN_vkVoidFunction)CreateDevice;
3856 if (!strcmp(name, "EnumerateInstanceExtensionProperties"))
3857 return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
3858 if (!strcmp(name, "EnumerateInstanceLayerProperties"))
3859 return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties;
3860 if (!strcmp(name, "EnumerateDeviceLayerProperties"))
3861 return (PFN_vkVoidFunction)EnumerateDeviceLayerProperties;
3862 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties"))
3863 return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties;
3864
3865 return NULL;
3866}
3867
3868static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
3869 if (device) {
3870 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06003871
3872 if (device_data->wsi_enabled) {
3873 if (!strcmp("vkCreateSwapchainKHR", name))
3874 return reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR);
3875 if (!strcmp("vkDestroySwapchainKHR", name))
3876 return reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR);
3877 if (!strcmp("vkGetSwapchainImagesKHR", name))
3878 return reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR);
3879 if (!strcmp("vkAcquireNextImageKHR", name))
3880 return reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR);
3881 if (!strcmp("vkQueuePresentKHR", name))
3882 return reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR);
3883 }
3884
3885 if (device_data->wsi_display_swapchain_enabled) {
3886 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
3887 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
3888 }
3889 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003890 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003891
3892 return nullptr;
3893}
3894
3895VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
3896 PFN_vkVoidFunction addr;
3897 addr = InterceptCoreDeviceCommand(funcName);
3898 if (addr) {
3899 return addr;
3900 }
3901 assert(device);
3902
3903 addr = InterceptWsiEnabledCommand(funcName, device);
3904 if (addr) {
3905 return addr;
3906 }
3907 if (get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr == NULL) {
3908 return NULL;
3909 }
3910 return get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr(device, funcName);
3911}
3912
3913VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
3914 PFN_vkVoidFunction addr;
3915 addr = InterceptCoreInstanceCommand(funcName);
3916 if (!addr) {
3917 addr = InterceptCoreDeviceCommand(funcName);
3918 }
3919 if (!addr) {
3920 addr = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
3921 }
3922 if (addr) {
3923 return addr;
3924 }
3925 assert(instance);
3926
3927 addr = InterceptMsgCallbackGetProcAddrCommand(funcName, instance);
3928 if (addr) {
3929 return addr;
3930 }
3931 addr = InterceptWsiEnabledCommand(funcName, instance);
3932 if (addr) {
3933 return addr;
3934 }
3935 if (get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr == NULL) {
3936 return NULL;
3937 }
3938 return get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
3939}
3940
3941} // namespace object_tracker
3942
3943// vk_layer_logging.h expects these to be defined
3944VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
3945 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
3946 const VkAllocationCallbacks *pAllocator,
3947 VkDebugReportCallbackEXT *pMsgCallback) {
3948 return object_tracker::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
3949}
3950
3951VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
3952 const VkAllocationCallbacks *pAllocator) {
3953 object_tracker::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
3954}
3955
3956VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
3957 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
3958 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
3959 object_tracker::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
3960}
3961
3962// Loader-layer interface v0, just wrappers since there is only a layer
3963VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
3964 VkExtensionProperties *pProperties) {
3965 return object_tracker::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
3966}
3967
3968VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
3969 VkLayerProperties *pProperties) {
3970 return object_tracker::EnumerateInstanceLayerProperties(pCount, pProperties);
3971}
3972
3973VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
3974 VkLayerProperties *pProperties) {
3975 // The layer command handles VK_NULL_HANDLE just fine internally
3976 assert(physicalDevice == VK_NULL_HANDLE);
3977 return object_tracker::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
3978}
3979
3980VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
3981 return object_tracker::GetDeviceProcAddr(dev, funcName);
3982}
3983
3984VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
3985 return object_tracker::GetInstanceProcAddr(instance, funcName);
3986}
3987
3988VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
3989 const char *pLayerName, uint32_t *pCount,
3990 VkExtensionProperties *pProperties) {
3991 // The layer command handles VK_NULL_HANDLE just fine internally
3992 assert(physicalDevice == VK_NULL_HANDLE);
3993 return object_tracker::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003994}