blob: 6a493fb5fa9698d0880501c4b4c48205df4c9f29 [file] [log] [blame]
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
5 * Copyright (c) 2015-2016 Google, Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * Author: Mark Lobodzinski <mark@lunarg.com>
20 * Author: Tobin Ehlis <tobine@google.com>
21 * Author: Courtney Goeltzenleuchter <courtneygo@google.com>
22 * Author: Jon Ashburn <jon@lunarg.com>
23 * Author: Mike Stroyan <stroyan@google.com>
24 * Author: Tony Barbour <tony@LunarG.com>
25 */
26
27#include "vk_loader_platform.h"
28#include "vulkan/vulkan.h"
29
30#include <cinttypes>
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34
35#include <unordered_map>
36
37#include "vk_layer_config.h"
38#include "vk_layer_data.h"
39#include "vk_layer_logging.h"
40#include "vk_layer_table.h"
41#include "vulkan/vk_layer.h"
42
43#include "object_tracker.h"
44
Karl Schultza9ef1e52016-10-06 17:53:48 -060045#include "vk_validation_error_messages.h"
46
Mark Lobodzinski9bab8662016-07-01 10:53:31 -060047namespace object_tracker {
48
49static void InitObjectTracker(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
50
51 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_object_tracker");
52}
53
54// Add new queue to head of global queue list
55static void AddQueueInfo(VkDevice device, uint32_t queue_node_index, VkQueue queue) {
56 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
57 auto queueItem = device_data->queue_info_map.find(queue);
58 if (queueItem == device_data->queue_info_map.end()) {
59 OT_QUEUE_INFO *p_queue_info = new OT_QUEUE_INFO;
60 if (p_queue_info != NULL) {
61 memset(p_queue_info, 0, sizeof(OT_QUEUE_INFO));
62 p_queue_info->queue = queue;
63 p_queue_info->queue_node_index = queue_node_index;
64 device_data->queue_info_map[queue] = p_queue_info;
65 } else {
66 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
67 reinterpret_cast<uint64_t>(queue), __LINE__, OBJTRACK_INTERNAL_ERROR, LayerName,
68 "ERROR: VK_ERROR_OUT_OF_HOST_MEMORY -- could not allocate memory for Queue Information");
69 }
70 }
71}
72
73// Destroy memRef lists and free all memory
74static void DestroyQueueDataStructures(VkDevice device) {
75 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
76
77 for (auto queue_item : device_data->queue_info_map) {
78 delete queue_item.second;
79 }
80 device_data->queue_info_map.clear();
81
82 // Destroy the items in the queue map
83 auto queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].begin();
84 while (queue != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
85 uint32_t obj_index = queue->second->object_type;
86 assert(device_data->num_total_objects > 0);
87 device_data->num_total_objects--;
88 assert(device_data->num_objects[obj_index] > 0);
89 device_data->num_objects[obj_index]--;
90 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, queue->second->object_type, queue->second->handle,
91 __LINE__, OBJTRACK_NONE, LayerName,
92 "OBJ_STAT Destroy Queue obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " Queue objs).",
93 queue->second->handle, device_data->num_total_objects, device_data->num_objects[obj_index]);
94 delete queue->second;
95 queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].erase(queue);
96 }
97}
98
99// Check Queue type flags for selected queue operations
100static void ValidateQueueFlags(VkQueue queue, const char *function) {
101 layer_data *device_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
102 auto queue_item = device_data->queue_info_map.find(queue);
103 if (queue_item != device_data->queue_info_map.end()) {
104 OT_QUEUE_INFO *pQueueInfo = queue_item->second;
105 if (pQueueInfo != NULL) {
106 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(device_data->physical_device), layer_data_map);
107 if ((instance_data->queue_family_properties[pQueueInfo->queue_node_index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) ==
108 0) {
109 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700110 reinterpret_cast<uint64_t>(queue), __LINE__, VALIDATION_ERROR_01651, LayerName,
111 "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_SPARSE_BINDING_BIT not set. %s",
112 function, validation_error_map[VALIDATION_ERROR_01651]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600113 }
114 }
115 }
116}
117
118static void AllocateCommandBuffer(VkDevice device, const VkCommandPool command_pool, const VkCommandBuffer command_buffer,
119 VkDebugReportObjectTypeEXT object_type, VkCommandBufferLevel level) {
120 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
121
122 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<const uint64_t>(command_buffer),
123 __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
124 string_VkDebugReportObjectTypeEXT(object_type), reinterpret_cast<const uint64_t>(command_buffer));
125
126 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
127 pNewObjNode->object_type = object_type;
128 pNewObjNode->handle = reinterpret_cast<const uint64_t>(command_buffer);
129 pNewObjNode->parent_object = reinterpret_cast<const uint64_t &>(command_pool);
130 if (level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) {
131 pNewObjNode->status = OBJSTATUS_COMMAND_BUFFER_SECONDARY;
132 } else {
133 pNewObjNode->status = OBJSTATUS_NONE;
134 }
135 device_data->object_map[object_type][reinterpret_cast<const uint64_t>(command_buffer)] = pNewObjNode;
136 device_data->num_objects[object_type]++;
137 device_data->num_total_objects++;
138}
139
140static bool ValidateCommandBuffer(VkDevice device, VkCommandPool command_pool, VkCommandBuffer command_buffer) {
141 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
142 bool skip_call = false;
143 uint64_t object_handle = reinterpret_cast<uint64_t>(command_buffer);
144 if (device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].find(object_handle) !=
145 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
146 OBJTRACK_NODE *pNode =
147 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<uint64_t>(command_buffer)];
148
149 if (pNode->parent_object != reinterpret_cast<uint64_t &>(command_pool)) {
150 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700151 __LINE__, VALIDATION_ERROR_00102, LayerName,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600152 "FreeCommandBuffers is attempting to free Command Buffer 0x%" PRIxLEAST64
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700153 " belonging to Command Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 "). %s",
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600154 reinterpret_cast<uint64_t>(command_buffer), pNode->parent_object,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700155 reinterpret_cast<uint64_t &>(command_pool), validation_error_map[VALIDATION_ERROR_00102]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600156 }
157 } else {
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700158 skip_call |=
159 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
160 object_handle, __LINE__, VALIDATION_ERROR_00097, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s",
161 object_name[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT], object_handle,
162 validation_error_map[VALIDATION_ERROR_00097]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600163 }
164 return skip_call;
165}
166
167static void AllocateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set,
168 VkDebugReportObjectTypeEXT object_type) {
169 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
170
171 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type,
172 reinterpret_cast<uint64_t &>(descriptor_set), __LINE__, OBJTRACK_NONE, LayerName,
173 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, object_name[object_type],
174 reinterpret_cast<uint64_t &>(descriptor_set));
175
176 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
177 pNewObjNode->object_type = object_type;
178 pNewObjNode->status = OBJSTATUS_NONE;
179 pNewObjNode->handle = reinterpret_cast<uint64_t &>(descriptor_set);
180 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(descriptor_pool);
181 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT][reinterpret_cast<uint64_t &>(descriptor_set)] =
182 pNewObjNode;
183 device_data->num_objects[object_type]++;
184 device_data->num_total_objects++;
185}
186
187static bool ValidateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set) {
188 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
189 bool skip_call = false;
190 uint64_t object_handle = reinterpret_cast<uint64_t &>(descriptor_set);
191 auto dsItem = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].find(object_handle);
192 if (dsItem != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
193 OBJTRACK_NODE *pNode = dsItem->second;
194
195 if (pNode->parent_object != reinterpret_cast<uint64_t &>(descriptor_pool)) {
196 skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700197 __LINE__, VALIDATION_ERROR_00927, LayerName,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600198 "FreeDescriptorSets is attempting to free descriptorSet 0x%" PRIxLEAST64
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700199 " belonging to Descriptor Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 "). %s",
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600200 reinterpret_cast<uint64_t &>(descriptor_set), pNode->parent_object,
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700201 reinterpret_cast<uint64_t &>(descriptor_pool), validation_error_map[VALIDATION_ERROR_00927]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600202 }
203 } else {
Mike Schuchardt7fbb7e32016-12-06 10:56:01 -0700204 skip_call |=
205 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
206 object_handle, __LINE__, VALIDATION_ERROR_00920, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s",
207 object_name[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT], object_handle,
208 validation_error_map[VALIDATION_ERROR_00920]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600209 }
210 return skip_call;
211}
212
213static void CreateQueue(VkDevice device, VkQueue vkObj, VkDebugReportObjectTypeEXT object_type) {
214 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
215
216 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, reinterpret_cast<uint64_t>(vkObj), __LINE__,
217 OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
218 object_name[object_type], reinterpret_cast<uint64_t>(vkObj));
219
220 OBJTRACK_NODE *p_obj_node = NULL;
221 auto queue_item = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].find(reinterpret_cast<uint64_t>(vkObj));
222 if (queue_item == device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
223 p_obj_node = new OBJTRACK_NODE;
224 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT][reinterpret_cast<uint64_t>(vkObj)] = p_obj_node;
225 device_data->num_objects[object_type]++;
226 device_data->num_total_objects++;
227 } else {
228 p_obj_node = queue_item->second;
229 }
230 p_obj_node->object_type = object_type;
231 p_obj_node->status = OBJSTATUS_NONE;
232 p_obj_node->handle = reinterpret_cast<uint64_t>(vkObj);
233}
234
235static void CreateSwapchainImageObject(VkDevice dispatchable_object, VkImage swapchain_image, VkSwapchainKHR swapchain) {
236 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
237 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
238 reinterpret_cast<uint64_t &>(swapchain_image), __LINE__, OBJTRACK_NONE, LayerName,
239 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, "SwapchainImage",
240 reinterpret_cast<uint64_t &>(swapchain_image));
241
242 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
243 pNewObjNode->object_type = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT;
244 pNewObjNode->status = OBJSTATUS_NONE;
245 pNewObjNode->handle = reinterpret_cast<uint64_t &>(swapchain_image);
246 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(swapchain);
247 device_data->swapchainImageMap[reinterpret_cast<uint64_t &>(swapchain_image)] = pNewObjNode;
248}
249
Chris Forbes64a31a12016-10-04 14:54:13 +1300250template<typename T>
251uint64_t handle_value(T handle) {
252 return reinterpret_cast<uint64_t &>(handle);
253}
254template<typename T>
255uint64_t handle_value(T *handle) {
256 return reinterpret_cast<uint64_t>(handle);
257}
258
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600259template <typename T1, typename T2>
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600260static void CreateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600261 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes04257ad2016-10-04 10:08:31 +1300262
Chris Forbes64a31a12016-10-04 14:54:13 +1300263 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600264 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600265
Chris Forbesfeecd402016-09-29 14:53:50 +1300266 log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, object_handle,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600267 __LINE__, OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
Chris Forbesfeecd402016-09-29 14:53:50 +1300268 object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600269
270 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
271 pNewObjNode->object_type = object_type;
Chris Forbesdbfe96a2016-09-29 13:51:10 +1300272 pNewObjNode->status = custom_allocator ? OBJSTATUS_CUSTOM_ALLOCATOR : OBJSTATUS_NONE;
Chris Forbesfeecd402016-09-29 14:53:50 +1300273 pNewObjNode->handle = object_handle;
274 instance_data->object_map[object_type][object_handle] = pNewObjNode;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600275 instance_data->num_objects[object_type]++;
276 instance_data->num_total_objects++;
277}
278
279template <typename T1, typename T2>
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600280static void DestroyObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600281 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
282
Chris Forbes64a31a12016-10-04 14:54:13 +1300283 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600284 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600285
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700286 if (object_handle != VK_NULL_HANDLE) {
287 auto item = device_data->object_map[object_type].find(object_handle);
288 if (item != device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600289
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700290 OBJTRACK_NODE *pNode = item->second;
291 assert(device_data->num_total_objects > 0);
292 device_data->num_total_objects--;
293 assert(device_data->num_objects[pNode->object_type] > 0);
294 device_data->num_objects[pNode->object_type]--;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600295
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700296 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, pNode->object_type, object_handle, __LINE__,
297 OBJTRACK_NONE, LayerName,
298 "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " %s objs).",
299 object_name[pNode->object_type], reinterpret_cast<uint64_t &>(object), device_data->num_total_objects,
300 device_data->num_objects[pNode->object_type], object_name[pNode->object_type]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600301
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700302 auto allocated_with_custom = (pNode->status & OBJSTATUS_CUSTOM_ALLOCATOR) ? true : false;
303 if (custom_allocator ^ allocated_with_custom) {
304 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
305 OBJTRACK_ALLOCATOR_MISMATCH, LayerName,
306 "Custom allocator %sspecified while destroying %s obj 0x%" PRIxLEAST64 " but %sspecified at creation",
307 (custom_allocator ? "" : "not "), object_name[object_type], object_handle,
308 (allocated_with_custom ? "" : "not "));
309 }
310
311 delete pNode;
312 device_data->object_map[object_type].erase(item);
313 } else {
314 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle, __LINE__,
315 OBJTRACK_UNKNOWN_OBJECT, LayerName,
316 "Unable to remove %s obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",
317 object_name[object_type], object_handle);
Chris Forbes3e51a202016-09-29 14:35:09 +1300318 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600319 }
320}
321
322template <typename T1, typename T2>
Karl Schultza9ef1e52016-10-06 17:53:48 -0600323static bool ValidateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool null_allowed,
Mike Schuchardt662c39c2016-11-11 16:10:51 -0700324 int error_code) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600325 if (null_allowed && (object == VK_NULL_HANDLE)) {
326 return false;
327 }
Chris Forbes64a31a12016-10-04 14:54:13 +1300328 auto object_handle = handle_value(object);
329
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600330 layer_data *device_data = get_my_data_ptr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +1300331 if (device_data->object_map[object_type].find(object_handle) == device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600332 // If object is an image, also look for it in the swapchain image map
333 if ((object_type != VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT) ||
Chris Forbes2f271a72016-09-29 14:58:08 +1300334 (device_data->swapchainImageMap.find(object_handle) == device_data->swapchainImageMap.end())) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -0700335 const char *error_msg = (error_code == VALIDATION_ERROR_UNDEFINED) ? "" : validation_error_map[error_code];
Karl Schultza9ef1e52016-10-06 17:53:48 -0600336 return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
337 error_code, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s", object_name[object_type],
338 object_handle, error_msg);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600339 }
340 }
341 return false;
342}
343
344static void DeviceReportUndestroyedObjects(VkDevice device, VkDebugReportObjectTypeEXT object_type) {
345 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
346 for (auto item = device_data->object_map[object_type].begin(); item != device_data->object_map[object_type].end();) {
347 OBJTRACK_NODE *object_info = item->second;
348 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_info->object_type, object_info->handle, __LINE__,
349 OBJTRACK_OBJECT_LEAK, LayerName,
350 "OBJ ERROR : For device 0x%" PRIxLEAST64 ", %s object 0x%" PRIxLEAST64 " has not been destroyed.",
351 reinterpret_cast<uint64_t>(device), object_name[object_type], object_info->handle);
352 item = device_data->object_map[object_type].erase(item);
353 }
354}
355
356VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
357 std::unique_lock<std::mutex> lock(global_lock);
358
359 dispatch_key key = get_dispatch_key(instance);
360 layer_data *instance_data = get_my_data_ptr(key, layer_data_map);
361
362 // Enable the temporary callback(s) here to catch cleanup issues:
363 bool callback_setup = false;
364 if (instance_data->num_tmp_callbacks > 0) {
365 if (!layer_enable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks,
366 instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks)) {
367 callback_setup = true;
368 }
369 }
370
Jeremy Hayes058b41c2016-11-03 10:49:44 -0600371 // TODO: The instance handle can not be validated here. The loader will likely have to validate it.
Karl Schultzcf2e0452016-10-12 13:28:49 -0600372 ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, true, VALIDATION_ERROR_00021);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600373
Chris Forbesec461992016-09-29 14:41:44 +1300374 DestroyObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600375 // Report any remaining objects in LL
376
377 for (auto iit = instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].begin();
378 iit != instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].end();) {
379 OBJTRACK_NODE *pNode = iit->second;
380
381 VkDevice device = reinterpret_cast<VkDevice>(pNode->handle);
382
383 log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, pNode->handle, __LINE__,
384 OBJTRACK_OBJECT_LEAK, LayerName, "OBJ ERROR : %s object 0x%" PRIxLEAST64 " has not been destroyed.",
385 string_VkDebugReportObjectTypeEXT(pNode->object_type), pNode->handle);
386 // Semaphore:
387 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT);
388 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT);
389 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT);
390 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT);
391 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
392 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
393 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT);
394 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT);
395 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT);
396 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT);
397 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT);
398 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT);
399 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT);
400 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT);
401 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT);
402 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT);
403 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT);
404 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT);
405 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
406 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT);
407 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT);
408 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT);
409 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
410 }
411 instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].clear();
412
413 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
414 pInstanceTable->DestroyInstance(instance, pAllocator);
415
416 // Disable and cleanup the temporary callback(s):
417 if (callback_setup) {
418 layer_disable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks, instance_data->tmp_callbacks);
419 }
420 if (instance_data->num_tmp_callbacks > 0) {
421 layer_free_tmp_callbacks(instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks);
422 instance_data->num_tmp_callbacks = 0;
423 }
424
425 // Clean up logging callback, if any
426 while (instance_data->logging_callback.size() > 0) {
427 VkDebugReportCallbackEXT callback = instance_data->logging_callback.back();
428 layer_destroy_msg_callback(instance_data->report_data, callback, pAllocator);
429 instance_data->logging_callback.pop_back();
430 }
431
432 layer_debug_report_destroy_instance(instance_data->report_data);
433 layer_data_map.erase(key);
434
435 instanceExtMap.erase(pInstanceTable);
436 lock.unlock();
437 ot_instance_table_map.erase(key);
438}
439
440VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
441
442 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600443 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, true, VALIDATION_ERROR_00052);
Chris Forbesec461992016-09-29 14:41:44 +1300444 DestroyObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600445
446 // Report any remaining objects associated with this VkDevice object in LL
447 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT);
448 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT);
449 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT);
450 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
451 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
452 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT);
453 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT);
454 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT);
455 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT);
456 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT);
457 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT);
458 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT);
459 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT);
460 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT);
461 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT);
462 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT);
463 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT);
464 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
465 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT);
466 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT);
467 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT);
468 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT);
469 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
470
471 // Clean up Queue's MemRef Linked Lists
472 DestroyQueueDataStructures(device);
473
474 lock.unlock();
475
476 dispatch_key key = get_dispatch_key(device);
477 VkLayerDispatchTable *pDisp = get_dispatch_table(ot_device_table_map, device);
478 pDisp->DestroyDevice(device, pAllocator);
479 ot_device_table_map.erase(key);
480}
481
482VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
483 bool skip_call = false;
484 {
485 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600486 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
487 VALIDATION_ERROR_01679);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600488 }
489 if (skip_call) {
490 return;
491 }
492 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
493}
494
495VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
496 VkFormatProperties *pFormatProperties) {
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_01683);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600502 }
503 if (skip_call) {
504 return;
505 }
506 get_dispatch_table(ot_instance_table_map, physicalDevice)
507 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
508}
509
510VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
511 VkImageType type, VkImageTiling tiling,
512 VkImageUsageFlags usage, VkImageCreateFlags flags,
513 VkImageFormatProperties *pImageFormatProperties) {
514 bool skip_call = false;
515 {
516 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600517 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
518 VALIDATION_ERROR_01686);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600519 }
520 if (skip_call) {
521 return VK_ERROR_VALIDATION_FAILED_EXT;
522 }
523 VkResult result =
524 get_dispatch_table(ot_instance_table_map, physicalDevice)
525 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
526 return result;
527}
528
529VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
530 bool skip_call = false;
531 {
532 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600533 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
534 VALIDATION_ERROR_00026);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600535 }
536 if (skip_call) {
537 return;
538 }
539 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
540}
541
542VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
543 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
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_00609);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600549 }
550 if (skip_call) {
551 return;
552 }
553 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
554}
555
556VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *pName);
557
558VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *pName);
559
560VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount,
561 VkExtensionProperties *pProperties);
562
563VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pPropertyCount, VkLayerProperties *pProperties);
564
565VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
566 VkLayerProperties *pProperties);
567
568VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
569 bool skip_call = false;
570 {
571 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600572 skip_call |= ValidateObject(queue, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_00130);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600573 if (pSubmits) {
574 for (uint32_t idx0 = 0; idx0 < submitCount; ++idx0) {
575 if (pSubmits[idx0].pCommandBuffers) {
576 for (uint32_t idx1 = 0; idx1 < pSubmits[idx0].commandBufferCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300577 skip_call |= ValidateObject(queue, pSubmits[idx0].pCommandBuffers[idx1],
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600578 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_00149);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600579 }
580 }
581 if (pSubmits[idx0].pSignalSemaphores) {
582 for (uint32_t idx2 = 0; idx2 < pSubmits[idx0].signalSemaphoreCount; ++idx2) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300583 skip_call |= ValidateObject(queue, pSubmits[idx0].pSignalSemaphores[idx2],
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600584 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false, VALIDATION_ERROR_00150);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600585 }
586 }
587 if (pSubmits[idx0].pWaitSemaphores) {
588 for (uint32_t idx3 = 0; idx3 < pSubmits[idx0].waitSemaphoreCount; ++idx3) {
Chris Forbes2f271a72016-09-29 14:58:08 +1300589 skip_call |= ValidateObject(queue, pSubmits[idx0].pWaitSemaphores[idx3],
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600590 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false, VALIDATION_ERROR_00146);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600591 }
592 }
593 }
594 }
595 if (queue) {
Karl Schultzcf2e0452016-10-12 13:28:49 -0600596 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_00128);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600597 }
598 }
599 if (skip_call) {
600 return VK_ERROR_VALIDATION_FAILED_EXT;
601 }
602 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
603 return result;
604}
605
606VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
607 bool skip_call = false;
608 {
609 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600610 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_00317);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600611 }
612 if (skip_call) {
613 return VK_ERROR_VALIDATION_FAILED_EXT;
614 }
615 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueWaitIdle(queue);
616 return result;
617}
618
619VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
620 bool skip_call = false;
621 {
622 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600623 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00318);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600624 }
625 if (skip_call) {
626 return VK_ERROR_VALIDATION_FAILED_EXT;
627 }
628 VkResult result = get_dispatch_table(ot_device_table_map, device)->DeviceWaitIdle(device);
629 return result;
630}
631
632VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
633 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
634 bool skip_call = false;
635 {
636 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600637 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00612);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600638 }
639 if (skip_call) {
640 return VK_ERROR_VALIDATION_FAILED_EXT;
641 }
642 VkResult result = get_dispatch_table(ot_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
643 {
644 std::lock_guard<std::mutex> lock(global_lock);
645 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300646 CreateObject(device, *pMemory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600647 }
648 }
649 return result;
650}
651
652VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
653 const VkMappedMemoryRange *pMemoryRanges) {
654 bool skip_call = false;
655 {
656 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600657 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00635);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600658 if (pMemoryRanges) {
659 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
660 if (pMemoryRanges[idx0].memory) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600661 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,
662 false, VALIDATION_ERROR_00648);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600663 }
664 }
665 }
666 }
667 if (skip_call) {
668 return VK_ERROR_VALIDATION_FAILED_EXT;
669 }
670 VkResult result =
671 get_dispatch_table(ot_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
672 return result;
673}
674
675VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
676 const VkMappedMemoryRange *pMemoryRanges) {
677 bool skip_call = false;
678 {
679 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600680 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00638);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600681 if (pMemoryRanges) {
682 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
683 if (pMemoryRanges[idx0].memory) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -0600684 skip_call |= ValidateObject(device, pMemoryRanges[idx0].memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,
685 false, VALIDATION_ERROR_00648);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600686 }
687 }
688 }
689 }
690 if (skip_call) {
691 return VK_ERROR_VALIDATION_FAILED_EXT;
692 }
693 VkResult result =
694 get_dispatch_table(ot_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
695 return result;
696}
697
698VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
699 VkDeviceSize *pCommittedMemoryInBytes) {
700 bool skip_call = false;
701 {
702 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600703 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00654);
704 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00655);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600705 }
706 if (skip_call) {
707 return;
708 }
709 get_dispatch_table(ot_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
710}
711
712VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
713 VkDeviceSize memoryOffset) {
714 bool skip_call = false;
715 {
716 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600717 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00799);
718 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00798);
719 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00800);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600720 }
721 if (skip_call) {
722 return VK_ERROR_VALIDATION_FAILED_EXT;
723 }
724 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
725 return result;
726}
727
728VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
729 bool skip_call = false;
730 {
731 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600732 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00807);
733 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00808);
734 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00809);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600735 }
736 if (skip_call) {
737 return VK_ERROR_VALIDATION_FAILED_EXT;
738 }
739 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
740 return result;
741}
742
743VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
744 VkMemoryRequirements *pMemoryRequirements) {
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, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00784);
749 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00783);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600750 }
751 if (skip_call) {
752 return;
753 }
754 get_dispatch_table(ot_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
755}
756
757VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
758 bool skip_call = false;
759 {
760 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600761 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00787);
762 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00788);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600763 }
764 if (skip_call) {
765 return;
766 }
767 get_dispatch_table(ot_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
768}
769
770VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
771 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
772 bool skip_call = false;
773 {
774 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600775 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01610);
776 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01611);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600777 }
778 if (skip_call) {
779 return;
780 }
781 get_dispatch_table(ot_device_table_map, device)
782 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
783}
784
785VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
786 VkImageType type, VkSampleCountFlagBits samples,
787 VkImageUsageFlags usage, VkImageTiling tiling,
788 uint32_t *pPropertyCount,
789 VkSparseImageFormatProperties *pProperties) {
790 bool skip_call = false;
791 {
792 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600793 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
794 VALIDATION_ERROR_01601);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600795 }
796 if (skip_call) {
797 return;
798 }
799 get_dispatch_table(ot_instance_table_map, physicalDevice)
800 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
801 pProperties);
802}
803
804VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
805 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
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(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00166);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600810 }
811 if (skip_call) {
812 return VK_ERROR_VALIDATION_FAILED_EXT;
813 }
814 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
815 {
816 std::lock_guard<std::mutex> lock(global_lock);
817 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300818 CreateObject(device, *pFence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600819 }
820 }
821 return result;
822}
823
824VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
825 bool skip_call = false;
826 {
827 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600828 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00176);
829 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_00177);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600830 }
831 if (skip_call) {
832 return;
833 }
834 {
835 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300836 DestroyObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600837 }
838 get_dispatch_table(ot_device_table_map, device)->DestroyFence(device, fence, pAllocator);
839}
840
841VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
842 bool skip_call = false;
843 {
844 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600845 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00184);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600846 if (pFences) {
847 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -0600848 skip_call |=
849 ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00187);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600850 }
851 }
852 }
853 if (skip_call) {
854 return VK_ERROR_VALIDATION_FAILED_EXT;
855 }
856 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetFences(device, fenceCount, pFences);
857 return result;
858}
859
860VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
861 bool skip_call = false;
862 {
863 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600864 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00180);
865 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00181);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600866 }
867 if (skip_call) {
868 return VK_ERROR_VALIDATION_FAILED_EXT;
869 }
870 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetFenceStatus(device, fence);
871 return result;
872}
873
874VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
875 uint64_t timeout) {
876 bool skip_call = false;
877 {
878 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600879 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00188);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600880 if (pFences) {
881 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -0600882 skip_call |=
883 ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00191);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600884 }
885 }
886 }
887 if (skip_call) {
888 return VK_ERROR_VALIDATION_FAILED_EXT;
889 }
890 VkResult result = get_dispatch_table(ot_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
891 return result;
892}
893
894VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
895 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
896 bool skip_call = false;
897 {
898 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600899 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00192);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600900 }
901 if (skip_call) {
902 return VK_ERROR_VALIDATION_FAILED_EXT;
903 }
904 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
905 {
906 std::lock_guard<std::mutex> lock(global_lock);
907 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300908 CreateObject(device, *pSemaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600909 }
910 }
911 return result;
912}
913
914VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
915 bool skip_call = false;
916 {
917 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600918 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00202);
919 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, true, VALIDATION_ERROR_00203);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600920 }
921 if (skip_call) {
922 return;
923 }
924 {
925 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300926 DestroyObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600927 }
928 get_dispatch_table(ot_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
929}
930
931VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
932 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
933 bool skip_call = false;
934 {
935 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600936 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00206);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600937 }
938 if (skip_call) {
939 return VK_ERROR_VALIDATION_FAILED_EXT;
940 }
941 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
942 {
943 std::lock_guard<std::mutex> lock(global_lock);
944 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300945 CreateObject(device, *pEvent, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600946 }
947 }
948 return result;
949}
950
951VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
952 bool skip_call = false;
953 {
954 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600955 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00216);
956 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, true, VALIDATION_ERROR_00217);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600957 }
958 if (skip_call) {
959 return;
960 }
961 {
962 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +1300963 DestroyObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600964 }
965 get_dispatch_table(ot_device_table_map, device)->DestroyEvent(device, event, pAllocator);
966}
967
968VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
969 bool skip_call = false;
970 {
971 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600972 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00220);
973 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00221);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600974 }
975 if (skip_call) {
976 return VK_ERROR_VALIDATION_FAILED_EXT;
977 }
978 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetEventStatus(device, event);
979 return result;
980}
981
982VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
983 bool skip_call = false;
984 {
985 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -0600986 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00223);
987 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00224);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600988 }
989 if (skip_call) {
990 return VK_ERROR_VALIDATION_FAILED_EXT;
991 }
992 VkResult result = get_dispatch_table(ot_device_table_map, device)->SetEvent(device, event);
993 return result;
994}
995
996VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
997 bool skip_call = false;
998 {
999 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001000 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00227);
1001 skip_call |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00228);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001002 }
1003 if (skip_call) {
1004 return VK_ERROR_VALIDATION_FAILED_EXT;
1005 }
1006 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetEvent(device, event);
1007 return result;
1008}
1009
1010VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1011 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
1012 bool skip_call = false;
1013 {
1014 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001015 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01002);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001016 }
1017 if (skip_call) {
1018 return VK_ERROR_VALIDATION_FAILED_EXT;
1019 }
1020 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
1021 {
1022 std::lock_guard<std::mutex> lock(global_lock);
1023 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001024 CreateObject(device, *pQueryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001025 }
1026 }
1027 return result;
1028}
1029
1030VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
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_01015);
1035 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, true, VALIDATION_ERROR_01016);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001036 }
1037 if (skip_call) {
1038 return;
1039 }
1040 {
1041 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001042 DestroyObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001043 }
1044 get_dispatch_table(ot_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
1045}
1046
1047VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
1048 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
1049 bool skip_call = false;
1050 {
1051 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001052 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01054);
1053 skip_call |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01055);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001054 }
1055 if (skip_call) {
1056 return VK_ERROR_VALIDATION_FAILED_EXT;
1057 }
1058 VkResult result = get_dispatch_table(ot_device_table_map, device)
1059 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
1060 return result;
1061}
1062
1063VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
1064 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
1065 bool skip_call = false;
1066 {
1067 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultza9ef1e52016-10-06 17:53:48 -06001068 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00659);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001069 }
1070 if (skip_call) {
1071 return VK_ERROR_VALIDATION_FAILED_EXT;
1072 }
1073 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
1074 {
1075 std::lock_guard<std::mutex> lock(global_lock);
1076 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001077 CreateObject(device, *pBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001078 }
1079 }
1080 return result;
1081}
1082
1083VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
1084 bool skip_call = false;
1085 {
1086 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001087 skip_call |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, true, VALIDATION_ERROR_00680);
1088 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00679);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001089 }
1090 if (skip_call) {
1091 return;
1092 }
1093 {
1094 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001095 DestroyObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001096 }
1097 get_dispatch_table(ot_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
1098}
1099
1100VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
1101 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
1102 bool skip_call = false;
1103 {
1104 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001105 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00683);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001106 if (pCreateInfo) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001107 skip_call |=
1108 ValidateObject(device, pCreateInfo->buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00699);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001109 }
1110 }
1111 if (skip_call) {
1112 return VK_ERROR_VALIDATION_FAILED_EXT;
1113 }
1114 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
1115 {
1116 std::lock_guard<std::mutex> lock(global_lock);
1117 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001118 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001119 }
1120 }
1121 return result;
1122}
1123
1124VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
1125 bool skip_call = false;
1126 {
1127 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001128 skip_call |= ValidateObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, true, VALIDATION_ERROR_00705);
1129 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00704);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001130 }
1131 if (skip_call) {
1132 return;
1133 }
1134 {
1135 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001136 DestroyObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001137 }
1138 get_dispatch_table(ot_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
1139}
1140
1141VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
1142 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
1143 bool skip_call = false;
1144 {
1145 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001146 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00709);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001147 }
1148 if (skip_call) {
1149 return VK_ERROR_VALIDATION_FAILED_EXT;
1150 }
1151 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
1152 {
1153 std::lock_guard<std::mutex> lock(global_lock);
1154 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001155 CreateObject(device, *pImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001156 }
1157 }
1158 return result;
1159}
1160
1161VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
1162 bool skip_call = false;
1163 {
1164 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001165 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00746);
1166 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, true, VALIDATION_ERROR_00747);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001167 }
1168 if (skip_call) {
1169 return;
1170 }
1171 {
1172 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001173 DestroyObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001174 }
1175 get_dispatch_table(ot_device_table_map, device)->DestroyImage(device, image, pAllocator);
1176}
1177
1178VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
1179 VkSubresourceLayout *pLayout) {
1180 bool skip_call = false;
1181 {
1182 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001183 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00734);
1184 skip_call |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00735);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001185 }
1186 if (skip_call) {
1187 return;
1188 }
1189 get_dispatch_table(ot_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
1190}
1191
1192VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
1193 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
1194 bool skip_call = false;
1195 {
1196 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001197 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00750);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001198 if (pCreateInfo) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001199 skip_call |=
1200 ValidateObject(device, pCreateInfo->image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00763);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001201 }
1202 }
1203 if (skip_call) {
1204 return VK_ERROR_VALIDATION_FAILED_EXT;
1205 }
1206 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
1207 {
1208 std::lock_guard<std::mutex> lock(global_lock);
1209 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001210 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001211 }
1212 }
1213 return result;
1214}
1215
1216VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
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_00779);
1221 skip_call |= ValidateObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, true, VALIDATION_ERROR_00780);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001222 }
1223 if (skip_call) {
1224 return;
1225 }
1226 {
1227 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001228 DestroyObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001229 }
1230 get_dispatch_table(ot_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
1231}
1232
1233VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
1234 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
1235 bool skip_call = false;
1236 {
1237 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001238 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00466);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001239 }
1240 if (skip_call) {
1241 return VK_ERROR_VALIDATION_FAILED_EXT;
1242 }
1243 VkResult result =
1244 get_dispatch_table(ot_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
1245 {
1246 std::lock_guard<std::mutex> lock(global_lock);
1247 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001248 CreateObject(device, *pShaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001249 }
1250 }
1251 return result;
1252}
1253
1254VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1255 const VkAllocationCallbacks *pAllocator) {
1256 bool skip_call = false;
1257 {
1258 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001259 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00481);
1260 skip_call |=
1261 ValidateObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, true, VALIDATION_ERROR_00482);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001262 }
1263 if (skip_call) {
1264 return;
1265 }
1266 {
1267 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001268 DestroyObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001269 }
1270 get_dispatch_table(ot_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
1271}
1272
1273VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
1274 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
1275 bool skip_call = false;
1276 {
1277 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001278 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00562);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001279 }
1280 if (skip_call) {
1281 return VK_ERROR_VALIDATION_FAILED_EXT;
1282 }
1283 VkResult result =
1284 get_dispatch_table(ot_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
1285 {
1286 std::lock_guard<std::mutex> lock(global_lock);
1287 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001288 CreateObject(device, *pPipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001289 }
1290 }
1291 return result;
1292}
1293
1294VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
1295 const VkAllocationCallbacks *pAllocator) {
1296 bool skip_call = false;
1297 {
1298 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001299 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00585);
1300 skip_call |=
1301 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00586);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001302 }
1303 if (skip_call) {
1304 return;
1305 }
1306 {
1307 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001308 DestroyObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001309 }
1310 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
1311}
1312
1313VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
1314 void *pData) {
1315 bool skip_call = false;
1316 {
1317 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001318 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00578);
1319 skip_call |=
1320 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false, VALIDATION_ERROR_00579);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001321 }
1322 if (skip_call) {
1323 return VK_ERROR_VALIDATION_FAILED_EXT;
1324 }
1325 VkResult result =
1326 get_dispatch_table(ot_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
1327 return result;
1328}
1329
1330VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
1331 const VkPipelineCache *pSrcCaches) {
1332 bool skip_call = false;
1333 {
1334 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001335 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00572);
1336 skip_call |=
1337 ValidateObject(device, dstCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false, VALIDATION_ERROR_00573);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001338 if (pSrcCaches) {
1339 for (uint32_t idx0 = 0; idx0 < srcCacheCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06001340 skip_call |= ValidateObject(device, pSrcCaches[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false,
1341 VALIDATION_ERROR_00577);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001342 }
1343 }
1344 }
1345 if (skip_call) {
1346 return VK_ERROR_VALIDATION_FAILED_EXT;
1347 }
1348 VkResult result =
1349 get_dispatch_table(ot_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
1350 return result;
1351}
1352
1353VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
1354 bool skip_call = false;
1355 {
1356 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001357 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00558);
1358 skip_call |= ValidateObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, true, VALIDATION_ERROR_00559);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001359 }
1360 if (skip_call) {
1361 return;
1362 }
1363 {
1364 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001365 DestroyObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001366 }
1367 get_dispatch_table(ot_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
1368}
1369
1370VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
1371 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
1372 bool skip_call = false;
1373 {
1374 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001375 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00861);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001376 if (pCreateInfo) {
1377 if (pCreateInfo->pSetLayouts) {
1378 for (uint32_t idx0 = 0; idx0 < pCreateInfo->setLayoutCount; ++idx0) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001379 skip_call |=
1380 ValidateObject(device, pCreateInfo->pSetLayouts[idx0],
1381 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false, VALIDATION_ERROR_00875);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001382 }
1383 }
1384 }
1385 }
1386 if (skip_call) {
1387 return VK_ERROR_VALIDATION_FAILED_EXT;
1388 }
1389 VkResult result =
1390 get_dispatch_table(ot_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
1391 {
1392 std::lock_guard<std::mutex> lock(global_lock);
1393 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001394 CreateObject(device, *pPipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001395 }
1396 }
1397 return result;
1398}
1399
1400VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1401 const VkAllocationCallbacks *pAllocator) {
1402 bool skip_call = false;
1403 {
1404 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001405 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00885);
1406 skip_call |=
1407 ValidateObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, true, VALIDATION_ERROR_00886);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001408 }
1409 if (skip_call) {
1410 return;
1411 }
1412 {
1413 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001414 DestroyObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001415 }
1416 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
1417}
1418
1419VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
1420 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
1421 bool skip_call = false;
1422 {
1423 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001424 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00812);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001425 }
1426 if (skip_call) {
1427 return VK_ERROR_VALIDATION_FAILED_EXT;
1428 }
1429 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
1430 {
1431 std::lock_guard<std::mutex> lock(global_lock);
1432 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001433 CreateObject(device, *pSampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001434 }
1435 }
1436 return result;
1437}
1438
1439VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
1440 bool skip_call = false;
1441 {
1442 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001443 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00840);
1444 skip_call |= ValidateObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, true, VALIDATION_ERROR_00841);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001445 }
1446 if (skip_call) {
1447 return;
1448 }
1449 {
1450 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001451 DestroyObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001452 }
1453 get_dispatch_table(ot_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
1454}
1455
1456VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
1457 const VkAllocationCallbacks *pAllocator,
1458 VkDescriptorSetLayout *pSetLayout) {
1459 bool skip_call = false;
1460 {
1461 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001462 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00844);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001463 if (pCreateInfo) {
1464 if (pCreateInfo->pBindings) {
1465 for (uint32_t idx0 = 0; idx0 < pCreateInfo->bindingCount; ++idx0) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001466 if ((pCreateInfo->pBindings[idx0].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
1467 (pCreateInfo->pBindings[idx0].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) {
1468 if (pCreateInfo->pBindings[idx0].pImmutableSamplers) {
1469 for (uint32_t idx1 = 0; idx1 < pCreateInfo->pBindings[idx0].descriptorCount; ++idx1) {
1470 skip_call |= ValidateObject(device, pCreateInfo->pBindings[idx0].pImmutableSamplers[idx1],
1471 VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false, VALIDATION_ERROR_00852);
1472 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001473 }
1474 }
1475 }
1476 }
1477 }
1478 }
1479 if (skip_call) {
1480 return VK_ERROR_VALIDATION_FAILED_EXT;
1481 }
1482 VkResult result =
1483 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
1484 {
1485 std::lock_guard<std::mutex> lock(global_lock);
1486 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001487 CreateObject(device, *pSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001488 }
1489 }
1490 return result;
1491}
1492
1493VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1494 const VkAllocationCallbacks *pAllocator) {
1495 bool skip_call = false;
1496 {
1497 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001498 skip_call |= ValidateObject(device, descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, true,
1499 VALIDATION_ERROR_00858);
1500 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00857);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001501 }
1502 if (skip_call) {
1503 return;
1504 }
1505 {
1506 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001507 DestroyObject(device, descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001508 }
1509 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
1510}
1511
1512VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
1513 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
1514 bool skip_call = false;
1515 {
1516 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001517 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00889);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001518 }
1519 if (skip_call) {
1520 return VK_ERROR_VALIDATION_FAILED_EXT;
1521 }
1522 VkResult result =
1523 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
1524 {
1525 std::lock_guard<std::mutex> lock(global_lock);
1526 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001527 CreateObject(device, *pDescriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001528 }
1529 }
1530 return result;
1531}
1532
1533VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1534 VkDescriptorPoolResetFlags flags) {
1535 bool skip_call = false;
Chris Forbes2a947ce2016-09-29 18:47:50 +13001536 std::unique_lock<std::mutex> lock(global_lock);
1537 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001538 skip_call |=
1539 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false, VALIDATION_ERROR_00930);
1540 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00929);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001541 if (skip_call) {
1542 return VK_ERROR_VALIDATION_FAILED_EXT;
1543 }
Chris Forbes2a947ce2016-09-29 18:47:50 +13001544 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is reset.
1545 // Remove this pool's descriptor sets from our descriptorSet map.
1546 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
1547 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
1548 OBJTRACK_NODE *pNode = (*itr).second;
1549 auto del_itr = itr++;
1550 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
1551 DestroyObject(device, (VkDescriptorSet)((*del_itr).first),
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06001552 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr);
Chris Forbes2a947ce2016-09-29 18:47:50 +13001553 }
1554 }
1555 lock.unlock();
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001556 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
1557 return result;
1558}
1559
1560VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
1561 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
1562 const VkCopyDescriptorSet *pDescriptorCopies) {
1563 bool skip_call = false;
1564 {
1565 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001566 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00933);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001567 if (pDescriptorCopies) {
1568 for (uint32_t idx0 = 0; idx0 < descriptorCopyCount; ++idx0) {
1569 if (pDescriptorCopies[idx0].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001570 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].dstSet,
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001571 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false, VALIDATION_ERROR_00972);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001572 }
1573 if (pDescriptorCopies[idx0].srcSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001574 skip_call |= ValidateObject(device, pDescriptorCopies[idx0].srcSet,
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001575 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false, VALIDATION_ERROR_00971);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001576 }
1577 }
1578 }
1579 if (pDescriptorWrites) {
1580 for (uint32_t idx1 = 0; idx1 < descriptorWriteCount; ++idx1) {
1581 if (pDescriptorWrites[idx1].dstSet) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001582 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].dstSet,
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001583 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false, VALIDATION_ERROR_00955);
1584 }
1585 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
1586 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
1587 for (uint32_t idx2 = 0; idx2 < pDescriptorWrites[idx1].descriptorCount; ++idx2) {
1588 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pTexelBufferView[idx2],
1589 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, false, VALIDATION_ERROR_00940);
1590 }
1591 }
1592 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
1593 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
1594 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
1595 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
1596 for (uint32_t idx3 = 0; idx3 < pDescriptorWrites[idx1].descriptorCount; ++idx3) {
1597 if (pDescriptorWrites[idx1].pImageInfo[idx3].imageView) {
1598 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pImageInfo[idx3].imageView,
1599 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false, VALIDATION_ERROR_00943);
1600 }
1601 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001602 }
1603 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
1604 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
1605 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
1606 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001607 for (uint32_t idx4 = 0; idx4 < pDescriptorWrites[idx1].descriptorCount; ++idx4) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001608 if (pDescriptorWrites[idx1].pBufferInfo[idx4].buffer) {
1609 skip_call |= ValidateObject(device, pDescriptorWrites[idx1].pBufferInfo[idx4].buffer,
1610 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00962);
1611 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001612 }
1613 }
1614 }
1615 }
1616 }
1617 if (skip_call) {
1618 return;
1619 }
1620 get_dispatch_table(ot_device_table_map, device)
1621 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
1622}
1623
1624VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
1625 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
1626 bool skip_call = false;
1627 {
1628 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001629 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00400);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001630 if (pCreateInfo) {
1631 if (pCreateInfo->pAttachments) {
1632 for (uint32_t idx0 = 0; idx0 < pCreateInfo->attachmentCount; ++idx0) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001633 skip_call |= ValidateObject(device, pCreateInfo->pAttachments[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT,
1634 false, VALIDATION_ERROR_00420);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001635 }
1636 }
1637 if (pCreateInfo->renderPass) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001638 skip_call |= ValidateObject(device, pCreateInfo->renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false,
1639 VALIDATION_ERROR_00419);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001640 }
1641 }
1642 }
1643 if (skip_call) {
1644 return VK_ERROR_VALIDATION_FAILED_EXT;
1645 }
1646 VkResult result =
1647 get_dispatch_table(ot_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
1648 {
1649 std::lock_guard<std::mutex> lock(global_lock);
1650 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001651 CreateObject(device, *pFramebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001652 }
1653 }
1654 return result;
1655}
1656
1657VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
1658 bool skip_call = false;
1659 {
1660 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001661 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00425);
1662 skip_call |= ValidateObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, true, VALIDATION_ERROR_00426);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001663 }
1664 if (skip_call) {
1665 return;
1666 }
1667 {
1668 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001669 DestroyObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001670 }
1671 get_dispatch_table(ot_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
1672}
1673
1674VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
1675 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
1676 bool skip_call = false;
1677 {
1678 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001679 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00319);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001680 }
1681 if (skip_call) {
1682 return VK_ERROR_VALIDATION_FAILED_EXT;
1683 }
1684 VkResult result =
1685 get_dispatch_table(ot_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
1686 {
1687 std::lock_guard<std::mutex> lock(global_lock);
1688 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001689 CreateObject(device, *pRenderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001690 }
1691 }
1692 return result;
1693}
1694
1695VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
1696 bool skip_call = false;
1697 {
1698 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001699 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00396);
1700 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, true, VALIDATION_ERROR_00397);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001701 }
1702 if (skip_call) {
1703 return;
1704 }
1705 {
1706 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13001707 DestroyObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001708 }
1709 get_dispatch_table(ot_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
1710}
1711
1712VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
1713 bool skip_call = false;
1714 {
1715 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001716 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00449);
1717 skip_call |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false, VALIDATION_ERROR_00450);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001718 }
1719 if (skip_call) {
1720 return;
1721 }
1722 get_dispatch_table(ot_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
1723}
1724
1725VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1726 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
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_00064);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001731 }
1732 if (skip_call) {
1733 return VK_ERROR_VALIDATION_FAILED_EXT;
1734 }
1735 VkResult result =
1736 get_dispatch_table(ot_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
1737 {
1738 std::lock_guard<std::mutex> lock(global_lock);
1739 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001740 CreateObject(device, *pCommandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001741 }
1742 }
1743 return result;
1744}
1745
1746VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
1747 bool skip_call = false;
1748 {
1749 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001750 skip_call |=
1751 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false, VALIDATION_ERROR_00074);
1752 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00073);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001753 }
1754 if (skip_call) {
1755 return VK_ERROR_VALIDATION_FAILED_EXT;
1756 }
1757 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
1758 return result;
1759}
1760
1761VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer command_buffer, const VkCommandBufferBeginInfo *begin_info) {
1762 layer_data *device_data = get_my_data_ptr(get_dispatch_key(command_buffer), layer_data_map);
1763 bool skip_call = false;
1764 {
1765 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001766 skip_call |= ValidateObject(command_buffer, command_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1767 VALIDATION_ERROR_00108);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001768 if (begin_info) {
1769 OBJTRACK_NODE *pNode =
1770 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<const uint64_t>(command_buffer)];
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001771 if ((begin_info->pInheritanceInfo) && (pNode->status & OBJSTATUS_COMMAND_BUFFER_SECONDARY) &&
1772 (begin_info->flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) {
Chris Forbes2f271a72016-09-29 14:58:08 +13001773 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->framebuffer,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001774 VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, true, VALIDATION_ERROR_00112);
Chris Forbes2f271a72016-09-29 14:58:08 +13001775 skip_call |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->renderPass,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001776 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false, VALIDATION_ERROR_00110);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001777 }
1778 }
1779 }
1780 if (skip_call) {
1781 return VK_ERROR_VALIDATION_FAILED_EXT;
1782 }
1783 VkResult result = get_dispatch_table(ot_device_table_map, command_buffer)->BeginCommandBuffer(command_buffer, begin_info);
1784 return result;
1785}
1786
1787VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
1788 bool skip_call = false;
1789 {
1790 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001791 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1792 VALIDATION_ERROR_00125);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001793 }
1794 if (skip_call) {
1795 return VK_ERROR_VALIDATION_FAILED_EXT;
1796 }
1797 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
1798 return result;
1799}
1800
1801VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
1802 bool skip_call = false;
1803 {
1804 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001805 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1806 VALIDATION_ERROR_00090);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001807 }
1808 if (skip_call) {
1809 return VK_ERROR_VALIDATION_FAILED_EXT;
1810 }
1811 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
1812 return result;
1813}
1814
1815VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1816 VkPipeline pipeline) {
1817 bool skip_call = false;
1818 {
1819 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001820 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1821 VALIDATION_ERROR_00599);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001822 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06001823 ValidateObject(commandBuffer, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, false, VALIDATION_ERROR_00601);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001824 }
1825 if (skip_call) {
1826 return;
1827 }
1828 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
1829}
1830
1831VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
1832 const VkViewport *pViewports) {
1833 bool skip_call = false;
1834 {
1835 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001836 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1837 VALIDATION_ERROR_01443);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001838 }
1839 if (skip_call) {
1840 return;
1841 }
1842 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
1843}
1844
1845VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
1846 const VkRect2D *pScissors) {
1847 bool skip_call = false;
1848 {
1849 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001850 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1851 VALIDATION_ERROR_01492);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001852 }
1853 if (skip_call) {
1854 return;
1855 }
1856 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
1857}
1858
1859VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
1860 bool skip_call = false;
1861 {
1862 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001863 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1864 VALIDATION_ERROR_01478);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001865 }
1866 if (skip_call) {
1867 return;
1868 }
1869 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
1870}
1871
1872VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
1873 float depthBiasSlopeFactor) {
1874 bool skip_call = false;
1875 {
1876 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001877 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1878 VALIDATION_ERROR_01483);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001879 }
1880 if (skip_call) {
1881 return;
1882 }
1883 get_dispatch_table(ot_device_table_map, commandBuffer)
1884 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
1885}
1886
1887VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
1888 bool skip_call = false;
1889 {
1890 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001891 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1892 VALIDATION_ERROR_01551);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001893 }
1894 if (skip_call) {
1895 return;
1896 }
1897 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
1898}
1899
1900VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
1901 bool skip_call = false;
1902 {
1903 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001904 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1905 VALIDATION_ERROR_01507);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001906 }
1907 if (skip_call) {
1908 return;
1909 }
1910 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
1911}
1912
1913VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
1914 uint32_t compareMask) {
1915 bool skip_call = false;
1916 {
1917 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001918 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1919 VALIDATION_ERROR_01515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001920 }
1921 if (skip_call) {
1922 return;
1923 }
1924 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
1925}
1926
1927VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
1928 bool skip_call = false;
1929 {
1930 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001931 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1932 VALIDATION_ERROR_01521);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001933 }
1934 if (skip_call) {
1935 return;
1936 }
1937 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
1938}
1939
1940VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
1941 bool skip_call = false;
1942 {
1943 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001944 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1945 VALIDATION_ERROR_01527);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001946 }
1947 if (skip_call) {
1948 return;
1949 }
1950 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
1951}
1952
1953VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1954 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
1955 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
1956 const uint32_t *pDynamicOffsets) {
1957 bool skip_call = false;
1958 {
1959 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001960 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1961 VALIDATION_ERROR_00979);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001962 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06001963 ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false, VALIDATION_ERROR_00981);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001964 if (pDescriptorSets) {
1965 for (uint32_t idx0 = 0; idx0 < descriptorSetCount; ++idx0) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001966 skip_call |= ValidateObject(commandBuffer, pDescriptorSets[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
1967 false, VALIDATION_ERROR_00982);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001968 }
1969 }
1970 }
1971 if (skip_call) {
1972 return;
1973 }
1974 get_dispatch_table(ot_device_table_map, commandBuffer)
1975 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
1976 dynamicOffsetCount, pDynamicOffsets);
1977}
1978
1979VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1980 VkIndexType indexType) {
1981 bool skip_call = false;
1982 {
1983 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001984 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01354);
1985 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1986 VALIDATION_ERROR_01353);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001987 }
1988 if (skip_call) {
1989 return;
1990 }
1991 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
1992}
1993
1994VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
1995 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
1996 bool skip_call = false;
1997 {
1998 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06001999 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2000 VALIDATION_ERROR_01419);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002001 if (pBuffers) {
2002 for (uint32_t idx0 = 0; idx0 < bindingCount; ++idx0) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002003 skip_call |= ValidateObject(commandBuffer, pBuffers[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false,
2004 VALIDATION_ERROR_01420);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002005 }
2006 }
2007 }
2008 if (skip_call) {
2009 return;
2010 }
2011 get_dispatch_table(ot_device_table_map, commandBuffer)
2012 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
2013}
2014
2015VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
2016 uint32_t firstVertex, uint32_t firstInstance) {
2017 bool skip_call = false;
2018 {
2019 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002020 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2021 VALIDATION_ERROR_01362);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002022 }
2023 if (skip_call) {
2024 return;
2025 }
2026 get_dispatch_table(ot_device_table_map, commandBuffer)
2027 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
2028}
2029
2030VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
2031 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
2032 bool skip_call = false;
2033 {
2034 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002035 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2036 VALIDATION_ERROR_01369);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002037 }
2038 if (skip_call) {
2039 return;
2040 }
2041 get_dispatch_table(ot_device_table_map, commandBuffer)
2042 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
2043}
2044
2045VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
2046 uint32_t stride) {
2047 bool skip_call = false;
2048 {
2049 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002050 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01378);
2051 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2052 VALIDATION_ERROR_01377);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002053 }
2054 if (skip_call) {
2055 return;
2056 }
2057 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
2058}
2059
2060VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2061 uint32_t drawCount, uint32_t stride) {
2062 bool skip_call = false;
2063 {
2064 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002065 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01390);
2066 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2067 VALIDATION_ERROR_01389);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002068 }
2069 if (skip_call) {
2070 return;
2071 }
2072 get_dispatch_table(ot_device_table_map, commandBuffer)
2073 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
2074}
2075
2076VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
2077 bool skip_call = false;
2078 {
2079 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002080 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2081 VALIDATION_ERROR_01559);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002082 }
2083 if (skip_call) {
2084 return;
2085 }
2086 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
2087}
2088
2089VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
2090 bool skip_call = false;
2091 {
2092 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002093 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01566);
2094 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2095 VALIDATION_ERROR_01565);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002096 }
2097 if (skip_call) {
2098 return;
2099 }
2100 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
2101}
2102
2103VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
2104 uint32_t regionCount, const VkBufferCopy *pRegions) {
2105 bool skip_call = false;
2106 {
2107 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002108 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2109 VALIDATION_ERROR_01166);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002110 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002111 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01168);
2112 skip_call |=
2113 ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01167);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002114 }
2115 if (skip_call) {
2116 return;
2117 }
2118 get_dispatch_table(ot_device_table_map, commandBuffer)
2119 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
2120}
2121
2122VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2123 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2124 const VkImageCopy *pRegions) {
2125 bool skip_call = false;
2126 {
2127 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002128 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2129 VALIDATION_ERROR_01186);
2130 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01189);
2131 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01187);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002132 }
2133 if (skip_call) {
2134 return;
2135 }
2136 get_dispatch_table(ot_device_table_map, commandBuffer)
2137 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2138}
2139
2140VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2141 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2142 const VkImageBlit *pRegions, VkFilter filter) {
2143 bool skip_call = false;
2144 {
2145 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002146 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2147 VALIDATION_ERROR_01291);
2148 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01294);
2149 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01292);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002150 }
2151 if (skip_call) {
2152 return;
2153 }
2154 get_dispatch_table(ot_device_table_map, commandBuffer)
2155 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
2156}
2157
2158VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
2159 VkImageLayout dstImageLayout, uint32_t regionCount,
2160 const VkBufferImageCopy *pRegions) {
2161 bool skip_call = false;
2162 {
2163 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002164 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2165 VALIDATION_ERROR_01235);
2166 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01237);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002167 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002168 ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01236);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002169 }
2170 if (skip_call) {
2171 return;
2172 }
2173 get_dispatch_table(ot_device_table_map, commandBuffer)
2174 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
2175}
2176
2177VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2178 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
2179 bool skip_call = false;
2180 {
2181 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002182 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2183 VALIDATION_ERROR_01253);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002184 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002185 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01256);
2186 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01254);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002187 }
2188 if (skip_call) {
2189 return;
2190 }
2191 get_dispatch_table(ot_device_table_map, commandBuffer)
2192 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
2193}
2194
2195VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2196 VkDeviceSize dataSize, const uint32_t *pData) {
2197 bool skip_call = false;
2198 {
2199 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002200 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2201 VALIDATION_ERROR_01150);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002202 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002203 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01151);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002204 }
2205 if (skip_call) {
2206 return;
2207 }
2208 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
2209}
2210
2211VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2212 VkDeviceSize size, uint32_t data) {
2213 bool skip_call = false;
2214 {
2215 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002216 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2217 VALIDATION_ERROR_01138);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002218 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002219 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01139);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002220 }
2221 if (skip_call) {
2222 return;
2223 }
2224 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
2225}
2226
2227VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2228 const VkClearColorValue *pColor, uint32_t rangeCount,
2229 const VkImageSubresourceRange *pRanges) {
2230 bool skip_call = false;
2231 {
2232 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002233 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2234 VALIDATION_ERROR_01089);
2235 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01090);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002236 }
2237 if (skip_call) {
2238 return;
2239 }
2240 get_dispatch_table(ot_device_table_map, commandBuffer)
2241 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
2242}
2243
2244VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2245 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
2246 const VkImageSubresourceRange *pRanges) {
2247 bool skip_call = false;
2248 {
2249 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002250 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2251 VALIDATION_ERROR_01104);
2252 skip_call |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01105);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002253 }
2254 if (skip_call) {
2255 return;
2256 }
2257 get_dispatch_table(ot_device_table_map, commandBuffer)
2258 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
2259}
2260
2261VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
2262 const VkClearAttachment *pAttachments, uint32_t rectCount,
2263 const VkClearRect *pRects) {
2264 bool skip_call = false;
2265 {
2266 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002267 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2268 VALIDATION_ERROR_01117);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002269 }
2270 if (skip_call) {
2271 return;
2272 }
2273 get_dispatch_table(ot_device_table_map, commandBuffer)
2274 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
2275}
2276
2277VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2278 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2279 const VkImageResolve *pRegions) {
2280 bool skip_call = false;
2281 {
2282 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002283 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2284 VALIDATION_ERROR_01327);
2285 skip_call |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01330);
2286 skip_call |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01328);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002287 }
2288 if (skip_call) {
2289 return;
2290 }
2291 get_dispatch_table(ot_device_table_map, commandBuffer)
2292 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2293}
2294
2295VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
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_00232);
2301 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00233);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002302 }
2303 if (skip_call) {
2304 return;
2305 }
2306 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
2307}
2308
2309VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
2310 bool skip_call = false;
2311 {
2312 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002313 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2314 VALIDATION_ERROR_00243);
2315 skip_call |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00244);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002316 }
2317 if (skip_call) {
2318 return;
2319 }
2320 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
2321}
2322
2323VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2324 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
2325 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2326 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2327 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
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_00252);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002333 if (pBufferMemoryBarriers) {
2334 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2335 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002336 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002337 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00259);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002338 }
2339 }
2340 }
2341 if (pEvents) {
2342 for (uint32_t idx1 = 0; idx1 < eventCount; ++idx1) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06002343 skip_call |= ValidateObject(commandBuffer, pEvents[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false,
2344 VALIDATION_ERROR_00253);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002345 }
2346 }
2347 if (pImageMemoryBarriers) {
2348 for (uint32_t idx2 = 0; idx2 < imageMemoryBarrierCount; ++idx2) {
2349 if (pImageMemoryBarriers[idx2].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002350 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx2].image,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002351 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00260);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002352 }
2353 }
2354 }
2355 }
2356 if (skip_call) {
2357 return;
2358 }
2359 get_dispatch_table(ot_device_table_map, commandBuffer)
2360 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
2361 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2362}
2363
2364VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2365 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2366 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2367 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2368 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
2369 bool skip_call = false;
2370 {
2371 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002372 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2373 VALIDATION_ERROR_00270);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002374 if (pBufferMemoryBarriers) {
2375 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2376 if (pBufferMemoryBarriers[idx0].buffer) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002377 skip_call |= ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002378 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00277);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002379 }
2380 }
2381 }
2382 if (pImageMemoryBarriers) {
2383 for (uint32_t idx1 = 0; idx1 < imageMemoryBarrierCount; ++idx1) {
2384 if (pImageMemoryBarriers[idx1].image) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002385 skip_call |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx1].image,
Karl Schultzcf2e0452016-10-12 13:28:49 -06002386 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00278);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002387 }
2388 }
2389 }
2390 }
2391 if (skip_call) {
2392 return;
2393 }
2394 get_dispatch_table(ot_device_table_map, commandBuffer)
2395 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
2396 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2397}
2398
2399VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query,
2400 VkQueryControlFlags flags) {
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_01035);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002406 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002407 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01036);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002408 }
2409 if (skip_call) {
2410 return;
2411 }
2412 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, query, flags);
2413}
2414
2415VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query) {
2416 bool skip_call = false;
2417 {
2418 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002419 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2420 VALIDATION_ERROR_01043);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002421 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002422 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01044);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002423 }
2424 if (skip_call) {
2425 return;
2426 }
2427 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, query);
2428}
2429
2430VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2431 uint32_t queryCount) {
2432 bool skip_call = false;
2433 {
2434 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002435 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2436 VALIDATION_ERROR_01021);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002437 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002438 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01022);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002439 }
2440 if (skip_call) {
2441 return;
2442 }
2443 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
2444}
2445
2446VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2447 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_01078);
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_01080);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002455 }
2456 if (skip_call) {
2457 return;
2458 }
2459 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
2460}
2461
2462VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2463 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2464 VkDeviceSize stride, VkQueryResultFlags flags) {
2465 bool skip_call = false;
2466 {
2467 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002468 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2469 VALIDATION_ERROR_01068);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002470 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002471 ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01070);
2472 skip_call |=
2473 ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01069);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002474 }
2475 if (skip_call) {
2476 return;
2477 }
2478 get_dispatch_table(ot_device_table_map, commandBuffer)
2479 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
2480}
2481
2482VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
2483 uint32_t offset, uint32_t size, const void *pValues) {
2484 bool skip_call = false;
2485 {
2486 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002487 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2488 VALIDATION_ERROR_00993);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002489 skip_call |=
Karl Schultzcf2e0452016-10-12 13:28:49 -06002490 ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false, VALIDATION_ERROR_00994);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002491 }
2492 if (skip_call) {
2493 return;
2494 }
2495 get_dispatch_table(ot_device_table_map, commandBuffer)
2496 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
2497}
2498
2499VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
2500 VkSubpassContents contents) {
2501 bool skip_call = false;
2502 {
2503 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002504 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2505 VALIDATION_ERROR_00435);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002506 if (pRenderPassBegin) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002507 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT,
2508 false, VALIDATION_ERROR_00446);
2509 skip_call |= ValidateObject(commandBuffer, pRenderPassBegin->renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,
2510 false, VALIDATION_ERROR_00445);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002511 }
2512 }
2513 if (skip_call) {
2514 return;
2515 }
2516 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
2517}
2518
2519VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
2520 bool skip_call = false;
2521 {
2522 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002523 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2524 VALIDATION_ERROR_00454);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002525 }
2526 if (skip_call) {
2527 return;
2528 }
2529 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
2530}
2531
2532VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
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_00461);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002538 }
2539 if (skip_call) {
2540 return;
2541 }
2542 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
2543}
2544
2545VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
2546 const VkCommandBuffer *pCommandBuffers) {
2547 bool skip_call = false;
2548 {
2549 std::lock_guard<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06002550 skip_call |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2551 VALIDATION_ERROR_00159);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002552 if (pCommandBuffers) {
2553 for (uint32_t idx0 = 0; idx0 < commandBufferCount; ++idx0) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06002554 skip_call |= ValidateObject(commandBuffer, pCommandBuffers[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
2555 false, VALIDATION_ERROR_00160);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002556 }
2557 }
2558 }
2559 if (skip_call) {
2560 return;
2561 }
2562 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
2563}
2564
2565VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
2566 bool skip_call = false;
2567 {
2568 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002569 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01847);
2570 skip_call |= ValidateObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, true, VALIDATION_ERROR_01848);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002571 }
2572 if (skip_call) {
2573 return;
2574 }
2575 {
2576 std::lock_guard<std::mutex> lock(global_lock);
Chris Forbesec461992016-09-29 14:41:44 +13002577 DestroyObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002578 }
2579 get_dispatch_table(ot_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
2580}
2581
2582VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
2583 VkSurfaceKHR surface, VkBool32 *pSupported) {
2584 bool skip_call = false;
2585 {
2586 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002587 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2588 VALIDATION_ERROR_01890);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002589 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002590 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01891);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002591 }
2592 if (skip_call) {
2593 return VK_ERROR_VALIDATION_FAILED_EXT;
2594 }
2595 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2596 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
2597 return result;
2598}
2599
2600VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2601 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
2602 bool skip_call = false;
2603 {
2604 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002605 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2606 VALIDATION_ERROR_01907);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002607 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002608 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01908);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002609 }
2610 if (skip_call) {
2611 return VK_ERROR_VALIDATION_FAILED_EXT;
2612 }
2613 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2614 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
2615 return result;
2616}
2617
2618VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2619 uint32_t *pSurfaceFormatCount,
2620 VkSurfaceFormatKHR *pSurfaceFormats) {
2621 bool skip_call = false;
2622 {
2623 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002624 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2625 VALIDATION_ERROR_01910);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002626 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002627 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01911);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002628 }
2629 if (skip_call) {
2630 return VK_ERROR_VALIDATION_FAILED_EXT;
2631 }
2632 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2633 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
2634 return result;
2635}
2636
2637VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2638 uint32_t *pPresentModeCount,
2639 VkPresentModeKHR *pPresentModes) {
2640 bool skip_call = false;
2641 {
2642 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002643 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2644 VALIDATION_ERROR_01914);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002645 skip_call |=
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002646 ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01915);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002647 }
2648 if (skip_call) {
2649 return VK_ERROR_VALIDATION_FAILED_EXT;
2650 }
2651 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2652 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
2653 return result;
2654}
2655
2656VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
2657 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
2658 bool skip_call = false;
2659 {
2660 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002661 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01918);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002662 if (pCreateInfo) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002663 skip_call |= ValidateObject(device, pCreateInfo->oldSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, true,
2664 VALIDATION_ERROR_01935);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002665 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002666 skip_call |= ValidateObject(device_data->physical_device, pCreateInfo->surface,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002667 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01926);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002668 }
2669 }
2670 if (skip_call) {
2671 return VK_ERROR_VALIDATION_FAILED_EXT;
2672 }
2673 VkResult result =
2674 get_dispatch_table(ot_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
2675 {
2676 std::lock_guard<std::mutex> lock(global_lock);
2677 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002678 CreateObject(device, *pSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002679 }
2680 }
2681 return result;
2682}
2683
2684VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
2685 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
2686 bool skip_call = false;
2687 {
2688 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002689 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01954);
2690 skip_call |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_01957);
2691 skip_call |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, true, VALIDATION_ERROR_01956);
2692 skip_call |=
2693 ValidateObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false, VALIDATION_ERROR_01955);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002694 }
2695 if (skip_call) {
2696 return VK_ERROR_VALIDATION_FAILED_EXT;
2697 }
2698 VkResult result = get_dispatch_table(ot_device_table_map, device)
2699 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
2700 return result;
2701}
2702
2703VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
2704 bool skip_call = false;
2705 {
2706 std::lock_guard<std::mutex> lock(global_lock);
2707 if (pPresentInfo) {
2708 if (pPresentInfo->pSwapchains) {
2709 for (uint32_t idx0 = 0; idx0 < pPresentInfo->swapchainCount; ++idx0) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002710 skip_call |= ValidateObject(queue, pPresentInfo->pSwapchains[idx0],
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002711 VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false, VALIDATION_ERROR_01969);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002712 }
2713 }
2714 if (pPresentInfo->pWaitSemaphores) {
2715 for (uint32_t idx1 = 0; idx1 < pPresentInfo->waitSemaphoreCount; ++idx1) {
Chris Forbes2f271a72016-09-29 14:58:08 +13002716 skip_call |= ValidateObject(queue, pPresentInfo->pWaitSemaphores[idx1],
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002717 VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false, VALIDATION_ERROR_01968);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002718 }
2719 }
2720 }
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002721 skip_call |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_01962);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002722 }
2723 if (skip_call) {
2724 return VK_ERROR_VALIDATION_FAILED_EXT;
2725 }
2726 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
2727 return result;
2728}
2729
Norbert Nopper1dec9a52016-11-25 07:55:13 +01002730VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
2731 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2732 bool skip_call = false;
2733 {
2734 std::lock_guard<std::mutex> lock(global_lock);
2735 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01878);
2736 }
2737 if (skip_call) {
2738 return VK_ERROR_VALIDATION_FAILED_EXT;
2739 }
2740 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
2741 ->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2742 {
2743 std::lock_guard<std::mutex> lock(global_lock);
2744 if (result == VK_SUCCESS) {
2745 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
2746 }
2747 }
2748 return result;
2749}
2750
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002751#ifdef VK_USE_PLATFORM_WIN32_KHR
2752VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
2753 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2754 bool skip_call = false;
2755 {
2756 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002757 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01820);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002758 }
2759 if (skip_call) {
2760 return VK_ERROR_VALIDATION_FAILED_EXT;
2761 }
2762 VkResult result =
2763 get_dispatch_table(ot_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2764 {
2765 std::lock_guard<std::mutex> lock(global_lock);
2766 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002767 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002768 }
2769 }
2770 return result;
2771}
2772
2773VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
2774 uint32_t queueFamilyIndex) {
2775 bool skip_call = false;
2776 {
2777 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002778 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2779 VALIDATION_ERROR_01900);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002780 }
2781 if (skip_call) {
2782 return VK_FALSE;
2783 }
2784 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2785 ->GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
2786 return result;
2787}
2788#endif // VK_USE_PLATFORM_WIN32_KHR
2789
2790#ifdef VK_USE_PLATFORM_XCB_KHR
2791VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
2792 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2793 bool skip_call = false;
2794 {
2795 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002796 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01827);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002797 }
2798 if (skip_call) {
2799 return VK_ERROR_VALIDATION_FAILED_EXT;
2800 }
2801 VkResult result =
2802 get_dispatch_table(ot_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2803 {
2804 std::lock_guard<std::mutex> lock(global_lock);
2805 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002806 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002807 }
2808 }
2809 return result;
2810}
2811
2812VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2813 uint32_t queueFamilyIndex, xcb_connection_t *connection,
2814 xcb_visualid_t visual_id) {
2815 bool skip_call = false;
2816 {
2817 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002818 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2819 VALIDATION_ERROR_01902);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002820 }
2821 if (skip_call) {
2822 return VK_FALSE;
2823 }
2824 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2825 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
2826 return result;
2827}
2828#endif // VK_USE_PLATFORM_XCB_KHR
2829
2830#ifdef VK_USE_PLATFORM_XLIB_KHR
2831VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
2832 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2833 bool skip_call = false;
2834 {
2835 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002836 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01836);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002837 }
2838 if (skip_call) {
2839 return VK_ERROR_VALIDATION_FAILED_EXT;
2840 }
2841 VkResult result =
2842 get_dispatch_table(ot_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2843 {
2844 std::lock_guard<std::mutex> lock(global_lock);
2845 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002846 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002847 }
2848 }
2849 return result;
2850}
2851
2852VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2853 uint32_t queueFamilyIndex, Display *dpy,
2854 VisualID visualID) {
2855 bool skip_call = false;
2856 {
2857 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002858 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2859 VALIDATION_ERROR_01905);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002860 }
2861 if (skip_call) {
2862 return VK_FALSE;
2863 }
2864 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2865 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
2866 return result;
2867}
2868#endif // VK_USE_PLATFORM_XLIB_KHR
2869
2870#ifdef VK_USE_PLATFORM_MIR_KHR
2871VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
2872 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2873 bool skip_call = false;
2874 {
2875 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002876 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01802);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002877 }
2878 if (skip_call) {
2879 return VK_ERROR_VALIDATION_FAILED_EXT;
2880 }
2881 VkResult result =
2882 get_dispatch_table(ot_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2883 {
2884 std::lock_guard<std::mutex> lock(global_lock);
2885 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002886 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002887 }
2888 }
2889 return result;
2890}
2891
2892VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2893 uint32_t queueFamilyIndex, MirConnection *connection) {
2894 bool skip_call = false;
2895 {
2896 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002897 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2898 VALIDATION_ERROR_01894);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002899 }
2900 if (skip_call) {
2901 return VK_FALSE;
2902 }
2903 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2904 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
2905 return result;
2906}
2907#endif // VK_USE_PLATFORM_MIR_KHR
2908
2909#ifdef VK_USE_PLATFORM_WAYLAND_KHR
2910VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
2911 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2912 bool skip_call = false;
2913 {
2914 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002915 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01811);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002916 }
2917 if (skip_call) {
2918 return VK_ERROR_VALIDATION_FAILED_EXT;
2919 }
2920 VkResult result =
2921 get_dispatch_table(ot_instance_table_map, instance)->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2922 {
2923 std::lock_guard<std::mutex> lock(global_lock);
2924 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002925 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002926 }
2927 }
2928 return result;
2929}
2930
2931VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2932 uint32_t queueFamilyIndex,
2933 struct wl_display *display) {
2934 bool skip_call = false;
2935 {
2936 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002937 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2938 VALIDATION_ERROR_01897);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002939 }
2940 if (skip_call) {
2941 return VK_FALSE;
2942 }
2943 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2944 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
2945 return result;
2946}
2947#endif // VK_USE_PLATFORM_WAYLAND_KHR
2948
2949#ifdef VK_USE_PLATFORM_ANDROID_KHR
2950VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
2951 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
2952 bool skip_call = false;
2953 {
2954 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002955 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01794);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002956 }
2957 if (skip_call) {
2958 return VK_ERROR_VALIDATION_FAILED_EXT;
2959 }
2960 VkResult result =
2961 get_dispatch_table(ot_instance_table_map, instance)->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2962 {
2963 std::lock_guard<std::mutex> lock(global_lock);
2964 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002965 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002966 }
2967 }
2968 return result;
2969}
2970#endif // VK_USE_PLATFORM_ANDROID_KHR
2971
Mark Youngead9b932016-09-08 12:28:38 -06002972VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
2973 const VkSwapchainCreateInfoKHR *pCreateInfos,
2974 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
2975 bool skip_call = false;
2976 uint32_t i = 0;
2977 {
2978 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002979 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01943);
Mark Youngead9b932016-09-08 12:28:38 -06002980 if (NULL != pCreateInfos) {
2981 for (i = 0; i < swapchainCount; i++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002982 skip_call |= ValidateObject(device, pCreateInfos[i].oldSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT,
2983 true, VALIDATION_ERROR_01935);
Mark Youngead9b932016-09-08 12:28:38 -06002984 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Chris Forbes2f271a72016-09-29 14:58:08 +13002985 skip_call |= ValidateObject(device_data->physical_device, pCreateInfos[i].surface,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07002986 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01926);
Mark Youngead9b932016-09-08 12:28:38 -06002987 }
2988 }
2989 }
2990 if (skip_call) {
2991 return VK_ERROR_VALIDATION_FAILED_EXT;
2992 }
2993 VkResult result =
2994 get_dispatch_table(ot_device_table_map, device)->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
2995 {
2996 std::lock_guard<std::mutex> lock(global_lock);
2997 if (result == VK_SUCCESS) {
2998 for (i = 0; i < swapchainCount; i++) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002999 CreateObject(device, pSwapchains[i], VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Youngead9b932016-09-08 12:28:38 -06003000 }
3001 }
3002 }
3003 return result;
3004}
3005
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003006VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
3007 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
3008 const VkAllocationCallbacks *pAllocator,
3009 VkDebugReportCallbackEXT *pCallback) {
3010 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3011 VkResult result = pInstanceTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback);
3012 if (VK_SUCCESS == result) {
3013 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3014 result = layer_create_msg_callback(instance_data->report_data, false, pCreateInfo, pAllocator, pCallback);
Chris Forbesfeecd402016-09-29 14:53:50 +13003015 CreateObject(instance, *pCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003016 }
3017 return result;
3018}
3019
3020VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
3021 const VkAllocationCallbacks *pAllocator) {
3022 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3023 pInstanceTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
3024 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3025 layer_destroy_msg_callback(instance_data->report_data, msgCallback, pAllocator);
Chris Forbesec461992016-09-29 14:41:44 +13003026 DestroyObject(instance, msgCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003027}
3028
3029VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
3030 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
3031 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
3032 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3033 pInstanceTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
3034}
3035
3036static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
3037
3038static const VkLayerProperties globalLayerProps = {"VK_LAYER_LUNARG_object_tracker",
3039 VK_LAYER_API_VERSION, // specVersion
3040 1, // implementationVersion
3041 "LunarG Validation Layer"};
3042
3043VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
3044 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
3045}
3046
3047VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
3048 VkLayerProperties *pProperties) {
3049 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
3050}
3051
3052VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
3053 VkExtensionProperties *pProperties) {
3054 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3055 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
3056
3057 return VK_ERROR_LAYER_NOT_PRESENT;
3058}
3059
3060VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
3061 uint32_t *pCount, VkExtensionProperties *pProperties) {
3062 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3063 return util_GetExtensionProperties(0, nullptr, pCount, pProperties);
3064
3065 assert(physicalDevice);
3066 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, physicalDevice);
3067 return pTable->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
3068}
3069
3070static inline PFN_vkVoidFunction InterceptMsgCallbackGetProcAddrCommand(const char *name, VkInstance instance) {
3071 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
3072 return debug_report_get_instance_proc_addr(instance_data->report_data, name);
3073}
3074
3075static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
3076 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, instance);
3077 if (instanceExtMap.size() == 0 || !instanceExtMap[pTable].wsi_enabled)
3078 return nullptr;
3079
3080 if (!strcmp("vkDestroySurfaceKHR", name))
3081 return reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR);
3082 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name))
3083 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR);
3084 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name))
3085 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR);
3086 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name))
3087 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR);
3088 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name))
3089 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR);
Norbert Nopper1dec9a52016-11-25 07:55:13 +01003090 if ((instanceExtMap[pTable].display_enabled == true) && !strcmp("vkCreateDisplayPlaneSurfaceKHR", name))
3091 return reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003092
3093#ifdef VK_USE_PLATFORM_WIN32_KHR
3094 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
3095 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
3096 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name))
3097 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR);
3098#endif // VK_USE_PLATFORM_WIN32_KHR
3099#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003100 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003101 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003102 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003103 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
3104#endif // VK_USE_PLATFORM_XCB_KHR
3105#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003106 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003107 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003108 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003109 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
3110#endif // VK_USE_PLATFORM_XLIB_KHR
3111#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003112 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003113 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003114 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003115 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
3116#endif // VK_USE_PLATFORM_MIR_KHR
3117#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003118 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003119 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003120 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003121 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
3122#endif // VK_USE_PLATFORM_WAYLAND_KHR
3123#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003124 if ((instanceExtMap[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003125 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
3126#endif // VK_USE_PLATFORM_ANDROID_KHR
3127
3128 return nullptr;
3129}
3130
3131static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
3132 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3133 device_data->wsi_enabled = false;
Mark Youngead9b932016-09-08 12:28:38 -06003134 device_data->wsi_display_swapchain_enabled = false;
3135 device_data->objtrack_extensions_enabled = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003136
3137 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3138 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
3139 device_data->wsi_enabled = true;
3140 }
Mark Youngead9b932016-09-08 12:28:38 -06003141 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
3142 device_data->wsi_display_swapchain_enabled = true;
3143 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003144 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], "OBJTRACK_EXTENSIONS") == 0) {
3145 device_data->objtrack_extensions_enabled = true;
3146 }
3147 }
3148}
3149
3150static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
3151 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(ot_instance_table_map, instance);
3152
3153
3154 instanceExtMap[pDisp] = {};
3155
3156 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
3157 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
3158 instanceExtMap[pDisp].wsi_enabled = true;
3159 }
Norbert Nopper1dec9a52016-11-25 07:55:13 +01003160 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
3161 instanceExtMap[pDisp].display_enabled = true;
3162 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003163#ifdef VK_USE_PLATFORM_XLIB_KHR
3164 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
3165 instanceExtMap[pDisp].xlib_enabled = true;
3166 }
3167#endif
3168#ifdef VK_USE_PLATFORM_XCB_KHR
3169 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
3170 instanceExtMap[pDisp].xcb_enabled = true;
3171 }
3172#endif
3173#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3174 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
3175 instanceExtMap[pDisp].wayland_enabled = true;
3176 }
3177#endif
3178#ifdef VK_USE_PLATFORM_MIR_KHR
3179 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
3180 instanceExtMap[pDisp].mir_enabled = true;
3181 }
3182#endif
3183#ifdef VK_USE_PLATFORM_ANDROID_KHR
3184 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
3185 instanceExtMap[pDisp].android_enabled = true;
3186 }
3187#endif
3188#ifdef VK_USE_PLATFORM_WIN32_KHR
3189 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
3190 instanceExtMap[pDisp].win32_enabled = true;
3191 }
3192#endif
3193 }
3194}
3195
3196VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
3197 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
3198 std::lock_guard<std::mutex> lock(global_lock);
3199 layer_data *phy_dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3200 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3201
3202 assert(chain_info->u.pLayerInfo);
3203 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3204 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
3205 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(phy_dev_data->instance, "vkCreateDevice");
3206 if (fpCreateDevice == NULL) {
3207 return VK_ERROR_INITIALIZATION_FAILED;
3208 }
3209
3210 // Advance the link info for the next element on the chain
3211 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3212
3213 VkResult result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
3214 if (result != VK_SUCCESS) {
3215 return result;
3216 }
3217
3218 layer_data *device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
3219 device_data->report_data = layer_debug_report_create_device(phy_dev_data->report_data, *pDevice);
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003220 layer_init_device_dispatch_table(*pDevice, &device_data->dispatch_table, fpGetDeviceProcAddr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003221
3222 // Add link back to physDev
3223 device_data->physical_device = physicalDevice;
3224
3225 initDeviceTable(*pDevice, fpGetDeviceProcAddr, ot_device_table_map);
3226
3227 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
Chris Forbesfeecd402016-09-29 14:53:50 +13003228 CreateObject(*pDevice, *pDevice, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003229
3230 return result;
3231}
3232
3233VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3234 uint32_t *pQueueFamilyPropertyCount,
3235 VkQueueFamilyProperties *pQueueFamilyProperties) {
3236 get_dispatch_table(ot_instance_table_map, physicalDevice)
3237 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
3238 std::lock_guard<std::mutex> lock(global_lock);
3239 if (pQueueFamilyProperties != NULL) {
3240 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
3241 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
3242 instance_data->queue_family_properties.emplace_back(pQueueFamilyProperties[i]);
3243 }
3244 }
3245}
3246
3247VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3248 VkInstance *pInstance) {
3249 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3250
3251 assert(chain_info->u.pLayerInfo);
3252 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3253 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
3254 if (fpCreateInstance == NULL) {
3255 return VK_ERROR_INITIALIZATION_FAILED;
3256 }
3257
3258 // Advance the link info for the next element on the chain
3259 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3260
3261 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
3262 if (result != VK_SUCCESS) {
3263 return result;
3264 }
3265
3266 layer_data *instance_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
3267 instance_data->instance = *pInstance;
3268 initInstanceTable(*pInstance, fpGetInstanceProcAddr, ot_instance_table_map);
3269 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, *pInstance);
3270
3271 // Look for one or more debug report create info structures, and copy the
3272 // callback(s) for each one found (for use by vkDestroyInstance)
3273 layer_copy_tmp_callbacks(pCreateInfo->pNext, &instance_data->num_tmp_callbacks, &instance_data->tmp_dbg_create_infos,
3274 &instance_data->tmp_callbacks);
3275
3276 instance_data->report_data = debug_report_create_instance(pInstanceTable, *pInstance, pCreateInfo->enabledExtensionCount,
3277 pCreateInfo->ppEnabledExtensionNames);
3278
3279 InitObjectTracker(instance_data, pAllocator);
3280 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
3281
Chris Forbesfeecd402016-09-29 14:53:50 +13003282 CreateObject(*pInstance, *pInstance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003283
3284 return result;
3285}
3286
3287VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
3288 VkPhysicalDevice *pPhysicalDevices) {
3289 bool skip_call = VK_FALSE;
3290 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003291 skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_00023);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003292 lock.unlock();
3293 if (skip_call) {
3294 return VK_ERROR_VALIDATION_FAILED_EXT;
3295 }
3296 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
3297 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
3298 lock.lock();
3299 if (result == VK_SUCCESS) {
3300 if (pPhysicalDevices) {
3301 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003302 CreateObject(instance, pPhysicalDevices[i], VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003303 }
3304 }
3305 }
3306 lock.unlock();
3307 return result;
3308}
3309
3310VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
3311 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003312 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00062);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003313 lock.unlock();
3314
3315 get_dispatch_table(ot_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
3316
3317 lock.lock();
3318
3319 CreateQueue(device, *pQueue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT);
3320 AddQueueInfo(device, queueFamilyIndex, *pQueue);
3321}
3322
3323VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Tobin Ehlis02337352016-10-20 14:42:57 -06003324 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003325 std::unique_lock<std::mutex> lock(global_lock);
Tobin Ehlis02337352016-10-20 14:42:57 -06003326 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00621);
3327 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, true, VALIDATION_ERROR_00622);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003328 lock.unlock();
Tobin Ehlis02337352016-10-20 14:42:57 -06003329 if (!skip) {
3330 get_dispatch_table(ot_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003331
Tobin Ehlis02337352016-10-20 14:42:57 -06003332 lock.lock();
3333 DestroyObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
3334 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003335}
3336
3337VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
3338 VkMemoryMapFlags flags, void **ppData) {
3339 bool skip_call = VK_FALSE;
3340 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultz259ddb22016-10-27 13:29:19 -06003341 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00630);
3342 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00631);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003343 lock.unlock();
3344 if (skip_call == VK_TRUE) {
3345 return VK_ERROR_VALIDATION_FAILED_EXT;
3346 }
3347 VkResult result = get_dispatch_table(ot_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
3348 return result;
3349}
3350
3351VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
3352 bool skip_call = VK_FALSE;
3353 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003354 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00650);
Karl Schultz259ddb22016-10-27 13:29:19 -06003355 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00651);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003356 lock.unlock();
3357 if (skip_call == VK_TRUE) {
3358 return;
3359 }
3360
3361 get_dispatch_table(ot_device_table_map, device)->UnmapMemory(device, memory);
3362}
3363VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
3364 VkFence fence) {
3365 std::unique_lock<std::mutex> lock(global_lock);
3366 ValidateQueueFlags(queue, "QueueBindSparse");
3367
3368 for (uint32_t i = 0; i < bindInfoCount; i++) {
3369 for (uint32_t j = 0; j < pBindInfo[i].bufferBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003370 ValidateObject(queue, pBindInfo[i].pBufferBinds[j].buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false,
3371 VALIDATION_ERROR_01656);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003372 for (uint32_t j = 0; j < pBindInfo[i].imageOpaqueBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003373 ValidateObject(queue, pBindInfo[i].pImageOpaqueBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
3374 VALIDATION_ERROR_01657);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003375 for (uint32_t j = 0; j < pBindInfo[i].imageBindCount; j++)
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003376 ValidateObject(queue, pBindInfo[i].pImageBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
3377 VALIDATION_ERROR_01658);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003378 }
3379 lock.unlock();
3380
3381 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
3382 return result;
3383}
3384
3385VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3386 VkCommandBuffer *pCommandBuffers) {
3387 bool skip_call = VK_FALSE;
3388 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003389 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00084);
3390 skip_call |= ValidateObject(device, pAllocateInfo->commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false,
3391 VALIDATION_ERROR_00090);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003392 lock.unlock();
3393
3394 if (skip_call) {
3395 return VK_ERROR_VALIDATION_FAILED_EXT;
3396 }
3397
3398 VkResult result =
3399 get_dispatch_table(ot_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3400
3401 lock.lock();
3402 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {
3403 AllocateCommandBuffer(device, pAllocateInfo->commandPool, pCommandBuffers[i],
3404 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, pAllocateInfo->level);
3405 }
3406 lock.unlock();
3407
3408 return result;
3409}
3410
3411VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3412 VkDescriptorSet *pDescriptorSets) {
3413 bool skip_call = VK_FALSE;
3414 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003415 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00908);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003416 skip_call |= ValidateObject(device, pAllocateInfo->descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false,
3417 VALIDATION_ERROR_00915);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003418 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003419 skip_call |= ValidateObject(device, pAllocateInfo->pSetLayouts[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT,
3420 false, VALIDATION_ERROR_00916);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003421 }
3422 lock.unlock();
3423 if (skip_call) {
3424 return VK_ERROR_VALIDATION_FAILED_EXT;
3425 }
3426
3427 VkResult result =
3428 get_dispatch_table(ot_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3429
3430 if (VK_SUCCESS == result) {
3431 lock.lock();
3432 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
3433 AllocateDescriptorSet(device, pAllocateInfo->descriptorPool, pDescriptorSets[i],
3434 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
3435 }
3436 lock.unlock();
3437 }
3438
3439 return result;
3440}
3441
3442VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
3443 const VkCommandBuffer *pCommandBuffers) {
3444 bool skip_call = false;
3445 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003446 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false, VALIDATION_ERROR_00099);
3447 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00098);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003448 for (uint32_t i = 0; i < commandBufferCount; i++) {
3449 skip_call |= ValidateCommandBuffer(device, commandPool, pCommandBuffers[i]);
3450 }
3451
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003452 for (uint32_t i = 0; i < commandBufferCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003453 DestroyObject(device, pCommandBuffers[i], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003454 }
3455
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003456 lock.unlock();
3457 if (!skip_call) {
3458 get_dispatch_table(ot_device_table_map, device)
3459 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
3460 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003461}
3462VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
3463 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3464 std::unique_lock<std::mutex> lock(global_lock);
3465 // A swapchain's images are implicitly deleted when the swapchain is deleted.
3466 // Remove this swapchain's images from our map of such images.
3467 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr = device_data->swapchainImageMap.begin();
3468 while (itr != device_data->swapchainImageMap.end()) {
3469 OBJTRACK_NODE *pNode = (*itr).second;
3470 if (pNode->parent_object == reinterpret_cast<uint64_t &>(swapchain)) {
3471 delete pNode;
3472 auto delete_item = itr++;
3473 device_data->swapchainImageMap.erase(delete_item);
3474 } else {
3475 ++itr;
3476 }
3477 }
Chris Forbesec461992016-09-29 14:41:44 +13003478 DestroyObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003479 lock.unlock();
3480
3481 get_dispatch_table(ot_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
3482}
3483
3484VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
3485 const VkDescriptorSet *pDescriptorSets) {
3486 bool skip_call = false;
3487 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3488 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003489 skip_call |=
3490 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false, VALIDATION_ERROR_00924);
3491 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00923);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003492 for (uint32_t i = 0; i < descriptorSetCount; i++) {
3493 skip_call |= ValidateDescriptorSet(device, descriptorPool, pDescriptorSets[i]);
3494 }
3495
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003496 for (uint32_t i = 0; i < descriptorSetCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003497 DestroyObject(device, pDescriptorSets[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003498 }
3499
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003500 lock.unlock();
3501 if (!skip_call) {
3502 result = get_dispatch_table(ot_device_table_map, device)
3503 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
3504 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003505 return result;
3506}
3507
3508VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3509 const VkAllocationCallbacks *pAllocator) {
3510 bool skip_call = VK_FALSE;
3511 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3512 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003513 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00904);
3514 skip_call |=
3515 ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, true, VALIDATION_ERROR_00905);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003516 lock.unlock();
3517 if (skip_call) {
3518 return;
3519 }
3520 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is deleted.
3521 // Remove this pool's descriptor sets from our descriptorSet map.
3522 lock.lock();
3523 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr =
3524 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
3525 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
3526 OBJTRACK_NODE *pNode = (*itr).second;
3527 auto del_itr = itr++;
3528 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
Chris Forbesec461992016-09-29 14:41:44 +13003529 DestroyObject(device, (VkDescriptorSet)((*del_itr).first),
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003530 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003531 }
3532 }
Chris Forbesec461992016-09-29 14:41:44 +13003533 DestroyObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003534 lock.unlock();
3535 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
3536}
3537
3538VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
3539 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3540 bool skip_call = false;
3541 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003542 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00080);
3543 skip_call |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, true, VALIDATION_ERROR_00081);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003544 lock.unlock();
3545 if (skip_call) {
3546 return;
3547 }
3548 lock.lock();
3549 // A CommandPool's command buffers are implicitly deleted when the pool is deleted.
3550 // Remove this pool's cmdBuffers from our cmd buffer map.
3551 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].begin();
3552 auto del_itr = itr;
3553 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
3554 OBJTRACK_NODE *pNode = (*itr).second;
3555 del_itr = itr++;
3556 if (pNode->parent_object == reinterpret_cast<uint64_t &>(commandPool)) {
3557 skip_call |= ValidateCommandBuffer(device, commandPool, reinterpret_cast<VkCommandBuffer>((*del_itr).first));
Chris Forbesec461992016-09-29 14:41:44 +13003558 DestroyObject(device, reinterpret_cast<VkCommandBuffer>((*del_itr).first),
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003559 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003560 }
3561 }
Chris Forbesec461992016-09-29 14:41:44 +13003562 DestroyObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003563 lock.unlock();
3564 get_dispatch_table(ot_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
3565}
3566
3567VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
3568 VkImage *pSwapchainImages) {
3569 bool skip_call = VK_FALSE;
3570 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003571 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01948);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003572 lock.unlock();
3573 if (skip_call) {
3574 return VK_ERROR_VALIDATION_FAILED_EXT;
3575 }
3576 VkResult result = get_dispatch_table(ot_device_table_map, device)
3577 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
3578 if (pSwapchainImages != NULL) {
3579 lock.lock();
3580 for (uint32_t i = 0; i < *pSwapchainImageCount; i++) {
3581 CreateSwapchainImageObject(device, pSwapchainImages[i], swapchain);
3582 }
3583 lock.unlock();
3584 }
3585 return result;
3586}
3587
3588VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3589 const VkGraphicsPipelineCreateInfo *pCreateInfos,
3590 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3591 bool skip_call = VK_FALSE;
3592 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003593 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00519);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003594 if (pCreateInfos) {
3595 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3596 if (pCreateInfos[idx0].basePipelineHandle) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003597 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3598 true, VALIDATION_ERROR_00529);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003599 }
3600 if (pCreateInfos[idx0].layout) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003601 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
3602 false, VALIDATION_ERROR_00546);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003603 }
3604 if (pCreateInfos[idx0].pStages) {
3605 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
3606 if (pCreateInfos[idx0].pStages[idx1].module) {
Chris Forbes2f271a72016-09-29 14:58:08 +13003607 skip_call |= ValidateObject(device, pCreateInfos[idx0].pStages[idx1].module,
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003608 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false, VALIDATION_ERROR_00515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003609 }
3610 }
3611 }
3612 if (pCreateInfos[idx0].renderPass) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003613 skip_call |= ValidateObject(device, pCreateInfos[idx0].renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,
3614 false, VALIDATION_ERROR_00547);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003615 }
3616 }
3617 }
3618 if (pipelineCache) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06003619 skip_call |=
3620 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00520);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003621 }
3622 lock.unlock();
3623 if (skip_call) {
Chris Forbes8d24dc92016-11-30 14:56:52 +13003624 for (uint32_t i = 0; i < createInfoCount; i++) {
3625 pPipelines[i] = VK_NULL_HANDLE;
3626 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003627 return VK_ERROR_VALIDATION_FAILED_EXT;
3628 }
3629 VkResult result = get_dispatch_table(ot_device_table_map, device)
3630 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3631 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01003632 for (uint32_t idx2 = 0; idx2 < createInfoCount; ++idx2) {
3633 if (pPipelines[idx2] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003634 CreateObject(device, pPipelines[idx2], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003635 }
3636 }
3637 lock.unlock();
3638 return result;
3639}
3640
3641VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3642 const VkComputePipelineCreateInfo *pCreateInfos,
3643 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
3644 bool skip_call = VK_FALSE;
3645 std::unique_lock<std::mutex> lock(global_lock);
Karl Schultzcf2e0452016-10-12 13:28:49 -06003646 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00486);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003647 if (pCreateInfos) {
3648 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3649 if (pCreateInfos[idx0].basePipelineHandle) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003650 skip_call |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3651 true, VALIDATION_ERROR_00496);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003652 }
3653 if (pCreateInfos[idx0].layout) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003654 skip_call |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
3655 false, VALIDATION_ERROR_00505);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003656 }
3657 if (pCreateInfos[idx0].stage.module) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003658 skip_call |= ValidateObject(device, pCreateInfos[idx0].stage.module, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT,
3659 false, VALIDATION_ERROR_00515);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003660 }
3661 }
3662 }
3663 if (pipelineCache) {
Karl Schultzcf2e0452016-10-12 13:28:49 -06003664 skip_call |=
3665 ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00487);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003666 }
3667 lock.unlock();
3668 if (skip_call) {
Chris Forbes8d24dc92016-11-30 14:56:52 +13003669 for (uint32_t i = 0; i < createInfoCount; i++) {
3670 pPipelines[i] = VK_NULL_HANDLE;
3671 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003672 return VK_ERROR_VALIDATION_FAILED_EXT;
3673 }
3674 VkResult result = get_dispatch_table(ot_device_table_map, device)
3675 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3676 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01003677 for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
3678 if (pPipelines[idx1] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003679 CreateObject(device, pPipelines[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003680 }
3681 }
3682 lock.unlock();
3683 return result;
3684}
3685
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003686// VK_EXT_debug_marker Extension
3687VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
3688 bool skip_call = VK_FALSE;
3689 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003690 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_02007);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003691 lock.unlock();
3692 if (skip_call) {
3693 return VK_ERROR_VALIDATION_FAILED_EXT;
3694 }
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003695 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3696 VkResult result = VK_SUCCESS;
3697 if (dev_data->dispatch_table.DebugMarkerSetObjectTagEXT) {
3698 result = dev_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
3699 }
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003700 return result;
3701}
3702
3703VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
3704 bool skip_call = VK_FALSE;
3705 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003706 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01999);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003707 lock.unlock();
3708 if (skip_call) {
3709 return VK_ERROR_VALIDATION_FAILED_EXT;
3710 }
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003711 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
3712 VkResult result = VK_SUCCESS;
3713 if (dev_data->dispatch_table.DebugMarkerSetObjectNameEXT) {
3714 result = dev_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
3715 }
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003716 return result;
3717}
3718
3719VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3720 bool skip_call = VK_FALSE;
3721 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003722 skip_call |=
3723 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02014);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003724 lock.unlock();
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003725 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3726 if (!skip_call && dev_data->dispatch_table.CmdDebugMarkerBeginEXT) {
3727 dev_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003728 }
3729}
3730
3731VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerEndEXT(VkCommandBuffer commandBuffer) {
3732 bool skip_call = VK_FALSE;
3733 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003734 skip_call |=
3735 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02022);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003736 lock.unlock();
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003737 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3738 if (!skip_call && dev_data->dispatch_table.CmdDebugMarkerEndEXT) {
3739 dev_data->dispatch_table.CmdDebugMarkerEndEXT(commandBuffer);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003740 }
3741}
3742
3743VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
3744 bool skip_call = VK_FALSE;
3745 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003746 skip_call |=
3747 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_02025);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003748 lock.unlock();
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003749 layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
3750 if (!skip_call && dev_data->dispatch_table.CmdDebugMarkerInsertEXT) {
3751 dev_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06003752 }
3753}
3754
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003755// VK_NV_external_memory_capabilities Extension
3756VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
3757 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
3758 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
3759 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
3760
3761 bool skip_call = false;
3762 {
3763 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003764 skip_call |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3765 VALIDATION_ERROR_01980);
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06003766 }
3767 if (skip_call) {
3768 return VK_ERROR_VALIDATION_FAILED_EXT;
3769 }
3770 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3771 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
3772 externalHandleType, pExternalImageFormatProperties);
3773 return result;
3774}
3775
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003776#ifdef VK_USE_PLATFORM_WIN32_KHR
3777// VK_NV_external_memory_win32 Extension
3778VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
3779 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
3780 bool skip_call = VK_FALSE;
3781 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003782 skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01725);
3783 skip_call |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_01726);
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06003784 lock.unlock();
3785 if (skip_call) {
3786 return VK_ERROR_VALIDATION_FAILED_EXT;
3787 }
3788 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
3789 return result;
3790}
3791#endif // VK_USE_PLATFORM_WIN32_KHR
3792
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003793// VK_AMD_draw_indirect_count Extension
3794VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3795 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3796 uint32_t stride) {
3797 bool skip_call = VK_FALSE;
3798 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003799 skip_call |=
3800 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01771);
3801 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01772);
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003802 lock.unlock();
3803 if (!skip_call) {
3804 get_dispatch_table(ot_device_table_map, commandBuffer)
3805 ->CmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3806 }
3807}
3808
3809VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3810 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3811 uint32_t maxDrawCount, uint32_t stride) {
3812 bool skip_call = VK_FALSE;
3813 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003814 skip_call |=
3815 ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01783);
3816 skip_call |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01784);
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06003817 lock.unlock();
3818 if (!skip_call) {
3819 get_dispatch_table(ot_device_table_map, commandBuffer)
3820 ->CmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
3821 }
3822}
3823
3824
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003825static inline PFN_vkVoidFunction InterceptCoreDeviceCommand(const char *name) {
3826 if (!name || name[0] != 'v' || name[1] != 'k')
3827 return NULL;
3828
3829 name += 2;
3830 if (!strcmp(name, "GetDeviceProcAddr"))
3831 return (PFN_vkVoidFunction)GetDeviceProcAddr;
3832 if (!strcmp(name, "DestroyDevice"))
3833 return (PFN_vkVoidFunction)DestroyDevice;
3834 if (!strcmp(name, "GetDeviceQueue"))
3835 return (PFN_vkVoidFunction)GetDeviceQueue;
3836 if (!strcmp(name, "QueueSubmit"))
3837 return (PFN_vkVoidFunction)QueueSubmit;
3838 if (!strcmp(name, "QueueWaitIdle"))
3839 return (PFN_vkVoidFunction)QueueWaitIdle;
3840 if (!strcmp(name, "DeviceWaitIdle"))
3841 return (PFN_vkVoidFunction)DeviceWaitIdle;
3842 if (!strcmp(name, "AllocateMemory"))
3843 return (PFN_vkVoidFunction)AllocateMemory;
3844 if (!strcmp(name, "FreeMemory"))
3845 return (PFN_vkVoidFunction)FreeMemory;
3846 if (!strcmp(name, "MapMemory"))
3847 return (PFN_vkVoidFunction)MapMemory;
3848 if (!strcmp(name, "UnmapMemory"))
3849 return (PFN_vkVoidFunction)UnmapMemory;
3850 if (!strcmp(name, "FlushMappedMemoryRanges"))
3851 return (PFN_vkVoidFunction)FlushMappedMemoryRanges;
3852 if (!strcmp(name, "InvalidateMappedMemoryRanges"))
3853 return (PFN_vkVoidFunction)InvalidateMappedMemoryRanges;
3854 if (!strcmp(name, "GetDeviceMemoryCommitment"))
3855 return (PFN_vkVoidFunction)GetDeviceMemoryCommitment;
3856 if (!strcmp(name, "BindBufferMemory"))
3857 return (PFN_vkVoidFunction)BindBufferMemory;
3858 if (!strcmp(name, "BindImageMemory"))
3859 return (PFN_vkVoidFunction)BindImageMemory;
3860 if (!strcmp(name, "GetBufferMemoryRequirements"))
3861 return (PFN_vkVoidFunction)GetBufferMemoryRequirements;
3862 if (!strcmp(name, "GetImageMemoryRequirements"))
3863 return (PFN_vkVoidFunction)GetImageMemoryRequirements;
3864 if (!strcmp(name, "GetImageSparseMemoryRequirements"))
3865 return (PFN_vkVoidFunction)GetImageSparseMemoryRequirements;
3866 if (!strcmp(name, "QueueBindSparse"))
3867 return (PFN_vkVoidFunction)QueueBindSparse;
3868 if (!strcmp(name, "CreateFence"))
3869 return (PFN_vkVoidFunction)CreateFence;
3870 if (!strcmp(name, "DestroyFence"))
3871 return (PFN_vkVoidFunction)DestroyFence;
3872 if (!strcmp(name, "ResetFences"))
3873 return (PFN_vkVoidFunction)ResetFences;
3874 if (!strcmp(name, "GetFenceStatus"))
3875 return (PFN_vkVoidFunction)GetFenceStatus;
3876 if (!strcmp(name, "WaitForFences"))
3877 return (PFN_vkVoidFunction)WaitForFences;
3878 if (!strcmp(name, "CreateSemaphore"))
3879 return (PFN_vkVoidFunction)CreateSemaphore;
3880 if (!strcmp(name, "DestroySemaphore"))
3881 return (PFN_vkVoidFunction)DestroySemaphore;
3882 if (!strcmp(name, "CreateEvent"))
3883 return (PFN_vkVoidFunction)CreateEvent;
3884 if (!strcmp(name, "DestroyEvent"))
3885 return (PFN_vkVoidFunction)DestroyEvent;
3886 if (!strcmp(name, "GetEventStatus"))
3887 return (PFN_vkVoidFunction)GetEventStatus;
3888 if (!strcmp(name, "SetEvent"))
3889 return (PFN_vkVoidFunction)SetEvent;
3890 if (!strcmp(name, "ResetEvent"))
3891 return (PFN_vkVoidFunction)ResetEvent;
3892 if (!strcmp(name, "CreateQueryPool"))
3893 return (PFN_vkVoidFunction)CreateQueryPool;
3894 if (!strcmp(name, "DestroyQueryPool"))
3895 return (PFN_vkVoidFunction)DestroyQueryPool;
3896 if (!strcmp(name, "GetQueryPoolResults"))
3897 return (PFN_vkVoidFunction)GetQueryPoolResults;
3898 if (!strcmp(name, "CreateBuffer"))
3899 return (PFN_vkVoidFunction)CreateBuffer;
3900 if (!strcmp(name, "DestroyBuffer"))
3901 return (PFN_vkVoidFunction)DestroyBuffer;
3902 if (!strcmp(name, "CreateBufferView"))
3903 return (PFN_vkVoidFunction)CreateBufferView;
3904 if (!strcmp(name, "DestroyBufferView"))
3905 return (PFN_vkVoidFunction)DestroyBufferView;
3906 if (!strcmp(name, "CreateImage"))
3907 return (PFN_vkVoidFunction)CreateImage;
3908 if (!strcmp(name, "DestroyImage"))
3909 return (PFN_vkVoidFunction)DestroyImage;
3910 if (!strcmp(name, "GetImageSubresourceLayout"))
3911 return (PFN_vkVoidFunction)GetImageSubresourceLayout;
3912 if (!strcmp(name, "CreateImageView"))
3913 return (PFN_vkVoidFunction)CreateImageView;
3914 if (!strcmp(name, "DestroyImageView"))
3915 return (PFN_vkVoidFunction)DestroyImageView;
3916 if (!strcmp(name, "CreateShaderModule"))
3917 return (PFN_vkVoidFunction)CreateShaderModule;
3918 if (!strcmp(name, "DestroyShaderModule"))
3919 return (PFN_vkVoidFunction)DestroyShaderModule;
3920 if (!strcmp(name, "CreatePipelineCache"))
3921 return (PFN_vkVoidFunction)CreatePipelineCache;
3922 if (!strcmp(name, "DestroyPipelineCache"))
3923 return (PFN_vkVoidFunction)DestroyPipelineCache;
3924 if (!strcmp(name, "GetPipelineCacheData"))
3925 return (PFN_vkVoidFunction)GetPipelineCacheData;
3926 if (!strcmp(name, "MergePipelineCaches"))
3927 return (PFN_vkVoidFunction)MergePipelineCaches;
3928 if (!strcmp(name, "CreateGraphicsPipelines"))
3929 return (PFN_vkVoidFunction)CreateGraphicsPipelines;
3930 if (!strcmp(name, "CreateComputePipelines"))
3931 return (PFN_vkVoidFunction)CreateComputePipelines;
3932 if (!strcmp(name, "DestroyPipeline"))
3933 return (PFN_vkVoidFunction)DestroyPipeline;
3934 if (!strcmp(name, "CreatePipelineLayout"))
3935 return (PFN_vkVoidFunction)CreatePipelineLayout;
3936 if (!strcmp(name, "DestroyPipelineLayout"))
3937 return (PFN_vkVoidFunction)DestroyPipelineLayout;
3938 if (!strcmp(name, "CreateSampler"))
3939 return (PFN_vkVoidFunction)CreateSampler;
3940 if (!strcmp(name, "DestroySampler"))
3941 return (PFN_vkVoidFunction)DestroySampler;
3942 if (!strcmp(name, "CreateDescriptorSetLayout"))
3943 return (PFN_vkVoidFunction)CreateDescriptorSetLayout;
3944 if (!strcmp(name, "DestroyDescriptorSetLayout"))
3945 return (PFN_vkVoidFunction)DestroyDescriptorSetLayout;
3946 if (!strcmp(name, "CreateDescriptorPool"))
3947 return (PFN_vkVoidFunction)CreateDescriptorPool;
3948 if (!strcmp(name, "DestroyDescriptorPool"))
3949 return (PFN_vkVoidFunction)DestroyDescriptorPool;
3950 if (!strcmp(name, "ResetDescriptorPool"))
3951 return (PFN_vkVoidFunction)ResetDescriptorPool;
3952 if (!strcmp(name, "AllocateDescriptorSets"))
3953 return (PFN_vkVoidFunction)AllocateDescriptorSets;
3954 if (!strcmp(name, "FreeDescriptorSets"))
3955 return (PFN_vkVoidFunction)FreeDescriptorSets;
3956 if (!strcmp(name, "UpdateDescriptorSets"))
3957 return (PFN_vkVoidFunction)UpdateDescriptorSets;
3958 if (!strcmp(name, "CreateFramebuffer"))
3959 return (PFN_vkVoidFunction)CreateFramebuffer;
3960 if (!strcmp(name, "DestroyFramebuffer"))
3961 return (PFN_vkVoidFunction)DestroyFramebuffer;
3962 if (!strcmp(name, "CreateRenderPass"))
3963 return (PFN_vkVoidFunction)CreateRenderPass;
3964 if (!strcmp(name, "DestroyRenderPass"))
3965 return (PFN_vkVoidFunction)DestroyRenderPass;
3966 if (!strcmp(name, "GetRenderAreaGranularity"))
3967 return (PFN_vkVoidFunction)GetRenderAreaGranularity;
3968 if (!strcmp(name, "CreateCommandPool"))
3969 return (PFN_vkVoidFunction)CreateCommandPool;
3970 if (!strcmp(name, "DestroyCommandPool"))
3971 return (PFN_vkVoidFunction)DestroyCommandPool;
3972 if (!strcmp(name, "ResetCommandPool"))
3973 return (PFN_vkVoidFunction)ResetCommandPool;
3974 if (!strcmp(name, "AllocateCommandBuffers"))
3975 return (PFN_vkVoidFunction)AllocateCommandBuffers;
3976 if (!strcmp(name, "FreeCommandBuffers"))
3977 return (PFN_vkVoidFunction)FreeCommandBuffers;
3978 if (!strcmp(name, "BeginCommandBuffer"))
3979 return (PFN_vkVoidFunction)BeginCommandBuffer;
3980 if (!strcmp(name, "EndCommandBuffer"))
3981 return (PFN_vkVoidFunction)EndCommandBuffer;
3982 if (!strcmp(name, "ResetCommandBuffer"))
3983 return (PFN_vkVoidFunction)ResetCommandBuffer;
3984 if (!strcmp(name, "CmdBindPipeline"))
3985 return (PFN_vkVoidFunction)CmdBindPipeline;
3986 if (!strcmp(name, "CmdSetViewport"))
3987 return (PFN_vkVoidFunction)CmdSetViewport;
3988 if (!strcmp(name, "CmdSetScissor"))
3989 return (PFN_vkVoidFunction)CmdSetScissor;
3990 if (!strcmp(name, "CmdSetLineWidth"))
3991 return (PFN_vkVoidFunction)CmdSetLineWidth;
3992 if (!strcmp(name, "CmdSetDepthBias"))
3993 return (PFN_vkVoidFunction)CmdSetDepthBias;
3994 if (!strcmp(name, "CmdSetBlendConstants"))
3995 return (PFN_vkVoidFunction)CmdSetBlendConstants;
3996 if (!strcmp(name, "CmdSetDepthBounds"))
3997 return (PFN_vkVoidFunction)CmdSetDepthBounds;
3998 if (!strcmp(name, "CmdSetStencilCompareMask"))
3999 return (PFN_vkVoidFunction)CmdSetStencilCompareMask;
4000 if (!strcmp(name, "CmdSetStencilWriteMask"))
4001 return (PFN_vkVoidFunction)CmdSetStencilWriteMask;
4002 if (!strcmp(name, "CmdSetStencilReference"))
4003 return (PFN_vkVoidFunction)CmdSetStencilReference;
4004 if (!strcmp(name, "CmdBindDescriptorSets"))
4005 return (PFN_vkVoidFunction)CmdBindDescriptorSets;
4006 if (!strcmp(name, "CmdBindIndexBuffer"))
4007 return (PFN_vkVoidFunction)CmdBindIndexBuffer;
4008 if (!strcmp(name, "CmdBindVertexBuffers"))
4009 return (PFN_vkVoidFunction)CmdBindVertexBuffers;
4010 if (!strcmp(name, "CmdDraw"))
4011 return (PFN_vkVoidFunction)CmdDraw;
4012 if (!strcmp(name, "CmdDrawIndexed"))
4013 return (PFN_vkVoidFunction)CmdDrawIndexed;
4014 if (!strcmp(name, "CmdDrawIndirect"))
4015 return (PFN_vkVoidFunction)CmdDrawIndirect;
4016 if (!strcmp(name, "CmdDrawIndexedIndirect"))
4017 return (PFN_vkVoidFunction)CmdDrawIndexedIndirect;
4018 if (!strcmp(name, "CmdDispatch"))
4019 return (PFN_vkVoidFunction)CmdDispatch;
4020 if (!strcmp(name, "CmdDispatchIndirect"))
4021 return (PFN_vkVoidFunction)CmdDispatchIndirect;
4022 if (!strcmp(name, "CmdCopyBuffer"))
4023 return (PFN_vkVoidFunction)CmdCopyBuffer;
4024 if (!strcmp(name, "CmdCopyImage"))
4025 return (PFN_vkVoidFunction)CmdCopyImage;
4026 if (!strcmp(name, "CmdBlitImage"))
4027 return (PFN_vkVoidFunction)CmdBlitImage;
4028 if (!strcmp(name, "CmdCopyBufferToImage"))
4029 return (PFN_vkVoidFunction)CmdCopyBufferToImage;
4030 if (!strcmp(name, "CmdCopyImageToBuffer"))
4031 return (PFN_vkVoidFunction)CmdCopyImageToBuffer;
4032 if (!strcmp(name, "CmdUpdateBuffer"))
4033 return (PFN_vkVoidFunction)CmdUpdateBuffer;
4034 if (!strcmp(name, "CmdFillBuffer"))
4035 return (PFN_vkVoidFunction)CmdFillBuffer;
4036 if (!strcmp(name, "CmdClearColorImage"))
4037 return (PFN_vkVoidFunction)CmdClearColorImage;
4038 if (!strcmp(name, "CmdClearDepthStencilImage"))
4039 return (PFN_vkVoidFunction)CmdClearDepthStencilImage;
4040 if (!strcmp(name, "CmdClearAttachments"))
4041 return (PFN_vkVoidFunction)CmdClearAttachments;
4042 if (!strcmp(name, "CmdResolveImage"))
4043 return (PFN_vkVoidFunction)CmdResolveImage;
4044 if (!strcmp(name, "CmdSetEvent"))
4045 return (PFN_vkVoidFunction)CmdSetEvent;
4046 if (!strcmp(name, "CmdResetEvent"))
4047 return (PFN_vkVoidFunction)CmdResetEvent;
4048 if (!strcmp(name, "CmdWaitEvents"))
4049 return (PFN_vkVoidFunction)CmdWaitEvents;
4050 if (!strcmp(name, "CmdPipelineBarrier"))
4051 return (PFN_vkVoidFunction)CmdPipelineBarrier;
4052 if (!strcmp(name, "CmdBeginQuery"))
4053 return (PFN_vkVoidFunction)CmdBeginQuery;
4054 if (!strcmp(name, "CmdEndQuery"))
4055 return (PFN_vkVoidFunction)CmdEndQuery;
4056 if (!strcmp(name, "CmdResetQueryPool"))
4057 return (PFN_vkVoidFunction)CmdResetQueryPool;
4058 if (!strcmp(name, "CmdWriteTimestamp"))
4059 return (PFN_vkVoidFunction)CmdWriteTimestamp;
4060 if (!strcmp(name, "CmdCopyQueryPoolResults"))
4061 return (PFN_vkVoidFunction)CmdCopyQueryPoolResults;
4062 if (!strcmp(name, "CmdPushConstants"))
4063 return (PFN_vkVoidFunction)CmdPushConstants;
4064 if (!strcmp(name, "CmdBeginRenderPass"))
4065 return (PFN_vkVoidFunction)CmdBeginRenderPass;
4066 if (!strcmp(name, "CmdNextSubpass"))
4067 return (PFN_vkVoidFunction)CmdNextSubpass;
4068 if (!strcmp(name, "CmdEndRenderPass"))
4069 return (PFN_vkVoidFunction)CmdEndRenderPass;
4070 if (!strcmp(name, "CmdExecuteCommands"))
4071 return (PFN_vkVoidFunction)CmdExecuteCommands;
Mark Lobodzinski82db45e2016-09-28 12:45:29 -06004072 if (!strcmp(name, "DebugMarkerSetObjectTagEXT"))
4073 return (PFN_vkVoidFunction)DebugMarkerSetObjectTagEXT;
4074 if (!strcmp(name, "DebugMarkerSetObjectNameEXT"))
4075 return (PFN_vkVoidFunction)DebugMarkerSetObjectNameEXT;
4076 if (!strcmp(name, "CmdDebugMarkerBeginEXT"))
4077 return (PFN_vkVoidFunction)CmdDebugMarkerBeginEXT;
4078 if (!strcmp(name, "CmdDebugMarkerEndEXT"))
4079 return (PFN_vkVoidFunction)CmdDebugMarkerEndEXT;
4080 if (!strcmp(name, "CmdDebugMarkerInsertEXT"))
4081 return (PFN_vkVoidFunction)CmdDebugMarkerInsertEXT;
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06004082#ifdef VK_USE_PLATFORM_WIN32_KHR
4083 if (!strcmp(name, "GetMemoryWin32HandleNV"))
4084 return (PFN_vkVoidFunction)GetMemoryWin32HandleNV;
4085#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski4e0003a2016-09-28 12:58:00 -06004086 if (!strcmp(name, "CmdDrawIndirectCountAMD"))
4087 return (PFN_vkVoidFunction)CmdDrawIndirectCountAMD;
4088 if (!strcmp(name, "CmdDrawIndexedIndirectCountAMD"))
4089 return (PFN_vkVoidFunction)CmdDrawIndexedIndirectCountAMD;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004090
4091 return NULL;
4092}
4093static inline PFN_vkVoidFunction InterceptCoreInstanceCommand(const char *name) {
4094 if (!name || name[0] != 'v' || name[1] != 'k')
4095 return NULL;
4096
4097 name += 2;
4098 if (!strcmp(name, "CreateInstance"))
4099 return (PFN_vkVoidFunction)CreateInstance;
4100 if (!strcmp(name, "DestroyInstance"))
4101 return (PFN_vkVoidFunction)DestroyInstance;
4102 if (!strcmp(name, "EnumeratePhysicalDevices"))
4103 return (PFN_vkVoidFunction)EnumeratePhysicalDevices;
4104 if (!strcmp(name, "GetPhysicalDeviceFeatures"))
4105 return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures;
4106 if (!strcmp(name, "GetPhysicalDeviceFormatProperties"))
4107 return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties;
4108 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties"))
4109 return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties;
4110 if (!strcmp(name, "GetPhysicalDeviceProperties"))
4111 return (PFN_vkVoidFunction)GetPhysicalDeviceProperties;
4112 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties"))
4113 return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties;
4114 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties"))
4115 return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties;
4116 if (!strcmp(name, "GetInstanceProcAddr"))
4117 return (PFN_vkVoidFunction)GetInstanceProcAddr;
4118 if (!strcmp(name, "CreateDevice"))
4119 return (PFN_vkVoidFunction)CreateDevice;
4120 if (!strcmp(name, "EnumerateInstanceExtensionProperties"))
4121 return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
4122 if (!strcmp(name, "EnumerateInstanceLayerProperties"))
4123 return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties;
4124 if (!strcmp(name, "EnumerateDeviceLayerProperties"))
4125 return (PFN_vkVoidFunction)EnumerateDeviceLayerProperties;
4126 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties"))
4127 return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties;
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06004128 if (!strcmp(name, "GetPhysicalDeviceExternalImageFormatPropertiesNV"))
4129 return (PFN_vkVoidFunction)GetPhysicalDeviceExternalImageFormatPropertiesNV;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004130
4131 return NULL;
4132}
4133
4134static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
4135 if (device) {
4136 layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06004137
4138 if (device_data->wsi_enabled) {
4139 if (!strcmp("vkCreateSwapchainKHR", name))
4140 return reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR);
4141 if (!strcmp("vkDestroySwapchainKHR", name))
4142 return reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR);
4143 if (!strcmp("vkGetSwapchainImagesKHR", name))
4144 return reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR);
4145 if (!strcmp("vkAcquireNextImageKHR", name))
4146 return reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR);
4147 if (!strcmp("vkQueuePresentKHR", name))
4148 return reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR);
4149 }
4150
4151 if (device_data->wsi_display_swapchain_enabled) {
4152 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
4153 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
4154 }
4155 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004156 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004157
4158 return nullptr;
4159}
4160
4161VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
4162 PFN_vkVoidFunction addr;
4163 addr = InterceptCoreDeviceCommand(funcName);
4164 if (addr) {
4165 return addr;
4166 }
4167 assert(device);
4168
4169 addr = InterceptWsiEnabledCommand(funcName, device);
4170 if (addr) {
4171 return addr;
4172 }
4173 if (get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr == NULL) {
4174 return NULL;
4175 }
4176 return get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr(device, funcName);
4177}
4178
4179VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
4180 PFN_vkVoidFunction addr;
4181 addr = InterceptCoreInstanceCommand(funcName);
4182 if (!addr) {
4183 addr = InterceptCoreDeviceCommand(funcName);
4184 }
4185 if (!addr) {
4186 addr = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
4187 }
4188 if (addr) {
4189 return addr;
4190 }
4191 assert(instance);
4192
4193 addr = InterceptMsgCallbackGetProcAddrCommand(funcName, instance);
4194 if (addr) {
4195 return addr;
4196 }
4197 addr = InterceptWsiEnabledCommand(funcName, instance);
4198 if (addr) {
4199 return addr;
4200 }
4201 if (get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr == NULL) {
4202 return NULL;
4203 }
4204 return get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
4205}
4206
4207} // namespace object_tracker
4208
4209// vk_layer_logging.h expects these to be defined
4210VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
4211 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
4212 const VkAllocationCallbacks *pAllocator,
4213 VkDebugReportCallbackEXT *pMsgCallback) {
4214 return object_tracker::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
4215}
4216
4217VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
4218 const VkAllocationCallbacks *pAllocator) {
4219 object_tracker::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
4220}
4221
4222VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
4223 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
4224 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
4225 object_tracker::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
4226}
4227
4228// Loader-layer interface v0, just wrappers since there is only a layer
4229VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
4230 VkExtensionProperties *pProperties) {
4231 return object_tracker::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
4232}
4233
4234VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
4235 VkLayerProperties *pProperties) {
4236 return object_tracker::EnumerateInstanceLayerProperties(pCount, pProperties);
4237}
4238
4239VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
4240 VkLayerProperties *pProperties) {
4241 // The layer command handles VK_NULL_HANDLE just fine internally
4242 assert(physicalDevice == VK_NULL_HANDLE);
4243 return object_tracker::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
4244}
4245
4246VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
4247 return object_tracker::GetDeviceProcAddr(dev, funcName);
4248}
4249
4250VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
4251 return object_tracker::GetInstanceProcAddr(instance, funcName);
4252}
4253
4254VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
4255 const char *pLayerName, uint32_t *pCount,
4256 VkExtensionProperties *pProperties) {
4257 // The layer command handles VK_NULL_HANDLE just fine internally
4258 assert(physicalDevice == VK_NULL_HANDLE);
4259 return object_tracker::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Mark Lobodzinski38080682016-07-22 15:30:27 -06004260}