blob: e9a97bd3e0b603798004e646375f81bdda680d42 [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
Mark Young39389872017-01-19 21:10:49 -070049static uint32_t loader_layer_if_version = CURRENT_LOADER_LAYER_INTERFACE_VERSION;
50
Mark Lobodzinski9bab8662016-07-01 10:53:31 -060051static void InitObjectTracker(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
52
53 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_object_tracker");
54}
55
56// Add new queue to head of global queue list
57static void AddQueueInfo(VkDevice device, uint32_t queue_node_index, VkQueue queue) {
58 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
59 auto queueItem = device_data->queue_info_map.find(queue);
60 if (queueItem == device_data->queue_info_map.end()) {
61 OT_QUEUE_INFO *p_queue_info = new OT_QUEUE_INFO;
62 if (p_queue_info != NULL) {
63 memset(p_queue_info, 0, sizeof(OT_QUEUE_INFO));
64 p_queue_info->queue = queue;
65 p_queue_info->queue_node_index = queue_node_index;
66 device_data->queue_info_map[queue] = p_queue_info;
67 } else {
68 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
69 reinterpret_cast<uint64_t>(queue), __LINE__, OBJTRACK_INTERNAL_ERROR, LayerName,
70 "ERROR: VK_ERROR_OUT_OF_HOST_MEMORY -- could not allocate memory for Queue Information");
71 }
72 }
73}
74
75// Destroy memRef lists and free all memory
76static void DestroyQueueDataStructures(VkDevice device) {
77 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
78
79 for (auto queue_item : device_data->queue_info_map) {
80 delete queue_item.second;
81 }
82 device_data->queue_info_map.clear();
83
84 // Destroy the items in the queue map
85 auto queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].begin();
86 while (queue != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
87 uint32_t obj_index = queue->second->object_type;
88 assert(device_data->num_total_objects > 0);
89 device_data->num_total_objects--;
90 assert(device_data->num_objects[obj_index] > 0);
91 device_data->num_objects[obj_index]--;
92 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, queue->second->object_type, queue->second->handle,
93 __LINE__, OBJTRACK_NONE, LayerName,
94 "OBJ_STAT Destroy Queue obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " Queue objs).",
95 queue->second->handle, device_data->num_total_objects, device_data->num_objects[obj_index]);
96 delete queue->second;
97 queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].erase(queue);
98 }
99}
100
101// Check Queue type flags for selected queue operations
102static void ValidateQueueFlags(VkQueue queue, const char *function) {
103 layer_data *device_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
104 auto queue_item = device_data->queue_info_map.find(queue);
105 if (queue_item != device_data->queue_info_map.end()) {
106 OT_QUEUE_INFO *pQueueInfo = queue_item->second;
107 if (pQueueInfo != NULL) {
108 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(device_data->physical_device), layer_data_map);
109 if ((instance_data->queue_family_properties[pQueueInfo->queue_node_index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) ==
110 0) {
111 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 -0700112 reinterpret_cast<uint64_t>(queue), __LINE__, VALIDATION_ERROR_01651, LayerName,
113 "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_SPARSE_BINDING_BIT not set. %s",
114 function, validation_error_map[VALIDATION_ERROR_01651]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600115 }
116 }
117 }
118}
119
120static void AllocateCommandBuffer(VkDevice device, const VkCommandPool command_pool, const VkCommandBuffer command_buffer,
121 VkDebugReportObjectTypeEXT object_type, VkCommandBufferLevel level) {
122 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
123
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700124 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type,
125 reinterpret_cast<const uint64_t>(command_buffer), __LINE__, OBJTRACK_NONE, LayerName,
126 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600127 string_VkDebugReportObjectTypeEXT(object_type), reinterpret_cast<const uint64_t>(command_buffer));
128
129 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
130 pNewObjNode->object_type = object_type;
131 pNewObjNode->handle = reinterpret_cast<const uint64_t>(command_buffer);
132 pNewObjNode->parent_object = reinterpret_cast<const uint64_t &>(command_pool);
133 if (level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) {
134 pNewObjNode->status = OBJSTATUS_COMMAND_BUFFER_SECONDARY;
135 } else {
136 pNewObjNode->status = OBJSTATUS_NONE;
137 }
138 device_data->object_map[object_type][reinterpret_cast<const uint64_t>(command_buffer)] = pNewObjNode;
139 device_data->num_objects[object_type]++;
140 device_data->num_total_objects++;
141}
142
143static bool ValidateCommandBuffer(VkDevice device, VkCommandPool command_pool, VkCommandBuffer command_buffer) {
144 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
145 bool skip_call = false;
146 uint64_t object_handle = reinterpret_cast<uint64_t>(command_buffer);
147 if (device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].find(object_handle) !=
148 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
149 OBJTRACK_NODE *pNode =
150 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<uint64_t>(command_buffer)];
151
152 if (pNode->parent_object != reinterpret_cast<uint64_t &>(command_pool)) {
153 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 -0700154 __LINE__, VALIDATION_ERROR_00102, LayerName,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600155 "FreeCommandBuffers is attempting to free Command Buffer 0x%" PRIxLEAST64
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700156 " belonging to Command Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 "). %s",
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600157 reinterpret_cast<uint64_t>(command_buffer), pNode->parent_object,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700158 reinterpret_cast<uint64_t &>(command_pool), validation_error_map[VALIDATION_ERROR_00102]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600159 }
160 } else {
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700161 skip_call |=
162 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
163 object_handle, __LINE__, VALIDATION_ERROR_00097, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s",
164 object_name[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT], object_handle,
165 validation_error_map[VALIDATION_ERROR_00097]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600166 }
167 return skip_call;
168}
169
170static void AllocateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set,
171 VkDebugReportObjectTypeEXT object_type) {
172 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
173
174 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type,
175 reinterpret_cast<uint64_t &>(descriptor_set), __LINE__, OBJTRACK_NONE, LayerName,
176 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, object_name[object_type],
177 reinterpret_cast<uint64_t &>(descriptor_set));
178
179 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
180 pNewObjNode->object_type = object_type;
181 pNewObjNode->status = OBJSTATUS_NONE;
182 pNewObjNode->handle = reinterpret_cast<uint64_t &>(descriptor_set);
183 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(descriptor_pool);
184 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT][reinterpret_cast<uint64_t &>(descriptor_set)] =
185 pNewObjNode;
186 device_data->num_objects[object_type]++;
187 device_data->num_total_objects++;
188}
189
190static bool ValidateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set) {
191 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
192 bool skip_call = false;
193 uint64_t object_handle = reinterpret_cast<uint64_t &>(descriptor_set);
194 auto dsItem = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].find(object_handle);
195 if (dsItem != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
196 OBJTRACK_NODE *pNode = dsItem->second;
197
198 if (pNode->parent_object != reinterpret_cast<uint64_t &>(descriptor_pool)) {
199 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 -0700200 __LINE__, VALIDATION_ERROR_00927, LayerName,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600201 "FreeDescriptorSets is attempting to free descriptorSet 0x%" PRIxLEAST64
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700202 " belonging to Descriptor Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 "). %s",
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600203 reinterpret_cast<uint64_t &>(descriptor_set), pNode->parent_object,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700204 reinterpret_cast<uint64_t &>(descriptor_pool), validation_error_map[VALIDATION_ERROR_00927]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600205 }
206 } else {
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700207 skip_call |=
208 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
209 object_handle, __LINE__, VALIDATION_ERROR_00920, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s",
210 object_name[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT], object_handle,
211 validation_error_map[VALIDATION_ERROR_00920]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600212 }
213 return skip_call;
214}
215
216static void CreateQueue(VkDevice device, VkQueue vkObj, VkDebugReportObjectTypeEXT object_type) {
217 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
218
219 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<uint64_t>(vkObj), __LINE__,
220 OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
221 object_name[object_type], reinterpret_cast<uint64_t>(vkObj));
222
223 OBJTRACK_NODE *p_obj_node = NULL;
224 auto queue_item = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].find(reinterpret_cast<uint64_t>(vkObj));
225 if (queue_item == device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
226 p_obj_node = new OBJTRACK_NODE;
227 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT][reinterpret_cast<uint64_t>(vkObj)] = p_obj_node;
228 device_data->num_objects[object_type]++;
229 device_data->num_total_objects++;
230 } else {
231 p_obj_node = queue_item->second;
232 }
233 p_obj_node->object_type = object_type;
234 p_obj_node->status = OBJSTATUS_NONE;
235 p_obj_node->handle = reinterpret_cast<uint64_t>(vkObj);
236}
237
238static void CreateSwapchainImageObject(VkDevice dispatchable_object, VkImage swapchain_image, VkSwapchainKHR swapchain) {
239 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
240 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
241 reinterpret_cast<uint64_t &>(swapchain_image), __LINE__, OBJTRACK_NONE, LayerName,
242 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, "SwapchainImage",
243 reinterpret_cast<uint64_t &>(swapchain_image));
244
245 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
246 pNewObjNode->object_type = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT;
247 pNewObjNode->status = OBJSTATUS_NONE;
248 pNewObjNode->handle = reinterpret_cast<uint64_t &>(swapchain_image);
249 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(swapchain);
250 device_data->swapchainImageMap[reinterpret_cast<uint64_t &>(swapchain_image)] = pNewObjNode;
251}
252
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700253template <typename T> uint64_t handle_value(T handle) { return reinterpret_cast<uint64_t &>(handle); }
254template <typename T> uint64_t handle_value(T *handle) { return reinterpret_cast<uint64_t>(handle); }
Chris Forbes64a31a12016-10-04 14:54:13 +1300255
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600256template <typename T1, typename T2>
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700257static void CreateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type,
258 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600259 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes04257ad2016-10-04 10:08:31 +1300260
Chris Forbes64a31a12016-10-04 14:54:13 +1300261 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600262 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600263
Mike Schuchardt21d998c2016-12-13 14:04:57 -0700264 if (!instance_data->object_map[object_type].count(object_handle)) {
265 log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, object_handle, __LINE__,
266 OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
267 object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600268
Mike Schuchardt21d998c2016-12-13 14:04:57 -0700269 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
270 pNewObjNode->object_type = object_type;
271 pNewObjNode->status = custom_allocator ? OBJSTATUS_CUSTOM_ALLOCATOR : OBJSTATUS_NONE;
272 pNewObjNode->handle = object_handle;
273
274 instance_data->object_map[object_type][object_handle] = pNewObjNode;
275 instance_data->num_objects[object_type]++;
276 instance_data->num_total_objects++;
277 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600278}
279
280template <typename T1, typename T2>
Mike Schuchardt3796a882016-12-06 18:03:56 -0700281static void DestroyObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type,
282 const VkAllocationCallbacks *pAllocator, enum UNIQUE_VALIDATION_ERROR_CODE expected_custom_allocator_code,
283 enum UNIQUE_VALIDATION_ERROR_CODE expected_default_allocator_code) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600284 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
285
Chris Forbes64a31a12016-10-04 14:54:13 +1300286 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600287 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600288
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700289 if (object_handle != VK_NULL_HANDLE) {
290 auto item = device_data->object_map[object_type].find(object_handle);
291 if (item != device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600292
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700293 OBJTRACK_NODE *pNode = item->second;
294 assert(device_data->num_total_objects > 0);
295 device_data->num_total_objects--;
296 assert(device_data->num_objects[pNode->object_type] > 0);
297 device_data->num_objects[pNode->object_type]--;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600298
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700299 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, pNode->object_type, object_handle, __LINE__,
300 OBJTRACK_NONE, LayerName,
301 "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " %s objs).",
302 object_name[pNode->object_type], reinterpret_cast<uint64_t &>(object), device_data->num_total_objects,
303 device_data->num_objects[pNode->object_type], object_name[pNode->object_type]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600304
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700305 auto allocated_with_custom = (pNode->status & OBJSTATUS_CUSTOM_ALLOCATOR) ? true : false;
Mike Schuchardt3796a882016-12-06 18:03:56 -0700306 if (allocated_with_custom && !custom_allocator && expected_custom_allocator_code != VALIDATION_ERROR_UNDEFINED) {
307 // This check only verifies that custom allocation callabacks were provided to both Create and Destroy calls,
308 // it cannot verify that these allocation callbacks are compatible with each other.
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700309 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
Mike Schuchardt3796a882016-12-06 18:03:56 -0700310 expected_custom_allocator_code, LayerName,
311 "Custom allocator not specified while destroying %s obj 0x%" PRIxLEAST64 " but specified at creation. %s",
312 object_name[object_type], object_handle, validation_error_map[expected_custom_allocator_code]);
313 } else if (!allocated_with_custom && custom_allocator &&
314 expected_default_allocator_code != VALIDATION_ERROR_UNDEFINED) {
315 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
316 expected_default_allocator_code, LayerName,
317 "Custom allocator specified while destroying %s obj 0x%" PRIxLEAST64 " but not specified at creation. %s",
318 object_name[object_type], object_handle, validation_error_map[expected_default_allocator_code]);
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700319 }
320
321 delete pNode;
322 device_data->object_map[object_type].erase(item);
323 } else {
324 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle, __LINE__,
325 OBJTRACK_UNKNOWN_OBJECT, LayerName,
326 "Unable to remove %s obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",
327 object_name[object_type], object_handle);
Chris Forbes3e51a202016-09-29 14:35:09 +1300328 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600329 }
330}
331
332template <typename T1, typename T2>
Karl Schultza9ef1e52016-10-06 17:53:48 -0600333static bool ValidateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool null_allowed,
Mike Schuchardt3796a882016-12-06 18:03:56 -0700334 enum UNIQUE_VALIDATION_ERROR_CODE error_code) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600335 if (null_allowed && (object == VK_NULL_HANDLE)) {
336 return false;
337 }
Chris Forbes64a31a12016-10-04 14:54:13 +1300338 auto object_handle = handle_value(object);
339
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600340 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +1300341 if (device_data->object_map[object_type].find(object_handle) == device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600342 // If object is an image, also look for it in the swapchain image map
343 if ((object_type != VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT) ||
Chris Forbes2f271a72016-09-29 14:58:08 +1300344 (device_data->swapchainImageMap.find(object_handle) == device_data->swapchainImageMap.end())) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -0700345 const char *error_msg = (error_code == VALIDATION_ERROR_UNDEFINED) ? "" : validation_error_map[error_code];
Karl Schultza9ef1e52016-10-06 17:53:48 -0600346 return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
347 error_code, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s", object_name[object_type],
348 object_handle, error_msg);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600349 }
350 }
351 return false;
352}
353
Mike Schuchardt3796a882016-12-06 18:03:56 -0700354static void DeviceReportUndestroyedObjects(VkDevice device, VkDebugReportObjectTypeEXT object_type,
355 enum UNIQUE_VALIDATION_ERROR_CODE error_code) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600356 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
357 for (auto item = device_data->object_map[object_type].begin(); item != device_data->object_map[object_type].end();) {
358 OBJTRACK_NODE *object_info = item->second;
359 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 -0700360 error_code, LayerName,
361 "OBJ ERROR : For device 0x%" PRIxLEAST64 ", %s object 0x%" PRIxLEAST64 " has not been destroyed. %s",
362 reinterpret_cast<uint64_t>(device), object_name[object_type], object_info->handle,
363 validation_error_map[error_code]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600364 item = device_data->object_map[object_type].erase(item);
365 }
366}
367
368VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
369 std::unique_lock<std::mutex> lock(global_lock);
370
371 dispatch_key key = get_dispatch_key(instance);
372 layer_data *instance_data = get_my_data_ptr(key, layer_data_map);
373
374 // Enable the temporary callback(s) here to catch cleanup issues:
375 bool callback_setup = false;
376 if (instance_data->num_tmp_callbacks > 0) {
377 if (!layer_enable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks,
378 instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks)) {
379 callback_setup = true;
380 }
381 }
382
Jeremy Hayes058b41c2016-11-03 10:49:44 -0600383 // TODO: The instance handle can not be validated here. The loader will likely have to validate it.
Karl Schultzcf2e0452016-10-12 13:28:49 -0600384 ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, true, VALIDATION_ERROR_00021);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600385
Mike Schuchardt3796a882016-12-06 18:03:56 -0700386 DestroyObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator, VALIDATION_ERROR_00019,
387 VALIDATION_ERROR_00020);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600388 // Report any remaining objects in LL
389
390 for (auto iit = instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].begin();
391 iit != instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].end();) {
392 OBJTRACK_NODE *pNode = iit->second;
393
394 VkDevice device = reinterpret_cast<VkDevice>(pNode->handle);
395
396 log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, pNode->handle, __LINE__,
397 OBJTRACK_OBJECT_LEAK, LayerName, "OBJ ERROR : %s object 0x%" PRIxLEAST64 " has not been destroyed.",
398 string_VkDebugReportObjectTypeEXT(pNode->object_type), pNode->handle);
399 // Semaphore:
Mike Schuchardt3796a882016-12-06 18:03:56 -0700400 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, VALIDATION_ERROR_00018);
401 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, VALIDATION_ERROR_00018);
402 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, VALIDATION_ERROR_00018);
403 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, VALIDATION_ERROR_00018);
404 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, VALIDATION_ERROR_00018);
405 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, VALIDATION_ERROR_00018);
406 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, VALIDATION_ERROR_00018);
407 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, VALIDATION_ERROR_00018);
408 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, VALIDATION_ERROR_00018);
409 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, VALIDATION_ERROR_00018);
410 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, VALIDATION_ERROR_00018);
411 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, VALIDATION_ERROR_00018);
412 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, VALIDATION_ERROR_00018);
413 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, VALIDATION_ERROR_00018);
414 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, VALIDATION_ERROR_00018);
415 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, VALIDATION_ERROR_00018);
416 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, VALIDATION_ERROR_00018);
417 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, VALIDATION_ERROR_00018);
418 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, VALIDATION_ERROR_00018);
419 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, VALIDATION_ERROR_00018);
420 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, VALIDATION_ERROR_00018);
421 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, VALIDATION_ERROR_00018);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600422 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
423 }
424 instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].clear();
425
426 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
427 pInstanceTable->DestroyInstance(instance, pAllocator);
428
429 // Disable and cleanup the temporary callback(s):
430 if (callback_setup) {
431 layer_disable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks, instance_data->tmp_callbacks);
432 }
433 if (instance_data->num_tmp_callbacks > 0) {
434 layer_free_tmp_callbacks(instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks);
435 instance_data->num_tmp_callbacks = 0;
436 }
437
438 // Clean up logging callback, if any
439 while (instance_data->logging_callback.size() > 0) {
440 VkDebugReportCallbackEXT callback = instance_data->logging_callback.back();
441 layer_destroy_msg_callback(instance_data->report_data, callback, pAllocator);
442 instance_data->logging_callback.pop_back();
443 }
444
445 layer_debug_report_destroy_instance(instance_data->report_data);
446 layer_data_map.erase(key);
447
448 instanceExtMap.erase(pInstanceTable);
449 lock.unlock();
450 ot_instance_table_map.erase(key);
451}
452
453VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
454
455 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600456 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, true, VALIDATION_ERROR_00052);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700457 DestroyObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator, VALIDATION_ERROR_00050,
458 VALIDATION_ERROR_00051);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600459
460 // Report any remaining objects associated with this VkDevice object in LL
Mike Schuchardt3796a882016-12-06 18:03:56 -0700461 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, VALIDATION_ERROR_00049);
462 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, VALIDATION_ERROR_00049);
463 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, VALIDATION_ERROR_00049);
464 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, VALIDATION_ERROR_00049);
465 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, VALIDATION_ERROR_00049);
466 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, VALIDATION_ERROR_00049);
467 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, VALIDATION_ERROR_00049);
468 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, VALIDATION_ERROR_00049);
469 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, VALIDATION_ERROR_00049);
470 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, VALIDATION_ERROR_00049);
471 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, VALIDATION_ERROR_00049);
472 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, VALIDATION_ERROR_00049);
473 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, VALIDATION_ERROR_00049);
474 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, VALIDATION_ERROR_00049);
475 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, VALIDATION_ERROR_00049);
476 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, VALIDATION_ERROR_00049);
477 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, VALIDATION_ERROR_00049);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600478 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700479 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, VALIDATION_ERROR_00049);
480 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, VALIDATION_ERROR_00049);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600481 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700482 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, VALIDATION_ERROR_00049);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600483 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
484
485 // Clean up Queue's MemRef Linked Lists
486 DestroyQueueDataStructures(device);
487
488 lock.unlock();
489
490 dispatch_key key = get_dispatch_key(device);
491 VkLayerDispatchTable *pDisp = get_dispatch_table(ot_device_table_map, device);
492 pDisp->DestroyDevice(device, pAllocator);
493 ot_device_table_map.erase(key);
494}
495
496VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
497 bool skip_call = false;
498 {
499 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600500 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
501 VALIDATION_ERROR_01679);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600502 }
503 if (skip_call) {
504 return;
505 }
506 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
507}
508
509VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
510 VkFormatProperties *pFormatProperties) {
511 bool skip_call = false;
512 {
513 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600514 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
515 VALIDATION_ERROR_01683);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600516 }
517 if (skip_call) {
518 return;
519 }
520 get_dispatch_table(ot_instance_table_map, physicalDevice)
521 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
522}
523
524VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
525 VkImageType type, VkImageTiling tiling,
526 VkImageUsageFlags usage, VkImageCreateFlags flags,
527 VkImageFormatProperties *pImageFormatProperties) {
528 bool skip_call = false;
529 {
530 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600531 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
532 VALIDATION_ERROR_01686);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600533 }
534 if (skip_call) {
535 return VK_ERROR_VALIDATION_FAILED_EXT;
536 }
537 VkResult result =
538 get_dispatch_table(ot_instance_table_map, physicalDevice)
539 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
540 return result;
541}
542
543VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
544 bool skip_call = false;
545 {
546 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600547 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
548 VALIDATION_ERROR_00026);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600549 }
550 if (skip_call) {
551 return;
552 }
553 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
554}
555
556VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
557 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
558 bool skip_call = false;
559 {
560 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600561 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
562 VALIDATION_ERROR_00609);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600563 }
564 if (skip_call) {
565 return;
566 }
567 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
568}
569
570VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *pName);
571
572VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *pName);
573
Mark Young39389872017-01-19 21:10:49 -0700574VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *funcName);
575
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600576VKAPI_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) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001801 OBJTRACK_NODE *pNode = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT]
1802 [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 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003005 VkResult result = get_dispatch_table(ot_device_table_map, device)
3006 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Youngead9b932016-09-08 12:28:38 -06003007 {
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,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003089 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003090
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 Young39389872017-01-19 21:10:49 -07003153 device_data->nvx_device_generated_commands_enabled = false;
3154 device_data->ext_display_control_enabled = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003155
3156 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3157 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
3158 device_data->wsi_enabled = true;
3159 }
Mark Youngead9b932016-09-08 12:28:38 -06003160 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
3161 device_data->wsi_display_swapchain_enabled = true;
3162 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003163 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
3164 device_data->wsi_display_extension_enabled = true;
3165 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003166 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], "OBJTRACK_EXTENSIONS") == 0) {
3167 device_data->objtrack_extensions_enabled = true;
3168 }
Mark Young39389872017-01-19 21:10:49 -07003169 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME) == 0) {
3170 device_data->nvx_device_generated_commands_enabled = true;
3171 }
3172 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME) == 0) {
3173 device_data->ext_display_control_enabled = true;
3174 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003175 }
3176}
3177
3178static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
3179 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(ot_instance_table_map, instance);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003180
3181 instanceExtMap[pDisp] = {};
3182
3183 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3184 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
3185 instanceExtMap[pDisp].wsi_enabled = true;
3186 }
Norbert Nopper1dec9a52016-11-25 07:55:13 +01003187 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
3188 instanceExtMap[pDisp].display_enabled = true;
3189 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003190#ifdef VK_USE_PLATFORM_XLIB_KHR
3191 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
3192 instanceExtMap[pDisp].xlib_enabled = true;
3193 }
3194#endif
3195#ifdef VK_USE_PLATFORM_XCB_KHR
3196 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
3197 instanceExtMap[pDisp].xcb_enabled = true;
3198 }
3199#endif
3200#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3201 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
3202 instanceExtMap[pDisp].wayland_enabled = true;
3203 }
3204#endif
3205#ifdef VK_USE_PLATFORM_MIR_KHR
3206 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
3207 instanceExtMap[pDisp].mir_enabled = true;
3208 }
3209#endif
3210#ifdef VK_USE_PLATFORM_ANDROID_KHR
3211 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
3212 instanceExtMap[pDisp].android_enabled = true;
3213 }
3214#endif
3215#ifdef VK_USE_PLATFORM_WIN32_KHR
3216 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
3217 instanceExtMap[pDisp].win32_enabled = true;
3218 }
3219#endif
3220 }
3221}
3222
3223VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
3224 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
3225 std::lock_guard<std::mutex> lock(global_lock);
3226 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3227 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3228
3229 assert(chain_info->u.pLayerInfo);
3230 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3231 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
3232 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(phy_dev_data->instance, "vkCreateDevice");
3233 if (fpCreateDevice == NULL) {
3234 return VK_ERROR_INITIALIZATION_FAILED;
3235 }
3236
3237 // Advance the link info for the next element on the chain
3238 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3239
3240 VkResult result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
3241 if (result != VK_SUCCESS) {
3242 return result;
3243 }
3244
3245 layer_data *device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
3246 device_data->report_data = layer_debug_report_create_device(phy_dev_data->report_data, *pDevice);
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003247 layer_init_device_dispatch_table(*pDevice, &device_data->dispatch_table, fpGetDeviceProcAddr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003248
3249 // Add link back to physDev
3250 device_data->physical_device = physicalDevice;
3251
3252 initDeviceTable(*pDevice, fpGetDeviceProcAddr, ot_device_table_map);
3253
3254 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
Chris Forbesfeecd402016-09-29 14:53:50 +13003255 CreateObject(*pDevice, *pDevice, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003256
3257 return result;
3258}
3259
3260VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3261 uint32_t *pQueueFamilyPropertyCount,
3262 VkQueueFamilyProperties *pQueueFamilyProperties) {
3263 get_dispatch_table(ot_instance_table_map, physicalDevice)
3264 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
3265 std::lock_guard<std::mutex> lock(global_lock);
3266 if (pQueueFamilyProperties != NULL) {
3267 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3268 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
3269 instance_data->queue_family_properties.emplace_back(pQueueFamilyProperties[i]);
3270 }
3271 }
3272}
3273
3274VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3275 VkInstance *pInstance) {
3276 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3277
3278 assert(chain_info->u.pLayerInfo);
3279 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3280 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
3281 if (fpCreateInstance == NULL) {
3282 return VK_ERROR_INITIALIZATION_FAILED;
3283 }
3284
3285 // Advance the link info for the next element on the chain
3286 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3287
3288 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
3289 if (result != VK_SUCCESS) {
3290 return result;
3291 }
3292
3293 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
3294 instance_data->instance = *pInstance;
3295 initInstanceTable(*pInstance, fpGetInstanceProcAddr, ot_instance_table_map);
3296 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, *pInstance);
3297
3298 // Look for one or more debug report create info structures, and copy the
3299 // callback(s) for each one found (for use by vkDestroyInstance)
3300 layer_copy_tmp_callbacks(pCreateInfo->pNext, &instance_data->num_tmp_callbacks, &instance_data->tmp_dbg_create_infos,
3301 &instance_data->tmp_callbacks);
3302
3303 instance_data->report_data = debug_report_create_instance(pInstanceTable, *pInstance, pCreateInfo->enabledExtensionCount,
3304 pCreateInfo->ppEnabledExtensionNames);
3305
3306 InitObjectTracker(instance_data, pAllocator);
3307 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
3308
Chris Forbesfeecd402016-09-29 14:53:50 +13003309 CreateObject(*pInstance, *pInstance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003310
3311 return result;
3312}
3313
3314VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
3315 VkPhysicalDevice *pPhysicalDevices) {
3316 bool skip_call = VK_FALSE;
3317 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003318 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_00023);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003319 lock.unlock();
3320 if (skip_call) {
3321 return VK_ERROR_VALIDATION_FAILED_EXT;
3322 }
3323 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
3324 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
3325 lock.lock();
3326 if (result == VK_SUCCESS) {
3327 if (pPhysicalDevices) {
3328 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003329 CreateObject(instance, pPhysicalDevices[i], VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003330 }
3331 }
3332 }
3333 lock.unlock();
3334 return result;
3335}
3336
3337VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
3338 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003339 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00062);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003340 lock.unlock();
3341
3342 get_dispatch_table(ot_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
3343
3344 lock.lock();
3345
3346 CreateQueue(device, *pQueue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT);
3347 AddQueueInfo(device, queueFamilyIndex, *pQueue);
3348}
3349
3350VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Tobin Ehlis02337352016-10-20 14:42:57 -06003351 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003352 std::unique_lock<std::mutex> lock(global_lock);
Tobin Ehlis02337352016-10-20 14:42:57 -06003353 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00621);
3354 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, true, VALIDATION_ERROR_00622);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003355 lock.unlock();
Tobin Ehlis02337352016-10-20 14:42:57 -06003356 if (!skip) {
3357 get_dispatch_table(ot_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003358
Tobin Ehlis02337352016-10-20 14:42:57 -06003359 lock.lock();
Mike Schuchardt3796a882016-12-06 18:03:56 -07003360 DestroyObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator, VALIDATION_ERROR_UNDEFINED,
3361 VALIDATION_ERROR_UNDEFINED);
Tobin Ehlis02337352016-10-20 14:42:57 -06003362 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003363}
3364
3365VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
3366 VkMemoryMapFlags flags, void **ppData) {
3367 bool skip_call = VK_FALSE;
3368 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultz259ddb22016-10-27 13:29:19 -06003369 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00630);
3370 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00631);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003371 lock.unlock();
3372 if (skip_call == VK_TRUE) {
3373 return VK_ERROR_VALIDATION_FAILED_EXT;
3374 }
3375 VkResult result = get_dispatch_table(ot_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
3376 return result;
3377}
3378
3379VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
3380 bool skip_call = VK_FALSE;
3381 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003382 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00650);
Karl Schultz259ddb22016-10-27 13:29:19 -06003383 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00651);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003384 lock.unlock();
3385 if (skip_call == VK_TRUE) {
3386 return;
3387 }
3388
3389 get_dispatch_table(ot_device_table_map, device)->UnmapMemory(device, memory);
3390}
3391VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
3392 VkFence fence) {
3393 std::unique_lock<std::mutex> lock(global_lock);
3394 ValidateQueueFlags(queue, "QueueBindSparse");
3395
3396 for (uint32_t i = 0; i < bindInfoCount; i++) {
3397 for (uint32_t j = 0; j < pBindInfo[i].bufferBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003398 ValidateObject(queue, pBindInfo[i].pBufferBinds[j].buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false,
3399 VALIDATION_ERROR_01656);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003400 for (uint32_t j = 0; j < pBindInfo[i].imageOpaqueBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003401 ValidateObject(queue, pBindInfo[i].pImageOpaqueBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
3402 VALIDATION_ERROR_01657);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003403 for (uint32_t j = 0; j < pBindInfo[i].imageBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003404 ValidateObject(queue, pBindInfo[i].pImageBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
3405 VALIDATION_ERROR_01658);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003406 }
3407 lock.unlock();
3408
3409 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
3410 return result;
3411}
3412
3413VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3414 VkCommandBuffer *pCommandBuffers) {
3415 bool skip_call = VK_FALSE;
3416 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003417 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00084);
3418 skip_call |= ValidateObject(device, pAllocateInfo->commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false,
3419 VALIDATION_ERROR_00090);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003420 lock.unlock();
3421
3422 if (skip_call) {
3423 return VK_ERROR_VALIDATION_FAILED_EXT;
3424 }
3425
3426 VkResult result =
3427 get_dispatch_table(ot_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3428
3429 lock.lock();
3430 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {
3431 AllocateCommandBuffer(device, pAllocateInfo->commandPool, pCommandBuffers[i],
3432 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, pAllocateInfo->level);
3433 }
3434 lock.unlock();
3435
3436 return result;
3437}
3438
3439VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3440 VkDescriptorSet *pDescriptorSets) {
3441 bool skip_call = VK_FALSE;
3442 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003443 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00908);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003444 skip_call |= ValidateObject(device, pAllocateInfo->descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false,
3445 VALIDATION_ERROR_00915);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003446 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003447 skip_call |= ValidateObject(device, pAllocateInfo->pSetLayouts[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT,
3448 false, VALIDATION_ERROR_00916);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003449 }
3450 lock.unlock();
3451 if (skip_call) {
3452 return VK_ERROR_VALIDATION_FAILED_EXT;
3453 }
3454
3455 VkResult result =
3456 get_dispatch_table(ot_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3457
3458 if (VK_SUCCESS == result) {
3459 lock.lock();
3460 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
3461 AllocateDescriptorSet(device, pAllocateInfo->descriptorPool, pDescriptorSets[i],
3462 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
3463 }
3464 lock.unlock();
3465 }
3466
3467 return result;
3468}
3469
3470VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
3471 const VkCommandBuffer *pCommandBuffers) {
3472 bool skip_call = false;
3473 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003474 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false, VALIDATION_ERROR_00099);
3475 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00098);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003476 for (uint32_t i = 0; i < commandBufferCount; i++) {
3477 skip_call |= ValidateCommandBuffer(device, commandPool, pCommandBuffers[i]);
3478 }
3479
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003480 for (uint32_t i = 0; i < commandBufferCount; i++) {
Mike Schuchardt3796a882016-12-06 18:03:56 -07003481 DestroyObject(device, pCommandBuffers[i], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr,
3482 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003483 }
3484
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003485 lock.unlock();
3486 if (!skip_call) {
3487 get_dispatch_table(ot_device_table_map, device)
3488 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
3489 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003490}
3491VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
3492 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3493 std::unique_lock<std::mutex> lock(global_lock);
3494 // A swapchain's images are implicitly deleted when the swapchain is deleted.
3495 // Remove this swapchain's images from our map of such images.
3496 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr = device_data->swapchainImageMap.begin();
3497 while (itr != device_data->swapchainImageMap.end()) {
3498 OBJTRACK_NODE *pNode = (*itr).second;
3499 if (pNode->parent_object == reinterpret_cast<uint64_t &>(swapchain)) {
3500 delete pNode;
3501 auto delete_item = itr++;
3502 device_data->swapchainImageMap.erase(delete_item);
3503 } else {
3504 ++itr;
3505 }
3506 }
Mike Schuchardt3796a882016-12-06 18:03:56 -07003507 DestroyObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator, VALIDATION_ERROR_01938,
3508 VALIDATION_ERROR_01939);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003509 lock.unlock();
3510
3511 get_dispatch_table(ot_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
3512}
3513
3514VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
3515 const VkDescriptorSet *pDescriptorSets) {
3516 bool skip_call = false;
3517 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3518 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003519 skip_call |=
3520 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false, VALIDATION_ERROR_00924);
3521 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00923);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003522 for (uint32_t i = 0; i < descriptorSetCount; i++) {
3523 skip_call |= ValidateDescriptorSet(device, descriptorPool, pDescriptorSets[i]);
3524 }
3525
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003526 for (uint32_t i = 0; i < descriptorSetCount; i++) {
Mike Schuchardt3796a882016-12-06 18:03:56 -07003527 DestroyObject(device, pDescriptorSets[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr,
3528 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003529 }
3530
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003531 lock.unlock();
3532 if (!skip_call) {
3533 result = get_dispatch_table(ot_device_table_map, device)
3534 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
3535 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003536 return result;
3537}
3538
3539VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3540 const VkAllocationCallbacks *pAllocator) {
3541 bool skip_call = VK_FALSE;
3542 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3543 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003544 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00904);
3545 skip_call |=
3546 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, true, VALIDATION_ERROR_00905);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003547 lock.unlock();
3548 if (skip_call) {
3549 return;
3550 }
3551 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is deleted.
3552 // Remove this pool's descriptor sets from our descriptorSet map.
3553 lock.lock();
3554 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr =
3555 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
3556 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
3557 OBJTRACK_NODE *pNode = (*itr).second;
3558 auto del_itr = itr++;
3559 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
Mike Schuchardt3796a882016-12-06 18:03:56 -07003560 DestroyObject(device, (VkDescriptorSet)((*del_itr).first), VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr,
3561 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003562 }
3563 }
Mike Schuchardt3796a882016-12-06 18:03:56 -07003564 DestroyObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator, VALIDATION_ERROR_00902,
3565 VALIDATION_ERROR_00903);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003566 lock.unlock();
3567 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
3568}
3569
3570VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3571 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3572 bool skip_call = false;
3573 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003574 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00080);
3575 skip_call |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, true, VALIDATION_ERROR_00081);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003576 lock.unlock();
3577 if (skip_call) {
3578 return;
3579 }
3580 lock.lock();
3581 // A CommandPool's command buffers are implicitly deleted when the pool is deleted.
3582 // Remove this pool's cmdBuffers from our cmd buffer map.
3583 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].begin();
3584 auto del_itr = itr;
3585 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
3586 OBJTRACK_NODE *pNode = (*itr).second;
3587 del_itr = itr++;
3588 if (pNode->parent_object == reinterpret_cast<uint64_t &>(commandPool)) {
3589 skip_call |= ValidateCommandBuffer(device, commandPool, reinterpret_cast<VkCommandBuffer>((*del_itr).first));
Chris Forbesec461992016-09-29 14:41:44 +13003590 DestroyObject(device, reinterpret_cast<VkCommandBuffer>((*del_itr).first),
Mike Schuchardt3796a882016-12-06 18:03:56 -07003591 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr, VALIDATION_ERROR_UNDEFINED,
3592 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003593 }
3594 }
Mike Schuchardt3796a882016-12-06 18:03:56 -07003595 DestroyObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator, VALIDATION_ERROR_00078,
3596 VALIDATION_ERROR_00079);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003597 lock.unlock();
3598 get_dispatch_table(ot_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
3599}
3600
3601VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
3602 VkImage *pSwapchainImages) {
3603 bool skip_call = VK_FALSE;
3604 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003605 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01948);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003606 lock.unlock();
3607 if (skip_call) {
3608 return VK_ERROR_VALIDATION_FAILED_EXT;
3609 }
3610 VkResult result = get_dispatch_table(ot_device_table_map, device)
3611 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
3612 if (pSwapchainImages != NULL) {
3613 lock.lock();
3614 for (uint32_t i = 0; i < *pSwapchainImageCount; i++) {
3615 CreateSwapchainImageObject(device, pSwapchainImages[i], swapchain);
3616 }
3617 lock.unlock();
3618 }
3619 return result;
3620}
3621
3622VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3623 const VkGraphicsPipelineCreateInfo *pCreateInfos,
3624 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3625 bool skip_call = VK_FALSE;
3626 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003627 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00519);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003628 if (pCreateInfos) {
3629 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3630 if (pCreateInfos[idx0].basePipelineHandle) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003631 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3632 true, VALIDATION_ERROR_00529);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003633 }
3634 if (pCreateInfos[idx0].layout) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003635 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
3636 false, VALIDATION_ERROR_00546);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003637 }
3638 if (pCreateInfos[idx0].pStages) {
3639 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
3640 if (pCreateInfos[idx0].pStages[idx1].module) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003641 skip_call |= ValidateObject(device, pCreateInfos[idx0].pStages[idx1].module,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003642 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false, VALIDATION_ERROR_00515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003643 }
3644 }
3645 }
3646 if (pCreateInfos[idx0].renderPass) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003647 skip_call |= ValidateObject(device, pCreateInfos[idx0].renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,
3648 false, VALIDATION_ERROR_00547);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003649 }
3650 }
3651 }
3652 if (pipelineCache) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06003653 skip_call |=
3654 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00520);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003655 }
3656 lock.unlock();
3657 if (skip_call) {
Chris Forbes8d24dc92016-11-30 14:56:52 +13003658 for (uint32_t i = 0; i < createInfoCount; i++) {
3659 pPipelines[i] = VK_NULL_HANDLE;
3660 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003661 return VK_ERROR_VALIDATION_FAILED_EXT;
3662 }
3663 VkResult result = get_dispatch_table(ot_device_table_map, device)
3664 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3665 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01003666 for (uint32_t idx2 = 0; idx2 < createInfoCount; ++idx2) {
3667 if (pPipelines[idx2] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003668 CreateObject(device, pPipelines[idx2], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003669 }
3670 }
3671 lock.unlock();
3672 return result;
3673}
3674
3675VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3676 const VkComputePipelineCreateInfo *pCreateInfos,
3677 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3678 bool skip_call = VK_FALSE;
3679 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003680 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00486);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003681 if (pCreateInfos) {
3682 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3683 if (pCreateInfos[idx0].basePipelineHandle) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003684 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3685 true, VALIDATION_ERROR_00496);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003686 }
3687 if (pCreateInfos[idx0].layout) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003688 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
3689 false, VALIDATION_ERROR_00505);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003690 }
3691 if (pCreateInfos[idx0].stage.module) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003692 skip_call |= ValidateObject(device, pCreateInfos[idx0].stage.module, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT,
3693 false, VALIDATION_ERROR_00515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003694 }
3695 }
3696 }
3697 if (pipelineCache) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06003698 skip_call |=
3699 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00487);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003700 }
3701 lock.unlock();
3702 if (skip_call) {
Chris Forbes8d24dc92016-11-30 14:56:52 +13003703 for (uint32_t i = 0; i < createInfoCount; i++) {
3704 pPipelines[i] = VK_NULL_HANDLE;
3705 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003706 return VK_ERROR_VALIDATION_FAILED_EXT;
3707 }
3708 VkResult result = get_dispatch_table(ot_device_table_map, device)
3709 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3710 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01003711 for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
3712 if (pPipelines[idx1] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003713 CreateObject(device, pPipelines[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003714 }
3715 }
3716 lock.unlock();
3717 return result;
3718}
3719
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003720// VK_EXT_debug_marker Extension
3721VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
3722 bool skip_call = VK_FALSE;
3723 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003724 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_02007);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003725 lock.unlock();
3726 if (skip_call) {
3727 return VK_ERROR_VALIDATION_FAILED_EXT;
3728 }
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003729 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3730 VkResult result = VK_SUCCESS;
3731 if (dev_data->dispatch_table.DebugMarkerSetObjectTagEXT) {
3732 result = dev_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
3733 }
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003734 return result;
3735}
3736
3737VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
3738 bool skip_call = VK_FALSE;
3739 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003740 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01999);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003741 lock.unlock();
3742 if (skip_call) {
3743 return VK_ERROR_VALIDATION_FAILED_EXT;
3744 }
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003745 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3746 VkResult result = VK_SUCCESS;
3747 if (dev_data->dispatch_table.DebugMarkerSetObjectNameEXT) {
3748 result = dev_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
3749 }
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003750 return result;
3751}
3752
3753VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3754 bool skip_call = VK_FALSE;
3755 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003756 skip_call |=
3757 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02014);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003758 lock.unlock();
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003759 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3760 if (!skip_call && dev_data->dispatch_table.CmdDebugMarkerBeginEXT) {
3761 dev_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003762 }
3763}
3764
3765VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerEndEXT(VkCommandBuffer commandBuffer) {
3766 bool skip_call = VK_FALSE;
3767 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003768 skip_call |=
3769 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02022);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003770 lock.unlock();
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003771 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3772 if (!skip_call && dev_data->dispatch_table.CmdDebugMarkerEndEXT) {
3773 dev_data->dispatch_table.CmdDebugMarkerEndEXT(commandBuffer);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003774 }
3775}
3776
3777VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3778 bool skip_call = VK_FALSE;
3779 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003780 skip_call |=
3781 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02025);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003782 lock.unlock();
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003783 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3784 if (!skip_call && dev_data->dispatch_table.CmdDebugMarkerInsertEXT) {
3785 dev_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003786 }
3787}
3788
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003789// VK_NV_external_memory_capabilities Extension
3790VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
3791 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
3792 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
3793 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
3794
3795 bool skip_call = false;
3796 {
3797 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003798 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3799 VALIDATION_ERROR_01980);
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003800 }
3801 if (skip_call) {
3802 return VK_ERROR_VALIDATION_FAILED_EXT;
3803 }
3804 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3805 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
3806 externalHandleType, pExternalImageFormatProperties);
3807 return result;
3808}
3809
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003810// VK_KHR_display Extension
3811VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
3812 VkDisplayPropertiesKHR *pProperties) {
3813 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3814 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003815 {
3816 std::unique_lock<std::mutex> lock(global_lock);
3817 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3818 VALIDATION_ERROR_01851);
3819 }
3820 if (!skip) {
3821 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003822 ->GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003823 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003824 return result;
3825}
3826
3827VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
3828 VkDisplayPlanePropertiesKHR *pProperties) {
3829 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3830 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003831 {
3832 std::unique_lock<std::mutex> lock(global_lock);
3833 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3834 VALIDATION_ERROR_01854);
3835 }
3836 if (!skip) {
3837 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003838 ->GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003839 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003840 return result;
3841}
3842
3843VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
3844 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
3845 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3846 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003847 {
3848 std::unique_lock<std::mutex> lock(global_lock);
3849 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3850 VALIDATION_ERROR_01858);
3851 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003852 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3853 ->GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003854 if (((result == VK_SUCCESS) || (result == VK_INCOMPLETE)) && (pDisplays != NULL)) {
3855 std::lock_guard<std::mutex> lock(global_lock);
3856 for (uint32_t displays = 0; displays < *pDisplayCount; displays++) {
3857 CreateObject(physicalDevice, pDisplays[displays], VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, nullptr);
3858 }
3859 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003860 return result;
3861}
3862
3863VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3864 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
3865 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3866 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003867 {
3868 std::unique_lock<std::mutex> lock(global_lock);
3869 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3870 VALIDATION_ERROR_01861);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003871 skip |= ValidateObject(physicalDevice, display, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, false, VALIDATION_ERROR_01862);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003872 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003873 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3874 ->GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
3875
3876 return result;
3877}
3878
3879VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3880 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3881 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
3882 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3883 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003884 {
3885 std::unique_lock<std::mutex> lock(global_lock);
3886 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3887 VALIDATION_ERROR_01865);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003888 skip |= ValidateObject(physicalDevice, display, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, false, VALIDATION_ERROR_01866);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003889 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003890 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3891 ->CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003892 {
3893 std::lock_guard<std::mutex> lock(global_lock);
3894 if (result == VK_SUCCESS) {
3895 CreateObject(physicalDevice, *pMode, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT, pAllocator);
3896 }
3897 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003898 return result;
3899}
3900
3901VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
3902 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
3903 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3904 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003905 {
3906 std::unique_lock<std::mutex> lock(global_lock);
3907 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3908 VALIDATION_ERROR_01875);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003909 skip |=
3910 ValidateObject(physicalDevice, mode, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT, false, VALIDATION_ERROR_01876);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003911 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003912 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3913 ->GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
3914
3915 return result;
3916}
3917
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003918VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003919 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003920 bool skip_call = false;
3921 {
3922 std::lock_guard<std::mutex> lock(global_lock);
3923 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01878);
3924 }
3925 if (skip_call) {
3926 return VK_ERROR_VALIDATION_FAILED_EXT;
3927 }
3928 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003929 ->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003930 {
3931 std::lock_guard<std::mutex> lock(global_lock);
3932 if (result == VK_SUCCESS) {
3933 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
3934 }
3935 }
3936 return result;
3937}
3938
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003939#ifdef VK_USE_PLATFORM_WIN32_KHR
3940// VK_NV_external_memory_win32 Extension
3941VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
3942 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
3943 bool skip_call = VK_FALSE;
3944 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003945 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01725);
3946 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_01726);
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003947 lock.unlock();
3948 if (skip_call) {
3949 return VK_ERROR_VALIDATION_FAILED_EXT;
3950 }
3951 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
3952 return result;
3953}
3954#endif // VK_USE_PLATFORM_WIN32_KHR
3955
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003956// VK_AMD_draw_indirect_count Extension
3957VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3958 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3959 uint32_t stride) {
3960 bool skip_call = VK_FALSE;
3961 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003962 skip_call |=
Mark Lobodzinski52c1f352017-01-06 07:37:11 -07003963 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_01771);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003964 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01772);
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003965 lock.unlock();
3966 if (!skip_call) {
3967 get_dispatch_table(ot_device_table_map, commandBuffer)
3968 ->CmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3969 }
3970}
3971
3972VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3973 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3974 uint32_t maxDrawCount, uint32_t stride) {
3975 bool skip_call = VK_FALSE;
3976 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003977 skip_call |=
Mark Lobodzinski52c1f352017-01-06 07:37:11 -07003978 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_01783);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003979 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01784);
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003980 lock.unlock();
3981 if (!skip_call) {
3982 get_dispatch_table(ot_device_table_map, commandBuffer)
3983 ->CmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3984 }
3985}
3986
Mark Young39389872017-01-19 21:10:49 -07003987// VK_KHR_get_physical_device_properties2 Extension
3988VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures2KHR(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR *pFeatures) {
3989 bool skip = false;
3990 {
3991 std::unique_lock<std::mutex> lock(global_lock);
3992 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3993 VALIDATION_ERROR_UNDEFINED);
3994 }
3995 if (!skip) {
3996 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures);
3997 }
3998}
3999
4000VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties2KHR(VkPhysicalDevice physicalDevice,
4001 VkPhysicalDeviceProperties2KHR *pProperties) {
4002 bool skip = false;
4003 {
4004 std::unique_lock<std::mutex> lock(global_lock);
4005 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4006 VALIDATION_ERROR_UNDEFINED);
4007 }
4008 if (!skip) {
4009 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties2KHR(physicalDevice, pProperties);
4010 }
4011}
4012
4013VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties2KHR(VkPhysicalDevice physicalDevice, VkFormat format,
4014 VkFormatProperties2KHR *pFormatProperties) {
4015 bool skip = false;
4016 {
4017 std::unique_lock<std::mutex> lock(global_lock);
4018 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4019 VALIDATION_ERROR_UNDEFINED);
4020 }
4021 if (!skip) {
4022 get_dispatch_table(ot_instance_table_map, physicalDevice)
4023 ->GetPhysicalDeviceFormatProperties2KHR(physicalDevice, format, pFormatProperties);
4024 }
4025}
4026
4027VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties2KHR(
4028 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR *pImageFormatInfo,
4029 VkImageFormatProperties2KHR *pImageFormatProperties) {
4030 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4031 bool skip = false;
4032 {
4033 std::unique_lock<std::mutex> lock(global_lock);
4034 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4035 VALIDATION_ERROR_UNDEFINED);
4036 }
4037 if (skip) {
4038 return VK_ERROR_VALIDATION_FAILED_EXT;
4039 }
4040 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
4041 ->GetPhysicalDeviceImageFormatProperties2KHR(physicalDevice, pImageFormatInfo, pImageFormatProperties);
4042
4043 return result;
4044}
4045
4046VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties2KHR(VkPhysicalDevice physicalDevice,
4047 uint32_t *pQueueFamilyPropertyCount,
4048 VkQueueFamilyProperties2KHR *pQueueFamilyProperties) {
4049 bool skip = false;
4050 {
4051 std::unique_lock<std::mutex> lock(global_lock);
4052 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4053 VALIDATION_ERROR_UNDEFINED);
4054 }
4055 if (!skip) {
4056 get_dispatch_table(ot_instance_table_map, physicalDevice)
4057 ->GetPhysicalDeviceQueueFamilyProperties2KHR(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
4058 }
4059}
4060
4061VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties2KHR(VkPhysicalDevice physicalDevice,
4062 VkPhysicalDeviceMemoryProperties2KHR *pMemoryProperties) {
4063 bool skip = false;
4064 {
4065 std::unique_lock<std::mutex> lock(global_lock);
4066 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4067 VALIDATION_ERROR_UNDEFINED);
4068 }
4069 if (!skip) {
4070 get_dispatch_table(ot_instance_table_map, physicalDevice)
4071 ->GetPhysicalDeviceMemoryProperties2KHR(physicalDevice, pMemoryProperties);
4072 }
4073}
4074
4075VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties2KHR(
4076 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2KHR *pFormatInfo, uint32_t *pPropertyCount,
4077 VkSparseImageFormatProperties2KHR *pProperties) {
4078 bool skip = false;
4079 {
4080 std::unique_lock<std::mutex> lock(global_lock);
4081 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4082 VALIDATION_ERROR_UNDEFINED);
4083 }
4084 if (!skip) {
4085 get_dispatch_table(ot_instance_table_map, physicalDevice)
4086 ->GetPhysicalDeviceSparseImageFormatProperties2KHR(physicalDevice, pFormatInfo, pPropertyCount, pProperties);
4087 }
4088}
4089
4090// VK_NVX_device_generated_commands Extension
4091VKAPI_ATTR void VKAPI_CALL CmdProcessCommandsNVX(VkCommandBuffer commandBuffer,
4092 const VkCmdProcessCommandsInfoNVX *pProcessCommandsInfo) {
4093 bool skip_call = VK_FALSE;
4094 std::unique_lock<std::mutex> lock(global_lock);
4095 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4096 VALIDATION_ERROR_UNDEFINED);
4097 lock.unlock();
4098 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4099 if (!skip_call && dev_data->dispatch_table.CmdProcessCommandsNVX) {
4100 dev_data->dispatch_table.CmdProcessCommandsNVX(commandBuffer, pProcessCommandsInfo);
4101 }
4102}
4103
4104VKAPI_ATTR void VKAPI_CALL CmdReserveSpaceForCommandsNVX(VkCommandBuffer commandBuffer,
4105 const VkCmdReserveSpaceForCommandsInfoNVX *pReserveSpaceInfo) {
4106 bool skip_call = VK_FALSE;
4107 std::unique_lock<std::mutex> lock(global_lock);
4108 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4109 VALIDATION_ERROR_UNDEFINED);
4110 lock.unlock();
4111 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
4112 if (!skip_call && dev_data->dispatch_table.CmdReserveSpaceForCommandsNVX) {
4113 dev_data->dispatch_table.CmdReserveSpaceForCommandsNVX(commandBuffer, pReserveSpaceInfo);
4114 }
4115}
4116
4117VKAPI_ATTR VkResult VKAPI_CALL CreateIndirectCommandsLayoutNVX(VkDevice device,
4118 const VkIndirectCommandsLayoutCreateInfoNVX *pCreateInfo,
4119 const VkAllocationCallbacks *pAllocator,
4120 VkIndirectCommandsLayoutNVX *pIndirectCommandsLayout) {
4121 bool skip_call = VK_FALSE;
4122 std::unique_lock<std::mutex> lock(global_lock);
4123 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED);
4124 lock.unlock();
4125 if (skip_call) {
4126 return VK_ERROR_VALIDATION_FAILED_EXT;
4127 }
4128 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4129 VkResult result = VK_SUCCESS;
4130 if (dev_data->dispatch_table.CreateIndirectCommandsLayoutNVX) {
4131 result = dev_data->dispatch_table.CreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout);
4132 }
4133 return result;
4134}
4135
4136VKAPI_ATTR void VKAPI_CALL DestroyIndirectCommandsLayoutNVX(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout,
4137 const VkAllocationCallbacks *pAllocator) {
4138 bool skip_call = VK_FALSE;
4139 std::unique_lock<std::mutex> lock(global_lock);
4140 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED);
4141 lock.unlock();
4142 if (!skip_call) {
4143 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4144 if (dev_data->dispatch_table.DestroyIndirectCommandsLayoutNVX) {
4145 dev_data->dispatch_table.DestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator);
4146 }
4147 }
4148}
4149
4150VKAPI_ATTR VkResult VKAPI_CALL CreateObjectTableNVX(VkDevice device, const VkObjectTableCreateInfoNVX *pCreateInfo,
4151 const VkAllocationCallbacks *pAllocator, VkObjectTableNVX *pObjectTable) {
4152 bool skip_call = VK_FALSE;
4153 std::unique_lock<std::mutex> lock(global_lock);
4154 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED);
4155 lock.unlock();
4156 if (skip_call) {
4157 return VK_ERROR_VALIDATION_FAILED_EXT;
4158 }
4159 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4160 VkResult result = VK_SUCCESS;
4161 if (dev_data->dispatch_table.CreateObjectTableNVX) {
4162 result = dev_data->dispatch_table.CreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable);
4163 }
4164 return result;
4165}
4166
4167VKAPI_ATTR void VKAPI_CALL DestroyObjectTableNVX(VkDevice device, VkObjectTableNVX objectTable,
4168 const VkAllocationCallbacks *pAllocator) {
4169 bool skip_call = VK_FALSE;
4170 std::unique_lock<std::mutex> lock(global_lock);
4171 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED);
4172 lock.unlock();
4173 if (!skip_call) {
4174 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4175 if (dev_data->dispatch_table.DestroyObjectTableNVX) {
4176 dev_data->dispatch_table.DestroyObjectTableNVX(device, objectTable, pAllocator);
4177 }
4178 }
4179}
4180
4181VKAPI_ATTR VkResult VKAPI_CALL RegisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
4182 const VkObjectTableEntryNVX *const *ppObjectTableEntries,
4183 const uint32_t *pObjectIndices) {
4184 bool skip_call = VK_FALSE;
4185 std::unique_lock<std::mutex> lock(global_lock);
4186 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED);
4187 lock.unlock();
4188 if (skip_call) {
4189 return VK_ERROR_VALIDATION_FAILED_EXT;
4190 }
4191 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4192 VkResult result = VK_SUCCESS;
4193 if (dev_data->dispatch_table.RegisterObjectsNVX) {
4194 result =
4195 dev_data->dispatch_table.RegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices);
4196 }
4197 return result;
4198}
4199
4200VKAPI_ATTR VkResult VKAPI_CALL UnregisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
4201 const VkObjectEntryTypeNVX *pObjectEntryTypes, const uint32_t *pObjectIndices) {
4202 bool skip_call = VK_FALSE;
4203 std::unique_lock<std::mutex> lock(global_lock);
4204 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED);
4205 lock.unlock();
4206 if (skip_call) {
4207 return VK_ERROR_VALIDATION_FAILED_EXT;
4208 }
4209 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4210 VkResult result = VK_SUCCESS;
4211 if (dev_data->dispatch_table.UnregisterObjectsNVX) {
4212 result = dev_data->dispatch_table.UnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices);
4213 }
4214 return result;
4215}
4216
4217VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceGeneratedCommandsPropertiesNVX(VkPhysicalDevice physicalDevice,
4218 VkDeviceGeneratedCommandsFeaturesNVX *pFeatures,
4219 VkDeviceGeneratedCommandsLimitsNVX *pLimits) {
4220 bool skip = false;
4221 {
4222 std::unique_lock<std::mutex> lock(global_lock);
4223 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4224 VALIDATION_ERROR_UNDEFINED);
4225 }
4226 if (skip) {
4227 get_dispatch_table(ot_instance_table_map, physicalDevice)
4228 ->GetPhysicalDeviceGeneratedCommandsPropertiesNVX(physicalDevice, pFeatures, pLimits);
4229 }
4230}
4231
4232// VK_EXT_direct_mode_display Extension
4233VKAPI_ATTR VkResult VKAPI_CALL ReleaseDisplayEXT(VkPhysicalDevice physicalDevice, VkDisplayKHR display) {
4234 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4235 bool skip = false;
4236 {
4237 std::unique_lock<std::mutex> lock(global_lock);
4238 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4239 VALIDATION_ERROR_UNDEFINED);
4240 }
4241 if (skip) {
4242 return VK_ERROR_VALIDATION_FAILED_EXT;
4243 }
4244 result = get_dispatch_table(ot_instance_table_map, physicalDevice)->ReleaseDisplayEXT(physicalDevice, display);
4245
4246 return result;
4247}
4248
4249// VK_EXT_acquire_xlib_display Extension
4250#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
4251VKAPI_ATTR VkResult VKAPI_CALL AcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, VkDisplayKHR display) {
4252 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4253 bool skip = false;
4254 {
4255 std::unique_lock<std::mutex> lock(global_lock);
4256 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4257 VALIDATION_ERROR_UNDEFINED);
4258 }
4259 if (skip) {
4260 return VK_ERROR_VALIDATION_FAILED_EXT;
4261 }
4262 result = get_dispatch_table(ot_instance_table_map, physicalDevice)->AcquireXlibDisplayEXT(physicalDevice, dpy, display);
4263
4264 return result;
4265}
4266
4267VKAPI_ATTR VkResult VKAPI_CALL GetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, RROutput rrOutput,
4268 VkDisplayKHR *pDisplay) {
4269 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4270 bool skip = false;
4271 {
4272 std::unique_lock<std::mutex> lock(global_lock);
4273 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4274 VALIDATION_ERROR_UNDEFINED);
4275 }
4276 if (skip) {
4277 return VK_ERROR_VALIDATION_FAILED_EXT;
4278 }
4279 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
4280 ->GetRandROutputDisplayEXT(physicalDevice, dpy, rrOutput, pDisplay);
4281 if (result == VK_SUCCESS && pDisplay != NULL) {
4282 std::lock_guard<std::mutex> lock(global_lock);
4283 CreateObject(physicalDevice, pDisplay, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, nullptr);
4284 }
4285
4286 return result;
4287}
4288#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
4289
4290// VK_EXT_display_surface_counter Extension
4291VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4292 VkSurfaceCapabilities2EXT *pSurfaceCapabilities) {
4293 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4294 bool skip = false;
4295 {
4296 std::unique_lock<std::mutex> lock(global_lock);
4297 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4298 VALIDATION_ERROR_UNDEFINED);
4299 }
4300 if (skip) {
4301 return VK_ERROR_VALIDATION_FAILED_EXT;
4302 }
4303 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
4304 ->GetPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, pSurfaceCapabilities);
4305
4306 return result;
4307}
4308
4309// VK_EXT_display_control Extension
4310VKAPI_ATTR VkResult VKAPI_CALL DisplayPowerControlEXT(VkDevice device, VkDisplayKHR display,
4311 const VkDisplayPowerInfoEXT *pDisplayPowerInfo) {
4312 bool skip_call = VK_FALSE;
4313 std::unique_lock<std::mutex> lock(global_lock);
4314 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED);
4315 lock.unlock();
4316 if (skip_call) {
4317 return VK_ERROR_VALIDATION_FAILED_EXT;
4318 }
4319 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4320 VkResult result = VK_SUCCESS;
4321 if (dev_data->dispatch_table.DisplayPowerControlEXT) {
4322 result = dev_data->dispatch_table.DisplayPowerControlEXT(device, display, pDisplayPowerInfo);
4323 }
4324 return result;
4325}
4326
4327VKAPI_ATTR VkResult VKAPI_CALL RegisterDeviceEventEXT(VkDevice device, const VkDeviceEventInfoEXT *pDeviceEventInfo,
4328 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
4329 bool skip_call = VK_FALSE;
4330 std::unique_lock<std::mutex> lock(global_lock);
4331 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED);
4332 lock.unlock();
4333 if (skip_call) {
4334 return VK_ERROR_VALIDATION_FAILED_EXT;
4335 }
4336 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4337 VkResult result = VK_SUCCESS;
4338 if (dev_data->dispatch_table.RegisterDeviceEventEXT) {
4339 result = dev_data->dispatch_table.RegisterDeviceEventEXT(device, pDeviceEventInfo, pAllocator, pFence);
4340 if (result == VK_SUCCESS && pFence != NULL) {
4341 std::lock_guard<std::mutex> lock(global_lock);
4342 CreateObject(device, *pFence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
4343 }
4344 }
4345 return result;
4346}
4347
4348VKAPI_ATTR VkResult VKAPI_CALL RegisterDisplayEventEXT(VkDevice device, VkDisplayKHR display,
4349 const VkDisplayEventInfoEXT *pDisplayEventInfo,
4350 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
4351 bool skip_call = VK_FALSE;
4352 std::unique_lock<std::mutex> lock(global_lock);
4353 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED);
4354 lock.unlock();
4355 if (skip_call) {
4356 return VK_ERROR_VALIDATION_FAILED_EXT;
4357 }
4358 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4359 VkResult result = VK_SUCCESS;
4360 if (dev_data->dispatch_table.RegisterDisplayEventEXT) {
4361 result = dev_data->dispatch_table.RegisterDisplayEventEXT(device, display, pDisplayEventInfo, pAllocator, pFence);
4362 if (result == VK_SUCCESS && pFence != NULL) {
4363 std::lock_guard<std::mutex> lock(global_lock);
4364 CreateObject(device, *pFence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
4365 }
4366 }
4367 return result;
4368}
4369
4370VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainCounterEXT(VkDevice device, VkSwapchainKHR swapchain,
4371 VkSurfaceCounterFlagBitsEXT counter, uint64_t *pCounterValue) {
4372 bool skip_call = VK_FALSE;
4373 std::unique_lock<std::mutex> lock(global_lock);
4374 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED);
4375 lock.unlock();
4376 if (skip_call) {
4377 return VK_ERROR_VALIDATION_FAILED_EXT;
4378 }
4379 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4380 VkResult result = VK_SUCCESS;
4381 if (dev_data->dispatch_table.GetSwapchainCounterEXT) {
4382 result = dev_data->dispatch_table.GetSwapchainCounterEXT(device, swapchain, counter, pCounterValue);
4383 }
4384 return result;
4385}
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06004386
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004387static inline PFN_vkVoidFunction InterceptCoreDeviceCommand(const char *name) {
4388 if (!name || name[0] != 'v' || name[1] != 'k')
4389 return NULL;
4390
4391 name += 2;
4392 if (!strcmp(name, "GetDeviceProcAddr"))
4393 return (PFN_vkVoidFunction)GetDeviceProcAddr;
4394 if (!strcmp(name, "DestroyDevice"))
4395 return (PFN_vkVoidFunction)DestroyDevice;
4396 if (!strcmp(name, "GetDeviceQueue"))
4397 return (PFN_vkVoidFunction)GetDeviceQueue;
4398 if (!strcmp(name, "QueueSubmit"))
4399 return (PFN_vkVoidFunction)QueueSubmit;
4400 if (!strcmp(name, "QueueWaitIdle"))
4401 return (PFN_vkVoidFunction)QueueWaitIdle;
4402 if (!strcmp(name, "DeviceWaitIdle"))
4403 return (PFN_vkVoidFunction)DeviceWaitIdle;
4404 if (!strcmp(name, "AllocateMemory"))
4405 return (PFN_vkVoidFunction)AllocateMemory;
4406 if (!strcmp(name, "FreeMemory"))
4407 return (PFN_vkVoidFunction)FreeMemory;
4408 if (!strcmp(name, "MapMemory"))
4409 return (PFN_vkVoidFunction)MapMemory;
4410 if (!strcmp(name, "UnmapMemory"))
4411 return (PFN_vkVoidFunction)UnmapMemory;
4412 if (!strcmp(name, "FlushMappedMemoryRanges"))
4413 return (PFN_vkVoidFunction)FlushMappedMemoryRanges;
4414 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
4415 return (PFN_vkVoidFunction)InvalidateMappedMemoryRanges;
4416 if (!strcmp(name, "GetDeviceMemoryCommitment"))
4417 return (PFN_vkVoidFunction)GetDeviceMemoryCommitment;
4418 if (!strcmp(name, "BindBufferMemory"))
4419 return (PFN_vkVoidFunction)BindBufferMemory;
4420 if (!strcmp(name, "BindImageMemory"))
4421 return (PFN_vkVoidFunction)BindImageMemory;
4422 if (!strcmp(name, "GetBufferMemoryRequirements"))
4423 return (PFN_vkVoidFunction)GetBufferMemoryRequirements;
4424 if (!strcmp(name, "GetImageMemoryRequirements"))
4425 return (PFN_vkVoidFunction)GetImageMemoryRequirements;
4426 if (!strcmp(name, "GetImageSparseMemoryRequirements"))
4427 return (PFN_vkVoidFunction)GetImageSparseMemoryRequirements;
4428 if (!strcmp(name, "QueueBindSparse"))
4429 return (PFN_vkVoidFunction)QueueBindSparse;
4430 if (!strcmp(name, "CreateFence"))
4431 return (PFN_vkVoidFunction)CreateFence;
4432 if (!strcmp(name, "DestroyFence"))
4433 return (PFN_vkVoidFunction)DestroyFence;
4434 if (!strcmp(name, "ResetFences"))
4435 return (PFN_vkVoidFunction)ResetFences;
4436 if (!strcmp(name, "GetFenceStatus"))
4437 return (PFN_vkVoidFunction)GetFenceStatus;
4438 if (!strcmp(name, "WaitForFences"))
4439 return (PFN_vkVoidFunction)WaitForFences;
4440 if (!strcmp(name, "CreateSemaphore"))
4441 return (PFN_vkVoidFunction)CreateSemaphore;
4442 if (!strcmp(name, "DestroySemaphore"))
4443 return (PFN_vkVoidFunction)DestroySemaphore;
4444 if (!strcmp(name, "CreateEvent"))
4445 return (PFN_vkVoidFunction)CreateEvent;
4446 if (!strcmp(name, "DestroyEvent"))
4447 return (PFN_vkVoidFunction)DestroyEvent;
4448 if (!strcmp(name, "GetEventStatus"))
4449 return (PFN_vkVoidFunction)GetEventStatus;
4450 if (!strcmp(name, "SetEvent"))
4451 return (PFN_vkVoidFunction)SetEvent;
4452 if (!strcmp(name, "ResetEvent"))
4453 return (PFN_vkVoidFunction)ResetEvent;
4454 if (!strcmp(name, "CreateQueryPool"))
4455 return (PFN_vkVoidFunction)CreateQueryPool;
4456 if (!strcmp(name, "DestroyQueryPool"))
4457 return (PFN_vkVoidFunction)DestroyQueryPool;
4458 if (!strcmp(name, "GetQueryPoolResults"))
4459 return (PFN_vkVoidFunction)GetQueryPoolResults;
4460 if (!strcmp(name, "CreateBuffer"))
4461 return (PFN_vkVoidFunction)CreateBuffer;
4462 if (!strcmp(name, "DestroyBuffer"))
4463 return (PFN_vkVoidFunction)DestroyBuffer;
4464 if (!strcmp(name, "CreateBufferView"))
4465 return (PFN_vkVoidFunction)CreateBufferView;
4466 if (!strcmp(name, "DestroyBufferView"))
4467 return (PFN_vkVoidFunction)DestroyBufferView;
4468 if (!strcmp(name, "CreateImage"))
4469 return (PFN_vkVoidFunction)CreateImage;
4470 if (!strcmp(name, "DestroyImage"))
4471 return (PFN_vkVoidFunction)DestroyImage;
4472 if (!strcmp(name, "GetImageSubresourceLayout"))
4473 return (PFN_vkVoidFunction)GetImageSubresourceLayout;
4474 if (!strcmp(name, "CreateImageView"))
4475 return (PFN_vkVoidFunction)CreateImageView;
4476 if (!strcmp(name, "DestroyImageView"))
4477 return (PFN_vkVoidFunction)DestroyImageView;
4478 if (!strcmp(name, "CreateShaderModule"))
4479 return (PFN_vkVoidFunction)CreateShaderModule;
4480 if (!strcmp(name, "DestroyShaderModule"))
4481 return (PFN_vkVoidFunction)DestroyShaderModule;
4482 if (!strcmp(name, "CreatePipelineCache"))
4483 return (PFN_vkVoidFunction)CreatePipelineCache;
4484 if (!strcmp(name, "DestroyPipelineCache"))
4485 return (PFN_vkVoidFunction)DestroyPipelineCache;
4486 if (!strcmp(name, "GetPipelineCacheData"))
4487 return (PFN_vkVoidFunction)GetPipelineCacheData;
4488 if (!strcmp(name, "MergePipelineCaches"))
4489 return (PFN_vkVoidFunction)MergePipelineCaches;
4490 if (!strcmp(name, "CreateGraphicsPipelines"))
4491 return (PFN_vkVoidFunction)CreateGraphicsPipelines;
4492 if (!strcmp(name, "CreateComputePipelines"))
4493 return (PFN_vkVoidFunction)CreateComputePipelines;
4494 if (!strcmp(name, "DestroyPipeline"))
4495 return (PFN_vkVoidFunction)DestroyPipeline;
4496 if (!strcmp(name, "CreatePipelineLayout"))
4497 return (PFN_vkVoidFunction)CreatePipelineLayout;
4498 if (!strcmp(name, "DestroyPipelineLayout"))
4499 return (PFN_vkVoidFunction)DestroyPipelineLayout;
4500 if (!strcmp(name, "CreateSampler"))
4501 return (PFN_vkVoidFunction)CreateSampler;
4502 if (!strcmp(name, "DestroySampler"))
4503 return (PFN_vkVoidFunction)DestroySampler;
4504 if (!strcmp(name, "CreateDescriptorSetLayout"))
4505 return (PFN_vkVoidFunction)CreateDescriptorSetLayout;
4506 if (!strcmp(name, "DestroyDescriptorSetLayout"))
4507 return (PFN_vkVoidFunction)DestroyDescriptorSetLayout;
4508 if (!strcmp(name, "CreateDescriptorPool"))
4509 return (PFN_vkVoidFunction)CreateDescriptorPool;
4510 if (!strcmp(name, "DestroyDescriptorPool"))
4511 return (PFN_vkVoidFunction)DestroyDescriptorPool;
4512 if (!strcmp(name, "ResetDescriptorPool"))
4513 return (PFN_vkVoidFunction)ResetDescriptorPool;
4514 if (!strcmp(name, "AllocateDescriptorSets"))
4515 return (PFN_vkVoidFunction)AllocateDescriptorSets;
4516 if (!strcmp(name, "FreeDescriptorSets"))
4517 return (PFN_vkVoidFunction)FreeDescriptorSets;
4518 if (!strcmp(name, "UpdateDescriptorSets"))
4519 return (PFN_vkVoidFunction)UpdateDescriptorSets;
4520 if (!strcmp(name, "CreateFramebuffer"))
4521 return (PFN_vkVoidFunction)CreateFramebuffer;
4522 if (!strcmp(name, "DestroyFramebuffer"))
4523 return (PFN_vkVoidFunction)DestroyFramebuffer;
4524 if (!strcmp(name, "CreateRenderPass"))
4525 return (PFN_vkVoidFunction)CreateRenderPass;
4526 if (!strcmp(name, "DestroyRenderPass"))
4527 return (PFN_vkVoidFunction)DestroyRenderPass;
4528 if (!strcmp(name, "GetRenderAreaGranularity"))
4529 return (PFN_vkVoidFunction)GetRenderAreaGranularity;
4530 if (!strcmp(name, "CreateCommandPool"))
4531 return (PFN_vkVoidFunction)CreateCommandPool;
4532 if (!strcmp(name, "DestroyCommandPool"))
4533 return (PFN_vkVoidFunction)DestroyCommandPool;
4534 if (!strcmp(name, "ResetCommandPool"))
4535 return (PFN_vkVoidFunction)ResetCommandPool;
4536 if (!strcmp(name, "AllocateCommandBuffers"))
4537 return (PFN_vkVoidFunction)AllocateCommandBuffers;
4538 if (!strcmp(name, "FreeCommandBuffers"))
4539 return (PFN_vkVoidFunction)FreeCommandBuffers;
4540 if (!strcmp(name, "BeginCommandBuffer"))
4541 return (PFN_vkVoidFunction)BeginCommandBuffer;
4542 if (!strcmp(name, "EndCommandBuffer"))
4543 return (PFN_vkVoidFunction)EndCommandBuffer;
4544 if (!strcmp(name, "ResetCommandBuffer"))
4545 return (PFN_vkVoidFunction)ResetCommandBuffer;
4546 if (!strcmp(name, "CmdBindPipeline"))
4547 return (PFN_vkVoidFunction)CmdBindPipeline;
4548 if (!strcmp(name, "CmdSetViewport"))
4549 return (PFN_vkVoidFunction)CmdSetViewport;
4550 if (!strcmp(name, "CmdSetScissor"))
4551 return (PFN_vkVoidFunction)CmdSetScissor;
4552 if (!strcmp(name, "CmdSetLineWidth"))
4553 return (PFN_vkVoidFunction)CmdSetLineWidth;
4554 if (!strcmp(name, "CmdSetDepthBias"))
4555 return (PFN_vkVoidFunction)CmdSetDepthBias;
4556 if (!strcmp(name, "CmdSetBlendConstants"))
4557 return (PFN_vkVoidFunction)CmdSetBlendConstants;
4558 if (!strcmp(name, "CmdSetDepthBounds"))
4559 return (PFN_vkVoidFunction)CmdSetDepthBounds;
4560 if (!strcmp(name, "CmdSetStencilCompareMask"))
4561 return (PFN_vkVoidFunction)CmdSetStencilCompareMask;
4562 if (!strcmp(name, "CmdSetStencilWriteMask"))
4563 return (PFN_vkVoidFunction)CmdSetStencilWriteMask;
4564 if (!strcmp(name, "CmdSetStencilReference"))
4565 return (PFN_vkVoidFunction)CmdSetStencilReference;
4566 if (!strcmp(name, "CmdBindDescriptorSets"))
4567 return (PFN_vkVoidFunction)CmdBindDescriptorSets;
4568 if (!strcmp(name, "CmdBindIndexBuffer"))
4569 return (PFN_vkVoidFunction)CmdBindIndexBuffer;
4570 if (!strcmp(name, "CmdBindVertexBuffers"))
4571 return (PFN_vkVoidFunction)CmdBindVertexBuffers;
4572 if (!strcmp(name, "CmdDraw"))
4573 return (PFN_vkVoidFunction)CmdDraw;
4574 if (!strcmp(name, "CmdDrawIndexed"))
4575 return (PFN_vkVoidFunction)CmdDrawIndexed;
4576 if (!strcmp(name, "CmdDrawIndirect"))
4577 return (PFN_vkVoidFunction)CmdDrawIndirect;
4578 if (!strcmp(name, "CmdDrawIndexedIndirect"))
4579 return (PFN_vkVoidFunction)CmdDrawIndexedIndirect;
4580 if (!strcmp(name, "CmdDispatch"))
4581 return (PFN_vkVoidFunction)CmdDispatch;
4582 if (!strcmp(name, "CmdDispatchIndirect"))
4583 return (PFN_vkVoidFunction)CmdDispatchIndirect;
4584 if (!strcmp(name, "CmdCopyBuffer"))
4585 return (PFN_vkVoidFunction)CmdCopyBuffer;
4586 if (!strcmp(name, "CmdCopyImage"))
4587 return (PFN_vkVoidFunction)CmdCopyImage;
4588 if (!strcmp(name, "CmdBlitImage"))
4589 return (PFN_vkVoidFunction)CmdBlitImage;
4590 if (!strcmp(name, "CmdCopyBufferToImage"))
4591 return (PFN_vkVoidFunction)CmdCopyBufferToImage;
4592 if (!strcmp(name, "CmdCopyImageToBuffer"))
4593 return (PFN_vkVoidFunction)CmdCopyImageToBuffer;
4594 if (!strcmp(name, "CmdUpdateBuffer"))
4595 return (PFN_vkVoidFunction)CmdUpdateBuffer;
4596 if (!strcmp(name, "CmdFillBuffer"))
4597 return (PFN_vkVoidFunction)CmdFillBuffer;
4598 if (!strcmp(name, "CmdClearColorImage"))
4599 return (PFN_vkVoidFunction)CmdClearColorImage;
4600 if (!strcmp(name, "CmdClearDepthStencilImage"))
4601 return (PFN_vkVoidFunction)CmdClearDepthStencilImage;
4602 if (!strcmp(name, "CmdClearAttachments"))
4603 return (PFN_vkVoidFunction)CmdClearAttachments;
4604 if (!strcmp(name, "CmdResolveImage"))
4605 return (PFN_vkVoidFunction)CmdResolveImage;
4606 if (!strcmp(name, "CmdSetEvent"))
4607 return (PFN_vkVoidFunction)CmdSetEvent;
4608 if (!strcmp(name, "CmdResetEvent"))
4609 return (PFN_vkVoidFunction)CmdResetEvent;
4610 if (!strcmp(name, "CmdWaitEvents"))
4611 return (PFN_vkVoidFunction)CmdWaitEvents;
4612 if (!strcmp(name, "CmdPipelineBarrier"))
4613 return (PFN_vkVoidFunction)CmdPipelineBarrier;
4614 if (!strcmp(name, "CmdBeginQuery"))
4615 return (PFN_vkVoidFunction)CmdBeginQuery;
4616 if (!strcmp(name, "CmdEndQuery"))
4617 return (PFN_vkVoidFunction)CmdEndQuery;
4618 if (!strcmp(name, "CmdResetQueryPool"))
4619 return (PFN_vkVoidFunction)CmdResetQueryPool;
4620 if (!strcmp(name, "CmdWriteTimestamp"))
4621 return (PFN_vkVoidFunction)CmdWriteTimestamp;
4622 if (!strcmp(name, "CmdCopyQueryPoolResults"))
4623 return (PFN_vkVoidFunction)CmdCopyQueryPoolResults;
4624 if (!strcmp(name, "CmdPushConstants"))
4625 return (PFN_vkVoidFunction)CmdPushConstants;
4626 if (!strcmp(name, "CmdBeginRenderPass"))
4627 return (PFN_vkVoidFunction)CmdBeginRenderPass;
4628 if (!strcmp(name, "CmdNextSubpass"))
4629 return (PFN_vkVoidFunction)CmdNextSubpass;
4630 if (!strcmp(name, "CmdEndRenderPass"))
4631 return (PFN_vkVoidFunction)CmdEndRenderPass;
4632 if (!strcmp(name, "CmdExecuteCommands"))
4633 return (PFN_vkVoidFunction)CmdExecuteCommands;
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06004634 if (!strcmp(name, "DebugMarkerSetObjectTagEXT"))
4635 return (PFN_vkVoidFunction)DebugMarkerSetObjectTagEXT;
4636 if (!strcmp(name, "DebugMarkerSetObjectNameEXT"))
4637 return (PFN_vkVoidFunction)DebugMarkerSetObjectNameEXT;
4638 if (!strcmp(name, "CmdDebugMarkerBeginEXT"))
4639 return (PFN_vkVoidFunction)CmdDebugMarkerBeginEXT;
4640 if (!strcmp(name, "CmdDebugMarkerEndEXT"))
4641 return (PFN_vkVoidFunction)CmdDebugMarkerEndEXT;
4642 if (!strcmp(name, "CmdDebugMarkerInsertEXT"))
4643 return (PFN_vkVoidFunction)CmdDebugMarkerInsertEXT;
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06004644#ifdef VK_USE_PLATFORM_WIN32_KHR
4645 if (!strcmp(name, "GetMemoryWin32HandleNV"))
4646 return (PFN_vkVoidFunction)GetMemoryWin32HandleNV;
4647#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06004648 if (!strcmp(name, "CmdDrawIndirectCountAMD"))
4649 return (PFN_vkVoidFunction)CmdDrawIndirectCountAMD;
4650 if (!strcmp(name, "CmdDrawIndexedIndirectCountAMD"))
4651 return (PFN_vkVoidFunction)CmdDrawIndexedIndirectCountAMD;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004652
4653 return NULL;
4654}
Mark Young39389872017-01-19 21:10:49 -07004655
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004656static inline PFN_vkVoidFunction InterceptCoreInstanceCommand(const char *name) {
4657 if (!name || name[0] != 'v' || name[1] != 'k')
4658 return NULL;
4659
4660 name += 2;
4661 if (!strcmp(name, "CreateInstance"))
4662 return (PFN_vkVoidFunction)CreateInstance;
4663 if (!strcmp(name, "DestroyInstance"))
4664 return (PFN_vkVoidFunction)DestroyInstance;
4665 if (!strcmp(name, "EnumeratePhysicalDevices"))
4666 return (PFN_vkVoidFunction)EnumeratePhysicalDevices;
Mark Young39389872017-01-19 21:10:49 -07004667 if (!strcmp(name, "_layerGetPhysicalDeviceProcAddr"))
4668 return (PFN_vkVoidFunction)GetPhysicalDeviceProcAddr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004669 if (!strcmp(name, "GetPhysicalDeviceFeatures"))
4670 return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures;
4671 if (!strcmp(name, "GetPhysicalDeviceFormatProperties"))
4672 return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties;
4673 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties"))
4674 return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties;
4675 if (!strcmp(name, "GetPhysicalDeviceProperties"))
4676 return (PFN_vkVoidFunction)GetPhysicalDeviceProperties;
4677 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties"))
4678 return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties;
4679 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties"))
4680 return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties;
4681 if (!strcmp(name, "GetInstanceProcAddr"))
4682 return (PFN_vkVoidFunction)GetInstanceProcAddr;
4683 if (!strcmp(name, "CreateDevice"))
4684 return (PFN_vkVoidFunction)CreateDevice;
4685 if (!strcmp(name, "EnumerateInstanceExtensionProperties"))
4686 return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
4687 if (!strcmp(name, "EnumerateInstanceLayerProperties"))
4688 return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties;
4689 if (!strcmp(name, "EnumerateDeviceLayerProperties"))
4690 return (PFN_vkVoidFunction)EnumerateDeviceLayerProperties;
4691 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties"))
4692 return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties;
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06004693 if (!strcmp(name, "GetPhysicalDeviceExternalImageFormatPropertiesNV"))
4694 return (PFN_vkVoidFunction)GetPhysicalDeviceExternalImageFormatPropertiesNV;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004695
4696 return NULL;
4697}
4698
Mark Young39389872017-01-19 21:10:49 -07004699static inline PFN_vkVoidFunction InterceptDeviceExtensionCommand(const char *name, VkDevice device) {
4700 if (device) {
4701 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
4702
4703 if (!name || name[0] != 'v' || name[1] != 'k')
4704 return NULL;
4705
4706 name += 2;
4707
4708 if (device_data->nvx_device_generated_commands_enabled) {
4709 if (!strcmp(name, "CmdProcessCommandsNVX"))
4710 return (PFN_vkVoidFunction)CmdProcessCommandsNVX;
4711 if (!strcmp(name, "CmdReserveSpaceForCommandsNVX"))
4712 return (PFN_vkVoidFunction)CmdReserveSpaceForCommandsNVX;
4713 if (!strcmp(name, "CreateIndirectCommandsLayoutNVX"))
4714 return (PFN_vkVoidFunction)CreateIndirectCommandsLayoutNVX;
4715 if (!strcmp(name, "DestroyIndirectCommandsLayoutNVX"))
4716 return (PFN_vkVoidFunction)DestroyIndirectCommandsLayoutNVX;
4717 if (!strcmp(name, "CreateObjectTableNVX"))
4718 return (PFN_vkVoidFunction)CreateObjectTableNVX;
4719 if (!strcmp(name, "DestroyObjectTableNVX"))
4720 return (PFN_vkVoidFunction)DestroyObjectTableNVX;
4721 if (!strcmp(name, "RegisterObjectsNVX"))
4722 return (PFN_vkVoidFunction)RegisterObjectsNVX;
4723 if (!strcmp(name, "UnregisterObjectsNVX"))
4724 return (PFN_vkVoidFunction)UnregisterObjectsNVX;
4725 }
4726 if (device_data->ext_display_control_enabled) {
4727 if (!strcmp(name, "DisplayPowerControlEXT"))
4728 return (PFN_vkVoidFunction)DisplayPowerControlEXT;
4729 if (!strcmp(name, "RegisterDeviceEventEXT"))
4730 return (PFN_vkVoidFunction)RegisterDeviceEventEXT;
4731 if (!strcmp(name, "RegisterDisplayEventEXT"))
4732 return (PFN_vkVoidFunction)RegisterDisplayEventEXT;
4733 if (!strcmp(name, "GetSwapchainCounterEXT"))
4734 return (PFN_vkVoidFunction)GetSwapchainCounterEXT;
4735 }
4736 }
4737
4738 return NULL;
4739}
4740
4741static inline PFN_vkVoidFunction InterceptInstanceExtensionCommand(const char *name) {
4742 if (!name || name[0] != 'v' || name[1] != 'k')
4743 return NULL;
4744
4745 name += 2;
4746
4747 // VK_KHR_get_physical_device_properties2 Extension
4748 if (!strcmp(name, "GetPhysicalDeviceFeatures2KHR"))
4749 return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures2KHR;
4750 if (!strcmp(name, "GetPhysicalDeviceProperties2KHR"))
4751 return (PFN_vkVoidFunction)GetPhysicalDeviceProperties2KHR;
4752 if (!strcmp(name, "GetPhysicalDeviceFormatProperties2KHR"))
4753 return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties2KHR;
4754 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties2KHR"))
4755 return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties2KHR;
4756 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties2KHR"))
4757 return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties2KHR;
4758 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties2KHR"))
4759 return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties2KHR;
4760 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties2KHR"))
4761 return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties2KHR;
4762 // VK_NVX_device_generated_commands Extension
4763 if (!strcmp(name, "GetPhysicalDeviceGeneratedCommandsPropertiesNVX"))
4764 return (PFN_vkVoidFunction)GetPhysicalDeviceGeneratedCommandsPropertiesNVX;
4765 // VK_EXT_direct_mode_display Extension
4766 if (!strcmp(name, "ReleaseDisplayEXT"))
4767 return (PFN_vkVoidFunction)ReleaseDisplayEXT;
4768#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
4769 // VK_EXT_acquire_xlib_display Extension
4770 if (!strcmp(name, "AcquireXlibDisplayEXT"))
4771 return (PFN_vkVoidFunction)AcquireXlibDisplayEXT;
4772 if (!strcmp(name, "GetRandROutputDisplayEXT"))
4773 return (PFN_vkVoidFunction)GetRandROutputDisplayEXT;
4774#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
4775 // VK_EXT_display_surface_counter Extension
4776 if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilities2EXT"))
4777 return (PFN_vkVoidFunction)GetPhysicalDeviceSurfaceCapabilities2EXT;
4778
4779 return NULL;
4780}
4781
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004782static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
4783 if (device) {
4784 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06004785
4786 if (device_data->wsi_enabled) {
4787 if (!strcmp("vkCreateSwapchainKHR", name))
4788 return reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR);
4789 if (!strcmp("vkDestroySwapchainKHR", name))
4790 return reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR);
4791 if (!strcmp("vkGetSwapchainImagesKHR", name))
4792 return reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR);
4793 if (!strcmp("vkAcquireNextImageKHR", name))
4794 return reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR);
4795 if (!strcmp("vkQueuePresentKHR", name))
4796 return reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR);
4797 }
4798
4799 if (device_data->wsi_display_swapchain_enabled) {
4800 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
4801 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
4802 }
4803 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07004804
4805 if (device_data->wsi_display_extension_enabled) {
4806 if (!strcmp("vkGetPhysicalDeviceDisplayPropertiesKHR", name))
4807 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR);
4808 if (!strcmp("vkGetPhysicalDeviceDisplayPlanePropertiesKHR", name))
4809 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR);
4810 if (!strcmp("vkGetDisplayPlaneSupportedDisplaysKHR", name))
4811 return reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR);
4812 if (!strcmp("vkGetDisplayModePropertiesKHR", name))
4813 return reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR);
4814 if (!strcmp("vkCreateDisplayModeKHR", name))
4815 return reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR);
4816 if (!strcmp("vkGetDisplayPlaneCapabilitiesKHR", name))
4817 return reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR);
4818 if (!strcmp("vkCreateDisplayPlaneSurfaceKHR", name))
4819 return reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR);
4820 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004821 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004822
4823 return nullptr;
4824}
4825
4826VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
4827 PFN_vkVoidFunction addr;
4828 addr = InterceptCoreDeviceCommand(funcName);
4829 if (addr) {
4830 return addr;
4831 }
4832 assert(device);
4833
4834 addr = InterceptWsiEnabledCommand(funcName, device);
4835 if (addr) {
4836 return addr;
4837 }
Mark Young39389872017-01-19 21:10:49 -07004838 addr = InterceptDeviceExtensionCommand(funcName, device);
4839 if (addr) {
4840 return addr;
4841 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004842 if (get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr == NULL) {
4843 return NULL;
4844 }
4845 return get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr(device, funcName);
4846}
4847
4848VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
4849 PFN_vkVoidFunction addr;
4850 addr = InterceptCoreInstanceCommand(funcName);
4851 if (!addr) {
4852 addr = InterceptCoreDeviceCommand(funcName);
4853 }
4854 if (!addr) {
4855 addr = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
4856 }
4857 if (addr) {
4858 return addr;
4859 }
4860 assert(instance);
4861
4862 addr = InterceptMsgCallbackGetProcAddrCommand(funcName, instance);
4863 if (addr) {
4864 return addr;
4865 }
4866 addr = InterceptWsiEnabledCommand(funcName, instance);
4867 if (addr) {
4868 return addr;
4869 }
Mark Young39389872017-01-19 21:10:49 -07004870 addr = InterceptInstanceExtensionCommand(funcName);
4871 if (addr) {
4872 return addr;
4873 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004874 if (get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr == NULL) {
4875 return NULL;
4876 }
4877 return get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
4878}
4879
Mark Young39389872017-01-19 21:10:49 -07004880VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *funcName) {
4881 assert(instance);
4882
4883 if (get_dispatch_table(ot_instance_table_map, instance)->GetPhysicalDeviceProcAddr == NULL) {
4884 return NULL;
4885 }
4886 return get_dispatch_table(ot_instance_table_map, instance)->GetPhysicalDeviceProcAddr(instance, funcName);
4887}
4888
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004889} // namespace object_tracker
4890
4891// vk_layer_logging.h expects these to be defined
4892VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
4893 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4894 const VkAllocationCallbacks *pAllocator,
4895 VkDebugReportCallbackEXT *pMsgCallback) {
4896 return object_tracker::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
4897}
4898
4899VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
4900 const VkAllocationCallbacks *pAllocator) {
4901 object_tracker::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
4902}
4903
4904VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
4905 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
4906 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
4907 object_tracker::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
4908}
4909
4910// Loader-layer interface v0, just wrappers since there is only a layer
4911VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4912 VkExtensionProperties *pProperties) {
4913 return object_tracker::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
4914}
4915
4916VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
4917 VkLayerProperties *pProperties) {
4918 return object_tracker::EnumerateInstanceLayerProperties(pCount, pProperties);
4919}
4920
4921VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4922 VkLayerProperties *pProperties) {
4923 // The layer command handles VK_NULL_HANDLE just fine internally
4924 assert(physicalDevice == VK_NULL_HANDLE);
4925 return object_tracker::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
4926}
4927
4928VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
4929 return object_tracker::GetDeviceProcAddr(dev, funcName);
4930}
4931
4932VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
4933 return object_tracker::GetInstanceProcAddr(instance, funcName);
4934}
4935
4936VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4937 const char *pLayerName, uint32_t *pCount,
4938 VkExtensionProperties *pProperties) {
4939 // The layer command handles VK_NULL_HANDLE just fine internally
4940 assert(physicalDevice == VK_NULL_HANDLE);
4941 return object_tracker::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Mark Lobodzinski38080682016-07-22 15:30:27 -06004942}
Mark Young39389872017-01-19 21:10:49 -07004943
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004944VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_layerGetPhysicalDeviceProcAddr(VkInstance instance,
4945 const char *funcName) {
Mark Young39389872017-01-19 21:10:49 -07004946 return object_tracker::GetPhysicalDeviceProcAddr(instance, funcName);
4947}
4948
4949VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface *pVersionStruct) {
4950 assert(pVersionStruct != NULL);
4951 assert(pVersionStruct->sType == LAYER_NEGOTIATE_INTERFACE_STRUCT);
4952
4953 // Fill in the function pointers if our version is at least capable of having the structure contain them.
4954 if (pVersionStruct->loaderLayerInterfaceVersion >= 2) {
4955 pVersionStruct->pfnGetInstanceProcAddr = vkGetInstanceProcAddr;
4956 pVersionStruct->pfnGetDeviceProcAddr = vkGetDeviceProcAddr;
4957 pVersionStruct->pfnGetPhysicalDeviceProcAddr = vk_layerGetPhysicalDeviceProcAddr;
4958 }
4959
4960 if (pVersionStruct->loaderLayerInterfaceVersion < CURRENT_LOADER_LAYER_INTERFACE_VERSION) {
4961 object_tracker::loader_layer_if_version = pVersionStruct->loaderLayerInterfaceVersion;
4962 } else if (pVersionStruct->loaderLayerInterfaceVersion > CURRENT_LOADER_LAYER_INTERFACE_VERSION) {
4963 pVersionStruct->loaderLayerInterfaceVersion = CURRENT_LOADER_LAYER_INTERFACE_VERSION;
4964 }
4965
4966 return VK_SUCCESS;
4967}