blob: b4443547c528256ec2e4cc8eb9457e2b9cb8936b [file] [log] [blame]
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
5 * Copyright (c) 2015-2016 Google, Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * Author: Mark Lobodzinski <mark@lunarg.com>
20 * Author: Tobin Ehlis <tobine@google.com>
21 * Author: Courtney Goeltzenleuchter <courtneygo@google.com>
22 * Author: Jon Ashburn <jon@lunarg.com>
23 * Author: Mike Stroyan <stroyan@google.com>
24 * Author: Tony Barbour <tony@LunarG.com>
25 */
26
27#include "vk_loader_platform.h"
28#include "vulkan/vulkan.h"
29
30#include <cinttypes>
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34
35#include <unordered_map>
36
37#include "vk_layer_config.h"
38#include "vk_layer_data.h"
39#include "vk_layer_logging.h"
40#include "vk_layer_table.h"
41#include "vulkan/vk_layer.h"
42
43#include "object_tracker.h"
44
Karl Schultza9ef1e52016-10-06 17:53:48 -060045#include "vk_validation_error_messages.h"
46
Mark Lobodzinski9bab8662016-07-01 10:53:31 -060047namespace object_tracker {
48
49static void InitObjectTracker(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
50
51 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_object_tracker");
52}
53
54// Add new queue to head of global queue list
55static void AddQueueInfo(VkDevice device, uint32_t queue_node_index, VkQueue queue) {
56 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
57 auto queueItem = device_data->queue_info_map.find(queue);
58 if (queueItem == device_data->queue_info_map.end()) {
59 OT_QUEUE_INFO *p_queue_info = new OT_QUEUE_INFO;
60 if (p_queue_info != NULL) {
61 memset(p_queue_info, 0, sizeof(OT_QUEUE_INFO));
62 p_queue_info->queue = queue;
63 p_queue_info->queue_node_index = queue_node_index;
64 device_data->queue_info_map[queue] = p_queue_info;
65 } else {
66 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
67 reinterpret_cast<uint64_t>(queue), __LINE__, OBJTRACK_INTERNAL_ERROR, LayerName,
68 "ERROR: VK_ERROR_OUT_OF_HOST_MEMORY -- could not allocate memory for Queue Information");
69 }
70 }
71}
72
73// Destroy memRef lists and free all memory
74static void DestroyQueueDataStructures(VkDevice device) {
75 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
76
77 for (auto queue_item : device_data->queue_info_map) {
78 delete queue_item.second;
79 }
80 device_data->queue_info_map.clear();
81
82 // Destroy the items in the queue map
83 auto queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].begin();
84 while (queue != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
85 uint32_t obj_index = queue->second->object_type;
86 assert(device_data->num_total_objects > 0);
87 device_data->num_total_objects--;
88 assert(device_data->num_objects[obj_index] > 0);
89 device_data->num_objects[obj_index]--;
90 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, queue->second->object_type, queue->second->handle,
91 __LINE__, OBJTRACK_NONE, LayerName,
92 "OBJ_STAT Destroy Queue obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " Queue objs).",
93 queue->second->handle, device_data->num_total_objects, device_data->num_objects[obj_index]);
94 delete queue->second;
95 queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].erase(queue);
96 }
97}
98
99// Check Queue type flags for selected queue operations
100static void ValidateQueueFlags(VkQueue queue, const char *function) {
101 layer_data *device_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
102 auto queue_item = device_data->queue_info_map.find(queue);
103 if (queue_item != device_data->queue_info_map.end()) {
104 OT_QUEUE_INFO *pQueueInfo = queue_item->second;
105 if (pQueueInfo != NULL) {
106 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(device_data->physical_device), layer_data_map);
107 if ((instance_data->queue_family_properties[pQueueInfo->queue_node_index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) ==
108 0) {
109 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
110 reinterpret_cast<uint64_t>(queue), __LINE__, OBJTRACK_UNKNOWN_OBJECT, LayerName,
111 "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_SPARSE_BINDING_BIT not set", function);
112 }
113 }
114 }
115}
116
117static void AllocateCommandBuffer(VkDevice device, const VkCommandPool command_pool, const VkCommandBuffer command_buffer,
118 VkDebugReportObjectTypeEXT object_type, VkCommandBufferLevel level) {
119 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
120
121 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<const uint64_t>(command_buffer),
122 __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
123 string_VkDebugReportObjectTypeEXT(object_type), reinterpret_cast<const uint64_t>(command_buffer));
124
125 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
126 pNewObjNode->object_type = object_type;
127 pNewObjNode->handle = reinterpret_cast<const uint64_t>(command_buffer);
128 pNewObjNode->parent_object = reinterpret_cast<const uint64_t &>(command_pool);
129 if (level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) {
130 pNewObjNode->status = OBJSTATUS_COMMAND_BUFFER_SECONDARY;
131 } else {
132 pNewObjNode->status = OBJSTATUS_NONE;
133 }
134 device_data->object_map[object_type][reinterpret_cast<const uint64_t>(command_buffer)] = pNewObjNode;
135 device_data->num_objects[object_type]++;
136 device_data->num_total_objects++;
137}
138
139static bool ValidateCommandBuffer(VkDevice device, VkCommandPool command_pool, VkCommandBuffer command_buffer) {
140 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
141 bool skip_call = false;
142 uint64_t object_handle = reinterpret_cast<uint64_t>(command_buffer);
143 if (device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].find(object_handle) !=
144 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
145 OBJTRACK_NODE *pNode =
146 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<uint64_t>(command_buffer)];
147
148 if (pNode->parent_object != reinterpret_cast<uint64_t &>(command_pool)) {
149 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
150 __LINE__, OBJTRACK_COMMAND_POOL_MISMATCH, LayerName,
151 "FreeCommandBuffers is attempting to free Command Buffer 0x%" PRIxLEAST64
152 " belonging to Command Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").",
153 reinterpret_cast<uint64_t>(command_buffer), pNode->parent_object,
154 reinterpret_cast<uint64_t &>(command_pool));
155 }
156 } else {
Mark Lobodzinski45e68612016-07-18 17:06:52 -0600157 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle,
158 __LINE__, OBJTRACK_NONE, LayerName, "Unable to remove command buffer obj 0x%" PRIxLEAST64
159 ". Was it created? Has it already been destroyed?",
160 object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600161 }
162 return skip_call;
163}
164
165static void AllocateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set,
166 VkDebugReportObjectTypeEXT object_type) {
167 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
168
169 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type,
170 reinterpret_cast<uint64_t &>(descriptor_set), __LINE__, OBJTRACK_NONE, LayerName,
171 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, object_name[object_type],
172 reinterpret_cast<uint64_t &>(descriptor_set));
173
174 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
175 pNewObjNode->object_type = object_type;
176 pNewObjNode->status = OBJSTATUS_NONE;
177 pNewObjNode->handle = reinterpret_cast<uint64_t &>(descriptor_set);
178 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(descriptor_pool);
179 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT][reinterpret_cast<uint64_t &>(descriptor_set)] =
180 pNewObjNode;
181 device_data->num_objects[object_type]++;
182 device_data->num_total_objects++;
183}
184
185static bool ValidateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set) {
186 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
187 bool skip_call = false;
188 uint64_t object_handle = reinterpret_cast<uint64_t &>(descriptor_set);
189 auto dsItem = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].find(object_handle);
190 if (dsItem != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
191 OBJTRACK_NODE *pNode = dsItem->second;
192
193 if (pNode->parent_object != reinterpret_cast<uint64_t &>(descriptor_pool)) {
194 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
195 __LINE__, OBJTRACK_DESCRIPTOR_POOL_MISMATCH, LayerName,
196 "FreeDescriptorSets is attempting to free descriptorSet 0x%" PRIxLEAST64
197 " belonging to Descriptor Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").",
198 reinterpret_cast<uint64_t &>(descriptor_set), pNode->parent_object,
199 reinterpret_cast<uint64_t &>(descriptor_pool));
200 }
201 } else {
Mark Lobodzinski45e68612016-07-18 17:06:52 -0600202 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle,
203 __LINE__, OBJTRACK_NONE, LayerName, "Unable to remove descriptor set obj 0x%" PRIxLEAST64
204 ". Was it created? Has it already been destroyed?",
205 object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600206 }
207 return skip_call;
208}
209
210static void CreateQueue(VkDevice device, VkQueue vkObj, VkDebugReportObjectTypeEXT object_type) {
211 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
212
213 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<uint64_t>(vkObj), __LINE__,
214 OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
215 object_name[object_type], reinterpret_cast<uint64_t>(vkObj));
216
217 OBJTRACK_NODE *p_obj_node = NULL;
218 auto queue_item = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].find(reinterpret_cast<uint64_t>(vkObj));
219 if (queue_item == device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
220 p_obj_node = new OBJTRACK_NODE;
221 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT][reinterpret_cast<uint64_t>(vkObj)] = p_obj_node;
222 device_data->num_objects[object_type]++;
223 device_data->num_total_objects++;
224 } else {
225 p_obj_node = queue_item->second;
226 }
227 p_obj_node->object_type = object_type;
228 p_obj_node->status = OBJSTATUS_NONE;
229 p_obj_node->handle = reinterpret_cast<uint64_t>(vkObj);
230}
231
232static void CreateSwapchainImageObject(VkDevice dispatchable_object, VkImage swapchain_image, VkSwapchainKHR swapchain) {
233 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
234 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
235 reinterpret_cast<uint64_t &>(swapchain_image), __LINE__, OBJTRACK_NONE, LayerName,
236 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, "SwapchainImage",
237 reinterpret_cast<uint64_t &>(swapchain_image));
238
239 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
240 pNewObjNode->object_type = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT;
241 pNewObjNode->status = OBJSTATUS_NONE;
242 pNewObjNode->handle = reinterpret_cast<uint64_t &>(swapchain_image);
243 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(swapchain);
244 device_data->swapchainImageMap[reinterpret_cast<uint64_t &>(swapchain_image)] = pNewObjNode;
245}
246
Chris Forbes64a31a12016-10-04 14:54:13 +1300247template<typename T>
248uint64_t handle_value(T handle) {
249 return reinterpret_cast<uint64_t &>(handle);
250}
251template<typename T>
252uint64_t handle_value(T *handle) {
253 return reinterpret_cast<uint64_t>(handle);
254}
255
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600256template <typename T1, typename T2>
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600257static void CreateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600258 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes04257ad2016-10-04 10:08:31 +1300259
Chris Forbes64a31a12016-10-04 14:54:13 +1300260 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600261 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600262
Chris Forbesfeecd402016-09-29 14:53:50 +1300263 log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, object_handle,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600264 __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
Chris Forbesfeecd402016-09-29 14:53:50 +1300265 object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600266
267 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
268 pNewObjNode->object_type = object_type;
Chris Forbesdbfe96a2016-09-29 13:51:10 +1300269 pNewObjNode->status = custom_allocator ? OBJSTATUS_CUSTOM_ALLOCATOR : OBJSTATUS_NONE;
Chris Forbesfeecd402016-09-29 14:53:50 +1300270 pNewObjNode->handle = object_handle;
271 instance_data->object_map[object_type][object_handle] = pNewObjNode;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600272 instance_data->num_objects[object_type]++;
273 instance_data->num_total_objects++;
274}
275
276template <typename T1, typename T2>
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600277static void DestroyObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600278 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
279
Chris Forbes64a31a12016-10-04 14:54:13 +1300280 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600281 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600282
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700283 if (object_handle != VK_NULL_HANDLE) {
284 auto item = device_data->object_map[object_type].find(object_handle);
285 if (item != device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600286
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700287 OBJTRACK_NODE *pNode = item->second;
288 assert(device_data->num_total_objects > 0);
289 device_data->num_total_objects--;
290 assert(device_data->num_objects[pNode->object_type] > 0);
291 device_data->num_objects[pNode->object_type]--;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600292
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700293 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, pNode->object_type, object_handle, __LINE__,
294 OBJTRACK_NONE, LayerName,
295 "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " %s objs).",
296 object_name[pNode->object_type], reinterpret_cast<uint64_t &>(object), device_data->num_total_objects,
297 device_data->num_objects[pNode->object_type], object_name[pNode->object_type]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600298
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700299 auto allocated_with_custom = (pNode->status & OBJSTATUS_CUSTOM_ALLOCATOR) ? true : false;
300 if (custom_allocator ^ allocated_with_custom) {
301 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
302 OBJTRACK_ALLOCATOR_MISMATCH, LayerName,
303 "Custom allocator %sspecified while destroying %s obj 0x%" PRIxLEAST64 " but %sspecified at creation",
304 (custom_allocator ? "" : "not "), object_name[object_type], object_handle,
305 (allocated_with_custom ? "" : "not "));
306 }
307
308 delete pNode;
309 device_data->object_map[object_type].erase(item);
310 } else {
311 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle, __LINE__,
312 OBJTRACK_UNKNOWN_OBJECT, LayerName,
313 "Unable to remove %s obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",
314 object_name[object_type], object_handle);
Chris Forbes3e51a202016-09-29 14:35:09 +1300315 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600316 }
317}
318
Mike Schuchardt662c39c2016-11-11 16:10:51 -0700319static const int VALIDATION_ERROR_UNDEFINED = -1;
320
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600321template <typename T1, typename T2>
Karl Schultza9ef1e52016-10-06 17:53:48 -0600322static bool ValidateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool null_allowed,
Mike Schuchardt662c39c2016-11-11 16:10:51 -0700323 int error_code) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600324 if (null_allowed && (object == VK_NULL_HANDLE)) {
325 return false;
326 }
Chris Forbes64a31a12016-10-04 14:54:13 +1300327 auto object_handle = handle_value(object);
328
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600329 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +1300330 if (device_data->object_map[object_type].find(object_handle) == device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600331 // If object is an image, also look for it in the swapchain image map
332 if ((object_type != VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT) ||
Chris Forbes2f271a72016-09-29 14:58:08 +1300333 (device_data->swapchainImageMap.find(object_handle) == device_data->swapchainImageMap.end())) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -0700334 const char *error_msg = (error_code == VALIDATION_ERROR_UNDEFINED) ? "" : validation_error_map[error_code];
Karl Schultza9ef1e52016-10-06 17:53:48 -0600335 return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
336 error_code, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s", object_name[object_type],
337 object_handle, error_msg);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600338 }
339 }
340 return false;
341}
342
343static void DeviceReportUndestroyedObjects(VkDevice device, VkDebugReportObjectTypeEXT object_type) {
344 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
345 for (auto item = device_data->object_map[object_type].begin(); item != device_data->object_map[object_type].end();) {
346 OBJTRACK_NODE *object_info = item->second;
347 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_info->object_type, object_info->handle, __LINE__,
348 OBJTRACK_OBJECT_LEAK, LayerName,
349 "OBJ ERROR : For device 0x%" PRIxLEAST64 ", %s object 0x%" PRIxLEAST64 " has not been destroyed.",
350 reinterpret_cast<uint64_t>(device), object_name[object_type], object_info->handle);
351 item = device_data->object_map[object_type].erase(item);
352 }
353}
354
355VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
356 std::unique_lock<std::mutex> lock(global_lock);
357
358 dispatch_key key = get_dispatch_key(instance);
359 layer_data *instance_data = get_my_data_ptr(key, layer_data_map);
360
361 // Enable the temporary callback(s) here to catch cleanup issues:
362 bool callback_setup = false;
363 if (instance_data->num_tmp_callbacks > 0) {
364 if (!layer_enable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks,
365 instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks)) {
366 callback_setup = true;
367 }
368 }
369
Jeremy Hayes058b41c2016-11-03 10:49:44 -0600370 // TODO: The instance handle can not be validated here. The loader will likely have to validate it.
Karl Schultzcf2e0452016-10-12 13:28:49 -0600371 ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, true, VALIDATION_ERROR_00021);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600372
Chris Forbesec461992016-09-29 14:41:44 +1300373 DestroyObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600374 // Report any remaining objects in LL
375
376 for (auto iit = instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].begin();
377 iit != instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].end();) {
378 OBJTRACK_NODE *pNode = iit->second;
379
380 VkDevice device = reinterpret_cast<VkDevice>(pNode->handle);
381
382 log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, pNode->handle, __LINE__,
383 OBJTRACK_OBJECT_LEAK, LayerName, "OBJ ERROR : %s object 0x%" PRIxLEAST64 " has not been destroyed.",
384 string_VkDebugReportObjectTypeEXT(pNode->object_type), pNode->handle);
385 // Semaphore:
386 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT);
387 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT);
388 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT);
389 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT);
390 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
391 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
392 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT);
393 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT);
394 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT);
395 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT);
396 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT);
397 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT);
398 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT);
399 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT);
400 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT);
401 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT);
402 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT);
403 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT);
404 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
405 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT);
406 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT);
407 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT);
408 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
409 }
410 instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].clear();
411
412 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
413 pInstanceTable->DestroyInstance(instance, pAllocator);
414
415 // Disable and cleanup the temporary callback(s):
416 if (callback_setup) {
417 layer_disable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks, instance_data->tmp_callbacks);
418 }
419 if (instance_data->num_tmp_callbacks > 0) {
420 layer_free_tmp_callbacks(instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks);
421 instance_data->num_tmp_callbacks = 0;
422 }
423
424 // Clean up logging callback, if any
425 while (instance_data->logging_callback.size() > 0) {
426 VkDebugReportCallbackEXT callback = instance_data->logging_callback.back();
427 layer_destroy_msg_callback(instance_data->report_data, callback, pAllocator);
428 instance_data->logging_callback.pop_back();
429 }
430
431 layer_debug_report_destroy_instance(instance_data->report_data);
432 layer_data_map.erase(key);
433
434 instanceExtMap.erase(pInstanceTable);
435 lock.unlock();
436 ot_instance_table_map.erase(key);
437}
438
439VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
440
441 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600442 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, true, VALIDATION_ERROR_00052);
Chris Forbesec461992016-09-29 14:41:44 +1300443 DestroyObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600444
445 // Report any remaining objects associated with this VkDevice object in LL
446 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT);
447 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT);
448 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT);
449 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
450 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
451 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT);
452 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT);
453 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT);
454 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT);
455 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT);
456 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT);
457 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT);
458 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT);
459 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT);
460 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT);
461 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT);
462 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT);
463 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
464 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT);
465 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT);
466 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT);
467 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT);
468 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
469
470 // Clean up Queue's MemRef Linked Lists
471 DestroyQueueDataStructures(device);
472
473 lock.unlock();
474
475 dispatch_key key = get_dispatch_key(device);
476 VkLayerDispatchTable *pDisp = get_dispatch_table(ot_device_table_map, device);
477 pDisp->DestroyDevice(device, pAllocator);
478 ot_device_table_map.erase(key);
479}
480
481VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
482 bool skip_call = false;
483 {
484 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600485 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
486 VALIDATION_ERROR_01679);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600487 }
488 if (skip_call) {
489 return;
490 }
491 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
492}
493
494VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
495 VkFormatProperties *pFormatProperties) {
496 bool skip_call = false;
497 {
498 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600499 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
500 VALIDATION_ERROR_01683);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600501 }
502 if (skip_call) {
503 return;
504 }
505 get_dispatch_table(ot_instance_table_map, physicalDevice)
506 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
507}
508
509VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
510 VkImageType type, VkImageTiling tiling,
511 VkImageUsageFlags usage, VkImageCreateFlags flags,
512 VkImageFormatProperties *pImageFormatProperties) {
513 bool skip_call = false;
514 {
515 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600516 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
517 VALIDATION_ERROR_01686);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600518 }
519 if (skip_call) {
520 return VK_ERROR_VALIDATION_FAILED_EXT;
521 }
522 VkResult result =
523 get_dispatch_table(ot_instance_table_map, physicalDevice)
524 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
525 return result;
526}
527
528VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
529 bool skip_call = false;
530 {
531 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600532 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
533 VALIDATION_ERROR_00026);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600534 }
535 if (skip_call) {
536 return;
537 }
538 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
539}
540
541VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
542 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
543 bool skip_call = false;
544 {
545 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600546 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
547 VALIDATION_ERROR_00609);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600548 }
549 if (skip_call) {
550 return;
551 }
552 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
553}
554
555VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *pName);
556
557VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *pName);
558
559VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount,
560 VkExtensionProperties *pProperties);
561
562VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pPropertyCount, VkLayerProperties *pProperties);
563
564VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
565 VkLayerProperties *pProperties);
566
567VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
568 bool skip_call = false;
569 {
570 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600571 skip_call |= ValidateObject(queue, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_00130);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600572 if (pSubmits) {
573 for (uint32_t idx0 = 0; idx0 < submitCount; ++idx0) {
574 if (pSubmits[idx0].pCommandBuffers) {
575 for (uint32_t idx1 = 0; idx1 < pSubmits[idx0].commandBufferCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300576 skip_call |= ValidateObject(queue, pSubmits[idx0].pCommandBuffers[idx1],
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600577 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_00149);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600578 }
579 }
580 if (pSubmits[idx0].pSignalSemaphores) {
581 for (uint32_t idx2 = 0; idx2 < pSubmits[idx0].signalSemaphoreCount; ++idx2) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300582 skip_call |= ValidateObject(queue, pSubmits[idx0].pSignalSemaphores[idx2],
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600583 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false, VALIDATION_ERROR_00150);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600584 }
585 }
586 if (pSubmits[idx0].pWaitSemaphores) {
587 for (uint32_t idx3 = 0; idx3 < pSubmits[idx0].waitSemaphoreCount; ++idx3) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300588 skip_call |= ValidateObject(queue, pSubmits[idx0].pWaitSemaphores[idx3],
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600589 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false, VALIDATION_ERROR_00146);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600590 }
591 }
592 }
593 }
594 if (queue) {
Karl Schultzcf2e0452016-10-12 13:28:49 -0600595 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_00128);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600596 }
597 }
598 if (skip_call) {
599 return VK_ERROR_VALIDATION_FAILED_EXT;
600 }
601 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
602 return result;
603}
604
605VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
606 bool skip_call = false;
607 {
608 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600609 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_00317);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600610 }
611 if (skip_call) {
612 return VK_ERROR_VALIDATION_FAILED_EXT;
613 }
614 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueWaitIdle(queue);
615 return result;
616}
617
618VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
619 bool skip_call = false;
620 {
621 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600622 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00318);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600623 }
624 if (skip_call) {
625 return VK_ERROR_VALIDATION_FAILED_EXT;
626 }
627 VkResult result = get_dispatch_table(ot_device_table_map, device)->DeviceWaitIdle(device);
628 return result;
629}
630
631VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
632 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
633 bool skip_call = false;
634 {
635 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600636 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00612);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600637 }
638 if (skip_call) {
639 return VK_ERROR_VALIDATION_FAILED_EXT;
640 }
641 VkResult result = get_dispatch_table(ot_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
642 {
643 std::lock_guard<std::mutex> lock(global_lock);
644 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300645 CreateObject(device, *pMemory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600646 }
647 }
648 return result;
649}
650
651VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
652 const VkMappedMemoryRange *pMemoryRanges) {
653 bool skip_call = false;
654 {
655 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600656 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00635);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600657 if (pMemoryRanges) {
658 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
659 if (pMemoryRanges[idx0].memory) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600660 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,
661 false, VALIDATION_ERROR_00648);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600662 }
663 }
664 }
665 }
666 if (skip_call) {
667 return VK_ERROR_VALIDATION_FAILED_EXT;
668 }
669 VkResult result =
670 get_dispatch_table(ot_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
671 return result;
672}
673
674VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
675 const VkMappedMemoryRange *pMemoryRanges) {
676 bool skip_call = false;
677 {
678 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600679 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00638);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600680 if (pMemoryRanges) {
681 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
682 if (pMemoryRanges[idx0].memory) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600683 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,
684 false, VALIDATION_ERROR_00648);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600685 }
686 }
687 }
688 }
689 if (skip_call) {
690 return VK_ERROR_VALIDATION_FAILED_EXT;
691 }
692 VkResult result =
693 get_dispatch_table(ot_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
694 return result;
695}
696
697VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
698 VkDeviceSize *pCommittedMemoryInBytes) {
699 bool skip_call = false;
700 {
701 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600702 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00654);
703 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00655);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600704 }
705 if (skip_call) {
706 return;
707 }
708 get_dispatch_table(ot_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
709}
710
711VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
712 VkDeviceSize memoryOffset) {
713 bool skip_call = false;
714 {
715 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600716 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00799);
717 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00798);
718 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00800);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600719 }
720 if (skip_call) {
721 return VK_ERROR_VALIDATION_FAILED_EXT;
722 }
723 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
724 return result;
725}
726
727VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
728 bool skip_call = false;
729 {
730 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600731 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00807);
732 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00808);
733 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00809);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600734 }
735 if (skip_call) {
736 return VK_ERROR_VALIDATION_FAILED_EXT;
737 }
738 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
739 return result;
740}
741
742VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
743 VkMemoryRequirements *pMemoryRequirements) {
744 bool skip_call = false;
745 {
746 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600747 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00784);
748 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00783);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600749 }
750 if (skip_call) {
751 return;
752 }
753 get_dispatch_table(ot_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
754}
755
756VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
757 bool skip_call = false;
758 {
759 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600760 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00787);
761 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00788);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600762 }
763 if (skip_call) {
764 return;
765 }
766 get_dispatch_table(ot_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
767}
768
769VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
770 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
771 bool skip_call = false;
772 {
773 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600774 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01610);
775 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01611);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600776 }
777 if (skip_call) {
778 return;
779 }
780 get_dispatch_table(ot_device_table_map, device)
781 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
782}
783
784VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
785 VkImageType type, VkSampleCountFlagBits samples,
786 VkImageUsageFlags usage, VkImageTiling tiling,
787 uint32_t *pPropertyCount,
788 VkSparseImageFormatProperties *pProperties) {
789 bool skip_call = false;
790 {
791 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600792 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
793 VALIDATION_ERROR_01601);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600794 }
795 if (skip_call) {
796 return;
797 }
798 get_dispatch_table(ot_instance_table_map, physicalDevice)
799 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
800 pProperties);
801}
802
803VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
804 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
805 bool skip_call = false;
806 {
807 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600808 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00166);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600809 }
810 if (skip_call) {
811 return VK_ERROR_VALIDATION_FAILED_EXT;
812 }
813 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
814 {
815 std::lock_guard<std::mutex> lock(global_lock);
816 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300817 CreateObject(device, *pFence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600818 }
819 }
820 return result;
821}
822
823VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
824 bool skip_call = false;
825 {
826 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600827 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00176);
828 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_00177);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600829 }
830 if (skip_call) {
831 return;
832 }
833 {
834 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300835 DestroyObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600836 }
837 get_dispatch_table(ot_device_table_map, device)->DestroyFence(device, fence, pAllocator);
838}
839
840VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
841 bool skip_call = false;
842 {
843 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600844 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00184);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600845 if (pFences) {
846 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -0600847 skip_call |=
848 ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00187);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600849 }
850 }
851 }
852 if (skip_call) {
853 return VK_ERROR_VALIDATION_FAILED_EXT;
854 }
855 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetFences(device, fenceCount, pFences);
856 return result;
857}
858
859VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
860 bool skip_call = false;
861 {
862 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600863 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00180);
864 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00181);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600865 }
866 if (skip_call) {
867 return VK_ERROR_VALIDATION_FAILED_EXT;
868 }
869 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetFenceStatus(device, fence);
870 return result;
871}
872
873VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
874 uint64_t timeout) {
875 bool skip_call = false;
876 {
877 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600878 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00188);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600879 if (pFences) {
880 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -0600881 skip_call |=
882 ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00191);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600883 }
884 }
885 }
886 if (skip_call) {
887 return VK_ERROR_VALIDATION_FAILED_EXT;
888 }
889 VkResult result = get_dispatch_table(ot_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
890 return result;
891}
892
893VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
894 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
895 bool skip_call = false;
896 {
897 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600898 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00192);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600899 }
900 if (skip_call) {
901 return VK_ERROR_VALIDATION_FAILED_EXT;
902 }
903 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
904 {
905 std::lock_guard<std::mutex> lock(global_lock);
906 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300907 CreateObject(device, *pSemaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600908 }
909 }
910 return result;
911}
912
913VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
914 bool skip_call = false;
915 {
916 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600917 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00202);
918 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, true, VALIDATION_ERROR_00203);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600919 }
920 if (skip_call) {
921 return;
922 }
923 {
924 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300925 DestroyObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600926 }
927 get_dispatch_table(ot_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
928}
929
930VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
931 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
932 bool skip_call = false;
933 {
934 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600935 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00206);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600936 }
937 if (skip_call) {
938 return VK_ERROR_VALIDATION_FAILED_EXT;
939 }
940 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
941 {
942 std::lock_guard<std::mutex> lock(global_lock);
943 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300944 CreateObject(device, *pEvent, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600945 }
946 }
947 return result;
948}
949
950VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
951 bool skip_call = false;
952 {
953 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600954 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00216);
955 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, true, VALIDATION_ERROR_00217);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600956 }
957 if (skip_call) {
958 return;
959 }
960 {
961 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300962 DestroyObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600963 }
964 get_dispatch_table(ot_device_table_map, device)->DestroyEvent(device, event, pAllocator);
965}
966
967VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
968 bool skip_call = false;
969 {
970 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600971 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00220);
972 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00221);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600973 }
974 if (skip_call) {
975 return VK_ERROR_VALIDATION_FAILED_EXT;
976 }
977 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetEventStatus(device, event);
978 return result;
979}
980
981VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
982 bool skip_call = false;
983 {
984 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600985 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00223);
986 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00224);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600987 }
988 if (skip_call) {
989 return VK_ERROR_VALIDATION_FAILED_EXT;
990 }
991 VkResult result = get_dispatch_table(ot_device_table_map, device)->SetEvent(device, event);
992 return result;
993}
994
995VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
996 bool skip_call = false;
997 {
998 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600999 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00227);
1000 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00228);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001001 }
1002 if (skip_call) {
1003 return VK_ERROR_VALIDATION_FAILED_EXT;
1004 }
1005 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetEvent(device, event);
1006 return result;
1007}
1008
1009VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1010 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
1011 bool skip_call = false;
1012 {
1013 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001014 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01002);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001015 }
1016 if (skip_call) {
1017 return VK_ERROR_VALIDATION_FAILED_EXT;
1018 }
1019 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
1020 {
1021 std::lock_guard<std::mutex> lock(global_lock);
1022 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001023 CreateObject(device, *pQueryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001024 }
1025 }
1026 return result;
1027}
1028
1029VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
1030 bool skip_call = false;
1031 {
1032 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001033 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01015);
1034 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, true, VALIDATION_ERROR_01016);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001035 }
1036 if (skip_call) {
1037 return;
1038 }
1039 {
1040 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001041 DestroyObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001042 }
1043 get_dispatch_table(ot_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
1044}
1045
1046VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
1047 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
1048 bool skip_call = false;
1049 {
1050 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001051 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01054);
1052 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01055);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001053 }
1054 if (skip_call) {
1055 return VK_ERROR_VALIDATION_FAILED_EXT;
1056 }
1057 VkResult result = get_dispatch_table(ot_device_table_map, device)
1058 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
1059 return result;
1060}
1061
1062VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
1063 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
1064 bool skip_call = false;
1065 {
1066 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultza9ef1e52016-10-06 17:53:48 -06001067 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00659);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001068 }
1069 if (skip_call) {
1070 return VK_ERROR_VALIDATION_FAILED_EXT;
1071 }
1072 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
1073 {
1074 std::lock_guard<std::mutex> lock(global_lock);
1075 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001076 CreateObject(device, *pBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001077 }
1078 }
1079 return result;
1080}
1081
1082VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
1083 bool skip_call = false;
1084 {
1085 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001086 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, true, VALIDATION_ERROR_00680);
1087 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00679);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001088 }
1089 if (skip_call) {
1090 return;
1091 }
1092 {
1093 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001094 DestroyObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001095 }
1096 get_dispatch_table(ot_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
1097}
1098
1099VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
1100 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
1101 bool skip_call = false;
1102 {
1103 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001104 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00683);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001105 if (pCreateInfo) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001106 skip_call |=
1107 ValidateObject(device, pCreateInfo->buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00699);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001108 }
1109 }
1110 if (skip_call) {
1111 return VK_ERROR_VALIDATION_FAILED_EXT;
1112 }
1113 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
1114 {
1115 std::lock_guard<std::mutex> lock(global_lock);
1116 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001117 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001118 }
1119 }
1120 return result;
1121}
1122
1123VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
1124 bool skip_call = false;
1125 {
1126 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001127 skip_call |= ValidateObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, true, VALIDATION_ERROR_00705);
1128 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00704);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001129 }
1130 if (skip_call) {
1131 return;
1132 }
1133 {
1134 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001135 DestroyObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001136 }
1137 get_dispatch_table(ot_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
1138}
1139
1140VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
1141 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
1142 bool skip_call = false;
1143 {
1144 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001145 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00709);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001146 }
1147 if (skip_call) {
1148 return VK_ERROR_VALIDATION_FAILED_EXT;
1149 }
1150 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
1151 {
1152 std::lock_guard<std::mutex> lock(global_lock);
1153 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001154 CreateObject(device, *pImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001155 }
1156 }
1157 return result;
1158}
1159
1160VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
1161 bool skip_call = false;
1162 {
1163 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001164 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00746);
1165 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, true, VALIDATION_ERROR_00747);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001166 }
1167 if (skip_call) {
1168 return;
1169 }
1170 {
1171 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001172 DestroyObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001173 }
1174 get_dispatch_table(ot_device_table_map, device)->DestroyImage(device, image, pAllocator);
1175}
1176
1177VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
1178 VkSubresourceLayout *pLayout) {
1179 bool skip_call = false;
1180 {
1181 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001182 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00734);
1183 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00735);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001184 }
1185 if (skip_call) {
1186 return;
1187 }
1188 get_dispatch_table(ot_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
1189}
1190
1191VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
1192 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
1193 bool skip_call = false;
1194 {
1195 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001196 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00750);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001197 if (pCreateInfo) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001198 skip_call |=
1199 ValidateObject(device, pCreateInfo->image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00763);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001200 }
1201 }
1202 if (skip_call) {
1203 return VK_ERROR_VALIDATION_FAILED_EXT;
1204 }
1205 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
1206 {
1207 std::lock_guard<std::mutex> lock(global_lock);
1208 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001209 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001210 }
1211 }
1212 return result;
1213}
1214
1215VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
1216 bool skip_call = false;
1217 {
1218 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001219 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00779);
1220 skip_call |= ValidateObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, true, VALIDATION_ERROR_00780);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001221 }
1222 if (skip_call) {
1223 return;
1224 }
1225 {
1226 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001227 DestroyObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001228 }
1229 get_dispatch_table(ot_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
1230}
1231
1232VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
1233 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
1234 bool skip_call = false;
1235 {
1236 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001237 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00466);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001238 }
1239 if (skip_call) {
1240 return VK_ERROR_VALIDATION_FAILED_EXT;
1241 }
1242 VkResult result =
1243 get_dispatch_table(ot_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
1244 {
1245 std::lock_guard<std::mutex> lock(global_lock);
1246 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001247 CreateObject(device, *pShaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001248 }
1249 }
1250 return result;
1251}
1252
1253VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1254 const VkAllocationCallbacks *pAllocator) {
1255 bool skip_call = false;
1256 {
1257 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001258 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00481);
1259 skip_call |=
1260 ValidateObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, true, VALIDATION_ERROR_00482);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001261 }
1262 if (skip_call) {
1263 return;
1264 }
1265 {
1266 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001267 DestroyObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001268 }
1269 get_dispatch_table(ot_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
1270}
1271
1272VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
1273 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
1274 bool skip_call = false;
1275 {
1276 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001277 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00562);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001278 }
1279 if (skip_call) {
1280 return VK_ERROR_VALIDATION_FAILED_EXT;
1281 }
1282 VkResult result =
1283 get_dispatch_table(ot_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
1284 {
1285 std::lock_guard<std::mutex> lock(global_lock);
1286 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001287 CreateObject(device, *pPipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001288 }
1289 }
1290 return result;
1291}
1292
1293VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
1294 const VkAllocationCallbacks *pAllocator) {
1295 bool skip_call = false;
1296 {
1297 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001298 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00585);
1299 skip_call |=
1300 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00586);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001301 }
1302 if (skip_call) {
1303 return;
1304 }
1305 {
1306 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001307 DestroyObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001308 }
1309 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
1310}
1311
1312VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
1313 void *pData) {
1314 bool skip_call = false;
1315 {
1316 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001317 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00578);
1318 skip_call |=
1319 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false, VALIDATION_ERROR_00579);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001320 }
1321 if (skip_call) {
1322 return VK_ERROR_VALIDATION_FAILED_EXT;
1323 }
1324 VkResult result =
1325 get_dispatch_table(ot_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
1326 return result;
1327}
1328
1329VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
1330 const VkPipelineCache *pSrcCaches) {
1331 bool skip_call = false;
1332 {
1333 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001334 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00572);
1335 skip_call |=
1336 ValidateObject(device, dstCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false, VALIDATION_ERROR_00573);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001337 if (pSrcCaches) {
1338 for (uint32_t idx0 = 0; idx0 < srcCacheCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06001339 skip_call |= ValidateObject(device, pSrcCaches[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false,
1340 VALIDATION_ERROR_00577);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001341 }
1342 }
1343 }
1344 if (skip_call) {
1345 return VK_ERROR_VALIDATION_FAILED_EXT;
1346 }
1347 VkResult result =
1348 get_dispatch_table(ot_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
1349 return result;
1350}
1351
1352VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
1353 bool skip_call = false;
1354 {
1355 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001356 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00558);
1357 skip_call |= ValidateObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, true, VALIDATION_ERROR_00559);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001358 }
1359 if (skip_call) {
1360 return;
1361 }
1362 {
1363 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001364 DestroyObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001365 }
1366 get_dispatch_table(ot_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
1367}
1368
1369VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
1370 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
1371 bool skip_call = false;
1372 {
1373 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001374 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00861);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001375 if (pCreateInfo) {
1376 if (pCreateInfo->pSetLayouts) {
1377 for (uint32_t idx0 = 0; idx0 < pCreateInfo->setLayoutCount; ++idx0) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001378 skip_call |=
1379 ValidateObject(device, pCreateInfo->pSetLayouts[idx0],
1380 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false, VALIDATION_ERROR_00875);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001381 }
1382 }
1383 }
1384 }
1385 if (skip_call) {
1386 return VK_ERROR_VALIDATION_FAILED_EXT;
1387 }
1388 VkResult result =
1389 get_dispatch_table(ot_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
1390 {
1391 std::lock_guard<std::mutex> lock(global_lock);
1392 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001393 CreateObject(device, *pPipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001394 }
1395 }
1396 return result;
1397}
1398
1399VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1400 const VkAllocationCallbacks *pAllocator) {
1401 bool skip_call = false;
1402 {
1403 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001404 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00885);
1405 skip_call |=
1406 ValidateObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, true, VALIDATION_ERROR_00886);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001407 }
1408 if (skip_call) {
1409 return;
1410 }
1411 {
1412 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001413 DestroyObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001414 }
1415 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
1416}
1417
1418VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
1419 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
1420 bool skip_call = false;
1421 {
1422 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001423 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00812);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001424 }
1425 if (skip_call) {
1426 return VK_ERROR_VALIDATION_FAILED_EXT;
1427 }
1428 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
1429 {
1430 std::lock_guard<std::mutex> lock(global_lock);
1431 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001432 CreateObject(device, *pSampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001433 }
1434 }
1435 return result;
1436}
1437
1438VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
1439 bool skip_call = false;
1440 {
1441 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001442 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00840);
1443 skip_call |= ValidateObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, true, VALIDATION_ERROR_00841);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001444 }
1445 if (skip_call) {
1446 return;
1447 }
1448 {
1449 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001450 DestroyObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001451 }
1452 get_dispatch_table(ot_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
1453}
1454
1455VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
1456 const VkAllocationCallbacks *pAllocator,
1457 VkDescriptorSetLayout *pSetLayout) {
1458 bool skip_call = false;
1459 {
1460 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001461 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00844);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001462 if (pCreateInfo) {
1463 if (pCreateInfo->pBindings) {
1464 for (uint32_t idx0 = 0; idx0 < pCreateInfo->bindingCount; ++idx0) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001465 if ((pCreateInfo->pBindings[idx0].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
1466 (pCreateInfo->pBindings[idx0].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) {
1467 if (pCreateInfo->pBindings[idx0].pImmutableSamplers) {
1468 for (uint32_t idx1 = 0; idx1 < pCreateInfo->pBindings[idx0].descriptorCount; ++idx1) {
1469 skip_call |= ValidateObject(device, pCreateInfo->pBindings[idx0].pImmutableSamplers[idx1],
1470 VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false, VALIDATION_ERROR_00852);
1471 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001472 }
1473 }
1474 }
1475 }
1476 }
1477 }
1478 if (skip_call) {
1479 return VK_ERROR_VALIDATION_FAILED_EXT;
1480 }
1481 VkResult result =
1482 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
1483 {
1484 std::lock_guard<std::mutex> lock(global_lock);
1485 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001486 CreateObject(device, *pSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001487 }
1488 }
1489 return result;
1490}
1491
1492VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1493 const VkAllocationCallbacks *pAllocator) {
1494 bool skip_call = false;
1495 {
1496 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001497 skip_call |= ValidateObject(device, descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, true,
1498 VALIDATION_ERROR_00858);
1499 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00857);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001500 }
1501 if (skip_call) {
1502 return;
1503 }
1504 {
1505 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001506 DestroyObject(device, descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001507 }
1508 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
1509}
1510
1511VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
1512 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
1513 bool skip_call = false;
1514 {
1515 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001516 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00889);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001517 }
1518 if (skip_call) {
1519 return VK_ERROR_VALIDATION_FAILED_EXT;
1520 }
1521 VkResult result =
1522 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
1523 {
1524 std::lock_guard<std::mutex> lock(global_lock);
1525 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001526 CreateObject(device, *pDescriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001527 }
1528 }
1529 return result;
1530}
1531
1532VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1533 VkDescriptorPoolResetFlags flags) {
1534 bool skip_call = false;
Chris Forbes2a947ce2016-09-29 18:47:50 +13001535 std::unique_lock<std::mutex> lock(global_lock);
1536 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001537 skip_call |=
1538 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false, VALIDATION_ERROR_00930);
1539 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00929);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001540 if (skip_call) {
1541 return VK_ERROR_VALIDATION_FAILED_EXT;
1542 }
Chris Forbes2a947ce2016-09-29 18:47:50 +13001543 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is reset.
1544 // Remove this pool's descriptor sets from our descriptorSet map.
1545 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
1546 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
1547 OBJTRACK_NODE *pNode = (*itr).second;
1548 auto del_itr = itr++;
1549 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
1550 DestroyObject(device, (VkDescriptorSet)((*del_itr).first),
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06001551 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr);
Chris Forbes2a947ce2016-09-29 18:47:50 +13001552 }
1553 }
1554 lock.unlock();
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001555 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
1556 return result;
1557}
1558
1559VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
1560 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
1561 const VkCopyDescriptorSet *pDescriptorCopies) {
1562 bool skip_call = false;
1563 {
1564 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001565 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00933);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001566 if (pDescriptorCopies) {
1567 for (uint32_t idx0 = 0; idx0 < descriptorCopyCount; ++idx0) {
1568 if (pDescriptorCopies[idx0].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001569 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].dstSet,
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001570 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false, VALIDATION_ERROR_00972);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001571 }
1572 if (pDescriptorCopies[idx0].srcSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001573 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].srcSet,
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001574 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false, VALIDATION_ERROR_00971);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001575 }
1576 }
1577 }
1578 if (pDescriptorWrites) {
1579 for (uint32_t idx1 = 0; idx1 < descriptorWriteCount; ++idx1) {
1580 if (pDescriptorWrites[idx1].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001581 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].dstSet,
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001582 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false, VALIDATION_ERROR_00955);
1583 }
1584 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
1585 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
1586 for (uint32_t idx2 = 0; idx2 < pDescriptorWrites[idx1].descriptorCount; ++idx2) {
1587 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pTexelBufferView[idx2],
1588 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, false, VALIDATION_ERROR_00940);
1589 }
1590 }
1591 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
1592 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
1593 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
1594 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
1595 for (uint32_t idx3 = 0; idx3 < pDescriptorWrites[idx1].descriptorCount; ++idx3) {
1596 if (pDescriptorWrites[idx1].pImageInfo[idx3].imageView) {
1597 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pImageInfo[idx3].imageView,
1598 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false, VALIDATION_ERROR_00943);
1599 }
1600 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001601 }
1602 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
1603 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
1604 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
1605 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001606 for (uint32_t idx4 = 0; idx4 < pDescriptorWrites[idx1].descriptorCount; ++idx4) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001607 if (pDescriptorWrites[idx1].pBufferInfo[idx4].buffer) {
1608 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pBufferInfo[idx4].buffer,
1609 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00962);
1610 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001611 }
1612 }
1613 }
1614 }
1615 }
1616 if (skip_call) {
1617 return;
1618 }
1619 get_dispatch_table(ot_device_table_map, device)
1620 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
1621}
1622
1623VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
1624 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
1625 bool skip_call = false;
1626 {
1627 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001628 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00400);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001629 if (pCreateInfo) {
1630 if (pCreateInfo->pAttachments) {
1631 for (uint32_t idx0 = 0; idx0 < pCreateInfo->attachmentCount; ++idx0) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001632 skip_call |= ValidateObject(device, pCreateInfo->pAttachments[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT,
1633 false, VALIDATION_ERROR_00420);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001634 }
1635 }
1636 if (pCreateInfo->renderPass) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001637 skip_call |= ValidateObject(device, pCreateInfo->renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false,
1638 VALIDATION_ERROR_00419);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001639 }
1640 }
1641 }
1642 if (skip_call) {
1643 return VK_ERROR_VALIDATION_FAILED_EXT;
1644 }
1645 VkResult result =
1646 get_dispatch_table(ot_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
1647 {
1648 std::lock_guard<std::mutex> lock(global_lock);
1649 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001650 CreateObject(device, *pFramebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001651 }
1652 }
1653 return result;
1654}
1655
1656VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
1657 bool skip_call = false;
1658 {
1659 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001660 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00425);
1661 skip_call |= ValidateObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, true, VALIDATION_ERROR_00426);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001662 }
1663 if (skip_call) {
1664 return;
1665 }
1666 {
1667 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001668 DestroyObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001669 }
1670 get_dispatch_table(ot_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
1671}
1672
1673VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
1674 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
1675 bool skip_call = false;
1676 {
1677 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001678 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00319);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001679 }
1680 if (skip_call) {
1681 return VK_ERROR_VALIDATION_FAILED_EXT;
1682 }
1683 VkResult result =
1684 get_dispatch_table(ot_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
1685 {
1686 std::lock_guard<std::mutex> lock(global_lock);
1687 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001688 CreateObject(device, *pRenderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001689 }
1690 }
1691 return result;
1692}
1693
1694VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
1695 bool skip_call = false;
1696 {
1697 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001698 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00396);
1699 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, true, VALIDATION_ERROR_00397);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001700 }
1701 if (skip_call) {
1702 return;
1703 }
1704 {
1705 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001706 DestroyObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001707 }
1708 get_dispatch_table(ot_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
1709}
1710
1711VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
1712 bool skip_call = false;
1713 {
1714 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001715 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00449);
1716 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false, VALIDATION_ERROR_00450);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001717 }
1718 if (skip_call) {
1719 return;
1720 }
1721 get_dispatch_table(ot_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
1722}
1723
1724VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1725 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
1726 bool skip_call = false;
1727 {
1728 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001729 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00064);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001730 }
1731 if (skip_call) {
1732 return VK_ERROR_VALIDATION_FAILED_EXT;
1733 }
1734 VkResult result =
1735 get_dispatch_table(ot_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
1736 {
1737 std::lock_guard<std::mutex> lock(global_lock);
1738 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001739 CreateObject(device, *pCommandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001740 }
1741 }
1742 return result;
1743}
1744
1745VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
1746 bool skip_call = false;
1747 {
1748 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001749 skip_call |=
1750 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false, VALIDATION_ERROR_00074);
1751 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00073);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001752 }
1753 if (skip_call) {
1754 return VK_ERROR_VALIDATION_FAILED_EXT;
1755 }
1756 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
1757 return result;
1758}
1759
1760VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer command_buffer, const VkCommandBufferBeginInfo *begin_info) {
1761 layer_data *device_data = get_my_data_ptr(get_dispatch_key(command_buffer), layer_data_map);
1762 bool skip_call = false;
1763 {
1764 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001765 skip_call |= ValidateObject(command_buffer, command_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1766 VALIDATION_ERROR_00108);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001767 if (begin_info) {
1768 OBJTRACK_NODE *pNode =
1769 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<const uint64_t>(command_buffer)];
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001770 if ((begin_info->pInheritanceInfo) && (pNode->status & OBJSTATUS_COMMAND_BUFFER_SECONDARY) &&
1771 (begin_info->flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001772 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->framebuffer,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001773 VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, true, VALIDATION_ERROR_00112);
Chris Forbes2f271a72016-09-29 14:58:08 +13001774 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->renderPass,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001775 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false, VALIDATION_ERROR_00110);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001776 }
1777 }
1778 }
1779 if (skip_call) {
1780 return VK_ERROR_VALIDATION_FAILED_EXT;
1781 }
1782 VkResult result = get_dispatch_table(ot_device_table_map, command_buffer)->BeginCommandBuffer(command_buffer, begin_info);
1783 return result;
1784}
1785
1786VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
1787 bool skip_call = false;
1788 {
1789 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001790 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1791 VALIDATION_ERROR_00125);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001792 }
1793 if (skip_call) {
1794 return VK_ERROR_VALIDATION_FAILED_EXT;
1795 }
1796 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
1797 return result;
1798}
1799
1800VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
1801 bool skip_call = false;
1802 {
1803 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001804 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1805 VALIDATION_ERROR_00090);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001806 }
1807 if (skip_call) {
1808 return VK_ERROR_VALIDATION_FAILED_EXT;
1809 }
1810 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
1811 return result;
1812}
1813
1814VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1815 VkPipeline pipeline) {
1816 bool skip_call = false;
1817 {
1818 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001819 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1820 VALIDATION_ERROR_00599);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001821 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06001822 ValidateObject(commandBuffer, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, false, VALIDATION_ERROR_00601);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001823 }
1824 if (skip_call) {
1825 return;
1826 }
1827 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
1828}
1829
1830VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
1831 const VkViewport *pViewports) {
1832 bool skip_call = false;
1833 {
1834 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001835 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1836 VALIDATION_ERROR_01443);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001837 }
1838 if (skip_call) {
1839 return;
1840 }
1841 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
1842}
1843
1844VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
1845 const VkRect2D *pScissors) {
1846 bool skip_call = false;
1847 {
1848 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001849 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1850 VALIDATION_ERROR_01492);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001851 }
1852 if (skip_call) {
1853 return;
1854 }
1855 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
1856}
1857
1858VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
1859 bool skip_call = false;
1860 {
1861 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001862 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1863 VALIDATION_ERROR_01478);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001864 }
1865 if (skip_call) {
1866 return;
1867 }
1868 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
1869}
1870
1871VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
1872 float depthBiasSlopeFactor) {
1873 bool skip_call = false;
1874 {
1875 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001876 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1877 VALIDATION_ERROR_01483);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001878 }
1879 if (skip_call) {
1880 return;
1881 }
1882 get_dispatch_table(ot_device_table_map, commandBuffer)
1883 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
1884}
1885
1886VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
1887 bool skip_call = false;
1888 {
1889 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001890 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1891 VALIDATION_ERROR_01551);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001892 }
1893 if (skip_call) {
1894 return;
1895 }
1896 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
1897}
1898
1899VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
1900 bool skip_call = false;
1901 {
1902 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001903 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1904 VALIDATION_ERROR_01507);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001905 }
1906 if (skip_call) {
1907 return;
1908 }
1909 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
1910}
1911
1912VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
1913 uint32_t compareMask) {
1914 bool skip_call = false;
1915 {
1916 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001917 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1918 VALIDATION_ERROR_01515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001919 }
1920 if (skip_call) {
1921 return;
1922 }
1923 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
1924}
1925
1926VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
1927 bool skip_call = false;
1928 {
1929 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001930 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1931 VALIDATION_ERROR_01521);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001932 }
1933 if (skip_call) {
1934 return;
1935 }
1936 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
1937}
1938
1939VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
1940 bool skip_call = false;
1941 {
1942 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001943 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1944 VALIDATION_ERROR_01527);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001945 }
1946 if (skip_call) {
1947 return;
1948 }
1949 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
1950}
1951
1952VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1953 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
1954 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
1955 const uint32_t *pDynamicOffsets) {
1956 bool skip_call = false;
1957 {
1958 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001959 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1960 VALIDATION_ERROR_00979);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001961 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06001962 ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false, VALIDATION_ERROR_00981);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001963 if (pDescriptorSets) {
1964 for (uint32_t idx0 = 0; idx0 < descriptorSetCount; ++idx0) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001965 skip_call |= ValidateObject(commandBuffer, pDescriptorSets[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
1966 false, VALIDATION_ERROR_00982);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001967 }
1968 }
1969 }
1970 if (skip_call) {
1971 return;
1972 }
1973 get_dispatch_table(ot_device_table_map, commandBuffer)
1974 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
1975 dynamicOffsetCount, pDynamicOffsets);
1976}
1977
1978VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1979 VkIndexType indexType) {
1980 bool skip_call = false;
1981 {
1982 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001983 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01354);
1984 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1985 VALIDATION_ERROR_01353);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001986 }
1987 if (skip_call) {
1988 return;
1989 }
1990 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
1991}
1992
1993VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
1994 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
1995 bool skip_call = false;
1996 {
1997 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001998 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1999 VALIDATION_ERROR_01419);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002000 if (pBuffers) {
2001 for (uint32_t idx0 = 0; idx0 < bindingCount; ++idx0) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002002 skip_call |= ValidateObject(commandBuffer, pBuffers[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false,
2003 VALIDATION_ERROR_01420);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002004 }
2005 }
2006 }
2007 if (skip_call) {
2008 return;
2009 }
2010 get_dispatch_table(ot_device_table_map, commandBuffer)
2011 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
2012}
2013
2014VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
2015 uint32_t firstVertex, uint32_t firstInstance) {
2016 bool skip_call = false;
2017 {
2018 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002019 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2020 VALIDATION_ERROR_01362);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002021 }
2022 if (skip_call) {
2023 return;
2024 }
2025 get_dispatch_table(ot_device_table_map, commandBuffer)
2026 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
2027}
2028
2029VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
2030 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
2031 bool skip_call = false;
2032 {
2033 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002034 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2035 VALIDATION_ERROR_01369);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002036 }
2037 if (skip_call) {
2038 return;
2039 }
2040 get_dispatch_table(ot_device_table_map, commandBuffer)
2041 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
2042}
2043
2044VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
2045 uint32_t stride) {
2046 bool skip_call = false;
2047 {
2048 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002049 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01378);
2050 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2051 VALIDATION_ERROR_01377);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002052 }
2053 if (skip_call) {
2054 return;
2055 }
2056 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
2057}
2058
2059VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2060 uint32_t drawCount, uint32_t stride) {
2061 bool skip_call = false;
2062 {
2063 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002064 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01390);
2065 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2066 VALIDATION_ERROR_01389);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002067 }
2068 if (skip_call) {
2069 return;
2070 }
2071 get_dispatch_table(ot_device_table_map, commandBuffer)
2072 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
2073}
2074
2075VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
2076 bool skip_call = false;
2077 {
2078 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002079 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2080 VALIDATION_ERROR_01559);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002081 }
2082 if (skip_call) {
2083 return;
2084 }
2085 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
2086}
2087
2088VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
2089 bool skip_call = false;
2090 {
2091 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002092 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01566);
2093 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2094 VALIDATION_ERROR_01565);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002095 }
2096 if (skip_call) {
2097 return;
2098 }
2099 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
2100}
2101
2102VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
2103 uint32_t regionCount, const VkBufferCopy *pRegions) {
2104 bool skip_call = false;
2105 {
2106 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002107 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2108 VALIDATION_ERROR_01166);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002109 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002110 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01168);
2111 skip_call |=
2112 ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01167);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002113 }
2114 if (skip_call) {
2115 return;
2116 }
2117 get_dispatch_table(ot_device_table_map, commandBuffer)
2118 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
2119}
2120
2121VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2122 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2123 const VkImageCopy *pRegions) {
2124 bool skip_call = false;
2125 {
2126 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002127 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2128 VALIDATION_ERROR_01186);
2129 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01189);
2130 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01187);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002131 }
2132 if (skip_call) {
2133 return;
2134 }
2135 get_dispatch_table(ot_device_table_map, commandBuffer)
2136 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2137}
2138
2139VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2140 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2141 const VkImageBlit *pRegions, VkFilter filter) {
2142 bool skip_call = false;
2143 {
2144 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002145 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2146 VALIDATION_ERROR_01291);
2147 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01294);
2148 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01292);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002149 }
2150 if (skip_call) {
2151 return;
2152 }
2153 get_dispatch_table(ot_device_table_map, commandBuffer)
2154 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
2155}
2156
2157VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
2158 VkImageLayout dstImageLayout, uint32_t regionCount,
2159 const VkBufferImageCopy *pRegions) {
2160 bool skip_call = false;
2161 {
2162 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002163 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2164 VALIDATION_ERROR_01235);
2165 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01237);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002166 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002167 ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01236);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002168 }
2169 if (skip_call) {
2170 return;
2171 }
2172 get_dispatch_table(ot_device_table_map, commandBuffer)
2173 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
2174}
2175
2176VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2177 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
2178 bool skip_call = false;
2179 {
2180 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002181 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2182 VALIDATION_ERROR_01253);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002183 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002184 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01256);
2185 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01254);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002186 }
2187 if (skip_call) {
2188 return;
2189 }
2190 get_dispatch_table(ot_device_table_map, commandBuffer)
2191 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
2192}
2193
2194VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2195 VkDeviceSize dataSize, const uint32_t *pData) {
2196 bool skip_call = false;
2197 {
2198 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002199 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2200 VALIDATION_ERROR_01150);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002201 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002202 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01151);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002203 }
2204 if (skip_call) {
2205 return;
2206 }
2207 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
2208}
2209
2210VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2211 VkDeviceSize size, uint32_t data) {
2212 bool skip_call = false;
2213 {
2214 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002215 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2216 VALIDATION_ERROR_01138);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002217 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002218 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01139);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002219 }
2220 if (skip_call) {
2221 return;
2222 }
2223 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
2224}
2225
2226VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2227 const VkClearColorValue *pColor, uint32_t rangeCount,
2228 const VkImageSubresourceRange *pRanges) {
2229 bool skip_call = false;
2230 {
2231 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002232 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2233 VALIDATION_ERROR_01089);
2234 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01090);
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 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
2241}
2242
2243VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2244 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
2245 const VkImageSubresourceRange *pRanges) {
2246 bool skip_call = false;
2247 {
2248 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002249 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2250 VALIDATION_ERROR_01104);
2251 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01105);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002252 }
2253 if (skip_call) {
2254 return;
2255 }
2256 get_dispatch_table(ot_device_table_map, commandBuffer)
2257 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
2258}
2259
2260VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
2261 const VkClearAttachment *pAttachments, uint32_t rectCount,
2262 const VkClearRect *pRects) {
2263 bool skip_call = false;
2264 {
2265 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002266 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2267 VALIDATION_ERROR_01117);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002268 }
2269 if (skip_call) {
2270 return;
2271 }
2272 get_dispatch_table(ot_device_table_map, commandBuffer)
2273 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
2274}
2275
2276VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2277 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2278 const VkImageResolve *pRegions) {
2279 bool skip_call = false;
2280 {
2281 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002282 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2283 VALIDATION_ERROR_01327);
2284 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01330);
2285 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01328);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002286 }
2287 if (skip_call) {
2288 return;
2289 }
2290 get_dispatch_table(ot_device_table_map, commandBuffer)
2291 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2292}
2293
2294VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
2295 bool skip_call = false;
2296 {
2297 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002298 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2299 VALIDATION_ERROR_00232);
2300 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00233);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002301 }
2302 if (skip_call) {
2303 return;
2304 }
2305 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
2306}
2307
2308VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
2309 bool skip_call = false;
2310 {
2311 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002312 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2313 VALIDATION_ERROR_00243);
2314 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00244);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002315 }
2316 if (skip_call) {
2317 return;
2318 }
2319 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
2320}
2321
2322VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2323 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
2324 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2325 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2326 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
2327 bool skip_call = false;
2328 {
2329 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002330 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2331 VALIDATION_ERROR_00252);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002332 if (pBufferMemoryBarriers) {
2333 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2334 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002335 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002336 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00259);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002337 }
2338 }
2339 }
2340 if (pEvents) {
2341 for (uint32_t idx1 = 0; idx1 < eventCount; ++idx1) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06002342 skip_call |= ValidateObject(commandBuffer, pEvents[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false,
2343 VALIDATION_ERROR_00253);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002344 }
2345 }
2346 if (pImageMemoryBarriers) {
2347 for (uint32_t idx2 = 0; idx2 < imageMemoryBarrierCount; ++idx2) {
2348 if (pImageMemoryBarriers[idx2].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002349 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx2].image,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002350 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00260);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002351 }
2352 }
2353 }
2354 }
2355 if (skip_call) {
2356 return;
2357 }
2358 get_dispatch_table(ot_device_table_map, commandBuffer)
2359 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
2360 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2361}
2362
2363VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2364 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2365 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2366 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2367 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
2368 bool skip_call = false;
2369 {
2370 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002371 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2372 VALIDATION_ERROR_00270);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002373 if (pBufferMemoryBarriers) {
2374 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2375 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002376 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002377 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00277);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002378 }
2379 }
2380 }
2381 if (pImageMemoryBarriers) {
2382 for (uint32_t idx1 = 0; idx1 < imageMemoryBarrierCount; ++idx1) {
2383 if (pImageMemoryBarriers[idx1].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002384 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx1].image,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002385 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00278);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002386 }
2387 }
2388 }
2389 }
2390 if (skip_call) {
2391 return;
2392 }
2393 get_dispatch_table(ot_device_table_map, commandBuffer)
2394 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
2395 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2396}
2397
2398VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query,
2399 VkQueryControlFlags flags) {
2400 bool skip_call = false;
2401 {
2402 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002403 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2404 VALIDATION_ERROR_01035);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002405 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002406 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01036);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002407 }
2408 if (skip_call) {
2409 return;
2410 }
2411 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, query, flags);
2412}
2413
2414VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query) {
2415 bool skip_call = false;
2416 {
2417 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002418 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2419 VALIDATION_ERROR_01043);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002420 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002421 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01044);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002422 }
2423 if (skip_call) {
2424 return;
2425 }
2426 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, query);
2427}
2428
2429VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2430 uint32_t queryCount) {
2431 bool skip_call = false;
2432 {
2433 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002434 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2435 VALIDATION_ERROR_01021);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002436 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002437 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01022);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002438 }
2439 if (skip_call) {
2440 return;
2441 }
2442 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
2443}
2444
2445VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2446 VkQueryPool queryPool, uint32_t query) {
2447 bool skip_call = false;
2448 {
2449 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002450 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2451 VALIDATION_ERROR_01078);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002452 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002453 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01080);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002454 }
2455 if (skip_call) {
2456 return;
2457 }
2458 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
2459}
2460
2461VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2462 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2463 VkDeviceSize stride, VkQueryResultFlags flags) {
2464 bool skip_call = false;
2465 {
2466 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002467 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2468 VALIDATION_ERROR_01068);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002469 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002470 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01070);
2471 skip_call |=
2472 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01069);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002473 }
2474 if (skip_call) {
2475 return;
2476 }
2477 get_dispatch_table(ot_device_table_map, commandBuffer)
2478 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
2479}
2480
2481VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
2482 uint32_t offset, uint32_t size, const void *pValues) {
2483 bool skip_call = false;
2484 {
2485 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002486 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2487 VALIDATION_ERROR_00993);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002488 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002489 ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false, VALIDATION_ERROR_00994);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002490 }
2491 if (skip_call) {
2492 return;
2493 }
2494 get_dispatch_table(ot_device_table_map, commandBuffer)
2495 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
2496}
2497
2498VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
2499 VkSubpassContents contents) {
2500 bool skip_call = false;
2501 {
2502 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002503 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2504 VALIDATION_ERROR_00435);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002505 if (pRenderPassBegin) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002506 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT,
2507 false, VALIDATION_ERROR_00446);
2508 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,
2509 false, VALIDATION_ERROR_00445);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002510 }
2511 }
2512 if (skip_call) {
2513 return;
2514 }
2515 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
2516}
2517
2518VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
2519 bool skip_call = false;
2520 {
2521 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002522 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2523 VALIDATION_ERROR_00454);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002524 }
2525 if (skip_call) {
2526 return;
2527 }
2528 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
2529}
2530
2531VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
2532 bool skip_call = false;
2533 {
2534 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002535 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2536 VALIDATION_ERROR_00461);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002537 }
2538 if (skip_call) {
2539 return;
2540 }
2541 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
2542}
2543
2544VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
2545 const VkCommandBuffer *pCommandBuffers) {
2546 bool skip_call = false;
2547 {
2548 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002549 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2550 VALIDATION_ERROR_00159);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002551 if (pCommandBuffers) {
2552 for (uint32_t idx0 = 0; idx0 < commandBufferCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06002553 skip_call |= ValidateObject(commandBuffer, pCommandBuffers[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
2554 false, VALIDATION_ERROR_00160);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002555 }
2556 }
2557 }
2558 if (skip_call) {
2559 return;
2560 }
2561 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
2562}
2563
2564VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
2565 bool skip_call = false;
2566 {
2567 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002568 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01847);
2569 skip_call |= ValidateObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, true, VALIDATION_ERROR_01848);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002570 }
2571 if (skip_call) {
2572 return;
2573 }
2574 {
2575 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13002576 DestroyObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002577 }
2578 get_dispatch_table(ot_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
2579}
2580
2581VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
2582 VkSurfaceKHR surface, VkBool32 *pSupported) {
2583 bool skip_call = false;
2584 {
2585 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002586 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2587 VALIDATION_ERROR_01890);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002588 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002589 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01891);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002590 }
2591 if (skip_call) {
2592 return VK_ERROR_VALIDATION_FAILED_EXT;
2593 }
2594 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2595 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
2596 return result;
2597}
2598
2599VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2600 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
2601 bool skip_call = false;
2602 {
2603 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002604 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2605 VALIDATION_ERROR_01907);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002606 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002607 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01908);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002608 }
2609 if (skip_call) {
2610 return VK_ERROR_VALIDATION_FAILED_EXT;
2611 }
2612 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2613 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
2614 return result;
2615}
2616
2617VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2618 uint32_t *pSurfaceFormatCount,
2619 VkSurfaceFormatKHR *pSurfaceFormats) {
2620 bool skip_call = false;
2621 {
2622 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002623 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2624 VALIDATION_ERROR_01910);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002625 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002626 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01911);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002627 }
2628 if (skip_call) {
2629 return VK_ERROR_VALIDATION_FAILED_EXT;
2630 }
2631 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2632 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
2633 return result;
2634}
2635
2636VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2637 uint32_t *pPresentModeCount,
2638 VkPresentModeKHR *pPresentModes) {
2639 bool skip_call = false;
2640 {
2641 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002642 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2643 VALIDATION_ERROR_01914);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002644 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002645 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01915);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002646 }
2647 if (skip_call) {
2648 return VK_ERROR_VALIDATION_FAILED_EXT;
2649 }
2650 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2651 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
2652 return result;
2653}
2654
2655VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
2656 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
2657 bool skip_call = false;
2658 {
2659 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002660 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01918);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002661 if (pCreateInfo) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002662 skip_call |= ValidateObject(device, pCreateInfo->oldSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, true,
2663 VALIDATION_ERROR_01935);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002664 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002665 skip_call |= ValidateObject(device_data->physical_device, pCreateInfo->surface,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002666 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01926);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002667 }
2668 }
2669 if (skip_call) {
2670 return VK_ERROR_VALIDATION_FAILED_EXT;
2671 }
2672 VkResult result =
2673 get_dispatch_table(ot_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
2674 {
2675 std::lock_guard<std::mutex> lock(global_lock);
2676 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002677 CreateObject(device, *pSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002678 }
2679 }
2680 return result;
2681}
2682
2683VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
2684 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
2685 bool skip_call = false;
2686 {
2687 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002688 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01954);
2689 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_01957);
2690 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, true, VALIDATION_ERROR_01956);
2691 skip_call |=
2692 ValidateObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false, VALIDATION_ERROR_01955);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002693 }
2694 if (skip_call) {
2695 return VK_ERROR_VALIDATION_FAILED_EXT;
2696 }
2697 VkResult result = get_dispatch_table(ot_device_table_map, device)
2698 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
2699 return result;
2700}
2701
2702VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
2703 bool skip_call = false;
2704 {
2705 std::lock_guard<std::mutex> lock(global_lock);
2706 if (pPresentInfo) {
2707 if (pPresentInfo->pSwapchains) {
2708 for (uint32_t idx0 = 0; idx0 < pPresentInfo->swapchainCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002709 skip_call |= ValidateObject(queue, pPresentInfo->pSwapchains[idx0],
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002710 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false, VALIDATION_ERROR_01969);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002711 }
2712 }
2713 if (pPresentInfo->pWaitSemaphores) {
2714 for (uint32_t idx1 = 0; idx1 < pPresentInfo->waitSemaphoreCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002715 skip_call |= ValidateObject(queue, pPresentInfo->pWaitSemaphores[idx1],
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002716 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false, VALIDATION_ERROR_01968);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002717 }
2718 }
2719 }
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002720 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_01962);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002721 }
2722 if (skip_call) {
2723 return VK_ERROR_VALIDATION_FAILED_EXT;
2724 }
2725 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
2726 return result;
2727}
2728
Norbert Nopper1dec9a52016-11-25 07:55:13 +01002729VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
2730 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2731 bool skip_call = false;
2732 {
2733 std::lock_guard<std::mutex> lock(global_lock);
2734 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01878);
2735 }
2736 if (skip_call) {
2737 return VK_ERROR_VALIDATION_FAILED_EXT;
2738 }
2739 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
2740 ->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2741 {
2742 std::lock_guard<std::mutex> lock(global_lock);
2743 if (result == VK_SUCCESS) {
2744 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
2745 }
2746 }
2747 return result;
2748}
2749
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002750#ifdef VK_USE_PLATFORM_WIN32_KHR
2751VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
2752 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2753 bool skip_call = false;
2754 {
2755 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002756 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01820);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002757 }
2758 if (skip_call) {
2759 return VK_ERROR_VALIDATION_FAILED_EXT;
2760 }
2761 VkResult result =
2762 get_dispatch_table(ot_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2763 {
2764 std::lock_guard<std::mutex> lock(global_lock);
2765 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002766 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002767 }
2768 }
2769 return result;
2770}
2771
2772VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
2773 uint32_t queueFamilyIndex) {
2774 bool skip_call = false;
2775 {
2776 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002777 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2778 VALIDATION_ERROR_01900);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002779 }
2780 if (skip_call) {
2781 return VK_FALSE;
2782 }
2783 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2784 ->GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
2785 return result;
2786}
2787#endif // VK_USE_PLATFORM_WIN32_KHR
2788
2789#ifdef VK_USE_PLATFORM_XCB_KHR
2790VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
2791 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2792 bool skip_call = false;
2793 {
2794 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002795 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01827);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002796 }
2797 if (skip_call) {
2798 return VK_ERROR_VALIDATION_FAILED_EXT;
2799 }
2800 VkResult result =
2801 get_dispatch_table(ot_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2802 {
2803 std::lock_guard<std::mutex> lock(global_lock);
2804 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002805 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002806 }
2807 }
2808 return result;
2809}
2810
2811VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2812 uint32_t queueFamilyIndex, xcb_connection_t *connection,
2813 xcb_visualid_t visual_id) {
2814 bool skip_call = false;
2815 {
2816 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002817 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2818 VALIDATION_ERROR_01902);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002819 }
2820 if (skip_call) {
2821 return VK_FALSE;
2822 }
2823 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2824 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
2825 return result;
2826}
2827#endif // VK_USE_PLATFORM_XCB_KHR
2828
2829#ifdef VK_USE_PLATFORM_XLIB_KHR
2830VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
2831 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2832 bool skip_call = false;
2833 {
2834 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002835 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01836);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002836 }
2837 if (skip_call) {
2838 return VK_ERROR_VALIDATION_FAILED_EXT;
2839 }
2840 VkResult result =
2841 get_dispatch_table(ot_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2842 {
2843 std::lock_guard<std::mutex> lock(global_lock);
2844 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002845 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002846 }
2847 }
2848 return result;
2849}
2850
2851VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2852 uint32_t queueFamilyIndex, Display *dpy,
2853 VisualID visualID) {
2854 bool skip_call = false;
2855 {
2856 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002857 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2858 VALIDATION_ERROR_01905);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002859 }
2860 if (skip_call) {
2861 return VK_FALSE;
2862 }
2863 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2864 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
2865 return result;
2866}
2867#endif // VK_USE_PLATFORM_XLIB_KHR
2868
2869#ifdef VK_USE_PLATFORM_MIR_KHR
2870VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
2871 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2872 bool skip_call = false;
2873 {
2874 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002875 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01802);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002876 }
2877 if (skip_call) {
2878 return VK_ERROR_VALIDATION_FAILED_EXT;
2879 }
2880 VkResult result =
2881 get_dispatch_table(ot_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2882 {
2883 std::lock_guard<std::mutex> lock(global_lock);
2884 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002885 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002886 }
2887 }
2888 return result;
2889}
2890
2891VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2892 uint32_t queueFamilyIndex, MirConnection *connection) {
2893 bool skip_call = false;
2894 {
2895 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002896 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2897 VALIDATION_ERROR_01894);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002898 }
2899 if (skip_call) {
2900 return VK_FALSE;
2901 }
2902 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2903 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
2904 return result;
2905}
2906#endif // VK_USE_PLATFORM_MIR_KHR
2907
2908#ifdef VK_USE_PLATFORM_WAYLAND_KHR
2909VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
2910 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2911 bool skip_call = false;
2912 {
2913 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002914 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01811);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002915 }
2916 if (skip_call) {
2917 return VK_ERROR_VALIDATION_FAILED_EXT;
2918 }
2919 VkResult result =
2920 get_dispatch_table(ot_instance_table_map, instance)->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2921 {
2922 std::lock_guard<std::mutex> lock(global_lock);
2923 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002924 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002925 }
2926 }
2927 return result;
2928}
2929
2930VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2931 uint32_t queueFamilyIndex,
2932 struct wl_display *display) {
2933 bool skip_call = false;
2934 {
2935 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002936 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2937 VALIDATION_ERROR_01897);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002938 }
2939 if (skip_call) {
2940 return VK_FALSE;
2941 }
2942 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2943 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
2944 return result;
2945}
2946#endif // VK_USE_PLATFORM_WAYLAND_KHR
2947
2948#ifdef VK_USE_PLATFORM_ANDROID_KHR
2949VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
2950 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2951 bool skip_call = false;
2952 {
2953 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002954 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01794);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002955 }
2956 if (skip_call) {
2957 return VK_ERROR_VALIDATION_FAILED_EXT;
2958 }
2959 VkResult result =
2960 get_dispatch_table(ot_instance_table_map, instance)->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2961 {
2962 std::lock_guard<std::mutex> lock(global_lock);
2963 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002964 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002965 }
2966 }
2967 return result;
2968}
2969#endif // VK_USE_PLATFORM_ANDROID_KHR
2970
Mark Youngead9b932016-09-08 12:28:38 -06002971VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
2972 const VkSwapchainCreateInfoKHR *pCreateInfos,
2973 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
2974 bool skip_call = false;
2975 uint32_t i = 0;
2976 {
2977 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002978 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01943);
Mark Youngead9b932016-09-08 12:28:38 -06002979 if (NULL != pCreateInfos) {
2980 for (i = 0; i < swapchainCount; i++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002981 skip_call |= ValidateObject(device, pCreateInfos[i].oldSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT,
2982 true, VALIDATION_ERROR_01935);
Mark Youngead9b932016-09-08 12:28:38 -06002983 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002984 skip_call |= ValidateObject(device_data->physical_device, pCreateInfos[i].surface,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002985 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01926);
Mark Youngead9b932016-09-08 12:28:38 -06002986 }
2987 }
2988 }
2989 if (skip_call) {
2990 return VK_ERROR_VALIDATION_FAILED_EXT;
2991 }
2992 VkResult result =
2993 get_dispatch_table(ot_device_table_map, device)->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
2994 {
2995 std::lock_guard<std::mutex> lock(global_lock);
2996 if (result == VK_SUCCESS) {
2997 for (i = 0; i < swapchainCount; i++) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002998 CreateObject(device, pSwapchains[i], VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Youngead9b932016-09-08 12:28:38 -06002999 }
3000 }
3001 }
3002 return result;
3003}
3004
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003005VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
3006 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
3007 const VkAllocationCallbacks *pAllocator,
3008 VkDebugReportCallbackEXT *pCallback) {
3009 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3010 VkResult result = pInstanceTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback);
3011 if (VK_SUCCESS == result) {
3012 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3013 result = layer_create_msg_callback(instance_data->report_data, false, pCreateInfo, pAllocator, pCallback);
Chris Forbesfeecd402016-09-29 14:53:50 +13003014 CreateObject(instance, *pCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003015 }
3016 return result;
3017}
3018
3019VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
3020 const VkAllocationCallbacks *pAllocator) {
3021 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3022 pInstanceTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
3023 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3024 layer_destroy_msg_callback(instance_data->report_data, msgCallback, pAllocator);
Chris Forbesec461992016-09-29 14:41:44 +13003025 DestroyObject(instance, msgCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003026}
3027
3028VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
3029 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
3030 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
3031 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3032 pInstanceTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
3033}
3034
3035static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
3036
3037static const VkLayerProperties globalLayerProps = {"VK_LAYER_LUNARG_object_tracker",
3038 VK_LAYER_API_VERSION, // specVersion
3039 1, // implementationVersion
3040 "LunarG Validation Layer"};
3041
3042VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
3043 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
3044}
3045
3046VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
3047 VkLayerProperties *pProperties) {
3048 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
3049}
3050
3051VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
3052 VkExtensionProperties *pProperties) {
3053 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3054 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
3055
3056 return VK_ERROR_LAYER_NOT_PRESENT;
3057}
3058
3059VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
3060 uint32_t *pCount, VkExtensionProperties *pProperties) {
3061 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3062 return util_GetExtensionProperties(0, nullptr, pCount, pProperties);
3063
3064 assert(physicalDevice);
3065 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, physicalDevice);
3066 return pTable->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
3067}
3068
3069static inline PFN_vkVoidFunction InterceptMsgCallbackGetProcAddrCommand(const char *name, VkInstance instance) {
3070 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3071 return debug_report_get_instance_proc_addr(instance_data->report_data, name);
3072}
3073
3074static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
3075 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, instance);
3076 if (instanceExtMap.size() == 0 || !instanceExtMap[pTable].wsi_enabled)
3077 return nullptr;
3078
3079 if (!strcmp("vkDestroySurfaceKHR", name))
3080 return reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR);
3081 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name))
3082 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR);
3083 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name))
3084 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR);
3085 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name))
3086 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR);
3087 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name))
3088 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR);
Norbert Nopper1dec9a52016-11-25 07:55:13 +01003089 if ((instanceExtMap[pTable].display_enabled == true) && !strcmp("vkCreateDisplayPlaneSurfaceKHR", name))
3090 return reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003091
3092#ifdef VK_USE_PLATFORM_WIN32_KHR
3093 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
3094 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
3095 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name))
3096 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR);
3097#endif // VK_USE_PLATFORM_WIN32_KHR
3098#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003099 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003100 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003101 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003102 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
3103#endif // VK_USE_PLATFORM_XCB_KHR
3104#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003105 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003106 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003107 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003108 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
3109#endif // VK_USE_PLATFORM_XLIB_KHR
3110#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003111 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003112 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003113 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003114 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
3115#endif // VK_USE_PLATFORM_MIR_KHR
3116#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003117 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003118 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003119 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003120 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
3121#endif // VK_USE_PLATFORM_WAYLAND_KHR
3122#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003123 if ((instanceExtMap[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003124 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
3125#endif // VK_USE_PLATFORM_ANDROID_KHR
3126
3127 return nullptr;
3128}
3129
3130static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
3131 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3132 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06003133 device_data->wsi_display_swapchain_enabled = false;
3134 device_data->objtrack_extensions_enabled = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003135
3136 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3137 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
3138 device_data->wsi_enabled = true;
3139 }
Mark Youngead9b932016-09-08 12:28:38 -06003140 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
3141 device_data->wsi_display_swapchain_enabled = true;
3142 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003143 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], "OBJTRACK_EXTENSIONS") == 0) {
3144 device_data->objtrack_extensions_enabled = true;
3145 }
3146 }
3147}
3148
3149static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
3150 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(ot_instance_table_map, instance);
3151
3152
3153 instanceExtMap[pDisp] = {};
3154
3155 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3156 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
3157 instanceExtMap[pDisp].wsi_enabled = true;
3158 }
Norbert Nopper1dec9a52016-11-25 07:55:13 +01003159 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
3160 instanceExtMap[pDisp].display_enabled = true;
3161 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003162#ifdef VK_USE_PLATFORM_XLIB_KHR
3163 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
3164 instanceExtMap[pDisp].xlib_enabled = true;
3165 }
3166#endif
3167#ifdef VK_USE_PLATFORM_XCB_KHR
3168 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
3169 instanceExtMap[pDisp].xcb_enabled = true;
3170 }
3171#endif
3172#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3173 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
3174 instanceExtMap[pDisp].wayland_enabled = true;
3175 }
3176#endif
3177#ifdef VK_USE_PLATFORM_MIR_KHR
3178 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
3179 instanceExtMap[pDisp].mir_enabled = true;
3180 }
3181#endif
3182#ifdef VK_USE_PLATFORM_ANDROID_KHR
3183 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
3184 instanceExtMap[pDisp].android_enabled = true;
3185 }
3186#endif
3187#ifdef VK_USE_PLATFORM_WIN32_KHR
3188 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
3189 instanceExtMap[pDisp].win32_enabled = true;
3190 }
3191#endif
3192 }
3193}
3194
3195VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
3196 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
3197 std::lock_guard<std::mutex> lock(global_lock);
3198 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3199 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3200
3201 assert(chain_info->u.pLayerInfo);
3202 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3203 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
3204 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(phy_dev_data->instance, "vkCreateDevice");
3205 if (fpCreateDevice == NULL) {
3206 return VK_ERROR_INITIALIZATION_FAILED;
3207 }
3208
3209 // Advance the link info for the next element on the chain
3210 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3211
3212 VkResult result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
3213 if (result != VK_SUCCESS) {
3214 return result;
3215 }
3216
3217 layer_data *device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
3218 device_data->report_data = layer_debug_report_create_device(phy_dev_data->report_data, *pDevice);
3219
3220 // Add link back to physDev
3221 device_data->physical_device = physicalDevice;
3222
3223 initDeviceTable(*pDevice, fpGetDeviceProcAddr, ot_device_table_map);
3224
3225 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
Chris Forbesfeecd402016-09-29 14:53:50 +13003226 CreateObject(*pDevice, *pDevice, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003227
3228 return result;
3229}
3230
3231VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3232 uint32_t *pQueueFamilyPropertyCount,
3233 VkQueueFamilyProperties *pQueueFamilyProperties) {
3234 get_dispatch_table(ot_instance_table_map, physicalDevice)
3235 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
3236 std::lock_guard<std::mutex> lock(global_lock);
3237 if (pQueueFamilyProperties != NULL) {
3238 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3239 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
3240 instance_data->queue_family_properties.emplace_back(pQueueFamilyProperties[i]);
3241 }
3242 }
3243}
3244
3245VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3246 VkInstance *pInstance) {
3247 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3248
3249 assert(chain_info->u.pLayerInfo);
3250 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3251 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
3252 if (fpCreateInstance == NULL) {
3253 return VK_ERROR_INITIALIZATION_FAILED;
3254 }
3255
3256 // Advance the link info for the next element on the chain
3257 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3258
3259 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
3260 if (result != VK_SUCCESS) {
3261 return result;
3262 }
3263
3264 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
3265 instance_data->instance = *pInstance;
3266 initInstanceTable(*pInstance, fpGetInstanceProcAddr, ot_instance_table_map);
3267 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, *pInstance);
3268
3269 // Look for one or more debug report create info structures, and copy the
3270 // callback(s) for each one found (for use by vkDestroyInstance)
3271 layer_copy_tmp_callbacks(pCreateInfo->pNext, &instance_data->num_tmp_callbacks, &instance_data->tmp_dbg_create_infos,
3272 &instance_data->tmp_callbacks);
3273
3274 instance_data->report_data = debug_report_create_instance(pInstanceTable, *pInstance, pCreateInfo->enabledExtensionCount,
3275 pCreateInfo->ppEnabledExtensionNames);
3276
3277 InitObjectTracker(instance_data, pAllocator);
3278 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
3279
Chris Forbesfeecd402016-09-29 14:53:50 +13003280 CreateObject(*pInstance, *pInstance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003281
3282 return result;
3283}
3284
3285VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
3286 VkPhysicalDevice *pPhysicalDevices) {
3287 bool skip_call = VK_FALSE;
3288 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003289 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_00023);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003290 lock.unlock();
3291 if (skip_call) {
3292 return VK_ERROR_VALIDATION_FAILED_EXT;
3293 }
3294 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
3295 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
3296 lock.lock();
3297 if (result == VK_SUCCESS) {
3298 if (pPhysicalDevices) {
3299 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003300 CreateObject(instance, pPhysicalDevices[i], VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003301 }
3302 }
3303 }
3304 lock.unlock();
3305 return result;
3306}
3307
3308VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
3309 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003310 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00062);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003311 lock.unlock();
3312
3313 get_dispatch_table(ot_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
3314
3315 lock.lock();
3316
3317 CreateQueue(device, *pQueue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT);
3318 AddQueueInfo(device, queueFamilyIndex, *pQueue);
3319}
3320
3321VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Tobin Ehlis02337352016-10-20 14:42:57 -06003322 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003323 std::unique_lock<std::mutex> lock(global_lock);
Tobin Ehlis02337352016-10-20 14:42:57 -06003324 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00621);
3325 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, true, VALIDATION_ERROR_00622);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003326 lock.unlock();
Tobin Ehlis02337352016-10-20 14:42:57 -06003327 if (!skip) {
3328 get_dispatch_table(ot_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003329
Tobin Ehlis02337352016-10-20 14:42:57 -06003330 lock.lock();
3331 DestroyObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
3332 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003333}
3334
3335VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
3336 VkMemoryMapFlags flags, void **ppData) {
3337 bool skip_call = VK_FALSE;
3338 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultz259ddb22016-10-27 13:29:19 -06003339 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00630);
3340 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00631);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003341 lock.unlock();
3342 if (skip_call == VK_TRUE) {
3343 return VK_ERROR_VALIDATION_FAILED_EXT;
3344 }
3345 VkResult result = get_dispatch_table(ot_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
3346 return result;
3347}
3348
3349VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
3350 bool skip_call = VK_FALSE;
3351 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003352 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00650);
Karl Schultz259ddb22016-10-27 13:29:19 -06003353 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00651);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003354 lock.unlock();
3355 if (skip_call == VK_TRUE) {
3356 return;
3357 }
3358
3359 get_dispatch_table(ot_device_table_map, device)->UnmapMemory(device, memory);
3360}
3361VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
3362 VkFence fence) {
3363 std::unique_lock<std::mutex> lock(global_lock);
3364 ValidateQueueFlags(queue, "QueueBindSparse");
3365
3366 for (uint32_t i = 0; i < bindInfoCount; i++) {
3367 for (uint32_t j = 0; j < pBindInfo[i].bufferBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003368 ValidateObject(queue, pBindInfo[i].pBufferBinds[j].buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false,
3369 VALIDATION_ERROR_01656);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003370 for (uint32_t j = 0; j < pBindInfo[i].imageOpaqueBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003371 ValidateObject(queue, pBindInfo[i].pImageOpaqueBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
3372 VALIDATION_ERROR_01657);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003373 for (uint32_t j = 0; j < pBindInfo[i].imageBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003374 ValidateObject(queue, pBindInfo[i].pImageBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
3375 VALIDATION_ERROR_01658);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003376 }
3377 lock.unlock();
3378
3379 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
3380 return result;
3381}
3382
3383VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3384 VkCommandBuffer *pCommandBuffers) {
3385 bool skip_call = VK_FALSE;
3386 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003387 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00084);
3388 skip_call |= ValidateObject(device, pAllocateInfo->commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false,
3389 VALIDATION_ERROR_00090);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003390 lock.unlock();
3391
3392 if (skip_call) {
3393 return VK_ERROR_VALIDATION_FAILED_EXT;
3394 }
3395
3396 VkResult result =
3397 get_dispatch_table(ot_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3398
3399 lock.lock();
3400 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {
3401 AllocateCommandBuffer(device, pAllocateInfo->commandPool, pCommandBuffers[i],
3402 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, pAllocateInfo->level);
3403 }
3404 lock.unlock();
3405
3406 return result;
3407}
3408
3409VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3410 VkDescriptorSet *pDescriptorSets) {
3411 bool skip_call = VK_FALSE;
3412 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003413 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00908);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003414 skip_call |= ValidateObject(device, pAllocateInfo->descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false,
3415 VALIDATION_ERROR_00915);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003416 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003417 skip_call |= ValidateObject(device, pAllocateInfo->pSetLayouts[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT,
3418 false, VALIDATION_ERROR_00916);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003419 }
3420 lock.unlock();
3421 if (skip_call) {
3422 return VK_ERROR_VALIDATION_FAILED_EXT;
3423 }
3424
3425 VkResult result =
3426 get_dispatch_table(ot_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3427
3428 if (VK_SUCCESS == result) {
3429 lock.lock();
3430 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
3431 AllocateDescriptorSet(device, pAllocateInfo->descriptorPool, pDescriptorSets[i],
3432 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
3433 }
3434 lock.unlock();
3435 }
3436
3437 return result;
3438}
3439
3440VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
3441 const VkCommandBuffer *pCommandBuffers) {
3442 bool skip_call = false;
3443 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003444 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false, VALIDATION_ERROR_00099);
3445 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00098);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003446 for (uint32_t i = 0; i < commandBufferCount; i++) {
3447 skip_call |= ValidateCommandBuffer(device, commandPool, pCommandBuffers[i]);
3448 }
3449
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003450 for (uint32_t i = 0; i < commandBufferCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003451 DestroyObject(device, pCommandBuffers[i], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003452 }
3453
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003454 lock.unlock();
3455 if (!skip_call) {
3456 get_dispatch_table(ot_device_table_map, device)
3457 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
3458 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003459}
3460VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
3461 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3462 std::unique_lock<std::mutex> lock(global_lock);
3463 // A swapchain's images are implicitly deleted when the swapchain is deleted.
3464 // Remove this swapchain's images from our map of such images.
3465 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr = device_data->swapchainImageMap.begin();
3466 while (itr != device_data->swapchainImageMap.end()) {
3467 OBJTRACK_NODE *pNode = (*itr).second;
3468 if (pNode->parent_object == reinterpret_cast<uint64_t &>(swapchain)) {
3469 delete pNode;
3470 auto delete_item = itr++;
3471 device_data->swapchainImageMap.erase(delete_item);
3472 } else {
3473 ++itr;
3474 }
3475 }
Chris Forbesec461992016-09-29 14:41:44 +13003476 DestroyObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003477 lock.unlock();
3478
3479 get_dispatch_table(ot_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
3480}
3481
3482VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
3483 const VkDescriptorSet *pDescriptorSets) {
3484 bool skip_call = false;
3485 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3486 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003487 skip_call |=
3488 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false, VALIDATION_ERROR_00924);
3489 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00923);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003490 for (uint32_t i = 0; i < descriptorSetCount; i++) {
3491 skip_call |= ValidateDescriptorSet(device, descriptorPool, pDescriptorSets[i]);
3492 }
3493
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003494 for (uint32_t i = 0; i < descriptorSetCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003495 DestroyObject(device, pDescriptorSets[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003496 }
3497
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003498 lock.unlock();
3499 if (!skip_call) {
3500 result = get_dispatch_table(ot_device_table_map, device)
3501 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
3502 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003503 return result;
3504}
3505
3506VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3507 const VkAllocationCallbacks *pAllocator) {
3508 bool skip_call = VK_FALSE;
3509 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3510 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003511 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00904);
3512 skip_call |=
3513 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, true, VALIDATION_ERROR_00905);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003514 lock.unlock();
3515 if (skip_call) {
3516 return;
3517 }
3518 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is deleted.
3519 // Remove this pool's descriptor sets from our descriptorSet map.
3520 lock.lock();
3521 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr =
3522 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
3523 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
3524 OBJTRACK_NODE *pNode = (*itr).second;
3525 auto del_itr = itr++;
3526 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
Chris Forbesec461992016-09-29 14:41:44 +13003527 DestroyObject(device, (VkDescriptorSet)((*del_itr).first),
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003528 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003529 }
3530 }
Chris Forbesec461992016-09-29 14:41:44 +13003531 DestroyObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003532 lock.unlock();
3533 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
3534}
3535
3536VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3537 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3538 bool skip_call = false;
3539 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003540 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00080);
3541 skip_call |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, true, VALIDATION_ERROR_00081);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003542 lock.unlock();
3543 if (skip_call) {
3544 return;
3545 }
3546 lock.lock();
3547 // A CommandPool's command buffers are implicitly deleted when the pool is deleted.
3548 // Remove this pool's cmdBuffers from our cmd buffer map.
3549 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].begin();
3550 auto del_itr = itr;
3551 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
3552 OBJTRACK_NODE *pNode = (*itr).second;
3553 del_itr = itr++;
3554 if (pNode->parent_object == reinterpret_cast<uint64_t &>(commandPool)) {
3555 skip_call |= ValidateCommandBuffer(device, commandPool, reinterpret_cast<VkCommandBuffer>((*del_itr).first));
Chris Forbesec461992016-09-29 14:41:44 +13003556 DestroyObject(device, reinterpret_cast<VkCommandBuffer>((*del_itr).first),
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003557 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003558 }
3559 }
Chris Forbesec461992016-09-29 14:41:44 +13003560 DestroyObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003561 lock.unlock();
3562 get_dispatch_table(ot_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
3563}
3564
3565VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
3566 VkImage *pSwapchainImages) {
3567 bool skip_call = VK_FALSE;
3568 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003569 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01948);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003570 lock.unlock();
3571 if (skip_call) {
3572 return VK_ERROR_VALIDATION_FAILED_EXT;
3573 }
3574 VkResult result = get_dispatch_table(ot_device_table_map, device)
3575 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
3576 if (pSwapchainImages != NULL) {
3577 lock.lock();
3578 for (uint32_t i = 0; i < *pSwapchainImageCount; i++) {
3579 CreateSwapchainImageObject(device, pSwapchainImages[i], swapchain);
3580 }
3581 lock.unlock();
3582 }
3583 return result;
3584}
3585
3586VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3587 const VkGraphicsPipelineCreateInfo *pCreateInfos,
3588 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3589 bool skip_call = VK_FALSE;
3590 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003591 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00519);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003592 if (pCreateInfos) {
3593 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3594 if (pCreateInfos[idx0].basePipelineHandle) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003595 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3596 true, VALIDATION_ERROR_00529);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003597 }
3598 if (pCreateInfos[idx0].layout) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003599 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
3600 false, VALIDATION_ERROR_00546);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003601 }
3602 if (pCreateInfos[idx0].pStages) {
3603 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
3604 if (pCreateInfos[idx0].pStages[idx1].module) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003605 skip_call |= ValidateObject(device, pCreateInfos[idx0].pStages[idx1].module,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003606 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false, VALIDATION_ERROR_00515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003607 }
3608 }
3609 }
3610 if (pCreateInfos[idx0].renderPass) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003611 skip_call |= ValidateObject(device, pCreateInfos[idx0].renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,
3612 false, VALIDATION_ERROR_00547);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003613 }
3614 }
3615 }
3616 if (pipelineCache) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06003617 skip_call |=
3618 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00520);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003619 }
3620 lock.unlock();
3621 if (skip_call) {
3622 return VK_ERROR_VALIDATION_FAILED_EXT;
3623 }
3624 VkResult result = get_dispatch_table(ot_device_table_map, device)
3625 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3626 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01003627 for (uint32_t idx2 = 0; idx2 < createInfoCount; ++idx2) {
3628 if (pPipelines[idx2] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003629 CreateObject(device, pPipelines[idx2], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003630 }
3631 }
3632 lock.unlock();
3633 return result;
3634}
3635
3636VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3637 const VkComputePipelineCreateInfo *pCreateInfos,
3638 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3639 bool skip_call = VK_FALSE;
3640 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003641 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00486);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003642 if (pCreateInfos) {
3643 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3644 if (pCreateInfos[idx0].basePipelineHandle) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003645 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3646 true, VALIDATION_ERROR_00496);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003647 }
3648 if (pCreateInfos[idx0].layout) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003649 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
3650 false, VALIDATION_ERROR_00505);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003651 }
3652 if (pCreateInfos[idx0].stage.module) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003653 skip_call |= ValidateObject(device, pCreateInfos[idx0].stage.module, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT,
3654 false, VALIDATION_ERROR_00515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003655 }
3656 }
3657 }
3658 if (pipelineCache) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06003659 skip_call |=
3660 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00487);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003661 }
3662 lock.unlock();
3663 if (skip_call) {
3664 return VK_ERROR_VALIDATION_FAILED_EXT;
3665 }
3666 VkResult result = get_dispatch_table(ot_device_table_map, device)
3667 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3668 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01003669 for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
3670 if (pPipelines[idx1] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003671 CreateObject(device, pPipelines[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003672 }
3673 }
3674 lock.unlock();
3675 return result;
3676}
3677
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003678// VK_EXT_debug_marker Extension
3679VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
3680 bool skip_call = VK_FALSE;
3681 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003682 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_02007);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003683 lock.unlock();
3684 if (skip_call) {
3685 return VK_ERROR_VALIDATION_FAILED_EXT;
3686 }
3687 VkResult result = get_dispatch_table(ot_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
3688 return result;
3689}
3690
3691VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
3692 bool skip_call = VK_FALSE;
3693 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003694 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01999);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003695 lock.unlock();
3696 if (skip_call) {
3697 return VK_ERROR_VALIDATION_FAILED_EXT;
3698 }
3699 VkResult result = get_dispatch_table(ot_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
3700 return result;
3701}
3702
3703VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3704 bool skip_call = VK_FALSE;
3705 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003706 skip_call |=
3707 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02014);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003708 lock.unlock();
3709 if (!skip_call) {
3710 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
3711 }
3712}
3713
3714VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerEndEXT(VkCommandBuffer commandBuffer) {
3715 bool skip_call = VK_FALSE;
3716 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003717 skip_call |=
3718 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02022);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003719 lock.unlock();
3720 if (!skip_call) {
3721 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerEndEXT(commandBuffer);
3722 }
3723}
3724
3725VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3726 bool skip_call = VK_FALSE;
3727 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003728 skip_call |=
3729 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02025);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003730 lock.unlock();
3731 if (!skip_call) {
3732 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
3733 }
3734}
3735
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003736// VK_NV_external_memory_capabilities Extension
3737VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
3738 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
3739 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
3740 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
3741
3742 bool skip_call = false;
3743 {
3744 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003745 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3746 VALIDATION_ERROR_01980);
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003747 }
3748 if (skip_call) {
3749 return VK_ERROR_VALIDATION_FAILED_EXT;
3750 }
3751 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3752 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
3753 externalHandleType, pExternalImageFormatProperties);
3754 return result;
3755}
3756
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003757#ifdef VK_USE_PLATFORM_WIN32_KHR
3758// VK_NV_external_memory_win32 Extension
3759VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
3760 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
3761 bool skip_call = VK_FALSE;
3762 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003763 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01725);
3764 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_01726);
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003765 lock.unlock();
3766 if (skip_call) {
3767 return VK_ERROR_VALIDATION_FAILED_EXT;
3768 }
3769 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
3770 return result;
3771}
3772#endif // VK_USE_PLATFORM_WIN32_KHR
3773
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003774// VK_AMD_draw_indirect_count Extension
3775VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3776 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3777 uint32_t stride) {
3778 bool skip_call = VK_FALSE;
3779 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003780 skip_call |=
3781 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01771);
3782 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01772);
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003783 lock.unlock();
3784 if (!skip_call) {
3785 get_dispatch_table(ot_device_table_map, commandBuffer)
3786 ->CmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3787 }
3788}
3789
3790VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3791 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3792 uint32_t maxDrawCount, uint32_t stride) {
3793 bool skip_call = VK_FALSE;
3794 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003795 skip_call |=
3796 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01783);
3797 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01784);
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003798 lock.unlock();
3799 if (!skip_call) {
3800 get_dispatch_table(ot_device_table_map, commandBuffer)
3801 ->CmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3802 }
3803}
3804
3805
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003806static inline PFN_vkVoidFunction InterceptCoreDeviceCommand(const char *name) {
3807 if (!name || name[0] != 'v' || name[1] != 'k')
3808 return NULL;
3809
3810 name += 2;
3811 if (!strcmp(name, "GetDeviceProcAddr"))
3812 return (PFN_vkVoidFunction)GetDeviceProcAddr;
3813 if (!strcmp(name, "DestroyDevice"))
3814 return (PFN_vkVoidFunction)DestroyDevice;
3815 if (!strcmp(name, "GetDeviceQueue"))
3816 return (PFN_vkVoidFunction)GetDeviceQueue;
3817 if (!strcmp(name, "QueueSubmit"))
3818 return (PFN_vkVoidFunction)QueueSubmit;
3819 if (!strcmp(name, "QueueWaitIdle"))
3820 return (PFN_vkVoidFunction)QueueWaitIdle;
3821 if (!strcmp(name, "DeviceWaitIdle"))
3822 return (PFN_vkVoidFunction)DeviceWaitIdle;
3823 if (!strcmp(name, "AllocateMemory"))
3824 return (PFN_vkVoidFunction)AllocateMemory;
3825 if (!strcmp(name, "FreeMemory"))
3826 return (PFN_vkVoidFunction)FreeMemory;
3827 if (!strcmp(name, "MapMemory"))
3828 return (PFN_vkVoidFunction)MapMemory;
3829 if (!strcmp(name, "UnmapMemory"))
3830 return (PFN_vkVoidFunction)UnmapMemory;
3831 if (!strcmp(name, "FlushMappedMemoryRanges"))
3832 return (PFN_vkVoidFunction)FlushMappedMemoryRanges;
3833 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
3834 return (PFN_vkVoidFunction)InvalidateMappedMemoryRanges;
3835 if (!strcmp(name, "GetDeviceMemoryCommitment"))
3836 return (PFN_vkVoidFunction)GetDeviceMemoryCommitment;
3837 if (!strcmp(name, "BindBufferMemory"))
3838 return (PFN_vkVoidFunction)BindBufferMemory;
3839 if (!strcmp(name, "BindImageMemory"))
3840 return (PFN_vkVoidFunction)BindImageMemory;
3841 if (!strcmp(name, "GetBufferMemoryRequirements"))
3842 return (PFN_vkVoidFunction)GetBufferMemoryRequirements;
3843 if (!strcmp(name, "GetImageMemoryRequirements"))
3844 return (PFN_vkVoidFunction)GetImageMemoryRequirements;
3845 if (!strcmp(name, "GetImageSparseMemoryRequirements"))
3846 return (PFN_vkVoidFunction)GetImageSparseMemoryRequirements;
3847 if (!strcmp(name, "QueueBindSparse"))
3848 return (PFN_vkVoidFunction)QueueBindSparse;
3849 if (!strcmp(name, "CreateFence"))
3850 return (PFN_vkVoidFunction)CreateFence;
3851 if (!strcmp(name, "DestroyFence"))
3852 return (PFN_vkVoidFunction)DestroyFence;
3853 if (!strcmp(name, "ResetFences"))
3854 return (PFN_vkVoidFunction)ResetFences;
3855 if (!strcmp(name, "GetFenceStatus"))
3856 return (PFN_vkVoidFunction)GetFenceStatus;
3857 if (!strcmp(name, "WaitForFences"))
3858 return (PFN_vkVoidFunction)WaitForFences;
3859 if (!strcmp(name, "CreateSemaphore"))
3860 return (PFN_vkVoidFunction)CreateSemaphore;
3861 if (!strcmp(name, "DestroySemaphore"))
3862 return (PFN_vkVoidFunction)DestroySemaphore;
3863 if (!strcmp(name, "CreateEvent"))
3864 return (PFN_vkVoidFunction)CreateEvent;
3865 if (!strcmp(name, "DestroyEvent"))
3866 return (PFN_vkVoidFunction)DestroyEvent;
3867 if (!strcmp(name, "GetEventStatus"))
3868 return (PFN_vkVoidFunction)GetEventStatus;
3869 if (!strcmp(name, "SetEvent"))
3870 return (PFN_vkVoidFunction)SetEvent;
3871 if (!strcmp(name, "ResetEvent"))
3872 return (PFN_vkVoidFunction)ResetEvent;
3873 if (!strcmp(name, "CreateQueryPool"))
3874 return (PFN_vkVoidFunction)CreateQueryPool;
3875 if (!strcmp(name, "DestroyQueryPool"))
3876 return (PFN_vkVoidFunction)DestroyQueryPool;
3877 if (!strcmp(name, "GetQueryPoolResults"))
3878 return (PFN_vkVoidFunction)GetQueryPoolResults;
3879 if (!strcmp(name, "CreateBuffer"))
3880 return (PFN_vkVoidFunction)CreateBuffer;
3881 if (!strcmp(name, "DestroyBuffer"))
3882 return (PFN_vkVoidFunction)DestroyBuffer;
3883 if (!strcmp(name, "CreateBufferView"))
3884 return (PFN_vkVoidFunction)CreateBufferView;
3885 if (!strcmp(name, "DestroyBufferView"))
3886 return (PFN_vkVoidFunction)DestroyBufferView;
3887 if (!strcmp(name, "CreateImage"))
3888 return (PFN_vkVoidFunction)CreateImage;
3889 if (!strcmp(name, "DestroyImage"))
3890 return (PFN_vkVoidFunction)DestroyImage;
3891 if (!strcmp(name, "GetImageSubresourceLayout"))
3892 return (PFN_vkVoidFunction)GetImageSubresourceLayout;
3893 if (!strcmp(name, "CreateImageView"))
3894 return (PFN_vkVoidFunction)CreateImageView;
3895 if (!strcmp(name, "DestroyImageView"))
3896 return (PFN_vkVoidFunction)DestroyImageView;
3897 if (!strcmp(name, "CreateShaderModule"))
3898 return (PFN_vkVoidFunction)CreateShaderModule;
3899 if (!strcmp(name, "DestroyShaderModule"))
3900 return (PFN_vkVoidFunction)DestroyShaderModule;
3901 if (!strcmp(name, "CreatePipelineCache"))
3902 return (PFN_vkVoidFunction)CreatePipelineCache;
3903 if (!strcmp(name, "DestroyPipelineCache"))
3904 return (PFN_vkVoidFunction)DestroyPipelineCache;
3905 if (!strcmp(name, "GetPipelineCacheData"))
3906 return (PFN_vkVoidFunction)GetPipelineCacheData;
3907 if (!strcmp(name, "MergePipelineCaches"))
3908 return (PFN_vkVoidFunction)MergePipelineCaches;
3909 if (!strcmp(name, "CreateGraphicsPipelines"))
3910 return (PFN_vkVoidFunction)CreateGraphicsPipelines;
3911 if (!strcmp(name, "CreateComputePipelines"))
3912 return (PFN_vkVoidFunction)CreateComputePipelines;
3913 if (!strcmp(name, "DestroyPipeline"))
3914 return (PFN_vkVoidFunction)DestroyPipeline;
3915 if (!strcmp(name, "CreatePipelineLayout"))
3916 return (PFN_vkVoidFunction)CreatePipelineLayout;
3917 if (!strcmp(name, "DestroyPipelineLayout"))
3918 return (PFN_vkVoidFunction)DestroyPipelineLayout;
3919 if (!strcmp(name, "CreateSampler"))
3920 return (PFN_vkVoidFunction)CreateSampler;
3921 if (!strcmp(name, "DestroySampler"))
3922 return (PFN_vkVoidFunction)DestroySampler;
3923 if (!strcmp(name, "CreateDescriptorSetLayout"))
3924 return (PFN_vkVoidFunction)CreateDescriptorSetLayout;
3925 if (!strcmp(name, "DestroyDescriptorSetLayout"))
3926 return (PFN_vkVoidFunction)DestroyDescriptorSetLayout;
3927 if (!strcmp(name, "CreateDescriptorPool"))
3928 return (PFN_vkVoidFunction)CreateDescriptorPool;
3929 if (!strcmp(name, "DestroyDescriptorPool"))
3930 return (PFN_vkVoidFunction)DestroyDescriptorPool;
3931 if (!strcmp(name, "ResetDescriptorPool"))
3932 return (PFN_vkVoidFunction)ResetDescriptorPool;
3933 if (!strcmp(name, "AllocateDescriptorSets"))
3934 return (PFN_vkVoidFunction)AllocateDescriptorSets;
3935 if (!strcmp(name, "FreeDescriptorSets"))
3936 return (PFN_vkVoidFunction)FreeDescriptorSets;
3937 if (!strcmp(name, "UpdateDescriptorSets"))
3938 return (PFN_vkVoidFunction)UpdateDescriptorSets;
3939 if (!strcmp(name, "CreateFramebuffer"))
3940 return (PFN_vkVoidFunction)CreateFramebuffer;
3941 if (!strcmp(name, "DestroyFramebuffer"))
3942 return (PFN_vkVoidFunction)DestroyFramebuffer;
3943 if (!strcmp(name, "CreateRenderPass"))
3944 return (PFN_vkVoidFunction)CreateRenderPass;
3945 if (!strcmp(name, "DestroyRenderPass"))
3946 return (PFN_vkVoidFunction)DestroyRenderPass;
3947 if (!strcmp(name, "GetRenderAreaGranularity"))
3948 return (PFN_vkVoidFunction)GetRenderAreaGranularity;
3949 if (!strcmp(name, "CreateCommandPool"))
3950 return (PFN_vkVoidFunction)CreateCommandPool;
3951 if (!strcmp(name, "DestroyCommandPool"))
3952 return (PFN_vkVoidFunction)DestroyCommandPool;
3953 if (!strcmp(name, "ResetCommandPool"))
3954 return (PFN_vkVoidFunction)ResetCommandPool;
3955 if (!strcmp(name, "AllocateCommandBuffers"))
3956 return (PFN_vkVoidFunction)AllocateCommandBuffers;
3957 if (!strcmp(name, "FreeCommandBuffers"))
3958 return (PFN_vkVoidFunction)FreeCommandBuffers;
3959 if (!strcmp(name, "BeginCommandBuffer"))
3960 return (PFN_vkVoidFunction)BeginCommandBuffer;
3961 if (!strcmp(name, "EndCommandBuffer"))
3962 return (PFN_vkVoidFunction)EndCommandBuffer;
3963 if (!strcmp(name, "ResetCommandBuffer"))
3964 return (PFN_vkVoidFunction)ResetCommandBuffer;
3965 if (!strcmp(name, "CmdBindPipeline"))
3966 return (PFN_vkVoidFunction)CmdBindPipeline;
3967 if (!strcmp(name, "CmdSetViewport"))
3968 return (PFN_vkVoidFunction)CmdSetViewport;
3969 if (!strcmp(name, "CmdSetScissor"))
3970 return (PFN_vkVoidFunction)CmdSetScissor;
3971 if (!strcmp(name, "CmdSetLineWidth"))
3972 return (PFN_vkVoidFunction)CmdSetLineWidth;
3973 if (!strcmp(name, "CmdSetDepthBias"))
3974 return (PFN_vkVoidFunction)CmdSetDepthBias;
3975 if (!strcmp(name, "CmdSetBlendConstants"))
3976 return (PFN_vkVoidFunction)CmdSetBlendConstants;
3977 if (!strcmp(name, "CmdSetDepthBounds"))
3978 return (PFN_vkVoidFunction)CmdSetDepthBounds;
3979 if (!strcmp(name, "CmdSetStencilCompareMask"))
3980 return (PFN_vkVoidFunction)CmdSetStencilCompareMask;
3981 if (!strcmp(name, "CmdSetStencilWriteMask"))
3982 return (PFN_vkVoidFunction)CmdSetStencilWriteMask;
3983 if (!strcmp(name, "CmdSetStencilReference"))
3984 return (PFN_vkVoidFunction)CmdSetStencilReference;
3985 if (!strcmp(name, "CmdBindDescriptorSets"))
3986 return (PFN_vkVoidFunction)CmdBindDescriptorSets;
3987 if (!strcmp(name, "CmdBindIndexBuffer"))
3988 return (PFN_vkVoidFunction)CmdBindIndexBuffer;
3989 if (!strcmp(name, "CmdBindVertexBuffers"))
3990 return (PFN_vkVoidFunction)CmdBindVertexBuffers;
3991 if (!strcmp(name, "CmdDraw"))
3992 return (PFN_vkVoidFunction)CmdDraw;
3993 if (!strcmp(name, "CmdDrawIndexed"))
3994 return (PFN_vkVoidFunction)CmdDrawIndexed;
3995 if (!strcmp(name, "CmdDrawIndirect"))
3996 return (PFN_vkVoidFunction)CmdDrawIndirect;
3997 if (!strcmp(name, "CmdDrawIndexedIndirect"))
3998 return (PFN_vkVoidFunction)CmdDrawIndexedIndirect;
3999 if (!strcmp(name, "CmdDispatch"))
4000 return (PFN_vkVoidFunction)CmdDispatch;
4001 if (!strcmp(name, "CmdDispatchIndirect"))
4002 return (PFN_vkVoidFunction)CmdDispatchIndirect;
4003 if (!strcmp(name, "CmdCopyBuffer"))
4004 return (PFN_vkVoidFunction)CmdCopyBuffer;
4005 if (!strcmp(name, "CmdCopyImage"))
4006 return (PFN_vkVoidFunction)CmdCopyImage;
4007 if (!strcmp(name, "CmdBlitImage"))
4008 return (PFN_vkVoidFunction)CmdBlitImage;
4009 if (!strcmp(name, "CmdCopyBufferToImage"))
4010 return (PFN_vkVoidFunction)CmdCopyBufferToImage;
4011 if (!strcmp(name, "CmdCopyImageToBuffer"))
4012 return (PFN_vkVoidFunction)CmdCopyImageToBuffer;
4013 if (!strcmp(name, "CmdUpdateBuffer"))
4014 return (PFN_vkVoidFunction)CmdUpdateBuffer;
4015 if (!strcmp(name, "CmdFillBuffer"))
4016 return (PFN_vkVoidFunction)CmdFillBuffer;
4017 if (!strcmp(name, "CmdClearColorImage"))
4018 return (PFN_vkVoidFunction)CmdClearColorImage;
4019 if (!strcmp(name, "CmdClearDepthStencilImage"))
4020 return (PFN_vkVoidFunction)CmdClearDepthStencilImage;
4021 if (!strcmp(name, "CmdClearAttachments"))
4022 return (PFN_vkVoidFunction)CmdClearAttachments;
4023 if (!strcmp(name, "CmdResolveImage"))
4024 return (PFN_vkVoidFunction)CmdResolveImage;
4025 if (!strcmp(name, "CmdSetEvent"))
4026 return (PFN_vkVoidFunction)CmdSetEvent;
4027 if (!strcmp(name, "CmdResetEvent"))
4028 return (PFN_vkVoidFunction)CmdResetEvent;
4029 if (!strcmp(name, "CmdWaitEvents"))
4030 return (PFN_vkVoidFunction)CmdWaitEvents;
4031 if (!strcmp(name, "CmdPipelineBarrier"))
4032 return (PFN_vkVoidFunction)CmdPipelineBarrier;
4033 if (!strcmp(name, "CmdBeginQuery"))
4034 return (PFN_vkVoidFunction)CmdBeginQuery;
4035 if (!strcmp(name, "CmdEndQuery"))
4036 return (PFN_vkVoidFunction)CmdEndQuery;
4037 if (!strcmp(name, "CmdResetQueryPool"))
4038 return (PFN_vkVoidFunction)CmdResetQueryPool;
4039 if (!strcmp(name, "CmdWriteTimestamp"))
4040 return (PFN_vkVoidFunction)CmdWriteTimestamp;
4041 if (!strcmp(name, "CmdCopyQueryPoolResults"))
4042 return (PFN_vkVoidFunction)CmdCopyQueryPoolResults;
4043 if (!strcmp(name, "CmdPushConstants"))
4044 return (PFN_vkVoidFunction)CmdPushConstants;
4045 if (!strcmp(name, "CmdBeginRenderPass"))
4046 return (PFN_vkVoidFunction)CmdBeginRenderPass;
4047 if (!strcmp(name, "CmdNextSubpass"))
4048 return (PFN_vkVoidFunction)CmdNextSubpass;
4049 if (!strcmp(name, "CmdEndRenderPass"))
4050 return (PFN_vkVoidFunction)CmdEndRenderPass;
4051 if (!strcmp(name, "CmdExecuteCommands"))
4052 return (PFN_vkVoidFunction)CmdExecuteCommands;
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06004053 if (!strcmp(name, "DebugMarkerSetObjectTagEXT"))
4054 return (PFN_vkVoidFunction)DebugMarkerSetObjectTagEXT;
4055 if (!strcmp(name, "DebugMarkerSetObjectNameEXT"))
4056 return (PFN_vkVoidFunction)DebugMarkerSetObjectNameEXT;
4057 if (!strcmp(name, "CmdDebugMarkerBeginEXT"))
4058 return (PFN_vkVoidFunction)CmdDebugMarkerBeginEXT;
4059 if (!strcmp(name, "CmdDebugMarkerEndEXT"))
4060 return (PFN_vkVoidFunction)CmdDebugMarkerEndEXT;
4061 if (!strcmp(name, "CmdDebugMarkerInsertEXT"))
4062 return (PFN_vkVoidFunction)CmdDebugMarkerInsertEXT;
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06004063#ifdef VK_USE_PLATFORM_WIN32_KHR
4064 if (!strcmp(name, "GetMemoryWin32HandleNV"))
4065 return (PFN_vkVoidFunction)GetMemoryWin32HandleNV;
4066#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06004067 if (!strcmp(name, "CmdDrawIndirectCountAMD"))
4068 return (PFN_vkVoidFunction)CmdDrawIndirectCountAMD;
4069 if (!strcmp(name, "CmdDrawIndexedIndirectCountAMD"))
4070 return (PFN_vkVoidFunction)CmdDrawIndexedIndirectCountAMD;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004071
4072 return NULL;
4073}
4074static inline PFN_vkVoidFunction InterceptCoreInstanceCommand(const char *name) {
4075 if (!name || name[0] != 'v' || name[1] != 'k')
4076 return NULL;
4077
4078 name += 2;
4079 if (!strcmp(name, "CreateInstance"))
4080 return (PFN_vkVoidFunction)CreateInstance;
4081 if (!strcmp(name, "DestroyInstance"))
4082 return (PFN_vkVoidFunction)DestroyInstance;
4083 if (!strcmp(name, "EnumeratePhysicalDevices"))
4084 return (PFN_vkVoidFunction)EnumeratePhysicalDevices;
4085 if (!strcmp(name, "GetPhysicalDeviceFeatures"))
4086 return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures;
4087 if (!strcmp(name, "GetPhysicalDeviceFormatProperties"))
4088 return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties;
4089 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties"))
4090 return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties;
4091 if (!strcmp(name, "GetPhysicalDeviceProperties"))
4092 return (PFN_vkVoidFunction)GetPhysicalDeviceProperties;
4093 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties"))
4094 return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties;
4095 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties"))
4096 return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties;
4097 if (!strcmp(name, "GetInstanceProcAddr"))
4098 return (PFN_vkVoidFunction)GetInstanceProcAddr;
4099 if (!strcmp(name, "CreateDevice"))
4100 return (PFN_vkVoidFunction)CreateDevice;
4101 if (!strcmp(name, "EnumerateInstanceExtensionProperties"))
4102 return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
4103 if (!strcmp(name, "EnumerateInstanceLayerProperties"))
4104 return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties;
4105 if (!strcmp(name, "EnumerateDeviceLayerProperties"))
4106 return (PFN_vkVoidFunction)EnumerateDeviceLayerProperties;
4107 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties"))
4108 return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties;
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06004109 if (!strcmp(name, "GetPhysicalDeviceExternalImageFormatPropertiesNV"))
4110 return (PFN_vkVoidFunction)GetPhysicalDeviceExternalImageFormatPropertiesNV;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004111
4112 return NULL;
4113}
4114
4115static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
4116 if (device) {
4117 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06004118
4119 if (device_data->wsi_enabled) {
4120 if (!strcmp("vkCreateSwapchainKHR", name))
4121 return reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR);
4122 if (!strcmp("vkDestroySwapchainKHR", name))
4123 return reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR);
4124 if (!strcmp("vkGetSwapchainImagesKHR", name))
4125 return reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR);
4126 if (!strcmp("vkAcquireNextImageKHR", name))
4127 return reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR);
4128 if (!strcmp("vkQueuePresentKHR", name))
4129 return reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR);
4130 }
4131
4132 if (device_data->wsi_display_swapchain_enabled) {
4133 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
4134 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
4135 }
4136 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004137 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004138
4139 return nullptr;
4140}
4141
4142VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
4143 PFN_vkVoidFunction addr;
4144 addr = InterceptCoreDeviceCommand(funcName);
4145 if (addr) {
4146 return addr;
4147 }
4148 assert(device);
4149
4150 addr = InterceptWsiEnabledCommand(funcName, device);
4151 if (addr) {
4152 return addr;
4153 }
4154 if (get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr == NULL) {
4155 return NULL;
4156 }
4157 return get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr(device, funcName);
4158}
4159
4160VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
4161 PFN_vkVoidFunction addr;
4162 addr = InterceptCoreInstanceCommand(funcName);
4163 if (!addr) {
4164 addr = InterceptCoreDeviceCommand(funcName);
4165 }
4166 if (!addr) {
4167 addr = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
4168 }
4169 if (addr) {
4170 return addr;
4171 }
4172 assert(instance);
4173
4174 addr = InterceptMsgCallbackGetProcAddrCommand(funcName, instance);
4175 if (addr) {
4176 return addr;
4177 }
4178 addr = InterceptWsiEnabledCommand(funcName, instance);
4179 if (addr) {
4180 return addr;
4181 }
4182 if (get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr == NULL) {
4183 return NULL;
4184 }
4185 return get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
4186}
4187
4188} // namespace object_tracker
4189
4190// vk_layer_logging.h expects these to be defined
4191VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
4192 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4193 const VkAllocationCallbacks *pAllocator,
4194 VkDebugReportCallbackEXT *pMsgCallback) {
4195 return object_tracker::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
4196}
4197
4198VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
4199 const VkAllocationCallbacks *pAllocator) {
4200 object_tracker::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
4201}
4202
4203VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
4204 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
4205 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
4206 object_tracker::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
4207}
4208
4209// Loader-layer interface v0, just wrappers since there is only a layer
4210VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4211 VkExtensionProperties *pProperties) {
4212 return object_tracker::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
4213}
4214
4215VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
4216 VkLayerProperties *pProperties) {
4217 return object_tracker::EnumerateInstanceLayerProperties(pCount, pProperties);
4218}
4219
4220VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4221 VkLayerProperties *pProperties) {
4222 // The layer command handles VK_NULL_HANDLE just fine internally
4223 assert(physicalDevice == VK_NULL_HANDLE);
4224 return object_tracker::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
4225}
4226
4227VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
4228 return object_tracker::GetDeviceProcAddr(dev, funcName);
4229}
4230
4231VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
4232 return object_tracker::GetInstanceProcAddr(instance, funcName);
4233}
4234
4235VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4236 const char *pLayerName, uint32_t *pCount,
4237 VkExtensionProperties *pProperties) {
4238 // The layer command handles VK_NULL_HANDLE just fine internally
4239 assert(physicalDevice == VK_NULL_HANDLE);
4240 return object_tracker::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Mark Lobodzinski38080682016-07-22 15:30:27 -06004241}