blob: 8a47dd2c95fbaf742527faebfebf099481e4ffa1 [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,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700110 reinterpret_cast<uint64_t>(queue), __LINE__, VALIDATION_ERROR_01651, LayerName,
111 "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_SPARSE_BINDING_BIT not set. %s",
112 function, validation_error_map[VALIDATION_ERROR_01651]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600113 }
114 }
115 }
116}
117
118static void AllocateCommandBuffer(VkDevice device, const VkCommandPool command_pool, const VkCommandBuffer command_buffer,
119 VkDebugReportObjectTypeEXT object_type, VkCommandBufferLevel level) {
120 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
121
122 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<const uint64_t>(command_buffer),
123 __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
124 string_VkDebugReportObjectTypeEXT(object_type), reinterpret_cast<const uint64_t>(command_buffer));
125
126 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
127 pNewObjNode->object_type = object_type;
128 pNewObjNode->handle = reinterpret_cast<const uint64_t>(command_buffer);
129 pNewObjNode->parent_object = reinterpret_cast<const uint64_t &>(command_pool);
130 if (level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) {
131 pNewObjNode->status = OBJSTATUS_COMMAND_BUFFER_SECONDARY;
132 } else {
133 pNewObjNode->status = OBJSTATUS_NONE;
134 }
135 device_data->object_map[object_type][reinterpret_cast<const uint64_t>(command_buffer)] = pNewObjNode;
136 device_data->num_objects[object_type]++;
137 device_data->num_total_objects++;
138}
139
140static bool ValidateCommandBuffer(VkDevice device, VkCommandPool command_pool, VkCommandBuffer command_buffer) {
141 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
142 bool skip_call = false;
143 uint64_t object_handle = reinterpret_cast<uint64_t>(command_buffer);
144 if (device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].find(object_handle) !=
145 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
146 OBJTRACK_NODE *pNode =
147 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<uint64_t>(command_buffer)];
148
149 if (pNode->parent_object != reinterpret_cast<uint64_t &>(command_pool)) {
150 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700151 __LINE__, VALIDATION_ERROR_00102, LayerName,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600152 "FreeCommandBuffers is attempting to free Command Buffer 0x%" PRIxLEAST64
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700153 " belonging to Command Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 "). %s",
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600154 reinterpret_cast<uint64_t>(command_buffer), pNode->parent_object,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700155 reinterpret_cast<uint64_t &>(command_pool), validation_error_map[VALIDATION_ERROR_00102]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600156 }
157 } else {
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700158 skip_call |=
159 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
160 object_handle, __LINE__, VALIDATION_ERROR_00097, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s",
161 object_name[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT], object_handle,
162 validation_error_map[VALIDATION_ERROR_00097]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600163 }
164 return skip_call;
165}
166
167static void AllocateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set,
168 VkDebugReportObjectTypeEXT object_type) {
169 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
170
171 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type,
172 reinterpret_cast<uint64_t &>(descriptor_set), __LINE__, OBJTRACK_NONE, LayerName,
173 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, object_name[object_type],
174 reinterpret_cast<uint64_t &>(descriptor_set));
175
176 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
177 pNewObjNode->object_type = object_type;
178 pNewObjNode->status = OBJSTATUS_NONE;
179 pNewObjNode->handle = reinterpret_cast<uint64_t &>(descriptor_set);
180 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(descriptor_pool);
181 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT][reinterpret_cast<uint64_t &>(descriptor_set)] =
182 pNewObjNode;
183 device_data->num_objects[object_type]++;
184 device_data->num_total_objects++;
185}
186
187static bool ValidateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set) {
188 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
189 bool skip_call = false;
190 uint64_t object_handle = reinterpret_cast<uint64_t &>(descriptor_set);
191 auto dsItem = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].find(object_handle);
192 if (dsItem != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
193 OBJTRACK_NODE *pNode = dsItem->second;
194
195 if (pNode->parent_object != reinterpret_cast<uint64_t &>(descriptor_pool)) {
196 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700197 __LINE__, VALIDATION_ERROR_00927, LayerName,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600198 "FreeDescriptorSets is attempting to free descriptorSet 0x%" PRIxLEAST64
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700199 " belonging to Descriptor Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 "). %s",
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600200 reinterpret_cast<uint64_t &>(descriptor_set), pNode->parent_object,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700201 reinterpret_cast<uint64_t &>(descriptor_pool), validation_error_map[VALIDATION_ERROR_00927]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600202 }
203 } else {
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700204 skip_call |=
205 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
206 object_handle, __LINE__, VALIDATION_ERROR_00920, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s",
207 object_name[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT], object_handle,
208 validation_error_map[VALIDATION_ERROR_00920]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600209 }
210 return skip_call;
211}
212
213static void CreateQueue(VkDevice device, VkQueue vkObj, VkDebugReportObjectTypeEXT object_type) {
214 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
215
216 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<uint64_t>(vkObj), __LINE__,
217 OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
218 object_name[object_type], reinterpret_cast<uint64_t>(vkObj));
219
220 OBJTRACK_NODE *p_obj_node = NULL;
221 auto queue_item = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].find(reinterpret_cast<uint64_t>(vkObj));
222 if (queue_item == device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
223 p_obj_node = new OBJTRACK_NODE;
224 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT][reinterpret_cast<uint64_t>(vkObj)] = p_obj_node;
225 device_data->num_objects[object_type]++;
226 device_data->num_total_objects++;
227 } else {
228 p_obj_node = queue_item->second;
229 }
230 p_obj_node->object_type = object_type;
231 p_obj_node->status = OBJSTATUS_NONE;
232 p_obj_node->handle = reinterpret_cast<uint64_t>(vkObj);
233}
234
235static void CreateSwapchainImageObject(VkDevice dispatchable_object, VkImage swapchain_image, VkSwapchainKHR swapchain) {
236 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
237 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
238 reinterpret_cast<uint64_t &>(swapchain_image), __LINE__, OBJTRACK_NONE, LayerName,
239 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, "SwapchainImage",
240 reinterpret_cast<uint64_t &>(swapchain_image));
241
242 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
243 pNewObjNode->object_type = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT;
244 pNewObjNode->status = OBJSTATUS_NONE;
245 pNewObjNode->handle = reinterpret_cast<uint64_t &>(swapchain_image);
246 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(swapchain);
247 device_data->swapchainImageMap[reinterpret_cast<uint64_t &>(swapchain_image)] = pNewObjNode;
248}
249
Chris Forbes64a31a12016-10-04 14:54:13 +1300250template<typename T>
251uint64_t handle_value(T handle) {
252 return reinterpret_cast<uint64_t &>(handle);
253}
254template<typename T>
255uint64_t handle_value(T *handle) {
256 return reinterpret_cast<uint64_t>(handle);
257}
258
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600259template <typename T1, typename T2>
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600260static void CreateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600261 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes04257ad2016-10-04 10:08:31 +1300262
Chris Forbes64a31a12016-10-04 14:54:13 +1300263 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600264 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600265
Mike Schuchardt21d998c2016-12-13 14:04:57 -0700266 if (!instance_data->object_map[object_type].count(object_handle)) {
267 log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, object_handle, __LINE__,
268 OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
269 object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600270
Mike Schuchardt21d998c2016-12-13 14:04:57 -0700271 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
272 pNewObjNode->object_type = object_type;
273 pNewObjNode->status = custom_allocator ? OBJSTATUS_CUSTOM_ALLOCATOR : OBJSTATUS_NONE;
274 pNewObjNode->handle = object_handle;
275
276 instance_data->object_map[object_type][object_handle] = pNewObjNode;
277 instance_data->num_objects[object_type]++;
278 instance_data->num_total_objects++;
279 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600280}
281
282template <typename T1, typename T2>
Mike Schuchardt3796a882016-12-06 18:03:56 -0700283static void DestroyObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type,
284 const VkAllocationCallbacks *pAllocator, enum UNIQUE_VALIDATION_ERROR_CODE expected_custom_allocator_code,
285 enum UNIQUE_VALIDATION_ERROR_CODE expected_default_allocator_code) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600286 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
287
Chris Forbes64a31a12016-10-04 14:54:13 +1300288 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600289 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600290
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700291 if (object_handle != VK_NULL_HANDLE) {
292 auto item = device_data->object_map[object_type].find(object_handle);
293 if (item != device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600294
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700295 OBJTRACK_NODE *pNode = item->second;
296 assert(device_data->num_total_objects > 0);
297 device_data->num_total_objects--;
298 assert(device_data->num_objects[pNode->object_type] > 0);
299 device_data->num_objects[pNode->object_type]--;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600300
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700301 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, pNode->object_type, object_handle, __LINE__,
302 OBJTRACK_NONE, LayerName,
303 "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " %s objs).",
304 object_name[pNode->object_type], reinterpret_cast<uint64_t &>(object), device_data->num_total_objects,
305 device_data->num_objects[pNode->object_type], object_name[pNode->object_type]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600306
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700307 auto allocated_with_custom = (pNode->status & OBJSTATUS_CUSTOM_ALLOCATOR) ? true : false;
Mike Schuchardt3796a882016-12-06 18:03:56 -0700308 if (allocated_with_custom && !custom_allocator && expected_custom_allocator_code != VALIDATION_ERROR_UNDEFINED) {
309 // This check only verifies that custom allocation callabacks were provided to both Create and Destroy calls,
310 // it cannot verify that these allocation callbacks are compatible with each other.
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700311 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
Mike Schuchardt3796a882016-12-06 18:03:56 -0700312 expected_custom_allocator_code, LayerName,
313 "Custom allocator not specified while destroying %s obj 0x%" PRIxLEAST64 " but specified at creation. %s",
314 object_name[object_type], object_handle, validation_error_map[expected_custom_allocator_code]);
315 } else if (!allocated_with_custom && custom_allocator &&
316 expected_default_allocator_code != VALIDATION_ERROR_UNDEFINED) {
317 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
318 expected_default_allocator_code, LayerName,
319 "Custom allocator specified while destroying %s obj 0x%" PRIxLEAST64 " but not specified at creation. %s",
320 object_name[object_type], object_handle, validation_error_map[expected_default_allocator_code]);
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700321 }
322
323 delete pNode;
324 device_data->object_map[object_type].erase(item);
325 } else {
326 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle, __LINE__,
327 OBJTRACK_UNKNOWN_OBJECT, LayerName,
328 "Unable to remove %s obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",
329 object_name[object_type], object_handle);
Chris Forbes3e51a202016-09-29 14:35:09 +1300330 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600331 }
332}
333
334template <typename T1, typename T2>
Karl Schultza9ef1e52016-10-06 17:53:48 -0600335static bool ValidateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool null_allowed,
Mike Schuchardt3796a882016-12-06 18:03:56 -0700336 enum UNIQUE_VALIDATION_ERROR_CODE error_code) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600337 if (null_allowed && (object == VK_NULL_HANDLE)) {
338 return false;
339 }
Chris Forbes64a31a12016-10-04 14:54:13 +1300340 auto object_handle = handle_value(object);
341
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600342 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +1300343 if (device_data->object_map[object_type].find(object_handle) == device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600344 // If object is an image, also look for it in the swapchain image map
345 if ((object_type != VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT) ||
Chris Forbes2f271a72016-09-29 14:58:08 +1300346 (device_data->swapchainImageMap.find(object_handle) == device_data->swapchainImageMap.end())) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -0700347 const char *error_msg = (error_code == VALIDATION_ERROR_UNDEFINED) ? "" : validation_error_map[error_code];
Karl Schultza9ef1e52016-10-06 17:53:48 -0600348 return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
349 error_code, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s", object_name[object_type],
350 object_handle, error_msg);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600351 }
352 }
353 return false;
354}
355
Mike Schuchardt3796a882016-12-06 18:03:56 -0700356static void DeviceReportUndestroyedObjects(VkDevice device, VkDebugReportObjectTypeEXT object_type,
357 enum UNIQUE_VALIDATION_ERROR_CODE error_code) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600358 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
359 for (auto item = device_data->object_map[object_type].begin(); item != device_data->object_map[object_type].end();) {
360 OBJTRACK_NODE *object_info = item->second;
361 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_info->object_type, object_info->handle, __LINE__,
Mike Schuchardt3796a882016-12-06 18:03:56 -0700362 error_code, LayerName,
363 "OBJ ERROR : For device 0x%" PRIxLEAST64 ", %s object 0x%" PRIxLEAST64 " has not been destroyed. %s",
364 reinterpret_cast<uint64_t>(device), object_name[object_type], object_info->handle,
365 validation_error_map[error_code]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600366 item = device_data->object_map[object_type].erase(item);
367 }
368}
369
370VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
371 std::unique_lock<std::mutex> lock(global_lock);
372
373 dispatch_key key = get_dispatch_key(instance);
374 layer_data *instance_data = get_my_data_ptr(key, layer_data_map);
375
376 // Enable the temporary callback(s) here to catch cleanup issues:
377 bool callback_setup = false;
378 if (instance_data->num_tmp_callbacks > 0) {
379 if (!layer_enable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks,
380 instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks)) {
381 callback_setup = true;
382 }
383 }
384
Jeremy Hayes058b41c2016-11-03 10:49:44 -0600385 // TODO: The instance handle can not be validated here. The loader will likely have to validate it.
Karl Schultzcf2e0452016-10-12 13:28:49 -0600386 ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, true, VALIDATION_ERROR_00021);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600387
Mike Schuchardt3796a882016-12-06 18:03:56 -0700388 DestroyObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator, VALIDATION_ERROR_00019,
389 VALIDATION_ERROR_00020);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600390 // Report any remaining objects in LL
391
392 for (auto iit = instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].begin();
393 iit != instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].end();) {
394 OBJTRACK_NODE *pNode = iit->second;
395
396 VkDevice device = reinterpret_cast<VkDevice>(pNode->handle);
397
398 log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, pNode->handle, __LINE__,
399 OBJTRACK_OBJECT_LEAK, LayerName, "OBJ ERROR : %s object 0x%" PRIxLEAST64 " has not been destroyed.",
400 string_VkDebugReportObjectTypeEXT(pNode->object_type), pNode->handle);
401 // Semaphore:
Mike Schuchardt3796a882016-12-06 18:03:56 -0700402 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, VALIDATION_ERROR_00018);
403 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, VALIDATION_ERROR_00018);
404 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, VALIDATION_ERROR_00018);
405 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, VALIDATION_ERROR_00018);
406 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, VALIDATION_ERROR_00018);
407 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, VALIDATION_ERROR_00018);
408 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, VALIDATION_ERROR_00018);
409 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, VALIDATION_ERROR_00018);
410 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, VALIDATION_ERROR_00018);
411 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, VALIDATION_ERROR_00018);
412 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, VALIDATION_ERROR_00018);
413 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, VALIDATION_ERROR_00018);
414 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, VALIDATION_ERROR_00018);
415 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, VALIDATION_ERROR_00018);
416 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, VALIDATION_ERROR_00018);
417 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, VALIDATION_ERROR_00018);
418 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, VALIDATION_ERROR_00018);
419 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, VALIDATION_ERROR_00018);
420 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, VALIDATION_ERROR_00018);
421 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, VALIDATION_ERROR_00018);
422 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, VALIDATION_ERROR_00018);
423 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, VALIDATION_ERROR_00018);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600424 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
425 }
426 instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].clear();
427
428 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
429 pInstanceTable->DestroyInstance(instance, pAllocator);
430
431 // Disable and cleanup the temporary callback(s):
432 if (callback_setup) {
433 layer_disable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks, instance_data->tmp_callbacks);
434 }
435 if (instance_data->num_tmp_callbacks > 0) {
436 layer_free_tmp_callbacks(instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks);
437 instance_data->num_tmp_callbacks = 0;
438 }
439
440 // Clean up logging callback, if any
441 while (instance_data->logging_callback.size() > 0) {
442 VkDebugReportCallbackEXT callback = instance_data->logging_callback.back();
443 layer_destroy_msg_callback(instance_data->report_data, callback, pAllocator);
444 instance_data->logging_callback.pop_back();
445 }
446
447 layer_debug_report_destroy_instance(instance_data->report_data);
448 layer_data_map.erase(key);
449
450 instanceExtMap.erase(pInstanceTable);
451 lock.unlock();
452 ot_instance_table_map.erase(key);
453}
454
455VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
456
457 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600458 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, true, VALIDATION_ERROR_00052);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700459 DestroyObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator, VALIDATION_ERROR_00050,
460 VALIDATION_ERROR_00051);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600461
462 // Report any remaining objects associated with this VkDevice object in LL
Mike Schuchardt3796a882016-12-06 18:03:56 -0700463 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, VALIDATION_ERROR_00049);
464 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, VALIDATION_ERROR_00049);
465 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, VALIDATION_ERROR_00049);
466 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, VALIDATION_ERROR_00049);
467 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, VALIDATION_ERROR_00049);
468 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, VALIDATION_ERROR_00049);
469 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, VALIDATION_ERROR_00049);
470 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, VALIDATION_ERROR_00049);
471 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, VALIDATION_ERROR_00049);
472 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, VALIDATION_ERROR_00049);
473 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, VALIDATION_ERROR_00049);
474 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, VALIDATION_ERROR_00049);
475 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, VALIDATION_ERROR_00049);
476 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, VALIDATION_ERROR_00049);
477 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, VALIDATION_ERROR_00049);
478 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, VALIDATION_ERROR_00049);
479 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, VALIDATION_ERROR_00049);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600480 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700481 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, VALIDATION_ERROR_00049);
482 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, VALIDATION_ERROR_00049);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600483 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700484 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, VALIDATION_ERROR_00049);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600485 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
486
487 // Clean up Queue's MemRef Linked Lists
488 DestroyQueueDataStructures(device);
489
490 lock.unlock();
491
492 dispatch_key key = get_dispatch_key(device);
493 VkLayerDispatchTable *pDisp = get_dispatch_table(ot_device_table_map, device);
494 pDisp->DestroyDevice(device, pAllocator);
495 ot_device_table_map.erase(key);
496}
497
498VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
499 bool skip_call = false;
500 {
501 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600502 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
503 VALIDATION_ERROR_01679);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600504 }
505 if (skip_call) {
506 return;
507 }
508 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
509}
510
511VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
512 VkFormatProperties *pFormatProperties) {
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_01683);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600518 }
519 if (skip_call) {
520 return;
521 }
522 get_dispatch_table(ot_instance_table_map, physicalDevice)
523 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
524}
525
526VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
527 VkImageType type, VkImageTiling tiling,
528 VkImageUsageFlags usage, VkImageCreateFlags flags,
529 VkImageFormatProperties *pImageFormatProperties) {
530 bool skip_call = false;
531 {
532 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600533 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
534 VALIDATION_ERROR_01686);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600535 }
536 if (skip_call) {
537 return VK_ERROR_VALIDATION_FAILED_EXT;
538 }
539 VkResult result =
540 get_dispatch_table(ot_instance_table_map, physicalDevice)
541 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
542 return result;
543}
544
545VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
546 bool skip_call = false;
547 {
548 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600549 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
550 VALIDATION_ERROR_00026);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600551 }
552 if (skip_call) {
553 return;
554 }
555 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
556}
557
558VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
559 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
560 bool skip_call = false;
561 {
562 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600563 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
564 VALIDATION_ERROR_00609);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600565 }
566 if (skip_call) {
567 return;
568 }
569 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
570}
571
572VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *pName);
573
574VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *pName);
575
576VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount,
577 VkExtensionProperties *pProperties);
578
579VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pPropertyCount, VkLayerProperties *pProperties);
580
581VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
582 VkLayerProperties *pProperties);
583
584VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
585 bool skip_call = false;
586 {
587 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600588 skip_call |= ValidateObject(queue, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_00130);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600589 if (pSubmits) {
590 for (uint32_t idx0 = 0; idx0 < submitCount; ++idx0) {
591 if (pSubmits[idx0].pCommandBuffers) {
592 for (uint32_t idx1 = 0; idx1 < pSubmits[idx0].commandBufferCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300593 skip_call |= ValidateObject(queue, pSubmits[idx0].pCommandBuffers[idx1],
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600594 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_00149);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600595 }
596 }
597 if (pSubmits[idx0].pSignalSemaphores) {
598 for (uint32_t idx2 = 0; idx2 < pSubmits[idx0].signalSemaphoreCount; ++idx2) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300599 skip_call |= ValidateObject(queue, pSubmits[idx0].pSignalSemaphores[idx2],
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600600 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false, VALIDATION_ERROR_00150);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600601 }
602 }
603 if (pSubmits[idx0].pWaitSemaphores) {
604 for (uint32_t idx3 = 0; idx3 < pSubmits[idx0].waitSemaphoreCount; ++idx3) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300605 skip_call |= ValidateObject(queue, pSubmits[idx0].pWaitSemaphores[idx3],
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600606 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false, VALIDATION_ERROR_00146);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600607 }
608 }
609 }
610 }
611 if (queue) {
Karl Schultzcf2e0452016-10-12 13:28:49 -0600612 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_00128);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600613 }
614 }
615 if (skip_call) {
616 return VK_ERROR_VALIDATION_FAILED_EXT;
617 }
618 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
619 return result;
620}
621
622VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
623 bool skip_call = false;
624 {
625 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600626 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_00317);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600627 }
628 if (skip_call) {
629 return VK_ERROR_VALIDATION_FAILED_EXT;
630 }
631 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueWaitIdle(queue);
632 return result;
633}
634
635VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
636 bool skip_call = false;
637 {
638 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600639 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00318);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600640 }
641 if (skip_call) {
642 return VK_ERROR_VALIDATION_FAILED_EXT;
643 }
644 VkResult result = get_dispatch_table(ot_device_table_map, device)->DeviceWaitIdle(device);
645 return result;
646}
647
648VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
649 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
650 bool skip_call = false;
651 {
652 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600653 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00612);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600654 }
655 if (skip_call) {
656 return VK_ERROR_VALIDATION_FAILED_EXT;
657 }
658 VkResult result = get_dispatch_table(ot_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
659 {
660 std::lock_guard<std::mutex> lock(global_lock);
661 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300662 CreateObject(device, *pMemory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600663 }
664 }
665 return result;
666}
667
668VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
669 const VkMappedMemoryRange *pMemoryRanges) {
670 bool skip_call = false;
671 {
672 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600673 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00635);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600674 if (pMemoryRanges) {
675 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
676 if (pMemoryRanges[idx0].memory) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600677 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,
678 false, VALIDATION_ERROR_00648);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600679 }
680 }
681 }
682 }
683 if (skip_call) {
684 return VK_ERROR_VALIDATION_FAILED_EXT;
685 }
686 VkResult result =
687 get_dispatch_table(ot_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
688 return result;
689}
690
691VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
692 const VkMappedMemoryRange *pMemoryRanges) {
693 bool skip_call = false;
694 {
695 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600696 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00638);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600697 if (pMemoryRanges) {
698 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
699 if (pMemoryRanges[idx0].memory) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600700 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,
701 false, VALIDATION_ERROR_00648);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600702 }
703 }
704 }
705 }
706 if (skip_call) {
707 return VK_ERROR_VALIDATION_FAILED_EXT;
708 }
709 VkResult result =
710 get_dispatch_table(ot_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
711 return result;
712}
713
714VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
715 VkDeviceSize *pCommittedMemoryInBytes) {
716 bool skip_call = false;
717 {
718 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600719 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00654);
720 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00655);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600721 }
722 if (skip_call) {
723 return;
724 }
725 get_dispatch_table(ot_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
726}
727
728VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
729 VkDeviceSize memoryOffset) {
730 bool skip_call = false;
731 {
732 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600733 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00799);
734 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00798);
735 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00800);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600736 }
737 if (skip_call) {
738 return VK_ERROR_VALIDATION_FAILED_EXT;
739 }
740 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
741 return result;
742}
743
744VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
745 bool skip_call = false;
746 {
747 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600748 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00807);
749 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00808);
750 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00809);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600751 }
752 if (skip_call) {
753 return VK_ERROR_VALIDATION_FAILED_EXT;
754 }
755 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
756 return result;
757}
758
759VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
760 VkMemoryRequirements *pMemoryRequirements) {
761 bool skip_call = false;
762 {
763 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600764 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00784);
765 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00783);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600766 }
767 if (skip_call) {
768 return;
769 }
770 get_dispatch_table(ot_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
771}
772
773VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
774 bool skip_call = false;
775 {
776 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600777 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00787);
778 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00788);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600779 }
780 if (skip_call) {
781 return;
782 }
783 get_dispatch_table(ot_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
784}
785
786VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
787 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
788 bool skip_call = false;
789 {
790 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600791 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01610);
792 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01611);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600793 }
794 if (skip_call) {
795 return;
796 }
797 get_dispatch_table(ot_device_table_map, device)
798 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
799}
800
801VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
802 VkImageType type, VkSampleCountFlagBits samples,
803 VkImageUsageFlags usage, VkImageTiling tiling,
804 uint32_t *pPropertyCount,
805 VkSparseImageFormatProperties *pProperties) {
806 bool skip_call = false;
807 {
808 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600809 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
810 VALIDATION_ERROR_01601);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600811 }
812 if (skip_call) {
813 return;
814 }
815 get_dispatch_table(ot_instance_table_map, physicalDevice)
816 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
817 pProperties);
818}
819
820VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
821 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
822 bool skip_call = false;
823 {
824 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600825 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00166);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600826 }
827 if (skip_call) {
828 return VK_ERROR_VALIDATION_FAILED_EXT;
829 }
830 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
831 {
832 std::lock_guard<std::mutex> lock(global_lock);
833 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300834 CreateObject(device, *pFence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600835 }
836 }
837 return result;
838}
839
840VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
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_00176);
845 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_00177);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600846 }
847 if (skip_call) {
848 return;
849 }
850 {
851 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700852 DestroyObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator, VALIDATION_ERROR_00174,
853 VALIDATION_ERROR_00175);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600854 }
855 get_dispatch_table(ot_device_table_map, device)->DestroyFence(device, fence, pAllocator);
856}
857
858VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
859 bool skip_call = false;
860 {
861 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600862 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00184);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600863 if (pFences) {
864 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -0600865 skip_call |=
866 ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00187);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600867 }
868 }
869 }
870 if (skip_call) {
871 return VK_ERROR_VALIDATION_FAILED_EXT;
872 }
873 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetFences(device, fenceCount, pFences);
874 return result;
875}
876
877VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
878 bool skip_call = false;
879 {
880 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600881 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00180);
882 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00181);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600883 }
884 if (skip_call) {
885 return VK_ERROR_VALIDATION_FAILED_EXT;
886 }
887 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetFenceStatus(device, fence);
888 return result;
889}
890
891VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
892 uint64_t timeout) {
893 bool skip_call = false;
894 {
895 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600896 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00188);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600897 if (pFences) {
898 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -0600899 skip_call |=
900 ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00191);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600901 }
902 }
903 }
904 if (skip_call) {
905 return VK_ERROR_VALIDATION_FAILED_EXT;
906 }
907 VkResult result = get_dispatch_table(ot_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
908 return result;
909}
910
911VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
912 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
913 bool skip_call = false;
914 {
915 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600916 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00192);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600917 }
918 if (skip_call) {
919 return VK_ERROR_VALIDATION_FAILED_EXT;
920 }
921 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
922 {
923 std::lock_guard<std::mutex> lock(global_lock);
924 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300925 CreateObject(device, *pSemaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600926 }
927 }
928 return result;
929}
930
931VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
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_00202);
936 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, true, VALIDATION_ERROR_00203);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600937 }
938 if (skip_call) {
939 return;
940 }
941 {
942 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700943 DestroyObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator, VALIDATION_ERROR_00200,
944 VALIDATION_ERROR_00201);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600945 }
946 get_dispatch_table(ot_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
947}
948
949VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
950 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
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_00206);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600955 }
956 if (skip_call) {
957 return VK_ERROR_VALIDATION_FAILED_EXT;
958 }
959 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
960 {
961 std::lock_guard<std::mutex> lock(global_lock);
962 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300963 CreateObject(device, *pEvent, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600964 }
965 }
966 return result;
967}
968
969VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
970 bool skip_call = false;
971 {
972 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600973 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00216);
974 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, true, VALIDATION_ERROR_00217);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600975 }
976 if (skip_call) {
977 return;
978 }
979 {
980 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700981 DestroyObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator, VALIDATION_ERROR_00214,
982 VALIDATION_ERROR_00215);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600983 }
984 get_dispatch_table(ot_device_table_map, device)->DestroyEvent(device, event, pAllocator);
985}
986
987VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
988 bool skip_call = false;
989 {
990 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600991 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00220);
992 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00221);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600993 }
994 if (skip_call) {
995 return VK_ERROR_VALIDATION_FAILED_EXT;
996 }
997 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetEventStatus(device, event);
998 return result;
999}
1000
1001VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
1002 bool skip_call = false;
1003 {
1004 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001005 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00223);
1006 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00224);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001007 }
1008 if (skip_call) {
1009 return VK_ERROR_VALIDATION_FAILED_EXT;
1010 }
1011 VkResult result = get_dispatch_table(ot_device_table_map, device)->SetEvent(device, event);
1012 return result;
1013}
1014
1015VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
1016 bool skip_call = false;
1017 {
1018 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001019 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00227);
1020 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00228);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001021 }
1022 if (skip_call) {
1023 return VK_ERROR_VALIDATION_FAILED_EXT;
1024 }
1025 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetEvent(device, event);
1026 return result;
1027}
1028
1029VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1030 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
1031 bool skip_call = false;
1032 {
1033 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001034 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01002);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001035 }
1036 if (skip_call) {
1037 return VK_ERROR_VALIDATION_FAILED_EXT;
1038 }
1039 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
1040 {
1041 std::lock_guard<std::mutex> lock(global_lock);
1042 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001043 CreateObject(device, *pQueryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001044 }
1045 }
1046 return result;
1047}
1048
1049VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
1050 bool skip_call = false;
1051 {
1052 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001053 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01015);
1054 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, true, VALIDATION_ERROR_01016);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001055 }
1056 if (skip_call) {
1057 return;
1058 }
1059 {
1060 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001061 DestroyObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator, VALIDATION_ERROR_01013,
1062 VALIDATION_ERROR_01014);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001063 }
1064 get_dispatch_table(ot_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
1065}
1066
1067VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
1068 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
1069 bool skip_call = false;
1070 {
1071 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001072 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01054);
1073 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01055);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001074 }
1075 if (skip_call) {
1076 return VK_ERROR_VALIDATION_FAILED_EXT;
1077 }
1078 VkResult result = get_dispatch_table(ot_device_table_map, device)
1079 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
1080 return result;
1081}
1082
1083VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
1084 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
1085 bool skip_call = false;
1086 {
1087 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultza9ef1e52016-10-06 17:53:48 -06001088 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00659);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001089 }
1090 if (skip_call) {
1091 return VK_ERROR_VALIDATION_FAILED_EXT;
1092 }
1093 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
1094 {
1095 std::lock_guard<std::mutex> lock(global_lock);
1096 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001097 CreateObject(device, *pBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001098 }
1099 }
1100 return result;
1101}
1102
1103VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
1104 bool skip_call = false;
1105 {
1106 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001107 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, true, VALIDATION_ERROR_00680);
1108 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00679);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001109 }
1110 if (skip_call) {
1111 return;
1112 }
1113 {
1114 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001115 DestroyObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator, VALIDATION_ERROR_00677,
1116 VALIDATION_ERROR_00678);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001117 }
1118 get_dispatch_table(ot_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
1119}
1120
1121VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
1122 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
1123 bool skip_call = false;
1124 {
1125 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001126 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00683);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001127 if (pCreateInfo) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001128 skip_call |=
1129 ValidateObject(device, pCreateInfo->buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00699);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001130 }
1131 }
1132 if (skip_call) {
1133 return VK_ERROR_VALIDATION_FAILED_EXT;
1134 }
1135 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
1136 {
1137 std::lock_guard<std::mutex> lock(global_lock);
1138 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001139 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001140 }
1141 }
1142 return result;
1143}
1144
1145VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
1146 bool skip_call = false;
1147 {
1148 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001149 skip_call |= ValidateObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, true, VALIDATION_ERROR_00705);
1150 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00704);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001151 }
1152 if (skip_call) {
1153 return;
1154 }
1155 {
1156 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001157 DestroyObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator, VALIDATION_ERROR_00702,
1158 VALIDATION_ERROR_00703);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001159 }
1160 get_dispatch_table(ot_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
1161}
1162
1163VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
1164 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
1165 bool skip_call = false;
1166 {
1167 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001168 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00709);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001169 }
1170 if (skip_call) {
1171 return VK_ERROR_VALIDATION_FAILED_EXT;
1172 }
1173 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
1174 {
1175 std::lock_guard<std::mutex> lock(global_lock);
1176 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001177 CreateObject(device, *pImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001178 }
1179 }
1180 return result;
1181}
1182
1183VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
1184 bool skip_call = false;
1185 {
1186 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001187 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00746);
1188 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, true, VALIDATION_ERROR_00747);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001189 }
1190 if (skip_call) {
1191 return;
1192 }
1193 {
1194 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001195 DestroyObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator, VALIDATION_ERROR_00744,
1196 VALIDATION_ERROR_00745);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001197 }
1198 get_dispatch_table(ot_device_table_map, device)->DestroyImage(device, image, pAllocator);
1199}
1200
1201VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
1202 VkSubresourceLayout *pLayout) {
1203 bool skip_call = false;
1204 {
1205 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001206 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00734);
1207 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00735);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001208 }
1209 if (skip_call) {
1210 return;
1211 }
1212 get_dispatch_table(ot_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
1213}
1214
1215VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
1216 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
1217 bool skip_call = false;
1218 {
1219 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001220 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00750);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001221 if (pCreateInfo) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001222 skip_call |=
1223 ValidateObject(device, pCreateInfo->image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00763);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001224 }
1225 }
1226 if (skip_call) {
1227 return VK_ERROR_VALIDATION_FAILED_EXT;
1228 }
1229 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
1230 {
1231 std::lock_guard<std::mutex> lock(global_lock);
1232 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001233 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001234 }
1235 }
1236 return result;
1237}
1238
1239VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
1240 bool skip_call = false;
1241 {
1242 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001243 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00779);
1244 skip_call |= ValidateObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, true, VALIDATION_ERROR_00780);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001245 }
1246 if (skip_call) {
1247 return;
1248 }
1249 {
1250 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001251 DestroyObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator, VALIDATION_ERROR_00777,
1252 VALIDATION_ERROR_00778);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001253 }
1254 get_dispatch_table(ot_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
1255}
1256
1257VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
1258 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
1259 bool skip_call = false;
1260 {
1261 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001262 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00466);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001263 }
1264 if (skip_call) {
1265 return VK_ERROR_VALIDATION_FAILED_EXT;
1266 }
1267 VkResult result =
1268 get_dispatch_table(ot_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
1269 {
1270 std::lock_guard<std::mutex> lock(global_lock);
1271 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001272 CreateObject(device, *pShaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001273 }
1274 }
1275 return result;
1276}
1277
1278VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1279 const VkAllocationCallbacks *pAllocator) {
1280 bool skip_call = false;
1281 {
1282 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001283 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00481);
1284 skip_call |=
1285 ValidateObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, true, VALIDATION_ERROR_00482);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001286 }
1287 if (skip_call) {
1288 return;
1289 }
1290 {
1291 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001292 DestroyObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator, VALIDATION_ERROR_00479,
1293 VALIDATION_ERROR_00480);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001294 }
1295 get_dispatch_table(ot_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
1296}
1297
1298VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
1299 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
1300 bool skip_call = false;
1301 {
1302 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001303 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00562);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001304 }
1305 if (skip_call) {
1306 return VK_ERROR_VALIDATION_FAILED_EXT;
1307 }
1308 VkResult result =
1309 get_dispatch_table(ot_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
1310 {
1311 std::lock_guard<std::mutex> lock(global_lock);
1312 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001313 CreateObject(device, *pPipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001314 }
1315 }
1316 return result;
1317}
1318
1319VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
1320 const VkAllocationCallbacks *pAllocator) {
1321 bool skip_call = false;
1322 {
1323 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001324 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00585);
1325 skip_call |=
1326 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00586);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001327 }
1328 if (skip_call) {
1329 return;
1330 }
1331 {
1332 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001333 DestroyObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator, VALIDATION_ERROR_00583,
1334 VALIDATION_ERROR_00584);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001335 }
1336 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
1337}
1338
1339VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
1340 void *pData) {
1341 bool skip_call = false;
1342 {
1343 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001344 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00578);
1345 skip_call |=
1346 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false, VALIDATION_ERROR_00579);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001347 }
1348 if (skip_call) {
1349 return VK_ERROR_VALIDATION_FAILED_EXT;
1350 }
1351 VkResult result =
1352 get_dispatch_table(ot_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
1353 return result;
1354}
1355
1356VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
1357 const VkPipelineCache *pSrcCaches) {
1358 bool skip_call = false;
1359 {
1360 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001361 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00572);
1362 skip_call |=
1363 ValidateObject(device, dstCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false, VALIDATION_ERROR_00573);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001364 if (pSrcCaches) {
1365 for (uint32_t idx0 = 0; idx0 < srcCacheCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06001366 skip_call |= ValidateObject(device, pSrcCaches[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false,
1367 VALIDATION_ERROR_00577);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001368 }
1369 }
1370 }
1371 if (skip_call) {
1372 return VK_ERROR_VALIDATION_FAILED_EXT;
1373 }
1374 VkResult result =
1375 get_dispatch_table(ot_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
1376 return result;
1377}
1378
1379VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
1380 bool skip_call = false;
1381 {
1382 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001383 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00558);
1384 skip_call |= ValidateObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, true, VALIDATION_ERROR_00559);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001385 }
1386 if (skip_call) {
1387 return;
1388 }
1389 {
1390 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001391 DestroyObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator, VALIDATION_ERROR_00556,
1392 VALIDATION_ERROR_00557);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001393 }
1394 get_dispatch_table(ot_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
1395}
1396
1397VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
1398 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
1399 bool skip_call = false;
1400 {
1401 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001402 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00861);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001403 if (pCreateInfo) {
1404 if (pCreateInfo->pSetLayouts) {
1405 for (uint32_t idx0 = 0; idx0 < pCreateInfo->setLayoutCount; ++idx0) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001406 skip_call |=
1407 ValidateObject(device, pCreateInfo->pSetLayouts[idx0],
1408 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false, VALIDATION_ERROR_00875);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001409 }
1410 }
1411 }
1412 }
1413 if (skip_call) {
1414 return VK_ERROR_VALIDATION_FAILED_EXT;
1415 }
1416 VkResult result =
1417 get_dispatch_table(ot_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
1418 {
1419 std::lock_guard<std::mutex> lock(global_lock);
1420 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001421 CreateObject(device, *pPipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001422 }
1423 }
1424 return result;
1425}
1426
1427VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1428 const VkAllocationCallbacks *pAllocator) {
1429 bool skip_call = false;
1430 {
1431 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001432 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00885);
1433 skip_call |=
1434 ValidateObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, true, VALIDATION_ERROR_00886);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001435 }
1436 if (skip_call) {
1437 return;
1438 }
1439 {
1440 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001441 DestroyObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator, VALIDATION_ERROR_00883,
1442 VALIDATION_ERROR_00884);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001443 }
1444 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
1445}
1446
1447VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
1448 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
1449 bool skip_call = false;
1450 {
1451 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001452 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00812);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001453 }
1454 if (skip_call) {
1455 return VK_ERROR_VALIDATION_FAILED_EXT;
1456 }
1457 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
1458 {
1459 std::lock_guard<std::mutex> lock(global_lock);
1460 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001461 CreateObject(device, *pSampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001462 }
1463 }
1464 return result;
1465}
1466
1467VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
1468 bool skip_call = false;
1469 {
1470 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001471 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00840);
1472 skip_call |= ValidateObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, true, VALIDATION_ERROR_00841);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001473 }
1474 if (skip_call) {
1475 return;
1476 }
1477 {
1478 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001479 DestroyObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator, VALIDATION_ERROR_00838,
1480 VALIDATION_ERROR_00839);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001481 }
1482 get_dispatch_table(ot_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
1483}
1484
1485VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
1486 const VkAllocationCallbacks *pAllocator,
1487 VkDescriptorSetLayout *pSetLayout) {
1488 bool skip_call = false;
1489 {
1490 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001491 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00844);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001492 if (pCreateInfo) {
1493 if (pCreateInfo->pBindings) {
1494 for (uint32_t idx0 = 0; idx0 < pCreateInfo->bindingCount; ++idx0) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001495 if ((pCreateInfo->pBindings[idx0].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
1496 (pCreateInfo->pBindings[idx0].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) {
1497 if (pCreateInfo->pBindings[idx0].pImmutableSamplers) {
1498 for (uint32_t idx1 = 0; idx1 < pCreateInfo->pBindings[idx0].descriptorCount; ++idx1) {
1499 skip_call |= ValidateObject(device, pCreateInfo->pBindings[idx0].pImmutableSamplers[idx1],
1500 VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false, VALIDATION_ERROR_00852);
1501 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001502 }
1503 }
1504 }
1505 }
1506 }
1507 }
1508 if (skip_call) {
1509 return VK_ERROR_VALIDATION_FAILED_EXT;
1510 }
1511 VkResult result =
1512 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
1513 {
1514 std::lock_guard<std::mutex> lock(global_lock);
1515 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001516 CreateObject(device, *pSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001517 }
1518 }
1519 return result;
1520}
1521
1522VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1523 const VkAllocationCallbacks *pAllocator) {
1524 bool skip_call = false;
1525 {
1526 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001527 skip_call |= ValidateObject(device, descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, true,
1528 VALIDATION_ERROR_00858);
1529 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00857);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001530 }
1531 if (skip_call) {
1532 return;
1533 }
1534 {
1535 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001536 DestroyObject(device, descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator,
1537 VALIDATION_ERROR_00855, VALIDATION_ERROR_00856);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001538 }
1539 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
1540}
1541
1542VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
1543 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
1544 bool skip_call = false;
1545 {
1546 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001547 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00889);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001548 }
1549 if (skip_call) {
1550 return VK_ERROR_VALIDATION_FAILED_EXT;
1551 }
1552 VkResult result =
1553 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
1554 {
1555 std::lock_guard<std::mutex> lock(global_lock);
1556 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001557 CreateObject(device, *pDescriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001558 }
1559 }
1560 return result;
1561}
1562
1563VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1564 VkDescriptorPoolResetFlags flags) {
1565 bool skip_call = false;
Chris Forbes2a947ce2016-09-29 18:47:50 +13001566 std::unique_lock<std::mutex> lock(global_lock);
1567 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001568 skip_call |=
1569 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false, VALIDATION_ERROR_00930);
1570 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00929);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001571 if (skip_call) {
1572 return VK_ERROR_VALIDATION_FAILED_EXT;
1573 }
Chris Forbes2a947ce2016-09-29 18:47:50 +13001574 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is reset.
1575 // Remove this pool's descriptor sets from our descriptorSet map.
1576 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
1577 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
1578 OBJTRACK_NODE *pNode = (*itr).second;
1579 auto del_itr = itr++;
1580 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
Mike Schuchardt3796a882016-12-06 18:03:56 -07001581 DestroyObject(device, (VkDescriptorSet)((*del_itr).first), VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr,
1582 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Chris Forbes2a947ce2016-09-29 18:47:50 +13001583 }
1584 }
1585 lock.unlock();
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001586 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
1587 return result;
1588}
1589
1590VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
1591 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
1592 const VkCopyDescriptorSet *pDescriptorCopies) {
1593 bool skip_call = false;
1594 {
1595 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001596 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00933);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001597 if (pDescriptorCopies) {
1598 for (uint32_t idx0 = 0; idx0 < descriptorCopyCount; ++idx0) {
1599 if (pDescriptorCopies[idx0].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001600 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].dstSet,
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001601 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false, VALIDATION_ERROR_00972);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001602 }
1603 if (pDescriptorCopies[idx0].srcSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001604 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].srcSet,
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001605 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false, VALIDATION_ERROR_00971);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001606 }
1607 }
1608 }
1609 if (pDescriptorWrites) {
1610 for (uint32_t idx1 = 0; idx1 < descriptorWriteCount; ++idx1) {
1611 if (pDescriptorWrites[idx1].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001612 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].dstSet,
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001613 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false, VALIDATION_ERROR_00955);
1614 }
1615 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
1616 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
1617 for (uint32_t idx2 = 0; idx2 < pDescriptorWrites[idx1].descriptorCount; ++idx2) {
1618 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pTexelBufferView[idx2],
1619 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, false, VALIDATION_ERROR_00940);
1620 }
1621 }
1622 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
1623 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
1624 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
1625 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
1626 for (uint32_t idx3 = 0; idx3 < pDescriptorWrites[idx1].descriptorCount; ++idx3) {
1627 if (pDescriptorWrites[idx1].pImageInfo[idx3].imageView) {
1628 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pImageInfo[idx3].imageView,
1629 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false, VALIDATION_ERROR_00943);
1630 }
1631 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001632 }
1633 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
1634 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
1635 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
1636 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001637 for (uint32_t idx4 = 0; idx4 < pDescriptorWrites[idx1].descriptorCount; ++idx4) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001638 if (pDescriptorWrites[idx1].pBufferInfo[idx4].buffer) {
1639 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pBufferInfo[idx4].buffer,
1640 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00962);
1641 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001642 }
1643 }
1644 }
1645 }
1646 }
1647 if (skip_call) {
1648 return;
1649 }
1650 get_dispatch_table(ot_device_table_map, device)
1651 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
1652}
1653
1654VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
1655 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
1656 bool skip_call = false;
1657 {
1658 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001659 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00400);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001660 if (pCreateInfo) {
1661 if (pCreateInfo->pAttachments) {
1662 for (uint32_t idx0 = 0; idx0 < pCreateInfo->attachmentCount; ++idx0) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001663 skip_call |= ValidateObject(device, pCreateInfo->pAttachments[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT,
1664 false, VALIDATION_ERROR_00420);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001665 }
1666 }
1667 if (pCreateInfo->renderPass) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001668 skip_call |= ValidateObject(device, pCreateInfo->renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false,
1669 VALIDATION_ERROR_00419);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001670 }
1671 }
1672 }
1673 if (skip_call) {
1674 return VK_ERROR_VALIDATION_FAILED_EXT;
1675 }
1676 VkResult result =
1677 get_dispatch_table(ot_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
1678 {
1679 std::lock_guard<std::mutex> lock(global_lock);
1680 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001681 CreateObject(device, *pFramebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001682 }
1683 }
1684 return result;
1685}
1686
1687VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
1688 bool skip_call = false;
1689 {
1690 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001691 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00425);
1692 skip_call |= ValidateObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, true, VALIDATION_ERROR_00426);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001693 }
1694 if (skip_call) {
1695 return;
1696 }
1697 {
1698 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001699 DestroyObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator, VALIDATION_ERROR_00423,
1700 VALIDATION_ERROR_00424);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001701 }
1702 get_dispatch_table(ot_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
1703}
1704
1705VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
1706 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
1707 bool skip_call = false;
1708 {
1709 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001710 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00319);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001711 }
1712 if (skip_call) {
1713 return VK_ERROR_VALIDATION_FAILED_EXT;
1714 }
1715 VkResult result =
1716 get_dispatch_table(ot_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
1717 {
1718 std::lock_guard<std::mutex> lock(global_lock);
1719 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001720 CreateObject(device, *pRenderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001721 }
1722 }
1723 return result;
1724}
1725
1726VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
1727 bool skip_call = false;
1728 {
1729 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001730 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00396);
1731 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, true, VALIDATION_ERROR_00397);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001732 }
1733 if (skip_call) {
1734 return;
1735 }
1736 {
1737 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001738 DestroyObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator, VALIDATION_ERROR_00394,
1739 VALIDATION_ERROR_00395);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001740 }
1741 get_dispatch_table(ot_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
1742}
1743
1744VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
1745 bool skip_call = false;
1746 {
1747 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001748 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00449);
1749 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false, VALIDATION_ERROR_00450);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001750 }
1751 if (skip_call) {
1752 return;
1753 }
1754 get_dispatch_table(ot_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
1755}
1756
1757VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1758 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
1759 bool skip_call = false;
1760 {
1761 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001762 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00064);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001763 }
1764 if (skip_call) {
1765 return VK_ERROR_VALIDATION_FAILED_EXT;
1766 }
1767 VkResult result =
1768 get_dispatch_table(ot_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
1769 {
1770 std::lock_guard<std::mutex> lock(global_lock);
1771 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001772 CreateObject(device, *pCommandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001773 }
1774 }
1775 return result;
1776}
1777
1778VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
1779 bool skip_call = false;
1780 {
1781 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001782 skip_call |=
1783 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false, VALIDATION_ERROR_00074);
1784 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00073);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001785 }
1786 if (skip_call) {
1787 return VK_ERROR_VALIDATION_FAILED_EXT;
1788 }
1789 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
1790 return result;
1791}
1792
1793VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer command_buffer, const VkCommandBufferBeginInfo *begin_info) {
1794 layer_data *device_data = get_my_data_ptr(get_dispatch_key(command_buffer), layer_data_map);
1795 bool skip_call = false;
1796 {
1797 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001798 skip_call |= ValidateObject(command_buffer, command_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1799 VALIDATION_ERROR_00108);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001800 if (begin_info) {
1801 OBJTRACK_NODE *pNode =
1802 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 -07001803 if ((begin_info->pInheritanceInfo) && (pNode->status & OBJSTATUS_COMMAND_BUFFER_SECONDARY) &&
1804 (begin_info->flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001805 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->framebuffer,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001806 VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, true, VALIDATION_ERROR_00112);
Chris Forbes2f271a72016-09-29 14:58:08 +13001807 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->renderPass,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001808 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false, VALIDATION_ERROR_00110);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001809 }
1810 }
1811 }
1812 if (skip_call) {
1813 return VK_ERROR_VALIDATION_FAILED_EXT;
1814 }
1815 VkResult result = get_dispatch_table(ot_device_table_map, command_buffer)->BeginCommandBuffer(command_buffer, begin_info);
1816 return result;
1817}
1818
1819VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
1820 bool skip_call = false;
1821 {
1822 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001823 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1824 VALIDATION_ERROR_00125);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001825 }
1826 if (skip_call) {
1827 return VK_ERROR_VALIDATION_FAILED_EXT;
1828 }
1829 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
1830 return result;
1831}
1832
1833VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
1834 bool skip_call = false;
1835 {
1836 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001837 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
Tobin Ehlis959517f2016-12-22 11:00:07 -07001838 VALIDATION_ERROR_00094);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001839 }
1840 if (skip_call) {
1841 return VK_ERROR_VALIDATION_FAILED_EXT;
1842 }
1843 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
1844 return result;
1845}
1846
1847VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1848 VkPipeline pipeline) {
1849 bool skip_call = false;
1850 {
1851 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001852 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1853 VALIDATION_ERROR_00599);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001854 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06001855 ValidateObject(commandBuffer, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, false, VALIDATION_ERROR_00601);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001856 }
1857 if (skip_call) {
1858 return;
1859 }
1860 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
1861}
1862
1863VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
1864 const VkViewport *pViewports) {
1865 bool skip_call = false;
1866 {
1867 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001868 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1869 VALIDATION_ERROR_01443);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001870 }
1871 if (skip_call) {
1872 return;
1873 }
1874 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
1875}
1876
1877VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
1878 const VkRect2D *pScissors) {
1879 bool skip_call = false;
1880 {
1881 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001882 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1883 VALIDATION_ERROR_01492);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001884 }
1885 if (skip_call) {
1886 return;
1887 }
1888 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
1889}
1890
1891VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
1892 bool skip_call = false;
1893 {
1894 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001895 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1896 VALIDATION_ERROR_01478);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001897 }
1898 if (skip_call) {
1899 return;
1900 }
1901 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
1902}
1903
1904VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
1905 float depthBiasSlopeFactor) {
1906 bool skip_call = false;
1907 {
1908 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001909 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1910 VALIDATION_ERROR_01483);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001911 }
1912 if (skip_call) {
1913 return;
1914 }
1915 get_dispatch_table(ot_device_table_map, commandBuffer)
1916 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
1917}
1918
1919VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
1920 bool skip_call = false;
1921 {
1922 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001923 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1924 VALIDATION_ERROR_01551);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001925 }
1926 if (skip_call) {
1927 return;
1928 }
1929 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
1930}
1931
1932VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
1933 bool skip_call = false;
1934 {
1935 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001936 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1937 VALIDATION_ERROR_01507);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001938 }
1939 if (skip_call) {
1940 return;
1941 }
1942 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
1943}
1944
1945VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
1946 uint32_t compareMask) {
1947 bool skip_call = false;
1948 {
1949 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001950 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1951 VALIDATION_ERROR_01515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001952 }
1953 if (skip_call) {
1954 return;
1955 }
1956 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
1957}
1958
1959VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
1960 bool skip_call = false;
1961 {
1962 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001963 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1964 VALIDATION_ERROR_01521);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001965 }
1966 if (skip_call) {
1967 return;
1968 }
1969 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
1970}
1971
1972VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
1973 bool skip_call = false;
1974 {
1975 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001976 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1977 VALIDATION_ERROR_01527);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001978 }
1979 if (skip_call) {
1980 return;
1981 }
1982 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
1983}
1984
1985VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1986 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
1987 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
1988 const uint32_t *pDynamicOffsets) {
1989 bool skip_call = false;
1990 {
1991 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001992 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1993 VALIDATION_ERROR_00979);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001994 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06001995 ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false, VALIDATION_ERROR_00981);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001996 if (pDescriptorSets) {
1997 for (uint32_t idx0 = 0; idx0 < descriptorSetCount; ++idx0) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001998 skip_call |= ValidateObject(commandBuffer, pDescriptorSets[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
1999 false, VALIDATION_ERROR_00982);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002000 }
2001 }
2002 }
2003 if (skip_call) {
2004 return;
2005 }
2006 get_dispatch_table(ot_device_table_map, commandBuffer)
2007 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
2008 dynamicOffsetCount, pDynamicOffsets);
2009}
2010
2011VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2012 VkIndexType indexType) {
2013 bool skip_call = false;
2014 {
2015 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002016 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01354);
2017 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2018 VALIDATION_ERROR_01353);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002019 }
2020 if (skip_call) {
2021 return;
2022 }
2023 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
2024}
2025
2026VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
2027 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
2028 bool skip_call = false;
2029 {
2030 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002031 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2032 VALIDATION_ERROR_01419);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002033 if (pBuffers) {
2034 for (uint32_t idx0 = 0; idx0 < bindingCount; ++idx0) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002035 skip_call |= ValidateObject(commandBuffer, pBuffers[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false,
2036 VALIDATION_ERROR_01420);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002037 }
2038 }
2039 }
2040 if (skip_call) {
2041 return;
2042 }
2043 get_dispatch_table(ot_device_table_map, commandBuffer)
2044 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
2045}
2046
2047VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
2048 uint32_t firstVertex, uint32_t firstInstance) {
2049 bool skip_call = false;
2050 {
2051 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002052 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2053 VALIDATION_ERROR_01362);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002054 }
2055 if (skip_call) {
2056 return;
2057 }
2058 get_dispatch_table(ot_device_table_map, commandBuffer)
2059 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
2060}
2061
2062VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
2063 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
2064 bool skip_call = false;
2065 {
2066 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002067 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2068 VALIDATION_ERROR_01369);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002069 }
2070 if (skip_call) {
2071 return;
2072 }
2073 get_dispatch_table(ot_device_table_map, commandBuffer)
2074 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
2075}
2076
2077VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
2078 uint32_t stride) {
2079 bool skip_call = false;
2080 {
2081 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002082 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01378);
2083 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2084 VALIDATION_ERROR_01377);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002085 }
2086 if (skip_call) {
2087 return;
2088 }
2089 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
2090}
2091
2092VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2093 uint32_t drawCount, uint32_t stride) {
2094 bool skip_call = false;
2095 {
2096 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002097 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01390);
2098 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2099 VALIDATION_ERROR_01389);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002100 }
2101 if (skip_call) {
2102 return;
2103 }
2104 get_dispatch_table(ot_device_table_map, commandBuffer)
2105 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
2106}
2107
2108VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
2109 bool skip_call = false;
2110 {
2111 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002112 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2113 VALIDATION_ERROR_01559);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002114 }
2115 if (skip_call) {
2116 return;
2117 }
2118 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
2119}
2120
2121VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
2122 bool skip_call = false;
2123 {
2124 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002125 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01566);
2126 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2127 VALIDATION_ERROR_01565);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002128 }
2129 if (skip_call) {
2130 return;
2131 }
2132 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
2133}
2134
2135VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
2136 uint32_t regionCount, const VkBufferCopy *pRegions) {
2137 bool skip_call = false;
2138 {
2139 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002140 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2141 VALIDATION_ERROR_01166);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002142 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002143 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01168);
2144 skip_call |=
2145 ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01167);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002146 }
2147 if (skip_call) {
2148 return;
2149 }
2150 get_dispatch_table(ot_device_table_map, commandBuffer)
2151 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
2152}
2153
2154VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2155 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2156 const VkImageCopy *pRegions) {
2157 bool skip_call = false;
2158 {
2159 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002160 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2161 VALIDATION_ERROR_01186);
2162 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01189);
2163 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01187);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002164 }
2165 if (skip_call) {
2166 return;
2167 }
2168 get_dispatch_table(ot_device_table_map, commandBuffer)
2169 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2170}
2171
2172VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2173 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2174 const VkImageBlit *pRegions, VkFilter filter) {
2175 bool skip_call = false;
2176 {
2177 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002178 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2179 VALIDATION_ERROR_01291);
2180 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01294);
2181 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01292);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002182 }
2183 if (skip_call) {
2184 return;
2185 }
2186 get_dispatch_table(ot_device_table_map, commandBuffer)
2187 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
2188}
2189
2190VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
2191 VkImageLayout dstImageLayout, uint32_t regionCount,
2192 const VkBufferImageCopy *pRegions) {
2193 bool skip_call = false;
2194 {
2195 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002196 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2197 VALIDATION_ERROR_01235);
2198 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01237);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002199 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002200 ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01236);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002201 }
2202 if (skip_call) {
2203 return;
2204 }
2205 get_dispatch_table(ot_device_table_map, commandBuffer)
2206 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
2207}
2208
2209VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2210 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
2211 bool skip_call = false;
2212 {
2213 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002214 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2215 VALIDATION_ERROR_01253);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002216 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002217 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01256);
2218 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01254);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002219 }
2220 if (skip_call) {
2221 return;
2222 }
2223 get_dispatch_table(ot_device_table_map, commandBuffer)
2224 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
2225}
2226
2227VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2228 VkDeviceSize dataSize, const uint32_t *pData) {
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_01150);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002234 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002235 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01151);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002236 }
2237 if (skip_call) {
2238 return;
2239 }
2240 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
2241}
2242
2243VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2244 VkDeviceSize size, uint32_t data) {
2245 bool skip_call = false;
2246 {
2247 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002248 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2249 VALIDATION_ERROR_01138);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002250 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002251 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01139);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002252 }
2253 if (skip_call) {
2254 return;
2255 }
2256 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
2257}
2258
2259VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2260 const VkClearColorValue *pColor, uint32_t rangeCount,
2261 const VkImageSubresourceRange *pRanges) {
2262 bool skip_call = false;
2263 {
2264 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002265 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2266 VALIDATION_ERROR_01089);
2267 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01090);
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 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
2274}
2275
2276VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2277 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
2278 const VkImageSubresourceRange *pRanges) {
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_01104);
2284 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01105);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002285 }
2286 if (skip_call) {
2287 return;
2288 }
2289 get_dispatch_table(ot_device_table_map, commandBuffer)
2290 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
2291}
2292
2293VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
2294 const VkClearAttachment *pAttachments, uint32_t rectCount,
2295 const VkClearRect *pRects) {
2296 bool skip_call = false;
2297 {
2298 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002299 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2300 VALIDATION_ERROR_01117);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002301 }
2302 if (skip_call) {
2303 return;
2304 }
2305 get_dispatch_table(ot_device_table_map, commandBuffer)
2306 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
2307}
2308
2309VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2310 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2311 const VkImageResolve *pRegions) {
2312 bool skip_call = false;
2313 {
2314 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002315 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2316 VALIDATION_ERROR_01327);
2317 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01330);
2318 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01328);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002319 }
2320 if (skip_call) {
2321 return;
2322 }
2323 get_dispatch_table(ot_device_table_map, commandBuffer)
2324 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2325}
2326
2327VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
2328 bool skip_call = false;
2329 {
2330 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002331 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2332 VALIDATION_ERROR_00232);
2333 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00233);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002334 }
2335 if (skip_call) {
2336 return;
2337 }
2338 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
2339}
2340
2341VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
2342 bool skip_call = false;
2343 {
2344 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002345 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2346 VALIDATION_ERROR_00243);
2347 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00244);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002348 }
2349 if (skip_call) {
2350 return;
2351 }
2352 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
2353}
2354
2355VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2356 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
2357 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2358 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2359 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
2360 bool skip_call = false;
2361 {
2362 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002363 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2364 VALIDATION_ERROR_00252);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002365 if (pBufferMemoryBarriers) {
2366 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2367 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002368 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002369 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00259);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002370 }
2371 }
2372 }
2373 if (pEvents) {
2374 for (uint32_t idx1 = 0; idx1 < eventCount; ++idx1) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06002375 skip_call |= ValidateObject(commandBuffer, pEvents[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false,
2376 VALIDATION_ERROR_00253);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002377 }
2378 }
2379 if (pImageMemoryBarriers) {
2380 for (uint32_t idx2 = 0; idx2 < imageMemoryBarrierCount; ++idx2) {
2381 if (pImageMemoryBarriers[idx2].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002382 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx2].image,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002383 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00260);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002384 }
2385 }
2386 }
2387 }
2388 if (skip_call) {
2389 return;
2390 }
2391 get_dispatch_table(ot_device_table_map, commandBuffer)
2392 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
2393 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2394}
2395
2396VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2397 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2398 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2399 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2400 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
2401 bool skip_call = false;
2402 {
2403 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002404 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2405 VALIDATION_ERROR_00270);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002406 if (pBufferMemoryBarriers) {
2407 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2408 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002409 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002410 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00277);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002411 }
2412 }
2413 }
2414 if (pImageMemoryBarriers) {
2415 for (uint32_t idx1 = 0; idx1 < imageMemoryBarrierCount; ++idx1) {
2416 if (pImageMemoryBarriers[idx1].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002417 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx1].image,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002418 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00278);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002419 }
2420 }
2421 }
2422 }
2423 if (skip_call) {
2424 return;
2425 }
2426 get_dispatch_table(ot_device_table_map, commandBuffer)
2427 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
2428 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2429}
2430
2431VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query,
2432 VkQueryControlFlags flags) {
2433 bool skip_call = false;
2434 {
2435 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002436 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2437 VALIDATION_ERROR_01035);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002438 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002439 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01036);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002440 }
2441 if (skip_call) {
2442 return;
2443 }
2444 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, query, flags);
2445}
2446
2447VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query) {
2448 bool skip_call = false;
2449 {
2450 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002451 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2452 VALIDATION_ERROR_01043);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002453 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002454 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01044);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002455 }
2456 if (skip_call) {
2457 return;
2458 }
2459 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, query);
2460}
2461
2462VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2463 uint32_t queryCount) {
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_01021);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002469 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002470 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01022);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002471 }
2472 if (skip_call) {
2473 return;
2474 }
2475 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
2476}
2477
2478VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2479 VkQueryPool queryPool, uint32_t query) {
2480 bool skip_call = false;
2481 {
2482 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002483 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2484 VALIDATION_ERROR_01078);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002485 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002486 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01080);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002487 }
2488 if (skip_call) {
2489 return;
2490 }
2491 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
2492}
2493
2494VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2495 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2496 VkDeviceSize stride, VkQueryResultFlags flags) {
2497 bool skip_call = false;
2498 {
2499 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002500 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2501 VALIDATION_ERROR_01068);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002502 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002503 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01070);
2504 skip_call |=
2505 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01069);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002506 }
2507 if (skip_call) {
2508 return;
2509 }
2510 get_dispatch_table(ot_device_table_map, commandBuffer)
2511 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
2512}
2513
2514VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
2515 uint32_t offset, uint32_t size, const void *pValues) {
2516 bool skip_call = false;
2517 {
2518 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002519 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2520 VALIDATION_ERROR_00993);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002521 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002522 ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false, VALIDATION_ERROR_00994);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002523 }
2524 if (skip_call) {
2525 return;
2526 }
2527 get_dispatch_table(ot_device_table_map, commandBuffer)
2528 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
2529}
2530
2531VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
2532 VkSubpassContents contents) {
2533 bool skip_call = false;
2534 {
2535 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002536 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2537 VALIDATION_ERROR_00435);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002538 if (pRenderPassBegin) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002539 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT,
2540 false, VALIDATION_ERROR_00446);
2541 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,
2542 false, VALIDATION_ERROR_00445);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002543 }
2544 }
2545 if (skip_call) {
2546 return;
2547 }
2548 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
2549}
2550
2551VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
2552 bool skip_call = false;
2553 {
2554 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002555 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2556 VALIDATION_ERROR_00454);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002557 }
2558 if (skip_call) {
2559 return;
2560 }
2561 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
2562}
2563
2564VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
2565 bool skip_call = false;
2566 {
2567 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002568 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2569 VALIDATION_ERROR_00461);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002570 }
2571 if (skip_call) {
2572 return;
2573 }
2574 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
2575}
2576
2577VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
2578 const VkCommandBuffer *pCommandBuffers) {
2579 bool skip_call = false;
2580 {
2581 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002582 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2583 VALIDATION_ERROR_00159);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002584 if (pCommandBuffers) {
2585 for (uint32_t idx0 = 0; idx0 < commandBufferCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06002586 skip_call |= ValidateObject(commandBuffer, pCommandBuffers[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
2587 false, VALIDATION_ERROR_00160);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002588 }
2589 }
2590 }
2591 if (skip_call) {
2592 return;
2593 }
2594 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
2595}
2596
2597VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
2598 bool skip_call = false;
2599 {
2600 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002601 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01847);
2602 skip_call |= ValidateObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, true, VALIDATION_ERROR_01848);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002603 }
2604 if (skip_call) {
2605 return;
2606 }
2607 {
2608 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07002609 DestroyObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator, VALIDATION_ERROR_01845,
2610 VALIDATION_ERROR_01846);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002611 }
2612 get_dispatch_table(ot_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
2613}
2614
2615VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
2616 VkSurfaceKHR surface, VkBool32 *pSupported) {
2617 bool skip_call = false;
2618 {
2619 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002620 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2621 VALIDATION_ERROR_01890);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002622 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002623 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01891);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002624 }
2625 if (skip_call) {
2626 return VK_ERROR_VALIDATION_FAILED_EXT;
2627 }
2628 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2629 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
2630 return result;
2631}
2632
2633VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2634 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
2635 bool skip_call = false;
2636 {
2637 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002638 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2639 VALIDATION_ERROR_01907);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002640 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002641 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01908);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002642 }
2643 if (skip_call) {
2644 return VK_ERROR_VALIDATION_FAILED_EXT;
2645 }
2646 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2647 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
2648 return result;
2649}
2650
2651VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2652 uint32_t *pSurfaceFormatCount,
2653 VkSurfaceFormatKHR *pSurfaceFormats) {
2654 bool skip_call = false;
2655 {
2656 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002657 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2658 VALIDATION_ERROR_01910);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002659 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002660 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01911);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002661 }
2662 if (skip_call) {
2663 return VK_ERROR_VALIDATION_FAILED_EXT;
2664 }
2665 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2666 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
2667 return result;
2668}
2669
2670VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2671 uint32_t *pPresentModeCount,
2672 VkPresentModeKHR *pPresentModes) {
2673 bool skip_call = false;
2674 {
2675 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002676 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2677 VALIDATION_ERROR_01914);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002678 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002679 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01915);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002680 }
2681 if (skip_call) {
2682 return VK_ERROR_VALIDATION_FAILED_EXT;
2683 }
2684 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2685 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
2686 return result;
2687}
2688
2689VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
2690 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
2691 bool skip_call = false;
2692 {
2693 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002694 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01918);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002695 if (pCreateInfo) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002696 skip_call |= ValidateObject(device, pCreateInfo->oldSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, true,
2697 VALIDATION_ERROR_01935);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002698 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002699 skip_call |= ValidateObject(device_data->physical_device, pCreateInfo->surface,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002700 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01926);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002701 }
2702 }
2703 if (skip_call) {
2704 return VK_ERROR_VALIDATION_FAILED_EXT;
2705 }
2706 VkResult result =
2707 get_dispatch_table(ot_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
2708 {
2709 std::lock_guard<std::mutex> lock(global_lock);
2710 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002711 CreateObject(device, *pSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002712 }
2713 }
2714 return result;
2715}
2716
2717VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
2718 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
2719 bool skip_call = false;
2720 {
2721 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002722 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01954);
2723 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_01957);
2724 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, true, VALIDATION_ERROR_01956);
2725 skip_call |=
2726 ValidateObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false, VALIDATION_ERROR_01955);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002727 }
2728 if (skip_call) {
2729 return VK_ERROR_VALIDATION_FAILED_EXT;
2730 }
2731 VkResult result = get_dispatch_table(ot_device_table_map, device)
2732 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
2733 return result;
2734}
2735
2736VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
2737 bool skip_call = false;
2738 {
2739 std::lock_guard<std::mutex> lock(global_lock);
2740 if (pPresentInfo) {
2741 if (pPresentInfo->pSwapchains) {
2742 for (uint32_t idx0 = 0; idx0 < pPresentInfo->swapchainCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002743 skip_call |= ValidateObject(queue, pPresentInfo->pSwapchains[idx0],
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002744 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false, VALIDATION_ERROR_01969);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002745 }
2746 }
2747 if (pPresentInfo->pWaitSemaphores) {
2748 for (uint32_t idx1 = 0; idx1 < pPresentInfo->waitSemaphoreCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002749 skip_call |= ValidateObject(queue, pPresentInfo->pWaitSemaphores[idx1],
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002750 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false, VALIDATION_ERROR_01968);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002751 }
2752 }
2753 }
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002754 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_01962);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002755 }
2756 if (skip_call) {
2757 return VK_ERROR_VALIDATION_FAILED_EXT;
2758 }
2759 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
2760 return result;
2761}
2762
2763#ifdef VK_USE_PLATFORM_WIN32_KHR
2764VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
2765 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2766 bool skip_call = false;
2767 {
2768 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002769 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01820);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002770 }
2771 if (skip_call) {
2772 return VK_ERROR_VALIDATION_FAILED_EXT;
2773 }
2774 VkResult result =
2775 get_dispatch_table(ot_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2776 {
2777 std::lock_guard<std::mutex> lock(global_lock);
2778 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002779 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002780 }
2781 }
2782 return result;
2783}
2784
2785VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
2786 uint32_t queueFamilyIndex) {
2787 bool skip_call = false;
2788 {
2789 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002790 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2791 VALIDATION_ERROR_01900);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002792 }
2793 if (skip_call) {
2794 return VK_FALSE;
2795 }
2796 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2797 ->GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
2798 return result;
2799}
2800#endif // VK_USE_PLATFORM_WIN32_KHR
2801
2802#ifdef VK_USE_PLATFORM_XCB_KHR
2803VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
2804 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2805 bool skip_call = false;
2806 {
2807 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002808 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01827);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002809 }
2810 if (skip_call) {
2811 return VK_ERROR_VALIDATION_FAILED_EXT;
2812 }
2813 VkResult result =
2814 get_dispatch_table(ot_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2815 {
2816 std::lock_guard<std::mutex> lock(global_lock);
2817 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002818 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002819 }
2820 }
2821 return result;
2822}
2823
2824VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2825 uint32_t queueFamilyIndex, xcb_connection_t *connection,
2826 xcb_visualid_t visual_id) {
2827 bool skip_call = false;
2828 {
2829 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002830 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2831 VALIDATION_ERROR_01902);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002832 }
2833 if (skip_call) {
2834 return VK_FALSE;
2835 }
2836 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2837 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
2838 return result;
2839}
2840#endif // VK_USE_PLATFORM_XCB_KHR
2841
2842#ifdef VK_USE_PLATFORM_XLIB_KHR
2843VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
2844 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2845 bool skip_call = false;
2846 {
2847 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002848 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01836);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002849 }
2850 if (skip_call) {
2851 return VK_ERROR_VALIDATION_FAILED_EXT;
2852 }
2853 VkResult result =
2854 get_dispatch_table(ot_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2855 {
2856 std::lock_guard<std::mutex> lock(global_lock);
2857 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002858 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002859 }
2860 }
2861 return result;
2862}
2863
2864VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2865 uint32_t queueFamilyIndex, Display *dpy,
2866 VisualID visualID) {
2867 bool skip_call = false;
2868 {
2869 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002870 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2871 VALIDATION_ERROR_01905);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002872 }
2873 if (skip_call) {
2874 return VK_FALSE;
2875 }
2876 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2877 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
2878 return result;
2879}
2880#endif // VK_USE_PLATFORM_XLIB_KHR
2881
2882#ifdef VK_USE_PLATFORM_MIR_KHR
2883VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
2884 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2885 bool skip_call = false;
2886 {
2887 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002888 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01802);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002889 }
2890 if (skip_call) {
2891 return VK_ERROR_VALIDATION_FAILED_EXT;
2892 }
2893 VkResult result =
2894 get_dispatch_table(ot_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2895 {
2896 std::lock_guard<std::mutex> lock(global_lock);
2897 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002898 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002899 }
2900 }
2901 return result;
2902}
2903
2904VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2905 uint32_t queueFamilyIndex, MirConnection *connection) {
2906 bool skip_call = false;
2907 {
2908 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002909 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2910 VALIDATION_ERROR_01894);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002911 }
2912 if (skip_call) {
2913 return VK_FALSE;
2914 }
2915 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2916 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
2917 return result;
2918}
2919#endif // VK_USE_PLATFORM_MIR_KHR
2920
2921#ifdef VK_USE_PLATFORM_WAYLAND_KHR
2922VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
2923 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2924 bool skip_call = false;
2925 {
2926 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002927 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01811);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002928 }
2929 if (skip_call) {
2930 return VK_ERROR_VALIDATION_FAILED_EXT;
2931 }
2932 VkResult result =
2933 get_dispatch_table(ot_instance_table_map, instance)->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2934 {
2935 std::lock_guard<std::mutex> lock(global_lock);
2936 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002937 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002938 }
2939 }
2940 return result;
2941}
2942
2943VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2944 uint32_t queueFamilyIndex,
2945 struct wl_display *display) {
2946 bool skip_call = false;
2947 {
2948 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002949 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2950 VALIDATION_ERROR_01897);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002951 }
2952 if (skip_call) {
2953 return VK_FALSE;
2954 }
2955 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2956 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
2957 return result;
2958}
2959#endif // VK_USE_PLATFORM_WAYLAND_KHR
2960
2961#ifdef VK_USE_PLATFORM_ANDROID_KHR
2962VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
2963 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2964 bool skip_call = false;
2965 {
2966 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002967 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01794);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002968 }
2969 if (skip_call) {
2970 return VK_ERROR_VALIDATION_FAILED_EXT;
2971 }
2972 VkResult result =
2973 get_dispatch_table(ot_instance_table_map, instance)->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2974 {
2975 std::lock_guard<std::mutex> lock(global_lock);
2976 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002977 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002978 }
2979 }
2980 return result;
2981}
2982#endif // VK_USE_PLATFORM_ANDROID_KHR
2983
Mark Youngead9b932016-09-08 12:28:38 -06002984VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
2985 const VkSwapchainCreateInfoKHR *pCreateInfos,
2986 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
2987 bool skip_call = false;
2988 uint32_t i = 0;
2989 {
2990 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002991 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01943);
Mark Youngead9b932016-09-08 12:28:38 -06002992 if (NULL != pCreateInfos) {
2993 for (i = 0; i < swapchainCount; i++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002994 skip_call |= ValidateObject(device, pCreateInfos[i].oldSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT,
2995 true, VALIDATION_ERROR_01935);
Mark Youngead9b932016-09-08 12:28:38 -06002996 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002997 skip_call |= ValidateObject(device_data->physical_device, pCreateInfos[i].surface,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002998 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01926);
Mark Youngead9b932016-09-08 12:28:38 -06002999 }
3000 }
3001 }
3002 if (skip_call) {
3003 return VK_ERROR_VALIDATION_FAILED_EXT;
3004 }
3005 VkResult result =
3006 get_dispatch_table(ot_device_table_map, device)->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
3007 {
3008 std::lock_guard<std::mutex> lock(global_lock);
3009 if (result == VK_SUCCESS) {
3010 for (i = 0; i < swapchainCount; i++) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003011 CreateObject(device, pSwapchains[i], VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Youngead9b932016-09-08 12:28:38 -06003012 }
3013 }
3014 }
3015 return result;
3016}
3017
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003018VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
3019 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
3020 const VkAllocationCallbacks *pAllocator,
3021 VkDebugReportCallbackEXT *pCallback) {
3022 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3023 VkResult result = pInstanceTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback);
3024 if (VK_SUCCESS == result) {
3025 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3026 result = layer_create_msg_callback(instance_data->report_data, false, pCreateInfo, pAllocator, pCallback);
Chris Forbesfeecd402016-09-29 14:53:50 +13003027 CreateObject(instance, *pCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003028 }
3029 return result;
3030}
3031
3032VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
3033 const VkAllocationCallbacks *pAllocator) {
3034 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3035 pInstanceTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
3036 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3037 layer_destroy_msg_callback(instance_data->report_data, msgCallback, pAllocator);
Mike Schuchardt3796a882016-12-06 18:03:56 -07003038 DestroyObject(instance, msgCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator, VALIDATION_ERROR_02049,
3039 VALIDATION_ERROR_02050);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003040}
3041
3042VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
3043 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
3044 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
3045 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3046 pInstanceTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
3047}
3048
3049static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
3050
3051static const VkLayerProperties globalLayerProps = {"VK_LAYER_LUNARG_object_tracker",
3052 VK_LAYER_API_VERSION, // specVersion
3053 1, // implementationVersion
3054 "LunarG Validation Layer"};
3055
3056VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
3057 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
3058}
3059
3060VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
3061 VkLayerProperties *pProperties) {
3062 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
3063}
3064
3065VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
3066 VkExtensionProperties *pProperties) {
3067 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3068 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
3069
3070 return VK_ERROR_LAYER_NOT_PRESENT;
3071}
3072
3073VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
3074 uint32_t *pCount, VkExtensionProperties *pProperties) {
3075 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3076 return util_GetExtensionProperties(0, nullptr, pCount, pProperties);
3077
3078 assert(physicalDevice);
3079 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, physicalDevice);
3080 return pTable->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
3081}
3082
3083static inline PFN_vkVoidFunction InterceptMsgCallbackGetProcAddrCommand(const char *name, VkInstance instance) {
3084 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3085 return debug_report_get_instance_proc_addr(instance_data->report_data, name);
3086}
3087
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003088VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3089 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface);
3090
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003091static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
3092 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, instance);
3093 if (instanceExtMap.size() == 0 || !instanceExtMap[pTable].wsi_enabled)
3094 return nullptr;
3095
3096 if (!strcmp("vkDestroySurfaceKHR", name))
3097 return reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR);
3098 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name))
3099 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR);
3100 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name))
3101 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR);
3102 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name))
3103 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR);
3104 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name))
3105 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR);
Norbert Nopper1dec9a52016-11-25 07:55:13 +01003106 if ((instanceExtMap[pTable].display_enabled == true) && !strcmp("vkCreateDisplayPlaneSurfaceKHR", name))
3107 return reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003108
3109#ifdef VK_USE_PLATFORM_WIN32_KHR
3110 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
3111 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
3112 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name))
3113 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR);
3114#endif // VK_USE_PLATFORM_WIN32_KHR
3115#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003116 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003117 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003118 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003119 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
3120#endif // VK_USE_PLATFORM_XCB_KHR
3121#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003122 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003123 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003124 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003125 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
3126#endif // VK_USE_PLATFORM_XLIB_KHR
3127#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003128 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003129 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003130 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003131 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
3132#endif // VK_USE_PLATFORM_MIR_KHR
3133#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003134 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003135 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003136 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003137 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
3138#endif // VK_USE_PLATFORM_WAYLAND_KHR
3139#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003140 if ((instanceExtMap[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003141 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
3142#endif // VK_USE_PLATFORM_ANDROID_KHR
3143
3144 return nullptr;
3145}
3146
3147static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
3148 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3149 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06003150 device_data->wsi_display_swapchain_enabled = false;
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003151 device_data->wsi_display_extension_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06003152 device_data->objtrack_extensions_enabled = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003153
3154 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3155 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
3156 device_data->wsi_enabled = true;
3157 }
Mark Youngead9b932016-09-08 12:28:38 -06003158 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
3159 device_data->wsi_display_swapchain_enabled = true;
3160 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003161 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
3162 device_data->wsi_display_extension_enabled = true;
3163 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003164 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], "OBJTRACK_EXTENSIONS") == 0) {
3165 device_data->objtrack_extensions_enabled = true;
3166 }
3167 }
3168}
3169
3170static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
3171 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(ot_instance_table_map, instance);
3172
3173
3174 instanceExtMap[pDisp] = {};
3175
3176 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3177 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
3178 instanceExtMap[pDisp].wsi_enabled = true;
3179 }
Norbert Nopper1dec9a52016-11-25 07:55:13 +01003180 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
3181 instanceExtMap[pDisp].display_enabled = true;
3182 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003183#ifdef VK_USE_PLATFORM_XLIB_KHR
3184 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
3185 instanceExtMap[pDisp].xlib_enabled = true;
3186 }
3187#endif
3188#ifdef VK_USE_PLATFORM_XCB_KHR
3189 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
3190 instanceExtMap[pDisp].xcb_enabled = true;
3191 }
3192#endif
3193#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3194 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
3195 instanceExtMap[pDisp].wayland_enabled = true;
3196 }
3197#endif
3198#ifdef VK_USE_PLATFORM_MIR_KHR
3199 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
3200 instanceExtMap[pDisp].mir_enabled = true;
3201 }
3202#endif
3203#ifdef VK_USE_PLATFORM_ANDROID_KHR
3204 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
3205 instanceExtMap[pDisp].android_enabled = true;
3206 }
3207#endif
3208#ifdef VK_USE_PLATFORM_WIN32_KHR
3209 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
3210 instanceExtMap[pDisp].win32_enabled = true;
3211 }
3212#endif
3213 }
3214}
3215
3216VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
3217 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
3218 std::lock_guard<std::mutex> lock(global_lock);
3219 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3220 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3221
3222 assert(chain_info->u.pLayerInfo);
3223 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3224 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
3225 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(phy_dev_data->instance, "vkCreateDevice");
3226 if (fpCreateDevice == 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 = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
3234 if (result != VK_SUCCESS) {
3235 return result;
3236 }
3237
3238 layer_data *device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
3239 device_data->report_data = layer_debug_report_create_device(phy_dev_data->report_data, *pDevice);
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003240 layer_init_device_dispatch_table(*pDevice, &device_data->dispatch_table, fpGetDeviceProcAddr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003241
3242 // Add link back to physDev
3243 device_data->physical_device = physicalDevice;
3244
3245 initDeviceTable(*pDevice, fpGetDeviceProcAddr, ot_device_table_map);
3246
3247 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
Chris Forbesfeecd402016-09-29 14:53:50 +13003248 CreateObject(*pDevice, *pDevice, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003249
3250 return result;
3251}
3252
3253VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3254 uint32_t *pQueueFamilyPropertyCount,
3255 VkQueueFamilyProperties *pQueueFamilyProperties) {
3256 get_dispatch_table(ot_instance_table_map, physicalDevice)
3257 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
3258 std::lock_guard<std::mutex> lock(global_lock);
3259 if (pQueueFamilyProperties != NULL) {
3260 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3261 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
3262 instance_data->queue_family_properties.emplace_back(pQueueFamilyProperties[i]);
3263 }
3264 }
3265}
3266
3267VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3268 VkInstance *pInstance) {
3269 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3270
3271 assert(chain_info->u.pLayerInfo);
3272 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3273 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
3274 if (fpCreateInstance == NULL) {
3275 return VK_ERROR_INITIALIZATION_FAILED;
3276 }
3277
3278 // Advance the link info for the next element on the chain
3279 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3280
3281 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
3282 if (result != VK_SUCCESS) {
3283 return result;
3284 }
3285
3286 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
3287 instance_data->instance = *pInstance;
3288 initInstanceTable(*pInstance, fpGetInstanceProcAddr, ot_instance_table_map);
3289 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, *pInstance);
3290
3291 // Look for one or more debug report create info structures, and copy the
3292 // callback(s) for each one found (for use by vkDestroyInstance)
3293 layer_copy_tmp_callbacks(pCreateInfo->pNext, &instance_data->num_tmp_callbacks, &instance_data->tmp_dbg_create_infos,
3294 &instance_data->tmp_callbacks);
3295
3296 instance_data->report_data = debug_report_create_instance(pInstanceTable, *pInstance, pCreateInfo->enabledExtensionCount,
3297 pCreateInfo->ppEnabledExtensionNames);
3298
3299 InitObjectTracker(instance_data, pAllocator);
3300 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
3301
Chris Forbesfeecd402016-09-29 14:53:50 +13003302 CreateObject(*pInstance, *pInstance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003303
3304 return result;
3305}
3306
3307VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
3308 VkPhysicalDevice *pPhysicalDevices) {
3309 bool skip_call = VK_FALSE;
3310 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003311 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_00023);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003312 lock.unlock();
3313 if (skip_call) {
3314 return VK_ERROR_VALIDATION_FAILED_EXT;
3315 }
3316 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
3317 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
3318 lock.lock();
3319 if (result == VK_SUCCESS) {
3320 if (pPhysicalDevices) {
3321 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003322 CreateObject(instance, pPhysicalDevices[i], VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003323 }
3324 }
3325 }
3326 lock.unlock();
3327 return result;
3328}
3329
3330VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
3331 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003332 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00062);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003333 lock.unlock();
3334
3335 get_dispatch_table(ot_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
3336
3337 lock.lock();
3338
3339 CreateQueue(device, *pQueue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT);
3340 AddQueueInfo(device, queueFamilyIndex, *pQueue);
3341}
3342
3343VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Tobin Ehlis02337352016-10-20 14:42:57 -06003344 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003345 std::unique_lock<std::mutex> lock(global_lock);
Tobin Ehlis02337352016-10-20 14:42:57 -06003346 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00621);
3347 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, true, VALIDATION_ERROR_00622);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003348 lock.unlock();
Tobin Ehlis02337352016-10-20 14:42:57 -06003349 if (!skip) {
3350 get_dispatch_table(ot_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003351
Tobin Ehlis02337352016-10-20 14:42:57 -06003352 lock.lock();
Mike Schuchardt3796a882016-12-06 18:03:56 -07003353 DestroyObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator, VALIDATION_ERROR_UNDEFINED,
3354 VALIDATION_ERROR_UNDEFINED);
Tobin Ehlis02337352016-10-20 14:42:57 -06003355 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003356}
3357
3358VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
3359 VkMemoryMapFlags flags, void **ppData) {
3360 bool skip_call = VK_FALSE;
3361 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultz259ddb22016-10-27 13:29:19 -06003362 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00630);
3363 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00631);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003364 lock.unlock();
3365 if (skip_call == VK_TRUE) {
3366 return VK_ERROR_VALIDATION_FAILED_EXT;
3367 }
3368 VkResult result = get_dispatch_table(ot_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
3369 return result;
3370}
3371
3372VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
3373 bool skip_call = VK_FALSE;
3374 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003375 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00650);
Karl Schultz259ddb22016-10-27 13:29:19 -06003376 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00651);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003377 lock.unlock();
3378 if (skip_call == VK_TRUE) {
3379 return;
3380 }
3381
3382 get_dispatch_table(ot_device_table_map, device)->UnmapMemory(device, memory);
3383}
3384VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
3385 VkFence fence) {
3386 std::unique_lock<std::mutex> lock(global_lock);
3387 ValidateQueueFlags(queue, "QueueBindSparse");
3388
3389 for (uint32_t i = 0; i < bindInfoCount; i++) {
3390 for (uint32_t j = 0; j < pBindInfo[i].bufferBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003391 ValidateObject(queue, pBindInfo[i].pBufferBinds[j].buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false,
3392 VALIDATION_ERROR_01656);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003393 for (uint32_t j = 0; j < pBindInfo[i].imageOpaqueBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003394 ValidateObject(queue, pBindInfo[i].pImageOpaqueBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
3395 VALIDATION_ERROR_01657);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003396 for (uint32_t j = 0; j < pBindInfo[i].imageBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003397 ValidateObject(queue, pBindInfo[i].pImageBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
3398 VALIDATION_ERROR_01658);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003399 }
3400 lock.unlock();
3401
3402 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
3403 return result;
3404}
3405
3406VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3407 VkCommandBuffer *pCommandBuffers) {
3408 bool skip_call = VK_FALSE;
3409 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003410 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00084);
3411 skip_call |= ValidateObject(device, pAllocateInfo->commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false,
3412 VALIDATION_ERROR_00090);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003413 lock.unlock();
3414
3415 if (skip_call) {
3416 return VK_ERROR_VALIDATION_FAILED_EXT;
3417 }
3418
3419 VkResult result =
3420 get_dispatch_table(ot_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3421
3422 lock.lock();
3423 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {
3424 AllocateCommandBuffer(device, pAllocateInfo->commandPool, pCommandBuffers[i],
3425 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, pAllocateInfo->level);
3426 }
3427 lock.unlock();
3428
3429 return result;
3430}
3431
3432VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3433 VkDescriptorSet *pDescriptorSets) {
3434 bool skip_call = VK_FALSE;
3435 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003436 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00908);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003437 skip_call |= ValidateObject(device, pAllocateInfo->descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false,
3438 VALIDATION_ERROR_00915);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003439 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003440 skip_call |= ValidateObject(device, pAllocateInfo->pSetLayouts[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT,
3441 false, VALIDATION_ERROR_00916);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003442 }
3443 lock.unlock();
3444 if (skip_call) {
3445 return VK_ERROR_VALIDATION_FAILED_EXT;
3446 }
3447
3448 VkResult result =
3449 get_dispatch_table(ot_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3450
3451 if (VK_SUCCESS == result) {
3452 lock.lock();
3453 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
3454 AllocateDescriptorSet(device, pAllocateInfo->descriptorPool, pDescriptorSets[i],
3455 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
3456 }
3457 lock.unlock();
3458 }
3459
3460 return result;
3461}
3462
3463VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
3464 const VkCommandBuffer *pCommandBuffers) {
3465 bool skip_call = false;
3466 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003467 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false, VALIDATION_ERROR_00099);
3468 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00098);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003469 for (uint32_t i = 0; i < commandBufferCount; i++) {
3470 skip_call |= ValidateCommandBuffer(device, commandPool, pCommandBuffers[i]);
3471 }
3472
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003473 for (uint32_t i = 0; i < commandBufferCount; i++) {
Mike Schuchardt3796a882016-12-06 18:03:56 -07003474 DestroyObject(device, pCommandBuffers[i], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr,
3475 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003476 }
3477
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003478 lock.unlock();
3479 if (!skip_call) {
3480 get_dispatch_table(ot_device_table_map, device)
3481 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
3482 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003483}
3484VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
3485 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3486 std::unique_lock<std::mutex> lock(global_lock);
3487 // A swapchain's images are implicitly deleted when the swapchain is deleted.
3488 // Remove this swapchain's images from our map of such images.
3489 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr = device_data->swapchainImageMap.begin();
3490 while (itr != device_data->swapchainImageMap.end()) {
3491 OBJTRACK_NODE *pNode = (*itr).second;
3492 if (pNode->parent_object == reinterpret_cast<uint64_t &>(swapchain)) {
3493 delete pNode;
3494 auto delete_item = itr++;
3495 device_data->swapchainImageMap.erase(delete_item);
3496 } else {
3497 ++itr;
3498 }
3499 }
Mike Schuchardt3796a882016-12-06 18:03:56 -07003500 DestroyObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator, VALIDATION_ERROR_01938,
3501 VALIDATION_ERROR_01939);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003502 lock.unlock();
3503
3504 get_dispatch_table(ot_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
3505}
3506
3507VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
3508 const VkDescriptorSet *pDescriptorSets) {
3509 bool skip_call = false;
3510 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3511 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003512 skip_call |=
3513 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false, VALIDATION_ERROR_00924);
3514 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00923);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003515 for (uint32_t i = 0; i < descriptorSetCount; i++) {
3516 skip_call |= ValidateDescriptorSet(device, descriptorPool, pDescriptorSets[i]);
3517 }
3518
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003519 for (uint32_t i = 0; i < descriptorSetCount; i++) {
Mike Schuchardt3796a882016-12-06 18:03:56 -07003520 DestroyObject(device, pDescriptorSets[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr,
3521 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003522 }
3523
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003524 lock.unlock();
3525 if (!skip_call) {
3526 result = get_dispatch_table(ot_device_table_map, device)
3527 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
3528 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003529 return result;
3530}
3531
3532VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3533 const VkAllocationCallbacks *pAllocator) {
3534 bool skip_call = VK_FALSE;
3535 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3536 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003537 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00904);
3538 skip_call |=
3539 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, true, VALIDATION_ERROR_00905);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003540 lock.unlock();
3541 if (skip_call) {
3542 return;
3543 }
3544 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is deleted.
3545 // Remove this pool's descriptor sets from our descriptorSet map.
3546 lock.lock();
3547 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr =
3548 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
3549 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
3550 OBJTRACK_NODE *pNode = (*itr).second;
3551 auto del_itr = itr++;
3552 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
Mike Schuchardt3796a882016-12-06 18:03:56 -07003553 DestroyObject(device, (VkDescriptorSet)((*del_itr).first), VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr,
3554 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003555 }
3556 }
Mike Schuchardt3796a882016-12-06 18:03:56 -07003557 DestroyObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator, VALIDATION_ERROR_00902,
3558 VALIDATION_ERROR_00903);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003559 lock.unlock();
3560 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
3561}
3562
3563VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3564 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3565 bool skip_call = false;
3566 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003567 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00080);
3568 skip_call |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, true, VALIDATION_ERROR_00081);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003569 lock.unlock();
3570 if (skip_call) {
3571 return;
3572 }
3573 lock.lock();
3574 // A CommandPool's command buffers are implicitly deleted when the pool is deleted.
3575 // Remove this pool's cmdBuffers from our cmd buffer map.
3576 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].begin();
3577 auto del_itr = itr;
3578 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
3579 OBJTRACK_NODE *pNode = (*itr).second;
3580 del_itr = itr++;
3581 if (pNode->parent_object == reinterpret_cast<uint64_t &>(commandPool)) {
3582 skip_call |= ValidateCommandBuffer(device, commandPool, reinterpret_cast<VkCommandBuffer>((*del_itr).first));
Chris Forbesec461992016-09-29 14:41:44 +13003583 DestroyObject(device, reinterpret_cast<VkCommandBuffer>((*del_itr).first),
Mike Schuchardt3796a882016-12-06 18:03:56 -07003584 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr, VALIDATION_ERROR_UNDEFINED,
3585 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003586 }
3587 }
Mike Schuchardt3796a882016-12-06 18:03:56 -07003588 DestroyObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator, VALIDATION_ERROR_00078,
3589 VALIDATION_ERROR_00079);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003590 lock.unlock();
3591 get_dispatch_table(ot_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
3592}
3593
3594VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
3595 VkImage *pSwapchainImages) {
3596 bool skip_call = VK_FALSE;
3597 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003598 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01948);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003599 lock.unlock();
3600 if (skip_call) {
3601 return VK_ERROR_VALIDATION_FAILED_EXT;
3602 }
3603 VkResult result = get_dispatch_table(ot_device_table_map, device)
3604 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
3605 if (pSwapchainImages != NULL) {
3606 lock.lock();
3607 for (uint32_t i = 0; i < *pSwapchainImageCount; i++) {
3608 CreateSwapchainImageObject(device, pSwapchainImages[i], swapchain);
3609 }
3610 lock.unlock();
3611 }
3612 return result;
3613}
3614
3615VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3616 const VkGraphicsPipelineCreateInfo *pCreateInfos,
3617 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3618 bool skip_call = VK_FALSE;
3619 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003620 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00519);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003621 if (pCreateInfos) {
3622 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3623 if (pCreateInfos[idx0].basePipelineHandle) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003624 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3625 true, VALIDATION_ERROR_00529);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003626 }
3627 if (pCreateInfos[idx0].layout) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003628 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
3629 false, VALIDATION_ERROR_00546);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003630 }
3631 if (pCreateInfos[idx0].pStages) {
3632 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
3633 if (pCreateInfos[idx0].pStages[idx1].module) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003634 skip_call |= ValidateObject(device, pCreateInfos[idx0].pStages[idx1].module,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003635 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false, VALIDATION_ERROR_00515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003636 }
3637 }
3638 }
3639 if (pCreateInfos[idx0].renderPass) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003640 skip_call |= ValidateObject(device, pCreateInfos[idx0].renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,
3641 false, VALIDATION_ERROR_00547);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003642 }
3643 }
3644 }
3645 if (pipelineCache) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06003646 skip_call |=
3647 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00520);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003648 }
3649 lock.unlock();
3650 if (skip_call) {
Chris Forbes8d24dc92016-11-30 14:56:52 +13003651 for (uint32_t i = 0; i < createInfoCount; i++) {
3652 pPipelines[i] = VK_NULL_HANDLE;
3653 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003654 return VK_ERROR_VALIDATION_FAILED_EXT;
3655 }
3656 VkResult result = get_dispatch_table(ot_device_table_map, device)
3657 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3658 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01003659 for (uint32_t idx2 = 0; idx2 < createInfoCount; ++idx2) {
3660 if (pPipelines[idx2] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003661 CreateObject(device, pPipelines[idx2], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003662 }
3663 }
3664 lock.unlock();
3665 return result;
3666}
3667
3668VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3669 const VkComputePipelineCreateInfo *pCreateInfos,
3670 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3671 bool skip_call = VK_FALSE;
3672 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003673 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00486);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003674 if (pCreateInfos) {
3675 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3676 if (pCreateInfos[idx0].basePipelineHandle) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003677 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3678 true, VALIDATION_ERROR_00496);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003679 }
3680 if (pCreateInfos[idx0].layout) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003681 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
3682 false, VALIDATION_ERROR_00505);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003683 }
3684 if (pCreateInfos[idx0].stage.module) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003685 skip_call |= ValidateObject(device, pCreateInfos[idx0].stage.module, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT,
3686 false, VALIDATION_ERROR_00515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003687 }
3688 }
3689 }
3690 if (pipelineCache) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06003691 skip_call |=
3692 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00487);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003693 }
3694 lock.unlock();
3695 if (skip_call) {
Chris Forbes8d24dc92016-11-30 14:56:52 +13003696 for (uint32_t i = 0; i < createInfoCount; i++) {
3697 pPipelines[i] = VK_NULL_HANDLE;
3698 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003699 return VK_ERROR_VALIDATION_FAILED_EXT;
3700 }
3701 VkResult result = get_dispatch_table(ot_device_table_map, device)
3702 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3703 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01003704 for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
3705 if (pPipelines[idx1] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003706 CreateObject(device, pPipelines[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003707 }
3708 }
3709 lock.unlock();
3710 return result;
3711}
3712
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003713// VK_EXT_debug_marker Extension
3714VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
3715 bool skip_call = VK_FALSE;
3716 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003717 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_02007);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003718 lock.unlock();
3719 if (skip_call) {
3720 return VK_ERROR_VALIDATION_FAILED_EXT;
3721 }
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003722 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3723 VkResult result = VK_SUCCESS;
3724 if (dev_data->dispatch_table.DebugMarkerSetObjectTagEXT) {
3725 result = dev_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
3726 }
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003727 return result;
3728}
3729
3730VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
3731 bool skip_call = VK_FALSE;
3732 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003733 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01999);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003734 lock.unlock();
3735 if (skip_call) {
3736 return VK_ERROR_VALIDATION_FAILED_EXT;
3737 }
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003738 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3739 VkResult result = VK_SUCCESS;
3740 if (dev_data->dispatch_table.DebugMarkerSetObjectNameEXT) {
3741 result = dev_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
3742 }
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003743 return result;
3744}
3745
3746VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3747 bool skip_call = VK_FALSE;
3748 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003749 skip_call |=
3750 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02014);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003751 lock.unlock();
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003752 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3753 if (!skip_call && dev_data->dispatch_table.CmdDebugMarkerBeginEXT) {
3754 dev_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003755 }
3756}
3757
3758VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerEndEXT(VkCommandBuffer commandBuffer) {
3759 bool skip_call = VK_FALSE;
3760 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003761 skip_call |=
3762 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02022);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003763 lock.unlock();
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003764 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3765 if (!skip_call && dev_data->dispatch_table.CmdDebugMarkerEndEXT) {
3766 dev_data->dispatch_table.CmdDebugMarkerEndEXT(commandBuffer);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003767 }
3768}
3769
3770VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3771 bool skip_call = VK_FALSE;
3772 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003773 skip_call |=
3774 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02025);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003775 lock.unlock();
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003776 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3777 if (!skip_call && dev_data->dispatch_table.CmdDebugMarkerInsertEXT) {
3778 dev_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003779 }
3780}
3781
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003782// VK_NV_external_memory_capabilities Extension
3783VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
3784 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
3785 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
3786 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
3787
3788 bool skip_call = false;
3789 {
3790 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003791 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3792 VALIDATION_ERROR_01980);
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003793 }
3794 if (skip_call) {
3795 return VK_ERROR_VALIDATION_FAILED_EXT;
3796 }
3797 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3798 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
3799 externalHandleType, pExternalImageFormatProperties);
3800 return result;
3801}
3802
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003803// VK_KHR_display Extension
3804VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
3805 VkDisplayPropertiesKHR *pProperties) {
3806 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3807 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003808 {
3809 std::unique_lock<std::mutex> lock(global_lock);
3810 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3811 VALIDATION_ERROR_01851);
3812 }
3813 if (!skip) {
3814 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3815 ->GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
3816 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003817 return result;
3818}
3819
3820VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
3821 VkDisplayPlanePropertiesKHR *pProperties) {
3822 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3823 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003824 {
3825 std::unique_lock<std::mutex> lock(global_lock);
3826 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3827 VALIDATION_ERROR_01854);
3828 }
3829 if (!skip) {
3830 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3831 ->GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
3832 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003833 return result;
3834}
3835
3836VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
3837 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
3838 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3839 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003840 {
3841 std::unique_lock<std::mutex> lock(global_lock);
3842 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3843 VALIDATION_ERROR_01858);
3844 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003845 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3846 ->GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003847 if (((result == VK_SUCCESS) || (result == VK_INCOMPLETE)) && (pDisplays != NULL)) {
3848 std::lock_guard<std::mutex> lock(global_lock);
3849 for (uint32_t displays = 0; displays < *pDisplayCount; displays++) {
3850 CreateObject(physicalDevice, pDisplays[displays], VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, nullptr);
3851 }
3852 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003853 return result;
3854}
3855
3856VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3857 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
3858 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3859 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003860 {
3861 std::unique_lock<std::mutex> lock(global_lock);
3862 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3863 VALIDATION_ERROR_01861);
3864 skip |= ValidateObject(physicalDevice, display, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, false,
3865 VALIDATION_ERROR_01862);
3866 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003867 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3868 ->GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
3869
3870 return result;
3871}
3872
3873VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3874 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3875 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
3876 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3877 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003878 {
3879 std::unique_lock<std::mutex> lock(global_lock);
3880 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3881 VALIDATION_ERROR_01865);
3882 skip |= ValidateObject(physicalDevice, display, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, false,
3883 VALIDATION_ERROR_01866);
3884 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003885 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3886 ->CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003887 {
3888 std::lock_guard<std::mutex> lock(global_lock);
3889 if (result == VK_SUCCESS) {
3890 CreateObject(physicalDevice, *pMode, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT, pAllocator);
3891 }
3892 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003893 return result;
3894}
3895
3896VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
3897 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
3898 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3899 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003900 {
3901 std::unique_lock<std::mutex> lock(global_lock);
3902 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3903 VALIDATION_ERROR_01875);
3904 skip |= ValidateObject(physicalDevice, mode, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT, false,
3905 VALIDATION_ERROR_01876);
3906 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003907 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3908 ->GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
3909
3910 return result;
3911}
3912
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003913VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3914 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
3915 bool skip_call = false;
3916 {
3917 std::lock_guard<std::mutex> lock(global_lock);
3918 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01878);
3919 }
3920 if (skip_call) {
3921 return VK_ERROR_VALIDATION_FAILED_EXT;
3922 }
3923 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
3924 ->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
3925 {
3926 std::lock_guard<std::mutex> lock(global_lock);
3927 if (result == VK_SUCCESS) {
3928 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
3929 }
3930 }
3931 return result;
3932}
3933
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003934#ifdef VK_USE_PLATFORM_WIN32_KHR
3935// VK_NV_external_memory_win32 Extension
3936VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
3937 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
3938 bool skip_call = VK_FALSE;
3939 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003940 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01725);
3941 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_01726);
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003942 lock.unlock();
3943 if (skip_call) {
3944 return VK_ERROR_VALIDATION_FAILED_EXT;
3945 }
3946 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
3947 return result;
3948}
3949#endif // VK_USE_PLATFORM_WIN32_KHR
3950
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003951// VK_AMD_draw_indirect_count Extension
3952VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3953 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3954 uint32_t stride) {
3955 bool skip_call = VK_FALSE;
3956 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003957 skip_call |=
3958 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01771);
3959 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01772);
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003960 lock.unlock();
3961 if (!skip_call) {
3962 get_dispatch_table(ot_device_table_map, commandBuffer)
3963 ->CmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3964 }
3965}
3966
3967VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3968 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3969 uint32_t maxDrawCount, uint32_t stride) {
3970 bool skip_call = VK_FALSE;
3971 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003972 skip_call |=
3973 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01783);
3974 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01784);
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003975 lock.unlock();
3976 if (!skip_call) {
3977 get_dispatch_table(ot_device_table_map, commandBuffer)
3978 ->CmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3979 }
3980}
3981
3982
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003983static inline PFN_vkVoidFunction InterceptCoreDeviceCommand(const char *name) {
3984 if (!name || name[0] != 'v' || name[1] != 'k')
3985 return NULL;
3986
3987 name += 2;
3988 if (!strcmp(name, "GetDeviceProcAddr"))
3989 return (PFN_vkVoidFunction)GetDeviceProcAddr;
3990 if (!strcmp(name, "DestroyDevice"))
3991 return (PFN_vkVoidFunction)DestroyDevice;
3992 if (!strcmp(name, "GetDeviceQueue"))
3993 return (PFN_vkVoidFunction)GetDeviceQueue;
3994 if (!strcmp(name, "QueueSubmit"))
3995 return (PFN_vkVoidFunction)QueueSubmit;
3996 if (!strcmp(name, "QueueWaitIdle"))
3997 return (PFN_vkVoidFunction)QueueWaitIdle;
3998 if (!strcmp(name, "DeviceWaitIdle"))
3999 return (PFN_vkVoidFunction)DeviceWaitIdle;
4000 if (!strcmp(name, "AllocateMemory"))
4001 return (PFN_vkVoidFunction)AllocateMemory;
4002 if (!strcmp(name, "FreeMemory"))
4003 return (PFN_vkVoidFunction)FreeMemory;
4004 if (!strcmp(name, "MapMemory"))
4005 return (PFN_vkVoidFunction)MapMemory;
4006 if (!strcmp(name, "UnmapMemory"))
4007 return (PFN_vkVoidFunction)UnmapMemory;
4008 if (!strcmp(name, "FlushMappedMemoryRanges"))
4009 return (PFN_vkVoidFunction)FlushMappedMemoryRanges;
4010 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
4011 return (PFN_vkVoidFunction)InvalidateMappedMemoryRanges;
4012 if (!strcmp(name, "GetDeviceMemoryCommitment"))
4013 return (PFN_vkVoidFunction)GetDeviceMemoryCommitment;
4014 if (!strcmp(name, "BindBufferMemory"))
4015 return (PFN_vkVoidFunction)BindBufferMemory;
4016 if (!strcmp(name, "BindImageMemory"))
4017 return (PFN_vkVoidFunction)BindImageMemory;
4018 if (!strcmp(name, "GetBufferMemoryRequirements"))
4019 return (PFN_vkVoidFunction)GetBufferMemoryRequirements;
4020 if (!strcmp(name, "GetImageMemoryRequirements"))
4021 return (PFN_vkVoidFunction)GetImageMemoryRequirements;
4022 if (!strcmp(name, "GetImageSparseMemoryRequirements"))
4023 return (PFN_vkVoidFunction)GetImageSparseMemoryRequirements;
4024 if (!strcmp(name, "QueueBindSparse"))
4025 return (PFN_vkVoidFunction)QueueBindSparse;
4026 if (!strcmp(name, "CreateFence"))
4027 return (PFN_vkVoidFunction)CreateFence;
4028 if (!strcmp(name, "DestroyFence"))
4029 return (PFN_vkVoidFunction)DestroyFence;
4030 if (!strcmp(name, "ResetFences"))
4031 return (PFN_vkVoidFunction)ResetFences;
4032 if (!strcmp(name, "GetFenceStatus"))
4033 return (PFN_vkVoidFunction)GetFenceStatus;
4034 if (!strcmp(name, "WaitForFences"))
4035 return (PFN_vkVoidFunction)WaitForFences;
4036 if (!strcmp(name, "CreateSemaphore"))
4037 return (PFN_vkVoidFunction)CreateSemaphore;
4038 if (!strcmp(name, "DestroySemaphore"))
4039 return (PFN_vkVoidFunction)DestroySemaphore;
4040 if (!strcmp(name, "CreateEvent"))
4041 return (PFN_vkVoidFunction)CreateEvent;
4042 if (!strcmp(name, "DestroyEvent"))
4043 return (PFN_vkVoidFunction)DestroyEvent;
4044 if (!strcmp(name, "GetEventStatus"))
4045 return (PFN_vkVoidFunction)GetEventStatus;
4046 if (!strcmp(name, "SetEvent"))
4047 return (PFN_vkVoidFunction)SetEvent;
4048 if (!strcmp(name, "ResetEvent"))
4049 return (PFN_vkVoidFunction)ResetEvent;
4050 if (!strcmp(name, "CreateQueryPool"))
4051 return (PFN_vkVoidFunction)CreateQueryPool;
4052 if (!strcmp(name, "DestroyQueryPool"))
4053 return (PFN_vkVoidFunction)DestroyQueryPool;
4054 if (!strcmp(name, "GetQueryPoolResults"))
4055 return (PFN_vkVoidFunction)GetQueryPoolResults;
4056 if (!strcmp(name, "CreateBuffer"))
4057 return (PFN_vkVoidFunction)CreateBuffer;
4058 if (!strcmp(name, "DestroyBuffer"))
4059 return (PFN_vkVoidFunction)DestroyBuffer;
4060 if (!strcmp(name, "CreateBufferView"))
4061 return (PFN_vkVoidFunction)CreateBufferView;
4062 if (!strcmp(name, "DestroyBufferView"))
4063 return (PFN_vkVoidFunction)DestroyBufferView;
4064 if (!strcmp(name, "CreateImage"))
4065 return (PFN_vkVoidFunction)CreateImage;
4066 if (!strcmp(name, "DestroyImage"))
4067 return (PFN_vkVoidFunction)DestroyImage;
4068 if (!strcmp(name, "GetImageSubresourceLayout"))
4069 return (PFN_vkVoidFunction)GetImageSubresourceLayout;
4070 if (!strcmp(name, "CreateImageView"))
4071 return (PFN_vkVoidFunction)CreateImageView;
4072 if (!strcmp(name, "DestroyImageView"))
4073 return (PFN_vkVoidFunction)DestroyImageView;
4074 if (!strcmp(name, "CreateShaderModule"))
4075 return (PFN_vkVoidFunction)CreateShaderModule;
4076 if (!strcmp(name, "DestroyShaderModule"))
4077 return (PFN_vkVoidFunction)DestroyShaderModule;
4078 if (!strcmp(name, "CreatePipelineCache"))
4079 return (PFN_vkVoidFunction)CreatePipelineCache;
4080 if (!strcmp(name, "DestroyPipelineCache"))
4081 return (PFN_vkVoidFunction)DestroyPipelineCache;
4082 if (!strcmp(name, "GetPipelineCacheData"))
4083 return (PFN_vkVoidFunction)GetPipelineCacheData;
4084 if (!strcmp(name, "MergePipelineCaches"))
4085 return (PFN_vkVoidFunction)MergePipelineCaches;
4086 if (!strcmp(name, "CreateGraphicsPipelines"))
4087 return (PFN_vkVoidFunction)CreateGraphicsPipelines;
4088 if (!strcmp(name, "CreateComputePipelines"))
4089 return (PFN_vkVoidFunction)CreateComputePipelines;
4090 if (!strcmp(name, "DestroyPipeline"))
4091 return (PFN_vkVoidFunction)DestroyPipeline;
4092 if (!strcmp(name, "CreatePipelineLayout"))
4093 return (PFN_vkVoidFunction)CreatePipelineLayout;
4094 if (!strcmp(name, "DestroyPipelineLayout"))
4095 return (PFN_vkVoidFunction)DestroyPipelineLayout;
4096 if (!strcmp(name, "CreateSampler"))
4097 return (PFN_vkVoidFunction)CreateSampler;
4098 if (!strcmp(name, "DestroySampler"))
4099 return (PFN_vkVoidFunction)DestroySampler;
4100 if (!strcmp(name, "CreateDescriptorSetLayout"))
4101 return (PFN_vkVoidFunction)CreateDescriptorSetLayout;
4102 if (!strcmp(name, "DestroyDescriptorSetLayout"))
4103 return (PFN_vkVoidFunction)DestroyDescriptorSetLayout;
4104 if (!strcmp(name, "CreateDescriptorPool"))
4105 return (PFN_vkVoidFunction)CreateDescriptorPool;
4106 if (!strcmp(name, "DestroyDescriptorPool"))
4107 return (PFN_vkVoidFunction)DestroyDescriptorPool;
4108 if (!strcmp(name, "ResetDescriptorPool"))
4109 return (PFN_vkVoidFunction)ResetDescriptorPool;
4110 if (!strcmp(name, "AllocateDescriptorSets"))
4111 return (PFN_vkVoidFunction)AllocateDescriptorSets;
4112 if (!strcmp(name, "FreeDescriptorSets"))
4113 return (PFN_vkVoidFunction)FreeDescriptorSets;
4114 if (!strcmp(name, "UpdateDescriptorSets"))
4115 return (PFN_vkVoidFunction)UpdateDescriptorSets;
4116 if (!strcmp(name, "CreateFramebuffer"))
4117 return (PFN_vkVoidFunction)CreateFramebuffer;
4118 if (!strcmp(name, "DestroyFramebuffer"))
4119 return (PFN_vkVoidFunction)DestroyFramebuffer;
4120 if (!strcmp(name, "CreateRenderPass"))
4121 return (PFN_vkVoidFunction)CreateRenderPass;
4122 if (!strcmp(name, "DestroyRenderPass"))
4123 return (PFN_vkVoidFunction)DestroyRenderPass;
4124 if (!strcmp(name, "GetRenderAreaGranularity"))
4125 return (PFN_vkVoidFunction)GetRenderAreaGranularity;
4126 if (!strcmp(name, "CreateCommandPool"))
4127 return (PFN_vkVoidFunction)CreateCommandPool;
4128 if (!strcmp(name, "DestroyCommandPool"))
4129 return (PFN_vkVoidFunction)DestroyCommandPool;
4130 if (!strcmp(name, "ResetCommandPool"))
4131 return (PFN_vkVoidFunction)ResetCommandPool;
4132 if (!strcmp(name, "AllocateCommandBuffers"))
4133 return (PFN_vkVoidFunction)AllocateCommandBuffers;
4134 if (!strcmp(name, "FreeCommandBuffers"))
4135 return (PFN_vkVoidFunction)FreeCommandBuffers;
4136 if (!strcmp(name, "BeginCommandBuffer"))
4137 return (PFN_vkVoidFunction)BeginCommandBuffer;
4138 if (!strcmp(name, "EndCommandBuffer"))
4139 return (PFN_vkVoidFunction)EndCommandBuffer;
4140 if (!strcmp(name, "ResetCommandBuffer"))
4141 return (PFN_vkVoidFunction)ResetCommandBuffer;
4142 if (!strcmp(name, "CmdBindPipeline"))
4143 return (PFN_vkVoidFunction)CmdBindPipeline;
4144 if (!strcmp(name, "CmdSetViewport"))
4145 return (PFN_vkVoidFunction)CmdSetViewport;
4146 if (!strcmp(name, "CmdSetScissor"))
4147 return (PFN_vkVoidFunction)CmdSetScissor;
4148 if (!strcmp(name, "CmdSetLineWidth"))
4149 return (PFN_vkVoidFunction)CmdSetLineWidth;
4150 if (!strcmp(name, "CmdSetDepthBias"))
4151 return (PFN_vkVoidFunction)CmdSetDepthBias;
4152 if (!strcmp(name, "CmdSetBlendConstants"))
4153 return (PFN_vkVoidFunction)CmdSetBlendConstants;
4154 if (!strcmp(name, "CmdSetDepthBounds"))
4155 return (PFN_vkVoidFunction)CmdSetDepthBounds;
4156 if (!strcmp(name, "CmdSetStencilCompareMask"))
4157 return (PFN_vkVoidFunction)CmdSetStencilCompareMask;
4158 if (!strcmp(name, "CmdSetStencilWriteMask"))
4159 return (PFN_vkVoidFunction)CmdSetStencilWriteMask;
4160 if (!strcmp(name, "CmdSetStencilReference"))
4161 return (PFN_vkVoidFunction)CmdSetStencilReference;
4162 if (!strcmp(name, "CmdBindDescriptorSets"))
4163 return (PFN_vkVoidFunction)CmdBindDescriptorSets;
4164 if (!strcmp(name, "CmdBindIndexBuffer"))
4165 return (PFN_vkVoidFunction)CmdBindIndexBuffer;
4166 if (!strcmp(name, "CmdBindVertexBuffers"))
4167 return (PFN_vkVoidFunction)CmdBindVertexBuffers;
4168 if (!strcmp(name, "CmdDraw"))
4169 return (PFN_vkVoidFunction)CmdDraw;
4170 if (!strcmp(name, "CmdDrawIndexed"))
4171 return (PFN_vkVoidFunction)CmdDrawIndexed;
4172 if (!strcmp(name, "CmdDrawIndirect"))
4173 return (PFN_vkVoidFunction)CmdDrawIndirect;
4174 if (!strcmp(name, "CmdDrawIndexedIndirect"))
4175 return (PFN_vkVoidFunction)CmdDrawIndexedIndirect;
4176 if (!strcmp(name, "CmdDispatch"))
4177 return (PFN_vkVoidFunction)CmdDispatch;
4178 if (!strcmp(name, "CmdDispatchIndirect"))
4179 return (PFN_vkVoidFunction)CmdDispatchIndirect;
4180 if (!strcmp(name, "CmdCopyBuffer"))
4181 return (PFN_vkVoidFunction)CmdCopyBuffer;
4182 if (!strcmp(name, "CmdCopyImage"))
4183 return (PFN_vkVoidFunction)CmdCopyImage;
4184 if (!strcmp(name, "CmdBlitImage"))
4185 return (PFN_vkVoidFunction)CmdBlitImage;
4186 if (!strcmp(name, "CmdCopyBufferToImage"))
4187 return (PFN_vkVoidFunction)CmdCopyBufferToImage;
4188 if (!strcmp(name, "CmdCopyImageToBuffer"))
4189 return (PFN_vkVoidFunction)CmdCopyImageToBuffer;
4190 if (!strcmp(name, "CmdUpdateBuffer"))
4191 return (PFN_vkVoidFunction)CmdUpdateBuffer;
4192 if (!strcmp(name, "CmdFillBuffer"))
4193 return (PFN_vkVoidFunction)CmdFillBuffer;
4194 if (!strcmp(name, "CmdClearColorImage"))
4195 return (PFN_vkVoidFunction)CmdClearColorImage;
4196 if (!strcmp(name, "CmdClearDepthStencilImage"))
4197 return (PFN_vkVoidFunction)CmdClearDepthStencilImage;
4198 if (!strcmp(name, "CmdClearAttachments"))
4199 return (PFN_vkVoidFunction)CmdClearAttachments;
4200 if (!strcmp(name, "CmdResolveImage"))
4201 return (PFN_vkVoidFunction)CmdResolveImage;
4202 if (!strcmp(name, "CmdSetEvent"))
4203 return (PFN_vkVoidFunction)CmdSetEvent;
4204 if (!strcmp(name, "CmdResetEvent"))
4205 return (PFN_vkVoidFunction)CmdResetEvent;
4206 if (!strcmp(name, "CmdWaitEvents"))
4207 return (PFN_vkVoidFunction)CmdWaitEvents;
4208 if (!strcmp(name, "CmdPipelineBarrier"))
4209 return (PFN_vkVoidFunction)CmdPipelineBarrier;
4210 if (!strcmp(name, "CmdBeginQuery"))
4211 return (PFN_vkVoidFunction)CmdBeginQuery;
4212 if (!strcmp(name, "CmdEndQuery"))
4213 return (PFN_vkVoidFunction)CmdEndQuery;
4214 if (!strcmp(name, "CmdResetQueryPool"))
4215 return (PFN_vkVoidFunction)CmdResetQueryPool;
4216 if (!strcmp(name, "CmdWriteTimestamp"))
4217 return (PFN_vkVoidFunction)CmdWriteTimestamp;
4218 if (!strcmp(name, "CmdCopyQueryPoolResults"))
4219 return (PFN_vkVoidFunction)CmdCopyQueryPoolResults;
4220 if (!strcmp(name, "CmdPushConstants"))
4221 return (PFN_vkVoidFunction)CmdPushConstants;
4222 if (!strcmp(name, "CmdBeginRenderPass"))
4223 return (PFN_vkVoidFunction)CmdBeginRenderPass;
4224 if (!strcmp(name, "CmdNextSubpass"))
4225 return (PFN_vkVoidFunction)CmdNextSubpass;
4226 if (!strcmp(name, "CmdEndRenderPass"))
4227 return (PFN_vkVoidFunction)CmdEndRenderPass;
4228 if (!strcmp(name, "CmdExecuteCommands"))
4229 return (PFN_vkVoidFunction)CmdExecuteCommands;
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06004230 if (!strcmp(name, "DebugMarkerSetObjectTagEXT"))
4231 return (PFN_vkVoidFunction)DebugMarkerSetObjectTagEXT;
4232 if (!strcmp(name, "DebugMarkerSetObjectNameEXT"))
4233 return (PFN_vkVoidFunction)DebugMarkerSetObjectNameEXT;
4234 if (!strcmp(name, "CmdDebugMarkerBeginEXT"))
4235 return (PFN_vkVoidFunction)CmdDebugMarkerBeginEXT;
4236 if (!strcmp(name, "CmdDebugMarkerEndEXT"))
4237 return (PFN_vkVoidFunction)CmdDebugMarkerEndEXT;
4238 if (!strcmp(name, "CmdDebugMarkerInsertEXT"))
4239 return (PFN_vkVoidFunction)CmdDebugMarkerInsertEXT;
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06004240#ifdef VK_USE_PLATFORM_WIN32_KHR
4241 if (!strcmp(name, "GetMemoryWin32HandleNV"))
4242 return (PFN_vkVoidFunction)GetMemoryWin32HandleNV;
4243#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06004244 if (!strcmp(name, "CmdDrawIndirectCountAMD"))
4245 return (PFN_vkVoidFunction)CmdDrawIndirectCountAMD;
4246 if (!strcmp(name, "CmdDrawIndexedIndirectCountAMD"))
4247 return (PFN_vkVoidFunction)CmdDrawIndexedIndirectCountAMD;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004248
4249 return NULL;
4250}
4251static inline PFN_vkVoidFunction InterceptCoreInstanceCommand(const char *name) {
4252 if (!name || name[0] != 'v' || name[1] != 'k')
4253 return NULL;
4254
4255 name += 2;
4256 if (!strcmp(name, "CreateInstance"))
4257 return (PFN_vkVoidFunction)CreateInstance;
4258 if (!strcmp(name, "DestroyInstance"))
4259 return (PFN_vkVoidFunction)DestroyInstance;
4260 if (!strcmp(name, "EnumeratePhysicalDevices"))
4261 return (PFN_vkVoidFunction)EnumeratePhysicalDevices;
4262 if (!strcmp(name, "GetPhysicalDeviceFeatures"))
4263 return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures;
4264 if (!strcmp(name, "GetPhysicalDeviceFormatProperties"))
4265 return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties;
4266 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties"))
4267 return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties;
4268 if (!strcmp(name, "GetPhysicalDeviceProperties"))
4269 return (PFN_vkVoidFunction)GetPhysicalDeviceProperties;
4270 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties"))
4271 return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties;
4272 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties"))
4273 return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties;
4274 if (!strcmp(name, "GetInstanceProcAddr"))
4275 return (PFN_vkVoidFunction)GetInstanceProcAddr;
4276 if (!strcmp(name, "CreateDevice"))
4277 return (PFN_vkVoidFunction)CreateDevice;
4278 if (!strcmp(name, "EnumerateInstanceExtensionProperties"))
4279 return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
4280 if (!strcmp(name, "EnumerateInstanceLayerProperties"))
4281 return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties;
4282 if (!strcmp(name, "EnumerateDeviceLayerProperties"))
4283 return (PFN_vkVoidFunction)EnumerateDeviceLayerProperties;
4284 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties"))
4285 return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties;
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06004286 if (!strcmp(name, "GetPhysicalDeviceExternalImageFormatPropertiesNV"))
4287 return (PFN_vkVoidFunction)GetPhysicalDeviceExternalImageFormatPropertiesNV;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004288
4289 return NULL;
4290}
4291
4292static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
4293 if (device) {
4294 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06004295
4296 if (device_data->wsi_enabled) {
4297 if (!strcmp("vkCreateSwapchainKHR", name))
4298 return reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR);
4299 if (!strcmp("vkDestroySwapchainKHR", name))
4300 return reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR);
4301 if (!strcmp("vkGetSwapchainImagesKHR", name))
4302 return reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR);
4303 if (!strcmp("vkAcquireNextImageKHR", name))
4304 return reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR);
4305 if (!strcmp("vkQueuePresentKHR", name))
4306 return reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR);
4307 }
4308
4309 if (device_data->wsi_display_swapchain_enabled) {
4310 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
4311 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
4312 }
4313 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07004314
4315 if (device_data->wsi_display_extension_enabled) {
4316 if (!strcmp("vkGetPhysicalDeviceDisplayPropertiesKHR", name))
4317 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR);
4318 if (!strcmp("vkGetPhysicalDeviceDisplayPlanePropertiesKHR", name))
4319 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR);
4320 if (!strcmp("vkGetDisplayPlaneSupportedDisplaysKHR", name))
4321 return reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR);
4322 if (!strcmp("vkGetDisplayModePropertiesKHR", name))
4323 return reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR);
4324 if (!strcmp("vkCreateDisplayModeKHR", name))
4325 return reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR);
4326 if (!strcmp("vkGetDisplayPlaneCapabilitiesKHR", name))
4327 return reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR);
4328 if (!strcmp("vkCreateDisplayPlaneSurfaceKHR", name))
4329 return reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR);
4330 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004331 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004332
4333 return nullptr;
4334}
4335
4336VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
4337 PFN_vkVoidFunction addr;
4338 addr = InterceptCoreDeviceCommand(funcName);
4339 if (addr) {
4340 return addr;
4341 }
4342 assert(device);
4343
4344 addr = InterceptWsiEnabledCommand(funcName, device);
4345 if (addr) {
4346 return addr;
4347 }
4348 if (get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr == NULL) {
4349 return NULL;
4350 }
4351 return get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr(device, funcName);
4352}
4353
4354VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
4355 PFN_vkVoidFunction addr;
4356 addr = InterceptCoreInstanceCommand(funcName);
4357 if (!addr) {
4358 addr = InterceptCoreDeviceCommand(funcName);
4359 }
4360 if (!addr) {
4361 addr = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
4362 }
4363 if (addr) {
4364 return addr;
4365 }
4366 assert(instance);
4367
4368 addr = InterceptMsgCallbackGetProcAddrCommand(funcName, instance);
4369 if (addr) {
4370 return addr;
4371 }
4372 addr = InterceptWsiEnabledCommand(funcName, instance);
4373 if (addr) {
4374 return addr;
4375 }
4376 if (get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr == NULL) {
4377 return NULL;
4378 }
4379 return get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
4380}
4381
4382} // namespace object_tracker
4383
4384// vk_layer_logging.h expects these to be defined
4385VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
4386 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4387 const VkAllocationCallbacks *pAllocator,
4388 VkDebugReportCallbackEXT *pMsgCallback) {
4389 return object_tracker::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
4390}
4391
4392VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
4393 const VkAllocationCallbacks *pAllocator) {
4394 object_tracker::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
4395}
4396
4397VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
4398 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
4399 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
4400 object_tracker::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
4401}
4402
4403// Loader-layer interface v0, just wrappers since there is only a layer
4404VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4405 VkExtensionProperties *pProperties) {
4406 return object_tracker::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
4407}
4408
4409VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
4410 VkLayerProperties *pProperties) {
4411 return object_tracker::EnumerateInstanceLayerProperties(pCount, pProperties);
4412}
4413
4414VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4415 VkLayerProperties *pProperties) {
4416 // The layer command handles VK_NULL_HANDLE just fine internally
4417 assert(physicalDevice == VK_NULL_HANDLE);
4418 return object_tracker::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
4419}
4420
4421VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
4422 return object_tracker::GetDeviceProcAddr(dev, funcName);
4423}
4424
4425VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
4426 return object_tracker::GetInstanceProcAddr(instance, funcName);
4427}
4428
4429VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4430 const char *pLayerName, uint32_t *pCount,
4431 VkExtensionProperties *pProperties) {
4432 // The layer command handles VK_NULL_HANDLE just fine internally
4433 assert(physicalDevice == VK_NULL_HANDLE);
4434 return object_tracker::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Mark Lobodzinski38080682016-07-22 15:30:27 -06004435}