blob: 11276f453b37a1f759364c2774a05ec3f1c255cf [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
2729#ifdef VK_USE_PLATFORM_WIN32_KHR
2730VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
2731 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2732 bool skip_call = false;
2733 {
2734 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002735 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01820);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002736 }
2737 if (skip_call) {
2738 return VK_ERROR_VALIDATION_FAILED_EXT;
2739 }
2740 VkResult result =
2741 get_dispatch_table(ot_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2742 {
2743 std::lock_guard<std::mutex> lock(global_lock);
2744 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002745 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002746 }
2747 }
2748 return result;
2749}
2750
2751VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
2752 uint32_t queueFamilyIndex) {
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(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2757 VALIDATION_ERROR_01900);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002758 }
2759 if (skip_call) {
2760 return VK_FALSE;
2761 }
2762 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2763 ->GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
2764 return result;
2765}
2766#endif // VK_USE_PLATFORM_WIN32_KHR
2767
2768#ifdef VK_USE_PLATFORM_XCB_KHR
2769VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
2770 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2771 bool skip_call = false;
2772 {
2773 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002774 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01827);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002775 }
2776 if (skip_call) {
2777 return VK_ERROR_VALIDATION_FAILED_EXT;
2778 }
2779 VkResult result =
2780 get_dispatch_table(ot_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2781 {
2782 std::lock_guard<std::mutex> lock(global_lock);
2783 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002784 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002785 }
2786 }
2787 return result;
2788}
2789
2790VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2791 uint32_t queueFamilyIndex, xcb_connection_t *connection,
2792 xcb_visualid_t visual_id) {
2793 bool skip_call = false;
2794 {
2795 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002796 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2797 VALIDATION_ERROR_01902);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002798 }
2799 if (skip_call) {
2800 return VK_FALSE;
2801 }
2802 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2803 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
2804 return result;
2805}
2806#endif // VK_USE_PLATFORM_XCB_KHR
2807
2808#ifdef VK_USE_PLATFORM_XLIB_KHR
2809VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
2810 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2811 bool skip_call = false;
2812 {
2813 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002814 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01836);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002815 }
2816 if (skip_call) {
2817 return VK_ERROR_VALIDATION_FAILED_EXT;
2818 }
2819 VkResult result =
2820 get_dispatch_table(ot_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2821 {
2822 std::lock_guard<std::mutex> lock(global_lock);
2823 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002824 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002825 }
2826 }
2827 return result;
2828}
2829
2830VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2831 uint32_t queueFamilyIndex, Display *dpy,
2832 VisualID visualID) {
2833 bool skip_call = false;
2834 {
2835 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002836 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2837 VALIDATION_ERROR_01905);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002838 }
2839 if (skip_call) {
2840 return VK_FALSE;
2841 }
2842 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2843 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
2844 return result;
2845}
2846#endif // VK_USE_PLATFORM_XLIB_KHR
2847
2848#ifdef VK_USE_PLATFORM_MIR_KHR
2849VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
2850 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2851 bool skip_call = false;
2852 {
2853 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002854 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01802);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002855 }
2856 if (skip_call) {
2857 return VK_ERROR_VALIDATION_FAILED_EXT;
2858 }
2859 VkResult result =
2860 get_dispatch_table(ot_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2861 {
2862 std::lock_guard<std::mutex> lock(global_lock);
2863 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002864 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002865 }
2866 }
2867 return result;
2868}
2869
2870VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2871 uint32_t queueFamilyIndex, MirConnection *connection) {
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(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2876 VALIDATION_ERROR_01894);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002877 }
2878 if (skip_call) {
2879 return VK_FALSE;
2880 }
2881 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2882 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
2883 return result;
2884}
2885#endif // VK_USE_PLATFORM_MIR_KHR
2886
2887#ifdef VK_USE_PLATFORM_WAYLAND_KHR
2888VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
2889 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2890 bool skip_call = false;
2891 {
2892 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002893 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01811);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002894 }
2895 if (skip_call) {
2896 return VK_ERROR_VALIDATION_FAILED_EXT;
2897 }
2898 VkResult result =
2899 get_dispatch_table(ot_instance_table_map, instance)->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2900 {
2901 std::lock_guard<std::mutex> lock(global_lock);
2902 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002903 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002904 }
2905 }
2906 return result;
2907}
2908
2909VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2910 uint32_t queueFamilyIndex,
2911 struct wl_display *display) {
2912 bool skip_call = false;
2913 {
2914 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002915 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2916 VALIDATION_ERROR_01897);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002917 }
2918 if (skip_call) {
2919 return VK_FALSE;
2920 }
2921 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2922 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
2923 return result;
2924}
2925#endif // VK_USE_PLATFORM_WAYLAND_KHR
2926
2927#ifdef VK_USE_PLATFORM_ANDROID_KHR
2928VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
2929 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2930 bool skip_call = false;
2931 {
2932 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002933 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01794);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002934 }
2935 if (skip_call) {
2936 return VK_ERROR_VALIDATION_FAILED_EXT;
2937 }
2938 VkResult result =
2939 get_dispatch_table(ot_instance_table_map, instance)->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2940 {
2941 std::lock_guard<std::mutex> lock(global_lock);
2942 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002943 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002944 }
2945 }
2946 return result;
2947}
2948#endif // VK_USE_PLATFORM_ANDROID_KHR
2949
Mark Youngead9b932016-09-08 12:28:38 -06002950VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
2951 const VkSwapchainCreateInfoKHR *pCreateInfos,
2952 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
2953 bool skip_call = false;
2954 uint32_t i = 0;
2955 {
2956 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002957 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01943);
Mark Youngead9b932016-09-08 12:28:38 -06002958 if (NULL != pCreateInfos) {
2959 for (i = 0; i < swapchainCount; i++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002960 skip_call |= ValidateObject(device, pCreateInfos[i].oldSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT,
2961 true, VALIDATION_ERROR_01935);
Mark Youngead9b932016-09-08 12:28:38 -06002962 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002963 skip_call |= ValidateObject(device_data->physical_device, pCreateInfos[i].surface,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002964 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01926);
Mark Youngead9b932016-09-08 12:28:38 -06002965 }
2966 }
2967 }
2968 if (skip_call) {
2969 return VK_ERROR_VALIDATION_FAILED_EXT;
2970 }
2971 VkResult result =
2972 get_dispatch_table(ot_device_table_map, device)->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
2973 {
2974 std::lock_guard<std::mutex> lock(global_lock);
2975 if (result == VK_SUCCESS) {
2976 for (i = 0; i < swapchainCount; i++) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002977 CreateObject(device, pSwapchains[i], VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Youngead9b932016-09-08 12:28:38 -06002978 }
2979 }
2980 }
2981 return result;
2982}
2983
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002984VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
2985 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
2986 const VkAllocationCallbacks *pAllocator,
2987 VkDebugReportCallbackEXT *pCallback) {
2988 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
2989 VkResult result = pInstanceTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback);
2990 if (VK_SUCCESS == result) {
2991 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
2992 result = layer_create_msg_callback(instance_data->report_data, false, pCreateInfo, pAllocator, pCallback);
Chris Forbesfeecd402016-09-29 14:53:50 +13002993 CreateObject(instance, *pCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002994 }
2995 return result;
2996}
2997
2998VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
2999 const VkAllocationCallbacks *pAllocator) {
3000 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3001 pInstanceTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
3002 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3003 layer_destroy_msg_callback(instance_data->report_data, msgCallback, pAllocator);
Chris Forbesec461992016-09-29 14:41:44 +13003004 DestroyObject(instance, msgCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003005}
3006
3007VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
3008 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
3009 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
3010 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3011 pInstanceTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
3012}
3013
3014static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
3015
3016static const VkLayerProperties globalLayerProps = {"VK_LAYER_LUNARG_object_tracker",
3017 VK_LAYER_API_VERSION, // specVersion
3018 1, // implementationVersion
3019 "LunarG Validation Layer"};
3020
3021VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
3022 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
3023}
3024
3025VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
3026 VkLayerProperties *pProperties) {
3027 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
3028}
3029
3030VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
3031 VkExtensionProperties *pProperties) {
3032 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3033 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
3034
3035 return VK_ERROR_LAYER_NOT_PRESENT;
3036}
3037
3038VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
3039 uint32_t *pCount, VkExtensionProperties *pProperties) {
3040 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3041 return util_GetExtensionProperties(0, nullptr, pCount, pProperties);
3042
3043 assert(physicalDevice);
3044 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, physicalDevice);
3045 return pTable->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
3046}
3047
3048static inline PFN_vkVoidFunction InterceptMsgCallbackGetProcAddrCommand(const char *name, VkInstance instance) {
3049 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3050 return debug_report_get_instance_proc_addr(instance_data->report_data, name);
3051}
3052
3053static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
3054 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, instance);
3055 if (instanceExtMap.size() == 0 || !instanceExtMap[pTable].wsi_enabled)
3056 return nullptr;
3057
3058 if (!strcmp("vkDestroySurfaceKHR", name))
3059 return reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR);
3060 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name))
3061 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR);
3062 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name))
3063 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR);
3064 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name))
3065 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR);
3066 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name))
3067 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR);
3068
3069#ifdef VK_USE_PLATFORM_WIN32_KHR
3070 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
3071 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
3072 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name))
3073 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR);
3074#endif // VK_USE_PLATFORM_WIN32_KHR
3075#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003076 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003077 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003078 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003079 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
3080#endif // VK_USE_PLATFORM_XCB_KHR
3081#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003082 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003083 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003084 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003085 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
3086#endif // VK_USE_PLATFORM_XLIB_KHR
3087#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003088 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003089 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003090 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003091 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
3092#endif // VK_USE_PLATFORM_MIR_KHR
3093#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003094 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003095 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003096 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003097 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
3098#endif // VK_USE_PLATFORM_WAYLAND_KHR
3099#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003100 if ((instanceExtMap[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003101 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
3102#endif // VK_USE_PLATFORM_ANDROID_KHR
3103
3104 return nullptr;
3105}
3106
3107static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
3108 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3109 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06003110 device_data->wsi_display_swapchain_enabled = false;
3111 device_data->objtrack_extensions_enabled = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003112
3113 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3114 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
3115 device_data->wsi_enabled = true;
3116 }
Mark Youngead9b932016-09-08 12:28:38 -06003117 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
3118 device_data->wsi_display_swapchain_enabled = true;
3119 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003120 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], "OBJTRACK_EXTENSIONS") == 0) {
3121 device_data->objtrack_extensions_enabled = true;
3122 }
3123 }
3124}
3125
3126static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
3127 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(ot_instance_table_map, instance);
3128
3129
3130 instanceExtMap[pDisp] = {};
3131
3132 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3133 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
3134 instanceExtMap[pDisp].wsi_enabled = true;
3135 }
3136#ifdef VK_USE_PLATFORM_XLIB_KHR
3137 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
3138 instanceExtMap[pDisp].xlib_enabled = true;
3139 }
3140#endif
3141#ifdef VK_USE_PLATFORM_XCB_KHR
3142 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
3143 instanceExtMap[pDisp].xcb_enabled = true;
3144 }
3145#endif
3146#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3147 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
3148 instanceExtMap[pDisp].wayland_enabled = true;
3149 }
3150#endif
3151#ifdef VK_USE_PLATFORM_MIR_KHR
3152 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
3153 instanceExtMap[pDisp].mir_enabled = true;
3154 }
3155#endif
3156#ifdef VK_USE_PLATFORM_ANDROID_KHR
3157 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
3158 instanceExtMap[pDisp].android_enabled = true;
3159 }
3160#endif
3161#ifdef VK_USE_PLATFORM_WIN32_KHR
3162 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
3163 instanceExtMap[pDisp].win32_enabled = true;
3164 }
3165#endif
3166 }
3167}
3168
3169VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
3170 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
3171 std::lock_guard<std::mutex> lock(global_lock);
3172 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3173 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3174
3175 assert(chain_info->u.pLayerInfo);
3176 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3177 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
3178 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(phy_dev_data->instance, "vkCreateDevice");
3179 if (fpCreateDevice == NULL) {
3180 return VK_ERROR_INITIALIZATION_FAILED;
3181 }
3182
3183 // Advance the link info for the next element on the chain
3184 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3185
3186 VkResult result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
3187 if (result != VK_SUCCESS) {
3188 return result;
3189 }
3190
3191 layer_data *device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
3192 device_data->report_data = layer_debug_report_create_device(phy_dev_data->report_data, *pDevice);
3193
3194 // Add link back to physDev
3195 device_data->physical_device = physicalDevice;
3196
3197 initDeviceTable(*pDevice, fpGetDeviceProcAddr, ot_device_table_map);
3198
3199 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
Chris Forbesfeecd402016-09-29 14:53:50 +13003200 CreateObject(*pDevice, *pDevice, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003201
3202 return result;
3203}
3204
3205VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3206 uint32_t *pQueueFamilyPropertyCount,
3207 VkQueueFamilyProperties *pQueueFamilyProperties) {
3208 get_dispatch_table(ot_instance_table_map, physicalDevice)
3209 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
3210 std::lock_guard<std::mutex> lock(global_lock);
3211 if (pQueueFamilyProperties != NULL) {
3212 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3213 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
3214 instance_data->queue_family_properties.emplace_back(pQueueFamilyProperties[i]);
3215 }
3216 }
3217}
3218
3219VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3220 VkInstance *pInstance) {
3221 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3222
3223 assert(chain_info->u.pLayerInfo);
3224 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3225 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
3226 if (fpCreateInstance == NULL) {
3227 return VK_ERROR_INITIALIZATION_FAILED;
3228 }
3229
3230 // Advance the link info for the next element on the chain
3231 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3232
3233 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
3234 if (result != VK_SUCCESS) {
3235 return result;
3236 }
3237
3238 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
3239 instance_data->instance = *pInstance;
3240 initInstanceTable(*pInstance, fpGetInstanceProcAddr, ot_instance_table_map);
3241 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, *pInstance);
3242
3243 // Look for one or more debug report create info structures, and copy the
3244 // callback(s) for each one found (for use by vkDestroyInstance)
3245 layer_copy_tmp_callbacks(pCreateInfo->pNext, &instance_data->num_tmp_callbacks, &instance_data->tmp_dbg_create_infos,
3246 &instance_data->tmp_callbacks);
3247
3248 instance_data->report_data = debug_report_create_instance(pInstanceTable, *pInstance, pCreateInfo->enabledExtensionCount,
3249 pCreateInfo->ppEnabledExtensionNames);
3250
3251 InitObjectTracker(instance_data, pAllocator);
3252 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
3253
Chris Forbesfeecd402016-09-29 14:53:50 +13003254 CreateObject(*pInstance, *pInstance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003255
3256 return result;
3257}
3258
3259VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
3260 VkPhysicalDevice *pPhysicalDevices) {
3261 bool skip_call = VK_FALSE;
3262 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003263 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_00023);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003264 lock.unlock();
3265 if (skip_call) {
3266 return VK_ERROR_VALIDATION_FAILED_EXT;
3267 }
3268 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
3269 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
3270 lock.lock();
3271 if (result == VK_SUCCESS) {
3272 if (pPhysicalDevices) {
3273 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003274 CreateObject(instance, pPhysicalDevices[i], VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003275 }
3276 }
3277 }
3278 lock.unlock();
3279 return result;
3280}
3281
3282VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
3283 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003284 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00062);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003285 lock.unlock();
3286
3287 get_dispatch_table(ot_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
3288
3289 lock.lock();
3290
3291 CreateQueue(device, *pQueue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT);
3292 AddQueueInfo(device, queueFamilyIndex, *pQueue);
3293}
3294
3295VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Tobin Ehlis02337352016-10-20 14:42:57 -06003296 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003297 std::unique_lock<std::mutex> lock(global_lock);
Tobin Ehlis02337352016-10-20 14:42:57 -06003298 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00621);
3299 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, true, VALIDATION_ERROR_00622);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003300 lock.unlock();
Tobin Ehlis02337352016-10-20 14:42:57 -06003301 if (!skip) {
3302 get_dispatch_table(ot_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003303
Tobin Ehlis02337352016-10-20 14:42:57 -06003304 lock.lock();
3305 DestroyObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
3306 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003307}
3308
3309VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
3310 VkMemoryMapFlags flags, void **ppData) {
3311 bool skip_call = VK_FALSE;
3312 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultz259ddb22016-10-27 13:29:19 -06003313 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00630);
3314 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00631);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003315 lock.unlock();
3316 if (skip_call == VK_TRUE) {
3317 return VK_ERROR_VALIDATION_FAILED_EXT;
3318 }
3319 VkResult result = get_dispatch_table(ot_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
3320 return result;
3321}
3322
3323VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
3324 bool skip_call = VK_FALSE;
3325 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003326 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00650);
Karl Schultz259ddb22016-10-27 13:29:19 -06003327 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00651);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003328 lock.unlock();
3329 if (skip_call == VK_TRUE) {
3330 return;
3331 }
3332
3333 get_dispatch_table(ot_device_table_map, device)->UnmapMemory(device, memory);
3334}
3335VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
3336 VkFence fence) {
3337 std::unique_lock<std::mutex> lock(global_lock);
3338 ValidateQueueFlags(queue, "QueueBindSparse");
3339
3340 for (uint32_t i = 0; i < bindInfoCount; i++) {
3341 for (uint32_t j = 0; j < pBindInfo[i].bufferBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003342 ValidateObject(queue, pBindInfo[i].pBufferBinds[j].buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false,
3343 VALIDATION_ERROR_01656);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003344 for (uint32_t j = 0; j < pBindInfo[i].imageOpaqueBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003345 ValidateObject(queue, pBindInfo[i].pImageOpaqueBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
3346 VALIDATION_ERROR_01657);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003347 for (uint32_t j = 0; j < pBindInfo[i].imageBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003348 ValidateObject(queue, pBindInfo[i].pImageBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
3349 VALIDATION_ERROR_01658);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003350 }
3351 lock.unlock();
3352
3353 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
3354 return result;
3355}
3356
3357VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3358 VkCommandBuffer *pCommandBuffers) {
3359 bool skip_call = VK_FALSE;
3360 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003361 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00084);
3362 skip_call |= ValidateObject(device, pAllocateInfo->commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false,
3363 VALIDATION_ERROR_00090);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003364 lock.unlock();
3365
3366 if (skip_call) {
3367 return VK_ERROR_VALIDATION_FAILED_EXT;
3368 }
3369
3370 VkResult result =
3371 get_dispatch_table(ot_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3372
3373 lock.lock();
3374 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {
3375 AllocateCommandBuffer(device, pAllocateInfo->commandPool, pCommandBuffers[i],
3376 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, pAllocateInfo->level);
3377 }
3378 lock.unlock();
3379
3380 return result;
3381}
3382
3383VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3384 VkDescriptorSet *pDescriptorSets) {
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_00908);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003388 skip_call |= ValidateObject(device, pAllocateInfo->descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false,
3389 VALIDATION_ERROR_00915);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003390 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003391 skip_call |= ValidateObject(device, pAllocateInfo->pSetLayouts[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT,
3392 false, VALIDATION_ERROR_00916);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003393 }
3394 lock.unlock();
3395 if (skip_call) {
3396 return VK_ERROR_VALIDATION_FAILED_EXT;
3397 }
3398
3399 VkResult result =
3400 get_dispatch_table(ot_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3401
3402 if (VK_SUCCESS == result) {
3403 lock.lock();
3404 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
3405 AllocateDescriptorSet(device, pAllocateInfo->descriptorPool, pDescriptorSets[i],
3406 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
3407 }
3408 lock.unlock();
3409 }
3410
3411 return result;
3412}
3413
3414VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
3415 const VkCommandBuffer *pCommandBuffers) {
3416 bool skip_call = false;
3417 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003418 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false, VALIDATION_ERROR_00099);
3419 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00098);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003420 for (uint32_t i = 0; i < commandBufferCount; i++) {
3421 skip_call |= ValidateCommandBuffer(device, commandPool, pCommandBuffers[i]);
3422 }
3423
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003424 for (uint32_t i = 0; i < commandBufferCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003425 DestroyObject(device, pCommandBuffers[i], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003426 }
3427
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003428 lock.unlock();
3429 if (!skip_call) {
3430 get_dispatch_table(ot_device_table_map, device)
3431 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
3432 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003433}
3434VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
3435 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3436 std::unique_lock<std::mutex> lock(global_lock);
3437 // A swapchain's images are implicitly deleted when the swapchain is deleted.
3438 // Remove this swapchain's images from our map of such images.
3439 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr = device_data->swapchainImageMap.begin();
3440 while (itr != device_data->swapchainImageMap.end()) {
3441 OBJTRACK_NODE *pNode = (*itr).second;
3442 if (pNode->parent_object == reinterpret_cast<uint64_t &>(swapchain)) {
3443 delete pNode;
3444 auto delete_item = itr++;
3445 device_data->swapchainImageMap.erase(delete_item);
3446 } else {
3447 ++itr;
3448 }
3449 }
Chris Forbesec461992016-09-29 14:41:44 +13003450 DestroyObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003451 lock.unlock();
3452
3453 get_dispatch_table(ot_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
3454}
3455
3456VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
3457 const VkDescriptorSet *pDescriptorSets) {
3458 bool skip_call = false;
3459 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3460 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003461 skip_call |=
3462 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false, VALIDATION_ERROR_00924);
3463 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00923);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003464 for (uint32_t i = 0; i < descriptorSetCount; i++) {
3465 skip_call |= ValidateDescriptorSet(device, descriptorPool, pDescriptorSets[i]);
3466 }
3467
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003468 for (uint32_t i = 0; i < descriptorSetCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003469 DestroyObject(device, pDescriptorSets[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003470 }
3471
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003472 lock.unlock();
3473 if (!skip_call) {
3474 result = get_dispatch_table(ot_device_table_map, device)
3475 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
3476 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003477 return result;
3478}
3479
3480VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3481 const VkAllocationCallbacks *pAllocator) {
3482 bool skip_call = VK_FALSE;
3483 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3484 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003485 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00904);
3486 skip_call |=
3487 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, true, VALIDATION_ERROR_00905);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003488 lock.unlock();
3489 if (skip_call) {
3490 return;
3491 }
3492 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is deleted.
3493 // Remove this pool's descriptor sets from our descriptorSet map.
3494 lock.lock();
3495 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr =
3496 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
3497 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
3498 OBJTRACK_NODE *pNode = (*itr).second;
3499 auto del_itr = itr++;
3500 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
Chris Forbesec461992016-09-29 14:41:44 +13003501 DestroyObject(device, (VkDescriptorSet)((*del_itr).first),
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003502 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003503 }
3504 }
Chris Forbesec461992016-09-29 14:41:44 +13003505 DestroyObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003506 lock.unlock();
3507 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
3508}
3509
3510VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3511 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3512 bool skip_call = false;
3513 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003514 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00080);
3515 skip_call |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, true, VALIDATION_ERROR_00081);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003516 lock.unlock();
3517 if (skip_call) {
3518 return;
3519 }
3520 lock.lock();
3521 // A CommandPool's command buffers are implicitly deleted when the pool is deleted.
3522 // Remove this pool's cmdBuffers from our cmd buffer map.
3523 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].begin();
3524 auto del_itr = itr;
3525 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
3526 OBJTRACK_NODE *pNode = (*itr).second;
3527 del_itr = itr++;
3528 if (pNode->parent_object == reinterpret_cast<uint64_t &>(commandPool)) {
3529 skip_call |= ValidateCommandBuffer(device, commandPool, reinterpret_cast<VkCommandBuffer>((*del_itr).first));
Chris Forbesec461992016-09-29 14:41:44 +13003530 DestroyObject(device, reinterpret_cast<VkCommandBuffer>((*del_itr).first),
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003531 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003532 }
3533 }
Chris Forbesec461992016-09-29 14:41:44 +13003534 DestroyObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003535 lock.unlock();
3536 get_dispatch_table(ot_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
3537}
3538
3539VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
3540 VkImage *pSwapchainImages) {
3541 bool skip_call = VK_FALSE;
3542 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003543 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01948);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003544 lock.unlock();
3545 if (skip_call) {
3546 return VK_ERROR_VALIDATION_FAILED_EXT;
3547 }
3548 VkResult result = get_dispatch_table(ot_device_table_map, device)
3549 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
3550 if (pSwapchainImages != NULL) {
3551 lock.lock();
3552 for (uint32_t i = 0; i < *pSwapchainImageCount; i++) {
3553 CreateSwapchainImageObject(device, pSwapchainImages[i], swapchain);
3554 }
3555 lock.unlock();
3556 }
3557 return result;
3558}
3559
3560VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3561 const VkGraphicsPipelineCreateInfo *pCreateInfos,
3562 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3563 bool skip_call = VK_FALSE;
3564 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003565 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00519);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003566 if (pCreateInfos) {
3567 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3568 if (pCreateInfos[idx0].basePipelineHandle) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003569 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3570 true, VALIDATION_ERROR_00529);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003571 }
3572 if (pCreateInfos[idx0].layout) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003573 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
3574 false, VALIDATION_ERROR_00546);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003575 }
3576 if (pCreateInfos[idx0].pStages) {
3577 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
3578 if (pCreateInfos[idx0].pStages[idx1].module) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003579 skip_call |= ValidateObject(device, pCreateInfos[idx0].pStages[idx1].module,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003580 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false, VALIDATION_ERROR_00515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003581 }
3582 }
3583 }
3584 if (pCreateInfos[idx0].renderPass) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003585 skip_call |= ValidateObject(device, pCreateInfos[idx0].renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,
3586 false, VALIDATION_ERROR_00547);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003587 }
3588 }
3589 }
3590 if (pipelineCache) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06003591 skip_call |=
3592 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00520);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003593 }
3594 lock.unlock();
3595 if (skip_call) {
3596 return VK_ERROR_VALIDATION_FAILED_EXT;
3597 }
3598 VkResult result = get_dispatch_table(ot_device_table_map, device)
3599 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3600 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01003601 for (uint32_t idx2 = 0; idx2 < createInfoCount; ++idx2) {
3602 if (pPipelines[idx2] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003603 CreateObject(device, pPipelines[idx2], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003604 }
3605 }
3606 lock.unlock();
3607 return result;
3608}
3609
3610VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3611 const VkComputePipelineCreateInfo *pCreateInfos,
3612 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3613 bool skip_call = VK_FALSE;
3614 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003615 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00486);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003616 if (pCreateInfos) {
3617 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3618 if (pCreateInfos[idx0].basePipelineHandle) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003619 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3620 true, VALIDATION_ERROR_00496);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003621 }
3622 if (pCreateInfos[idx0].layout) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003623 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
3624 false, VALIDATION_ERROR_00505);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003625 }
3626 if (pCreateInfos[idx0].stage.module) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003627 skip_call |= ValidateObject(device, pCreateInfos[idx0].stage.module, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT,
3628 false, VALIDATION_ERROR_00515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003629 }
3630 }
3631 }
3632 if (pipelineCache) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06003633 skip_call |=
3634 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00487);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003635 }
3636 lock.unlock();
3637 if (skip_call) {
3638 return VK_ERROR_VALIDATION_FAILED_EXT;
3639 }
3640 VkResult result = get_dispatch_table(ot_device_table_map, device)
3641 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3642 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01003643 for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
3644 if (pPipelines[idx1] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003645 CreateObject(device, pPipelines[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003646 }
3647 }
3648 lock.unlock();
3649 return result;
3650}
3651
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003652// VK_EXT_debug_marker Extension
3653VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
3654 bool skip_call = VK_FALSE;
3655 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003656 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_02007);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003657 lock.unlock();
3658 if (skip_call) {
3659 return VK_ERROR_VALIDATION_FAILED_EXT;
3660 }
3661 VkResult result = get_dispatch_table(ot_device_table_map, device)->DebugMarkerSetObjectTagEXT(device, pTagInfo);
3662 return result;
3663}
3664
3665VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
3666 bool skip_call = VK_FALSE;
3667 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003668 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01999);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003669 lock.unlock();
3670 if (skip_call) {
3671 return VK_ERROR_VALIDATION_FAILED_EXT;
3672 }
3673 VkResult result = get_dispatch_table(ot_device_table_map, device)->DebugMarkerSetObjectNameEXT(device, pNameInfo);
3674 return result;
3675}
3676
3677VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3678 bool skip_call = VK_FALSE;
3679 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003680 skip_call |=
3681 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02014);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003682 lock.unlock();
3683 if (!skip_call) {
3684 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
3685 }
3686}
3687
3688VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerEndEXT(VkCommandBuffer commandBuffer) {
3689 bool skip_call = VK_FALSE;
3690 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003691 skip_call |=
3692 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02022);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003693 lock.unlock();
3694 if (!skip_call) {
3695 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerEndEXT(commandBuffer);
3696 }
3697}
3698
3699VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3700 bool skip_call = VK_FALSE;
3701 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003702 skip_call |=
3703 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02025);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003704 lock.unlock();
3705 if (!skip_call) {
3706 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
3707 }
3708}
3709
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003710// VK_NV_external_memory_capabilities Extension
3711VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
3712 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
3713 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
3714 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
3715
3716 bool skip_call = false;
3717 {
3718 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003719 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3720 VALIDATION_ERROR_01980);
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003721 }
3722 if (skip_call) {
3723 return VK_ERROR_VALIDATION_FAILED_EXT;
3724 }
3725 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3726 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
3727 externalHandleType, pExternalImageFormatProperties);
3728 return result;
3729}
3730
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003731#ifdef VK_USE_PLATFORM_WIN32_KHR
3732// VK_NV_external_memory_win32 Extension
3733VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
3734 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
3735 bool skip_call = VK_FALSE;
3736 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003737 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01725);
3738 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_01726);
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003739 lock.unlock();
3740 if (skip_call) {
3741 return VK_ERROR_VALIDATION_FAILED_EXT;
3742 }
3743 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
3744 return result;
3745}
3746#endif // VK_USE_PLATFORM_WIN32_KHR
3747
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003748// VK_AMD_draw_indirect_count Extension
3749VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3750 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3751 uint32_t stride) {
3752 bool skip_call = VK_FALSE;
3753 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003754 skip_call |=
3755 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01771);
3756 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01772);
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003757 lock.unlock();
3758 if (!skip_call) {
3759 get_dispatch_table(ot_device_table_map, commandBuffer)
3760 ->CmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3761 }
3762}
3763
3764VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3765 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3766 uint32_t maxDrawCount, uint32_t stride) {
3767 bool skip_call = VK_FALSE;
3768 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003769 skip_call |=
3770 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01783);
3771 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01784);
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003772 lock.unlock();
3773 if (!skip_call) {
3774 get_dispatch_table(ot_device_table_map, commandBuffer)
3775 ->CmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3776 }
3777}
3778
3779
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003780static inline PFN_vkVoidFunction InterceptCoreDeviceCommand(const char *name) {
3781 if (!name || name[0] != 'v' || name[1] != 'k')
3782 return NULL;
3783
3784 name += 2;
3785 if (!strcmp(name, "GetDeviceProcAddr"))
3786 return (PFN_vkVoidFunction)GetDeviceProcAddr;
3787 if (!strcmp(name, "DestroyDevice"))
3788 return (PFN_vkVoidFunction)DestroyDevice;
3789 if (!strcmp(name, "GetDeviceQueue"))
3790 return (PFN_vkVoidFunction)GetDeviceQueue;
3791 if (!strcmp(name, "QueueSubmit"))
3792 return (PFN_vkVoidFunction)QueueSubmit;
3793 if (!strcmp(name, "QueueWaitIdle"))
3794 return (PFN_vkVoidFunction)QueueWaitIdle;
3795 if (!strcmp(name, "DeviceWaitIdle"))
3796 return (PFN_vkVoidFunction)DeviceWaitIdle;
3797 if (!strcmp(name, "AllocateMemory"))
3798 return (PFN_vkVoidFunction)AllocateMemory;
3799 if (!strcmp(name, "FreeMemory"))
3800 return (PFN_vkVoidFunction)FreeMemory;
3801 if (!strcmp(name, "MapMemory"))
3802 return (PFN_vkVoidFunction)MapMemory;
3803 if (!strcmp(name, "UnmapMemory"))
3804 return (PFN_vkVoidFunction)UnmapMemory;
3805 if (!strcmp(name, "FlushMappedMemoryRanges"))
3806 return (PFN_vkVoidFunction)FlushMappedMemoryRanges;
3807 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
3808 return (PFN_vkVoidFunction)InvalidateMappedMemoryRanges;
3809 if (!strcmp(name, "GetDeviceMemoryCommitment"))
3810 return (PFN_vkVoidFunction)GetDeviceMemoryCommitment;
3811 if (!strcmp(name, "BindBufferMemory"))
3812 return (PFN_vkVoidFunction)BindBufferMemory;
3813 if (!strcmp(name, "BindImageMemory"))
3814 return (PFN_vkVoidFunction)BindImageMemory;
3815 if (!strcmp(name, "GetBufferMemoryRequirements"))
3816 return (PFN_vkVoidFunction)GetBufferMemoryRequirements;
3817 if (!strcmp(name, "GetImageMemoryRequirements"))
3818 return (PFN_vkVoidFunction)GetImageMemoryRequirements;
3819 if (!strcmp(name, "GetImageSparseMemoryRequirements"))
3820 return (PFN_vkVoidFunction)GetImageSparseMemoryRequirements;
3821 if (!strcmp(name, "QueueBindSparse"))
3822 return (PFN_vkVoidFunction)QueueBindSparse;
3823 if (!strcmp(name, "CreateFence"))
3824 return (PFN_vkVoidFunction)CreateFence;
3825 if (!strcmp(name, "DestroyFence"))
3826 return (PFN_vkVoidFunction)DestroyFence;
3827 if (!strcmp(name, "ResetFences"))
3828 return (PFN_vkVoidFunction)ResetFences;
3829 if (!strcmp(name, "GetFenceStatus"))
3830 return (PFN_vkVoidFunction)GetFenceStatus;
3831 if (!strcmp(name, "WaitForFences"))
3832 return (PFN_vkVoidFunction)WaitForFences;
3833 if (!strcmp(name, "CreateSemaphore"))
3834 return (PFN_vkVoidFunction)CreateSemaphore;
3835 if (!strcmp(name, "DestroySemaphore"))
3836 return (PFN_vkVoidFunction)DestroySemaphore;
3837 if (!strcmp(name, "CreateEvent"))
3838 return (PFN_vkVoidFunction)CreateEvent;
3839 if (!strcmp(name, "DestroyEvent"))
3840 return (PFN_vkVoidFunction)DestroyEvent;
3841 if (!strcmp(name, "GetEventStatus"))
3842 return (PFN_vkVoidFunction)GetEventStatus;
3843 if (!strcmp(name, "SetEvent"))
3844 return (PFN_vkVoidFunction)SetEvent;
3845 if (!strcmp(name, "ResetEvent"))
3846 return (PFN_vkVoidFunction)ResetEvent;
3847 if (!strcmp(name, "CreateQueryPool"))
3848 return (PFN_vkVoidFunction)CreateQueryPool;
3849 if (!strcmp(name, "DestroyQueryPool"))
3850 return (PFN_vkVoidFunction)DestroyQueryPool;
3851 if (!strcmp(name, "GetQueryPoolResults"))
3852 return (PFN_vkVoidFunction)GetQueryPoolResults;
3853 if (!strcmp(name, "CreateBuffer"))
3854 return (PFN_vkVoidFunction)CreateBuffer;
3855 if (!strcmp(name, "DestroyBuffer"))
3856 return (PFN_vkVoidFunction)DestroyBuffer;
3857 if (!strcmp(name, "CreateBufferView"))
3858 return (PFN_vkVoidFunction)CreateBufferView;
3859 if (!strcmp(name, "DestroyBufferView"))
3860 return (PFN_vkVoidFunction)DestroyBufferView;
3861 if (!strcmp(name, "CreateImage"))
3862 return (PFN_vkVoidFunction)CreateImage;
3863 if (!strcmp(name, "DestroyImage"))
3864 return (PFN_vkVoidFunction)DestroyImage;
3865 if (!strcmp(name, "GetImageSubresourceLayout"))
3866 return (PFN_vkVoidFunction)GetImageSubresourceLayout;
3867 if (!strcmp(name, "CreateImageView"))
3868 return (PFN_vkVoidFunction)CreateImageView;
3869 if (!strcmp(name, "DestroyImageView"))
3870 return (PFN_vkVoidFunction)DestroyImageView;
3871 if (!strcmp(name, "CreateShaderModule"))
3872 return (PFN_vkVoidFunction)CreateShaderModule;
3873 if (!strcmp(name, "DestroyShaderModule"))
3874 return (PFN_vkVoidFunction)DestroyShaderModule;
3875 if (!strcmp(name, "CreatePipelineCache"))
3876 return (PFN_vkVoidFunction)CreatePipelineCache;
3877 if (!strcmp(name, "DestroyPipelineCache"))
3878 return (PFN_vkVoidFunction)DestroyPipelineCache;
3879 if (!strcmp(name, "GetPipelineCacheData"))
3880 return (PFN_vkVoidFunction)GetPipelineCacheData;
3881 if (!strcmp(name, "MergePipelineCaches"))
3882 return (PFN_vkVoidFunction)MergePipelineCaches;
3883 if (!strcmp(name, "CreateGraphicsPipelines"))
3884 return (PFN_vkVoidFunction)CreateGraphicsPipelines;
3885 if (!strcmp(name, "CreateComputePipelines"))
3886 return (PFN_vkVoidFunction)CreateComputePipelines;
3887 if (!strcmp(name, "DestroyPipeline"))
3888 return (PFN_vkVoidFunction)DestroyPipeline;
3889 if (!strcmp(name, "CreatePipelineLayout"))
3890 return (PFN_vkVoidFunction)CreatePipelineLayout;
3891 if (!strcmp(name, "DestroyPipelineLayout"))
3892 return (PFN_vkVoidFunction)DestroyPipelineLayout;
3893 if (!strcmp(name, "CreateSampler"))
3894 return (PFN_vkVoidFunction)CreateSampler;
3895 if (!strcmp(name, "DestroySampler"))
3896 return (PFN_vkVoidFunction)DestroySampler;
3897 if (!strcmp(name, "CreateDescriptorSetLayout"))
3898 return (PFN_vkVoidFunction)CreateDescriptorSetLayout;
3899 if (!strcmp(name, "DestroyDescriptorSetLayout"))
3900 return (PFN_vkVoidFunction)DestroyDescriptorSetLayout;
3901 if (!strcmp(name, "CreateDescriptorPool"))
3902 return (PFN_vkVoidFunction)CreateDescriptorPool;
3903 if (!strcmp(name, "DestroyDescriptorPool"))
3904 return (PFN_vkVoidFunction)DestroyDescriptorPool;
3905 if (!strcmp(name, "ResetDescriptorPool"))
3906 return (PFN_vkVoidFunction)ResetDescriptorPool;
3907 if (!strcmp(name, "AllocateDescriptorSets"))
3908 return (PFN_vkVoidFunction)AllocateDescriptorSets;
3909 if (!strcmp(name, "FreeDescriptorSets"))
3910 return (PFN_vkVoidFunction)FreeDescriptorSets;
3911 if (!strcmp(name, "UpdateDescriptorSets"))
3912 return (PFN_vkVoidFunction)UpdateDescriptorSets;
3913 if (!strcmp(name, "CreateFramebuffer"))
3914 return (PFN_vkVoidFunction)CreateFramebuffer;
3915 if (!strcmp(name, "DestroyFramebuffer"))
3916 return (PFN_vkVoidFunction)DestroyFramebuffer;
3917 if (!strcmp(name, "CreateRenderPass"))
3918 return (PFN_vkVoidFunction)CreateRenderPass;
3919 if (!strcmp(name, "DestroyRenderPass"))
3920 return (PFN_vkVoidFunction)DestroyRenderPass;
3921 if (!strcmp(name, "GetRenderAreaGranularity"))
3922 return (PFN_vkVoidFunction)GetRenderAreaGranularity;
3923 if (!strcmp(name, "CreateCommandPool"))
3924 return (PFN_vkVoidFunction)CreateCommandPool;
3925 if (!strcmp(name, "DestroyCommandPool"))
3926 return (PFN_vkVoidFunction)DestroyCommandPool;
3927 if (!strcmp(name, "ResetCommandPool"))
3928 return (PFN_vkVoidFunction)ResetCommandPool;
3929 if (!strcmp(name, "AllocateCommandBuffers"))
3930 return (PFN_vkVoidFunction)AllocateCommandBuffers;
3931 if (!strcmp(name, "FreeCommandBuffers"))
3932 return (PFN_vkVoidFunction)FreeCommandBuffers;
3933 if (!strcmp(name, "BeginCommandBuffer"))
3934 return (PFN_vkVoidFunction)BeginCommandBuffer;
3935 if (!strcmp(name, "EndCommandBuffer"))
3936 return (PFN_vkVoidFunction)EndCommandBuffer;
3937 if (!strcmp(name, "ResetCommandBuffer"))
3938 return (PFN_vkVoidFunction)ResetCommandBuffer;
3939 if (!strcmp(name, "CmdBindPipeline"))
3940 return (PFN_vkVoidFunction)CmdBindPipeline;
3941 if (!strcmp(name, "CmdSetViewport"))
3942 return (PFN_vkVoidFunction)CmdSetViewport;
3943 if (!strcmp(name, "CmdSetScissor"))
3944 return (PFN_vkVoidFunction)CmdSetScissor;
3945 if (!strcmp(name, "CmdSetLineWidth"))
3946 return (PFN_vkVoidFunction)CmdSetLineWidth;
3947 if (!strcmp(name, "CmdSetDepthBias"))
3948 return (PFN_vkVoidFunction)CmdSetDepthBias;
3949 if (!strcmp(name, "CmdSetBlendConstants"))
3950 return (PFN_vkVoidFunction)CmdSetBlendConstants;
3951 if (!strcmp(name, "CmdSetDepthBounds"))
3952 return (PFN_vkVoidFunction)CmdSetDepthBounds;
3953 if (!strcmp(name, "CmdSetStencilCompareMask"))
3954 return (PFN_vkVoidFunction)CmdSetStencilCompareMask;
3955 if (!strcmp(name, "CmdSetStencilWriteMask"))
3956 return (PFN_vkVoidFunction)CmdSetStencilWriteMask;
3957 if (!strcmp(name, "CmdSetStencilReference"))
3958 return (PFN_vkVoidFunction)CmdSetStencilReference;
3959 if (!strcmp(name, "CmdBindDescriptorSets"))
3960 return (PFN_vkVoidFunction)CmdBindDescriptorSets;
3961 if (!strcmp(name, "CmdBindIndexBuffer"))
3962 return (PFN_vkVoidFunction)CmdBindIndexBuffer;
3963 if (!strcmp(name, "CmdBindVertexBuffers"))
3964 return (PFN_vkVoidFunction)CmdBindVertexBuffers;
3965 if (!strcmp(name, "CmdDraw"))
3966 return (PFN_vkVoidFunction)CmdDraw;
3967 if (!strcmp(name, "CmdDrawIndexed"))
3968 return (PFN_vkVoidFunction)CmdDrawIndexed;
3969 if (!strcmp(name, "CmdDrawIndirect"))
3970 return (PFN_vkVoidFunction)CmdDrawIndirect;
3971 if (!strcmp(name, "CmdDrawIndexedIndirect"))
3972 return (PFN_vkVoidFunction)CmdDrawIndexedIndirect;
3973 if (!strcmp(name, "CmdDispatch"))
3974 return (PFN_vkVoidFunction)CmdDispatch;
3975 if (!strcmp(name, "CmdDispatchIndirect"))
3976 return (PFN_vkVoidFunction)CmdDispatchIndirect;
3977 if (!strcmp(name, "CmdCopyBuffer"))
3978 return (PFN_vkVoidFunction)CmdCopyBuffer;
3979 if (!strcmp(name, "CmdCopyImage"))
3980 return (PFN_vkVoidFunction)CmdCopyImage;
3981 if (!strcmp(name, "CmdBlitImage"))
3982 return (PFN_vkVoidFunction)CmdBlitImage;
3983 if (!strcmp(name, "CmdCopyBufferToImage"))
3984 return (PFN_vkVoidFunction)CmdCopyBufferToImage;
3985 if (!strcmp(name, "CmdCopyImageToBuffer"))
3986 return (PFN_vkVoidFunction)CmdCopyImageToBuffer;
3987 if (!strcmp(name, "CmdUpdateBuffer"))
3988 return (PFN_vkVoidFunction)CmdUpdateBuffer;
3989 if (!strcmp(name, "CmdFillBuffer"))
3990 return (PFN_vkVoidFunction)CmdFillBuffer;
3991 if (!strcmp(name, "CmdClearColorImage"))
3992 return (PFN_vkVoidFunction)CmdClearColorImage;
3993 if (!strcmp(name, "CmdClearDepthStencilImage"))
3994 return (PFN_vkVoidFunction)CmdClearDepthStencilImage;
3995 if (!strcmp(name, "CmdClearAttachments"))
3996 return (PFN_vkVoidFunction)CmdClearAttachments;
3997 if (!strcmp(name, "CmdResolveImage"))
3998 return (PFN_vkVoidFunction)CmdResolveImage;
3999 if (!strcmp(name, "CmdSetEvent"))
4000 return (PFN_vkVoidFunction)CmdSetEvent;
4001 if (!strcmp(name, "CmdResetEvent"))
4002 return (PFN_vkVoidFunction)CmdResetEvent;
4003 if (!strcmp(name, "CmdWaitEvents"))
4004 return (PFN_vkVoidFunction)CmdWaitEvents;
4005 if (!strcmp(name, "CmdPipelineBarrier"))
4006 return (PFN_vkVoidFunction)CmdPipelineBarrier;
4007 if (!strcmp(name, "CmdBeginQuery"))
4008 return (PFN_vkVoidFunction)CmdBeginQuery;
4009 if (!strcmp(name, "CmdEndQuery"))
4010 return (PFN_vkVoidFunction)CmdEndQuery;
4011 if (!strcmp(name, "CmdResetQueryPool"))
4012 return (PFN_vkVoidFunction)CmdResetQueryPool;
4013 if (!strcmp(name, "CmdWriteTimestamp"))
4014 return (PFN_vkVoidFunction)CmdWriteTimestamp;
4015 if (!strcmp(name, "CmdCopyQueryPoolResults"))
4016 return (PFN_vkVoidFunction)CmdCopyQueryPoolResults;
4017 if (!strcmp(name, "CmdPushConstants"))
4018 return (PFN_vkVoidFunction)CmdPushConstants;
4019 if (!strcmp(name, "CmdBeginRenderPass"))
4020 return (PFN_vkVoidFunction)CmdBeginRenderPass;
4021 if (!strcmp(name, "CmdNextSubpass"))
4022 return (PFN_vkVoidFunction)CmdNextSubpass;
4023 if (!strcmp(name, "CmdEndRenderPass"))
4024 return (PFN_vkVoidFunction)CmdEndRenderPass;
4025 if (!strcmp(name, "CmdExecuteCommands"))
4026 return (PFN_vkVoidFunction)CmdExecuteCommands;
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06004027 if (!strcmp(name, "DebugMarkerSetObjectTagEXT"))
4028 return (PFN_vkVoidFunction)DebugMarkerSetObjectTagEXT;
4029 if (!strcmp(name, "DebugMarkerSetObjectNameEXT"))
4030 return (PFN_vkVoidFunction)DebugMarkerSetObjectNameEXT;
4031 if (!strcmp(name, "CmdDebugMarkerBeginEXT"))
4032 return (PFN_vkVoidFunction)CmdDebugMarkerBeginEXT;
4033 if (!strcmp(name, "CmdDebugMarkerEndEXT"))
4034 return (PFN_vkVoidFunction)CmdDebugMarkerEndEXT;
4035 if (!strcmp(name, "CmdDebugMarkerInsertEXT"))
4036 return (PFN_vkVoidFunction)CmdDebugMarkerInsertEXT;
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06004037#ifdef VK_USE_PLATFORM_WIN32_KHR
4038 if (!strcmp(name, "GetMemoryWin32HandleNV"))
4039 return (PFN_vkVoidFunction)GetMemoryWin32HandleNV;
4040#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06004041 if (!strcmp(name, "CmdDrawIndirectCountAMD"))
4042 return (PFN_vkVoidFunction)CmdDrawIndirectCountAMD;
4043 if (!strcmp(name, "CmdDrawIndexedIndirectCountAMD"))
4044 return (PFN_vkVoidFunction)CmdDrawIndexedIndirectCountAMD;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004045
4046 return NULL;
4047}
4048static inline PFN_vkVoidFunction InterceptCoreInstanceCommand(const char *name) {
4049 if (!name || name[0] != 'v' || name[1] != 'k')
4050 return NULL;
4051
4052 name += 2;
4053 if (!strcmp(name, "CreateInstance"))
4054 return (PFN_vkVoidFunction)CreateInstance;
4055 if (!strcmp(name, "DestroyInstance"))
4056 return (PFN_vkVoidFunction)DestroyInstance;
4057 if (!strcmp(name, "EnumeratePhysicalDevices"))
4058 return (PFN_vkVoidFunction)EnumeratePhysicalDevices;
4059 if (!strcmp(name, "GetPhysicalDeviceFeatures"))
4060 return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures;
4061 if (!strcmp(name, "GetPhysicalDeviceFormatProperties"))
4062 return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties;
4063 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties"))
4064 return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties;
4065 if (!strcmp(name, "GetPhysicalDeviceProperties"))
4066 return (PFN_vkVoidFunction)GetPhysicalDeviceProperties;
4067 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties"))
4068 return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties;
4069 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties"))
4070 return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties;
4071 if (!strcmp(name, "GetInstanceProcAddr"))
4072 return (PFN_vkVoidFunction)GetInstanceProcAddr;
4073 if (!strcmp(name, "CreateDevice"))
4074 return (PFN_vkVoidFunction)CreateDevice;
4075 if (!strcmp(name, "EnumerateInstanceExtensionProperties"))
4076 return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
4077 if (!strcmp(name, "EnumerateInstanceLayerProperties"))
4078 return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties;
4079 if (!strcmp(name, "EnumerateDeviceLayerProperties"))
4080 return (PFN_vkVoidFunction)EnumerateDeviceLayerProperties;
4081 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties"))
4082 return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties;
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06004083 if (!strcmp(name, "GetPhysicalDeviceExternalImageFormatPropertiesNV"))
4084 return (PFN_vkVoidFunction)GetPhysicalDeviceExternalImageFormatPropertiesNV;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004085
4086 return NULL;
4087}
4088
4089static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
4090 if (device) {
4091 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06004092
4093 if (device_data->wsi_enabled) {
4094 if (!strcmp("vkCreateSwapchainKHR", name))
4095 return reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR);
4096 if (!strcmp("vkDestroySwapchainKHR", name))
4097 return reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR);
4098 if (!strcmp("vkGetSwapchainImagesKHR", name))
4099 return reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR);
4100 if (!strcmp("vkAcquireNextImageKHR", name))
4101 return reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR);
4102 if (!strcmp("vkQueuePresentKHR", name))
4103 return reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR);
4104 }
4105
4106 if (device_data->wsi_display_swapchain_enabled) {
4107 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
4108 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
4109 }
4110 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004111 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004112
4113 return nullptr;
4114}
4115
4116VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
4117 PFN_vkVoidFunction addr;
4118 addr = InterceptCoreDeviceCommand(funcName);
4119 if (addr) {
4120 return addr;
4121 }
4122 assert(device);
4123
4124 addr = InterceptWsiEnabledCommand(funcName, device);
4125 if (addr) {
4126 return addr;
4127 }
4128 if (get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr == NULL) {
4129 return NULL;
4130 }
4131 return get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr(device, funcName);
4132}
4133
4134VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
4135 PFN_vkVoidFunction addr;
4136 addr = InterceptCoreInstanceCommand(funcName);
4137 if (!addr) {
4138 addr = InterceptCoreDeviceCommand(funcName);
4139 }
4140 if (!addr) {
4141 addr = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
4142 }
4143 if (addr) {
4144 return addr;
4145 }
4146 assert(instance);
4147
4148 addr = InterceptMsgCallbackGetProcAddrCommand(funcName, instance);
4149 if (addr) {
4150 return addr;
4151 }
4152 addr = InterceptWsiEnabledCommand(funcName, instance);
4153 if (addr) {
4154 return addr;
4155 }
4156 if (get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr == NULL) {
4157 return NULL;
4158 }
4159 return get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
4160}
4161
4162} // namespace object_tracker
4163
4164// vk_layer_logging.h expects these to be defined
4165VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
4166 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4167 const VkAllocationCallbacks *pAllocator,
4168 VkDebugReportCallbackEXT *pMsgCallback) {
4169 return object_tracker::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
4170}
4171
4172VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
4173 const VkAllocationCallbacks *pAllocator) {
4174 object_tracker::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
4175}
4176
4177VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
4178 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
4179 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
4180 object_tracker::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
4181}
4182
4183// Loader-layer interface v0, just wrappers since there is only a layer
4184VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4185 VkExtensionProperties *pProperties) {
4186 return object_tracker::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
4187}
4188
4189VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
4190 VkLayerProperties *pProperties) {
4191 return object_tracker::EnumerateInstanceLayerProperties(pCount, pProperties);
4192}
4193
4194VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4195 VkLayerProperties *pProperties) {
4196 // The layer command handles VK_NULL_HANDLE just fine internally
4197 assert(physicalDevice == VK_NULL_HANDLE);
4198 return object_tracker::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
4199}
4200
4201VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
4202 return object_tracker::GetDeviceProcAddr(dev, funcName);
4203}
4204
4205VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
4206 return object_tracker::GetInstanceProcAddr(instance, funcName);
4207}
4208
4209VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4210 const char *pLayerName, uint32_t *pCount,
4211 VkExtensionProperties *pProperties) {
4212 // The layer command handles VK_NULL_HANDLE just fine internally
4213 assert(physicalDevice == VK_NULL_HANDLE);
4214 return object_tracker::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Mark Lobodzinski38080682016-07-22 15:30:27 -06004215}