blob: c06cd601b555c0d416ea7c54221714de19dead1b [file] [log] [blame]
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001/*
Mark Young0f183a82017-02-28 09:58:04 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06006 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * Author: Mark Lobodzinski <mark@lunarg.com>
20 * Author: Tobin Ehlis <tobine@google.com>
21 * Author: Courtney Goeltzenleuchter <courtneygo@google.com>
22 * Author: Jon Ashburn <jon@lunarg.com>
23 * Author: Mike Stroyan <stroyan@google.com>
24 * Author: Tony Barbour <tony@LunarG.com>
25 */
26
27#include "vk_loader_platform.h"
28#include "vulkan/vulkan.h"
29
30#include <cinttypes>
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34
35#include <unordered_map>
36
37#include "vk_layer_config.h"
38#include "vk_layer_data.h"
39#include "vk_layer_logging.h"
40#include "vk_layer_table.h"
41#include "vulkan/vk_layer.h"
42
43#include "object_tracker.h"
44
Karl Schultza9ef1e52016-10-06 17:53:48 -060045#include "vk_validation_error_messages.h"
46
Mark Lobodzinski9bab8662016-07-01 10:53:31 -060047namespace object_tracker {
48
Mark Young39389872017-01-19 21:10:49 -070049static uint32_t loader_layer_if_version = CURRENT_LOADER_LAYER_INTERFACE_VERSION;
50
Mark Lobodzinski9bab8662016-07-01 10:53:31 -060051static void InitObjectTracker(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -060052 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_object_tracker");
53}
54
55// Add new queue to head of global queue list
56static void AddQueueInfo(VkDevice device, uint32_t queue_node_index, VkQueue queue) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -070057 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -060058 auto queueItem = device_data->queue_info_map.find(queue);
59 if (queueItem == device_data->queue_info_map.end()) {
60 OT_QUEUE_INFO *p_queue_info = new OT_QUEUE_INFO;
61 if (p_queue_info != NULL) {
62 memset(p_queue_info, 0, sizeof(OT_QUEUE_INFO));
63 p_queue_info->queue = queue;
64 p_queue_info->queue_node_index = queue_node_index;
65 device_data->queue_info_map[queue] = p_queue_info;
66 } else {
67 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
68 reinterpret_cast<uint64_t>(queue), __LINE__, OBJTRACK_INTERNAL_ERROR, LayerName,
69 "ERROR: VK_ERROR_OUT_OF_HOST_MEMORY -- could not allocate memory for Queue Information");
70 }
71 }
72}
73
74// Destroy memRef lists and free all memory
75static void DestroyQueueDataStructures(VkDevice device) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -070076 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -060077
78 for (auto queue_item : device_data->queue_info_map) {
79 delete queue_item.second;
80 }
81 device_data->queue_info_map.clear();
82
83 // Destroy the items in the queue map
84 auto queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].begin();
85 while (queue != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].end()) {
86 uint32_t obj_index = queue->second->object_type;
87 assert(device_data->num_total_objects > 0);
88 device_data->num_total_objects--;
89 assert(device_data->num_objects[obj_index] > 0);
90 device_data->num_objects[obj_index]--;
91 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, queue->second->object_type, queue->second->handle,
92 __LINE__, OBJTRACK_NONE, LayerName,
93 "OBJ_STAT Destroy Queue obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " Queue objs).",
94 queue->second->handle, device_data->num_total_objects, device_data->num_objects[obj_index]);
95 delete queue->second;
96 queue = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT].erase(queue);
97 }
98}
99
100// Check Queue type flags for selected queue operations
101static void ValidateQueueFlags(VkQueue queue, const char *function) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700102 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(queue), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600103 auto queue_item = device_data->queue_info_map.find(queue);
104 if (queue_item != device_data->queue_info_map.end()) {
105 OT_QUEUE_INFO *pQueueInfo = queue_item->second;
106 if (pQueueInfo != NULL) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700107 layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(device_data->physical_device), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600108 if ((instance_data->queue_family_properties[pQueueInfo->queue_node_index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) ==
109 0) {
110 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 -0700111 reinterpret_cast<uint64_t>(queue), __LINE__, VALIDATION_ERROR_01651, LayerName,
112 "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_SPARSE_BINDING_BIT not set. %s",
113 function, validation_error_map[VALIDATION_ERROR_01651]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600114 }
115 }
116 }
117}
118
119static void AllocateCommandBuffer(VkDevice device, const VkCommandPool command_pool, const VkCommandBuffer command_buffer,
120 VkDebugReportObjectTypeEXT object_type, VkCommandBufferLevel level) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700121 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600122
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700123 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type,
124 reinterpret_cast<const uint64_t>(command_buffer), __LINE__, OBJTRACK_NONE, LayerName,
125 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600126 string_VkDebugReportObjectTypeEXT(object_type), reinterpret_cast<const uint64_t>(command_buffer));
127
128 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
129 pNewObjNode->object_type = object_type;
130 pNewObjNode->handle = reinterpret_cast<const uint64_t>(command_buffer);
131 pNewObjNode->parent_object = reinterpret_cast<const uint64_t &>(command_pool);
132 if (level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) {
133 pNewObjNode->status = OBJSTATUS_COMMAND_BUFFER_SECONDARY;
134 } else {
135 pNewObjNode->status = OBJSTATUS_NONE;
136 }
137 device_data->object_map[object_type][reinterpret_cast<const uint64_t>(command_buffer)] = pNewObjNode;
138 device_data->num_objects[object_type]++;
139 device_data->num_total_objects++;
140}
141
142static bool ValidateCommandBuffer(VkDevice device, VkCommandPool command_pool, VkCommandBuffer command_buffer) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700143 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600144 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600145 uint64_t object_handle = reinterpret_cast<uint64_t>(command_buffer);
146 if (device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].find(object_handle) !=
147 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
148 OBJTRACK_NODE *pNode =
149 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<uint64_t>(command_buffer)];
150
151 if (pNode->parent_object != reinterpret_cast<uint64_t &>(command_pool)) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600152 skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle, __LINE__,
153 VALIDATION_ERROR_00102, LayerName,
154 "FreeCommandBuffers is attempting to free Command Buffer 0x%" PRIxLEAST64
155 " belonging to Command Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 "). %s",
156 reinterpret_cast<uint64_t>(command_buffer), pNode->parent_object,
157 reinterpret_cast<uint64_t &>(command_pool), validation_error_map[VALIDATION_ERROR_00102]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600158 }
159 } else {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600160 skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
161 object_handle, __LINE__, VALIDATION_ERROR_00097, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s",
162 object_name[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT], object_handle,
163 validation_error_map[VALIDATION_ERROR_00097]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600164 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600165 return skip;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600166}
167
168static void AllocateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set,
169 VkDebugReportObjectTypeEXT object_type) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700170 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600171
172 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type,
173 reinterpret_cast<uint64_t &>(descriptor_set), __LINE__, OBJTRACK_NONE, LayerName,
174 "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++, object_name[object_type],
175 reinterpret_cast<uint64_t &>(descriptor_set));
176
177 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
178 pNewObjNode->object_type = object_type;
179 pNewObjNode->status = OBJSTATUS_NONE;
180 pNewObjNode->handle = reinterpret_cast<uint64_t &>(descriptor_set);
181 pNewObjNode->parent_object = reinterpret_cast<uint64_t &>(descriptor_pool);
182 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT][reinterpret_cast<uint64_t &>(descriptor_set)] =
183 pNewObjNode;
184 device_data->num_objects[object_type]++;
185 device_data->num_total_objects++;
186}
187
188static bool ValidateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700189 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600190 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600191 uint64_t object_handle = reinterpret_cast<uint64_t &>(descriptor_set);
192 auto dsItem = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].find(object_handle);
193 if (dsItem != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
194 OBJTRACK_NODE *pNode = dsItem->second;
195
196 if (pNode->parent_object != reinterpret_cast<uint64_t &>(descriptor_pool)) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600197 skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, object_handle, __LINE__,
198 VALIDATION_ERROR_00927, LayerName,
199 "FreeDescriptorSets is attempting to free descriptorSet 0x%" PRIxLEAST64
200 " belonging to Descriptor Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 "). %s",
201 reinterpret_cast<uint64_t &>(descriptor_set), pNode->parent_object,
202 reinterpret_cast<uint64_t &>(descriptor_pool), validation_error_map[VALIDATION_ERROR_00927]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600203 }
204 } else {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600205 skip |= 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 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600210 return skip;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600211}
212
213static void CreateQueue(VkDevice device, VkQueue vkObj, VkDebugReportObjectTypeEXT object_type) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700214 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600215
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) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700236 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(dispatchable_object), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600237 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
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700250template <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}
Chris Forbes64a31a12016-10-04 14:54:13 +1300258
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600259template <typename T1, typename T2>
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700260static void CreateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type,
261 const VkAllocationCallbacks *pAllocator) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700262 layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(dispatchable_object), layer_data_map);
Chris Forbes04257ad2016-10-04 10:08:31 +1300263
Chris Forbes64a31a12016-10-04 14:54:13 +1300264 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600265 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600266
Mike Schuchardt21d998c2016-12-13 14:04:57 -0700267 if (!instance_data->object_map[object_type].count(object_handle)) {
268 log_msg(instance_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, object_type, object_handle, __LINE__,
269 OBJTRACK_NONE, LayerName, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64, object_track_index++,
270 object_name[object_type], object_handle);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600271
Mike Schuchardt21d998c2016-12-13 14:04:57 -0700272 OBJTRACK_NODE *pNewObjNode = new OBJTRACK_NODE;
273 pNewObjNode->object_type = object_type;
274 pNewObjNode->status = custom_allocator ? OBJSTATUS_CUSTOM_ALLOCATOR : OBJSTATUS_NONE;
275 pNewObjNode->handle = object_handle;
276
277 instance_data->object_map[object_type][object_handle] = pNewObjNode;
278 instance_data->num_objects[object_type]++;
279 instance_data->num_total_objects++;
280 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600281}
282
283template <typename T1, typename T2>
Mike Schuchardt3796a882016-12-06 18:03:56 -0700284static void DestroyObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type,
285 const VkAllocationCallbacks *pAllocator, enum UNIQUE_VALIDATION_ERROR_CODE expected_custom_allocator_code,
286 enum UNIQUE_VALIDATION_ERROR_CODE expected_default_allocator_code) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700287 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(dispatchable_object), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600288
Chris Forbes64a31a12016-10-04 14:54:13 +1300289 auto object_handle = handle_value(object);
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -0600290 bool custom_allocator = pAllocator != nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600291
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700292 if (object_handle != VK_NULL_HANDLE) {
293 auto item = device_data->object_map[object_type].find(object_handle);
294 if (item != device_data->object_map[object_type].end()) {
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700295 OBJTRACK_NODE *pNode = item->second;
296 assert(device_data->num_total_objects > 0);
297 device_data->num_total_objects--;
298 assert(device_data->num_objects[pNode->object_type] > 0);
299 device_data->num_objects[pNode->object_type]--;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600300
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700301 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, pNode->object_type, object_handle, __LINE__,
302 OBJTRACK_NONE, LayerName,
303 "OBJ_STAT Destroy %s obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " %s objs).",
304 object_name[pNode->object_type], reinterpret_cast<uint64_t &>(object), device_data->num_total_objects,
305 device_data->num_objects[pNode->object_type], object_name[pNode->object_type]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600306
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700307 auto allocated_with_custom = (pNode->status & OBJSTATUS_CUSTOM_ALLOCATOR) ? true : false;
Mike Schuchardt3796a882016-12-06 18:03:56 -0700308 if (allocated_with_custom && !custom_allocator && expected_custom_allocator_code != VALIDATION_ERROR_UNDEFINED) {
Mark Youngdee312c2017-03-08 13:38:35 -0700309 // This check only verifies that custom allocation callbacks were provided to both Create and Destroy calls,
Mike Schuchardt3796a882016-12-06 18:03:56 -0700310 // it cannot verify that these allocation callbacks are compatible with each other.
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700311 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
Mike Schuchardt3796a882016-12-06 18:03:56 -0700312 expected_custom_allocator_code, LayerName,
313 "Custom allocator not specified while destroying %s obj 0x%" PRIxLEAST64 " but specified at creation. %s",
314 object_name[object_type], object_handle, validation_error_map[expected_custom_allocator_code]);
315 } else if (!allocated_with_custom && custom_allocator &&
316 expected_default_allocator_code != VALIDATION_ERROR_UNDEFINED) {
317 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
318 expected_default_allocator_code, LayerName,
319 "Custom allocator specified while destroying %s obj 0x%" PRIxLEAST64 " but not specified at creation. %s",
320 object_name[object_type], object_handle, validation_error_map[expected_default_allocator_code]);
Mark Lobodzinski3b9f8e72016-11-17 10:56:14 -0700321 }
322
323 delete pNode;
324 device_data->object_map[object_type].erase(item);
325 } else {
326 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, object_handle, __LINE__,
327 OBJTRACK_UNKNOWN_OBJECT, LayerName,
328 "Unable to remove %s obj 0x%" PRIxLEAST64 ". Was it created? Has it already been destroyed?",
329 object_name[object_type], object_handle);
Chris Forbes3e51a202016-09-29 14:35:09 +1300330 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600331 }
332}
333
334template <typename T1, typename T2>
Karl Schultza9ef1e52016-10-06 17:53:48 -0600335static bool ValidateObject(T1 dispatchable_object, T2 object, VkDebugReportObjectTypeEXT object_type, bool null_allowed,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -0700336 enum UNIQUE_VALIDATION_ERROR_CODE invalid_handle_code,
337 enum UNIQUE_VALIDATION_ERROR_CODE wrong_device_code) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600338 if (null_allowed && (object == VK_NULL_HANDLE)) {
339 return false;
340 }
Chris Forbes64a31a12016-10-04 14:54:13 +1300341 auto object_handle = handle_value(object);
342
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700343 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(dispatchable_object), layer_data_map);
Mike Schuchardtdc2cb782017-02-14 15:33:52 -0700344 // Look for object in device object map
Chris Forbes2f271a72016-09-29 14:58:08 +1300345 if (device_data->object_map[object_type].find(object_handle) == device_data->object_map[object_type].end()) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600346 // If object is an image, also look for it in the swapchain image map
347 if ((object_type != VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT) ||
Chris Forbes2f271a72016-09-29 14:58:08 +1300348 (device_data->swapchainImageMap.find(object_handle) == device_data->swapchainImageMap.end())) {
Mike Schuchardtdc2cb782017-02-14 15:33:52 -0700349 // Object not found, look for it in other device object maps
350 for (auto other_device_data : layer_data_map) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600351 if (other_device_data.second != device_data) {
Mike Schuchardtdc2cb782017-02-14 15:33:52 -0700352 if (other_device_data.second->object_map[object_type].find(object_handle) !=
353 other_device_data.second->object_map[object_type].end() ||
354 (object_type == VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT &&
355 other_device_data.second->swapchainImageMap.find(object_handle) !=
356 other_device_data.second->swapchainImageMap.end())) {
357 // Object found on other device, report an error if object has a device parent error code
358 if (wrong_device_code != VALIDATION_ERROR_UNDEFINED) {
359 return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
360 __LINE__, wrong_device_code, LayerName,
361 "Object 0x%" PRIxLEAST64
362 " was not created, allocated or retrieved from the correct device. %s",
363 object_handle, validation_error_map[wrong_device_code]);
364 } else {
365 return false;
366 }
367 }
368 }
369 }
370 // Report an error if object was not found anywhere
Karl Schultza9ef1e52016-10-06 17:53:48 -0600371 return log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle, __LINE__,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -0700372 invalid_handle_code, LayerName, "Invalid %s Object 0x%" PRIxLEAST64 ". %s", object_name[object_type],
373 object_handle, validation_error_map[invalid_handle_code]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600374 }
375 }
376 return false;
377}
378
Mike Schuchardt3796a882016-12-06 18:03:56 -0700379static void DeviceReportUndestroyedObjects(VkDevice device, VkDebugReportObjectTypeEXT object_type,
380 enum UNIQUE_VALIDATION_ERROR_CODE error_code) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700381 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600382 for (auto item = device_data->object_map[object_type].begin(); item != device_data->object_map[object_type].end();) {
383 OBJTRACK_NODE *object_info = item->second;
384 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_info->object_type, object_info->handle, __LINE__,
Mike Schuchardt3796a882016-12-06 18:03:56 -0700385 error_code, LayerName,
386 "OBJ ERROR : For device 0x%" PRIxLEAST64 ", %s object 0x%" PRIxLEAST64 " has not been destroyed. %s",
387 reinterpret_cast<uint64_t>(device), object_name[object_type], object_info->handle,
388 validation_error_map[error_code]);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600389 item = device_data->object_map[object_type].erase(item);
390 }
391}
392
393VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
394 std::unique_lock<std::mutex> lock(global_lock);
395
396 dispatch_key key = get_dispatch_key(instance);
Tobin Ehlis8d6acde2017-02-08 07:40:40 -0700397 layer_data *instance_data = GetLayerDataPtr(key, layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600398
399 // Enable the temporary callback(s) here to catch cleanup issues:
400 bool callback_setup = false;
401 if (instance_data->num_tmp_callbacks > 0) {
402 if (!layer_enable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks,
403 instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks)) {
404 callback_setup = true;
405 }
406 }
407
Jeremy Hayes058b41c2016-11-03 10:49:44 -0600408 // TODO: The instance handle can not be validated here. The loader will likely have to validate it.
Mike Schuchardtdc2cb782017-02-14 15:33:52 -0700409 ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, true, VALIDATION_ERROR_00021,
410 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600411
Mike Schuchardt3796a882016-12-06 18:03:56 -0700412 DestroyObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator, VALIDATION_ERROR_00019,
413 VALIDATION_ERROR_00020);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600414 // Report any remaining objects in LL
415
416 for (auto iit = instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].begin();
417 iit != instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].end();) {
418 OBJTRACK_NODE *pNode = iit->second;
419
420 VkDevice device = reinterpret_cast<VkDevice>(pNode->handle);
421
422 log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, pNode->object_type, pNode->handle, __LINE__,
423 OBJTRACK_OBJECT_LEAK, LayerName, "OBJ ERROR : %s object 0x%" PRIxLEAST64 " has not been destroyed.",
424 string_VkDebugReportObjectTypeEXT(pNode->object_type), pNode->handle);
425 // Semaphore:
Mike Schuchardt3796a882016-12-06 18:03:56 -0700426 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, VALIDATION_ERROR_00018);
427 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, VALIDATION_ERROR_00018);
428 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, VALIDATION_ERROR_00018);
429 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, VALIDATION_ERROR_00018);
430 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, VALIDATION_ERROR_00018);
431 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, VALIDATION_ERROR_00018);
432 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, VALIDATION_ERROR_00018);
433 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, VALIDATION_ERROR_00018);
434 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, VALIDATION_ERROR_00018);
435 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, VALIDATION_ERROR_00018);
436 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, VALIDATION_ERROR_00018);
437 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, VALIDATION_ERROR_00018);
438 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, VALIDATION_ERROR_00018);
439 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, VALIDATION_ERROR_00018);
440 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, VALIDATION_ERROR_00018);
441 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, VALIDATION_ERROR_00018);
442 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, VALIDATION_ERROR_00018);
443 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, VALIDATION_ERROR_00018);
444 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, VALIDATION_ERROR_00018);
445 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, VALIDATION_ERROR_00018);
446 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, VALIDATION_ERROR_00018);
447 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, VALIDATION_ERROR_00018);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600448 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
449 }
450 instance_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT].clear();
451
452 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
453 pInstanceTable->DestroyInstance(instance, pAllocator);
454
455 // Disable and cleanup the temporary callback(s):
456 if (callback_setup) {
457 layer_disable_tmp_callbacks(instance_data->report_data, instance_data->num_tmp_callbacks, instance_data->tmp_callbacks);
458 }
459 if (instance_data->num_tmp_callbacks > 0) {
460 layer_free_tmp_callbacks(instance_data->tmp_dbg_create_infos, instance_data->tmp_callbacks);
461 instance_data->num_tmp_callbacks = 0;
462 }
463
464 // Clean up logging callback, if any
465 while (instance_data->logging_callback.size() > 0) {
466 VkDebugReportCallbackEXT callback = instance_data->logging_callback.back();
467 layer_destroy_msg_callback(instance_data->report_data, callback, pAllocator);
468 instance_data->logging_callback.pop_back();
469 }
470
471 layer_debug_report_destroy_instance(instance_data->report_data);
472 layer_data_map.erase(key);
473
474 instanceExtMap.erase(pInstanceTable);
475 lock.unlock();
476 ot_instance_table_map.erase(key);
477}
478
479VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600480 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardtdc2cb782017-02-14 15:33:52 -0700481 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, true, VALIDATION_ERROR_00052,
482 VALIDATION_ERROR_UNDEFINED);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700483 DestroyObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator, VALIDATION_ERROR_00050,
484 VALIDATION_ERROR_00051);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600485
486 // Report any remaining objects associated with this VkDevice object in LL
Mike Schuchardt3796a882016-12-06 18:03:56 -0700487 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, VALIDATION_ERROR_00049);
488 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, VALIDATION_ERROR_00049);
489 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, VALIDATION_ERROR_00049);
490 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, VALIDATION_ERROR_00049);
491 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, VALIDATION_ERROR_00049);
492 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, VALIDATION_ERROR_00049);
493 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, VALIDATION_ERROR_00049);
494 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, VALIDATION_ERROR_00049);
495 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, VALIDATION_ERROR_00049);
496 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, VALIDATION_ERROR_00049);
497 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, VALIDATION_ERROR_00049);
498 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, VALIDATION_ERROR_00049);
499 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, VALIDATION_ERROR_00049);
500 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, VALIDATION_ERROR_00049);
501 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, VALIDATION_ERROR_00049);
502 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, VALIDATION_ERROR_00049);
503 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, VALIDATION_ERROR_00049);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600504 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700505 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, VALIDATION_ERROR_00049);
506 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, VALIDATION_ERROR_00049);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600507 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700508 DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, VALIDATION_ERROR_00049);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600509 // DeviceReportUndestroyedObjects(device, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT);
510
511 // Clean up Queue's MemRef Linked Lists
512 DestroyQueueDataStructures(device);
513
514 lock.unlock();
515
516 dispatch_key key = get_dispatch_key(device);
517 VkLayerDispatchTable *pDisp = get_dispatch_table(ot_device_table_map, device);
518 pDisp->DestroyDevice(device, pAllocator);
519 ot_device_table_map.erase(key);
520}
521
522VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600523 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600524 {
525 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600526 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
527 VALIDATION_ERROR_01679, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600528 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600529 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600530 return;
531 }
532 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures(physicalDevice, pFeatures);
533}
534
535VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
536 VkFormatProperties *pFormatProperties) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600537 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600538 {
539 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600540 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
541 VALIDATION_ERROR_01683, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600542 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600543 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600544 return;
545 }
546 get_dispatch_table(ot_instance_table_map, physicalDevice)
547 ->GetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
548}
549
550VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
551 VkImageType type, VkImageTiling tiling,
552 VkImageUsageFlags usage, VkImageCreateFlags flags,
553 VkImageFormatProperties *pImageFormatProperties) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600554 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600555 {
556 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600557 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
558 VALIDATION_ERROR_01686, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600559 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600560 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600561 return VK_ERROR_VALIDATION_FAILED_EXT;
562 }
563 VkResult result =
564 get_dispatch_table(ot_instance_table_map, physicalDevice)
565 ->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
566 return result;
567}
568
569VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600570 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600571 {
572 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600573 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
574 VALIDATION_ERROR_00026, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600575 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600576 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600577 return;
578 }
579 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties(physicalDevice, pProperties);
580}
581
582VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
583 VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600584 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600585 {
586 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600587 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
588 VALIDATION_ERROR_00609, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600589 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600590 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600591 return;
592 }
593 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
594}
595
596VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *pName);
597
598VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *pName);
599
Mark Young39389872017-01-19 21:10:49 -0700600VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *funcName);
601
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600602VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount,
603 VkExtensionProperties *pProperties);
604
605VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pPropertyCount, VkLayerProperties *pProperties);
606
607VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
608 VkLayerProperties *pProperties);
609
610VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600611 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600612 {
613 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600614 skip |= ValidateObject(queue, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_00130,
615 VALIDATION_ERROR_00131);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600616 if (pSubmits) {
617 for (uint32_t idx0 = 0; idx0 < submitCount; ++idx0) {
618 if (pSubmits[idx0].pCommandBuffers) {
619 for (uint32_t idx1 = 0; idx1 < pSubmits[idx0].commandBufferCount; ++idx1) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600620 skip |= ValidateObject(queue, pSubmits[idx0].pCommandBuffers[idx1],
621 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false, VALIDATION_ERROR_00149,
622 VALIDATION_ERROR_00151);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600623 }
624 }
625 if (pSubmits[idx0].pSignalSemaphores) {
626 for (uint32_t idx2 = 0; idx2 < pSubmits[idx0].signalSemaphoreCount; ++idx2) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600627 skip |=
Mike Schuchardtdc2cb782017-02-14 15:33:52 -0700628 ValidateObject(queue, pSubmits[idx0].pSignalSemaphores[idx2], VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT,
629 false, VALIDATION_ERROR_00150, VALIDATION_ERROR_00151);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600630 }
631 }
632 if (pSubmits[idx0].pWaitSemaphores) {
633 for (uint32_t idx3 = 0; idx3 < pSubmits[idx0].waitSemaphoreCount; ++idx3) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600634 skip |=
Mike Schuchardtdc2cb782017-02-14 15:33:52 -0700635 ValidateObject(queue, pSubmits[idx0].pWaitSemaphores[idx3], VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT,
636 false, VALIDATION_ERROR_00146, VALIDATION_ERROR_00151);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600637 }
638 }
639 }
640 }
641 if (queue) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600642 skip |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_00128,
643 VALIDATION_ERROR_00131);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600644 }
645 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600646 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600647 return VK_ERROR_VALIDATION_FAILED_EXT;
648 }
649 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueSubmit(queue, submitCount, pSubmits, fence);
650 return result;
651}
652
653VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600654 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600655 {
656 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600657 skip |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_00317,
658 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600659 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600660 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600661 return VK_ERROR_VALIDATION_FAILED_EXT;
662 }
663 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueWaitIdle(queue);
664 return result;
665}
666
667VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600668 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600669 {
670 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600671 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00318,
672 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600673 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600674 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600675 return VK_ERROR_VALIDATION_FAILED_EXT;
676 }
677 VkResult result = get_dispatch_table(ot_device_table_map, device)->DeviceWaitIdle(device);
678 return result;
679}
680
681VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
682 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600683 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600684 {
685 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600686 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00612,
687 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600688 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600689 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600690 return VK_ERROR_VALIDATION_FAILED_EXT;
691 }
692 VkResult result = get_dispatch_table(ot_device_table_map, device)->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
693 {
694 std::lock_guard<std::mutex> lock(global_lock);
695 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300696 CreateObject(device, *pMemory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600697 }
698 }
699 return result;
700}
701
702VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
703 const VkMappedMemoryRange *pMemoryRanges) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600704 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600705 {
706 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600707 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00635,
708 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600709 if (pMemoryRanges) {
710 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
711 if (pMemoryRanges[idx0].memory) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600712 skip |= ValidateObject(device, pMemoryRanges[idx0].memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false,
713 VALIDATION_ERROR_00648, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600714 }
715 }
716 }
717 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600718 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600719 return VK_ERROR_VALIDATION_FAILED_EXT;
720 }
721 VkResult result =
722 get_dispatch_table(ot_device_table_map, device)->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
723 return result;
724}
725
726VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
727 const VkMappedMemoryRange *pMemoryRanges) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600728 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600729 {
730 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600731 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00638,
732 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600733 if (pMemoryRanges) {
734 for (uint32_t idx0 = 0; idx0 < memoryRangeCount; ++idx0) {
735 if (pMemoryRanges[idx0].memory) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600736 skip |= ValidateObject(device, pMemoryRanges[idx0].memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false,
737 VALIDATION_ERROR_00648, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600738 }
739 }
740 }
741 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600742 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600743 return VK_ERROR_VALIDATION_FAILED_EXT;
744 }
745 VkResult result =
746 get_dispatch_table(ot_device_table_map, device)->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
747 return result;
748}
749
750VKAPI_ATTR void VKAPI_CALL GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
751 VkDeviceSize *pCommittedMemoryInBytes) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600752 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600753 {
754 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600755 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00654,
756 VALIDATION_ERROR_UNDEFINED);
757 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00655,
758 VALIDATION_ERROR_00657);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600759 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600760 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600761 return;
762 }
763 get_dispatch_table(ot_device_table_map, device)->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
764}
765
766VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
767 VkDeviceSize memoryOffset) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600768 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600769 {
770 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600771 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00798,
772 VALIDATION_ERROR_UNDEFINED);
773 skip |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00799,
774 VALIDATION_ERROR_00801);
775 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00800,
776 VALIDATION_ERROR_00802);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600777 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600778 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600779 return VK_ERROR_VALIDATION_FAILED_EXT;
780 }
781 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindBufferMemory(device, buffer, memory, memoryOffset);
782 return result;
783}
784
785VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600786 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600787 {
788 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600789 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00807,
790 VALIDATION_ERROR_UNDEFINED);
791 skip |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00808,
792 VALIDATION_ERROR_00810);
793 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00809,
794 VALIDATION_ERROR_00811);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600795 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600796 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600797 return VK_ERROR_VALIDATION_FAILED_EXT;
798 }
799 VkResult result = get_dispatch_table(ot_device_table_map, device)->BindImageMemory(device, image, memory, memoryOffset);
800 return result;
801}
802
803VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
804 VkMemoryRequirements *pMemoryRequirements) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600805 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600806 {
807 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600808 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00783,
809 VALIDATION_ERROR_UNDEFINED);
810 skip |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00784,
811 VALIDATION_ERROR_00786);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600812 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600813 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600814 return;
815 }
816 get_dispatch_table(ot_device_table_map, device)->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
817}
818
819VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600820 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600821 {
822 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600823 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00787,
824 VALIDATION_ERROR_UNDEFINED);
825 skip |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00788,
826 VALIDATION_ERROR_00790);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600827 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600828 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600829 return;
830 }
831 get_dispatch_table(ot_device_table_map, device)->GetImageMemoryRequirements(device, image, pMemoryRequirements);
832}
833
834VKAPI_ATTR void VKAPI_CALL GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
835 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600836 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600837 {
838 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600839 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01610,
840 VALIDATION_ERROR_UNDEFINED);
841 skip |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01611,
842 VALIDATION_ERROR_01614);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600843 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600844 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600845 return;
846 }
847 get_dispatch_table(ot_device_table_map, device)
848 ->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
849}
850
851VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
852 VkImageType type, VkSampleCountFlagBits samples,
853 VkImageUsageFlags usage, VkImageTiling tiling,
854 uint32_t *pPropertyCount,
855 VkSparseImageFormatProperties *pProperties) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600856 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600857 {
858 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600859 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
860 VALIDATION_ERROR_01601, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600861 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600862 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600863 return;
864 }
865 get_dispatch_table(ot_instance_table_map, physicalDevice)
866 ->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount,
867 pProperties);
868}
869
870VKAPI_ATTR VkResult VKAPI_CALL CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
871 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600872 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600873 {
874 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600875 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00166,
876 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600877 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600878 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600879 return VK_ERROR_VALIDATION_FAILED_EXT;
880 }
881 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateFence(device, pCreateInfo, pAllocator, pFence);
882 {
883 std::lock_guard<std::mutex> lock(global_lock);
884 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300885 CreateObject(device, *pFence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600886 }
887 }
888 return result;
889}
890
891VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600892 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600893 {
894 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600895 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00176,
896 VALIDATION_ERROR_UNDEFINED);
897 skip |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_00177,
898 VALIDATION_ERROR_00179);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600899 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600900 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600901 return;
902 }
903 {
904 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -0700905 DestroyObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator, VALIDATION_ERROR_00174,
906 VALIDATION_ERROR_00175);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600907 }
908 get_dispatch_table(ot_device_table_map, device)->DestroyFence(device, fence, pAllocator);
909}
910
911VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600912 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600913 {
914 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600915 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00184,
916 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600917 if (pFences) {
918 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600919 skip |= ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00185,
920 VALIDATION_ERROR_00187);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600921 }
922 }
923 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600924 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600925 return VK_ERROR_VALIDATION_FAILED_EXT;
926 }
927 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetFences(device, fenceCount, pFences);
928 return result;
929}
930
931VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600932 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600933 {
934 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600935 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00180,
936 VALIDATION_ERROR_UNDEFINED);
937 skip |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00181,
938 VALIDATION_ERROR_00182);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600939 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600940 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600941 return VK_ERROR_VALIDATION_FAILED_EXT;
942 }
943 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetFenceStatus(device, fence);
944 return result;
945}
946
947VKAPI_ATTR VkResult VKAPI_CALL WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll,
948 uint64_t timeout) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600949 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600950 {
951 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600952 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00188,
953 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600954 if (pFences) {
955 for (uint32_t idx0 = 0; idx0 < fenceCount; ++idx0) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600956 skip |= ValidateObject(device, pFences[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, false, VALIDATION_ERROR_00189,
957 VALIDATION_ERROR_00191);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600958 }
959 }
960 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600961 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600962 return VK_ERROR_VALIDATION_FAILED_EXT;
963 }
964 VkResult result = get_dispatch_table(ot_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
965 return result;
966}
967
968VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
969 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600970 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600971 {
972 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600973 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00192,
974 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600975 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600976 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600977 return VK_ERROR_VALIDATION_FAILED_EXT;
978 }
979 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
980 {
981 std::lock_guard<std::mutex> lock(global_lock);
982 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +1300983 CreateObject(device, *pSemaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600984 }
985 }
986 return result;
987}
988
989VKAPI_ATTR void VKAPI_CALL DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600990 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600991 {
992 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600993 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00202,
994 VALIDATION_ERROR_UNDEFINED);
995 skip |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, true, VALIDATION_ERROR_00203,
996 VALIDATION_ERROR_00205);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600997 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -0600998 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -0600999 return;
1000 }
1001 {
1002 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001003 DestroyObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, pAllocator, VALIDATION_ERROR_00200,
1004 VALIDATION_ERROR_00201);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001005 }
1006 get_dispatch_table(ot_device_table_map, device)->DestroySemaphore(device, semaphore, pAllocator);
1007}
1008
1009VKAPI_ATTR VkResult VKAPI_CALL CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
1010 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001011 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001012 {
1013 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001014 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00206,
1015 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001016 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001017 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001018 return VK_ERROR_VALIDATION_FAILED_EXT;
1019 }
1020 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
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, *pEvent, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001025 }
1026 }
1027 return result;
1028}
1029
1030VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001031 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001032 {
1033 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001034 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00216,
1035 VALIDATION_ERROR_UNDEFINED);
1036 skip |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, true, VALIDATION_ERROR_00217,
1037 VALIDATION_ERROR_00219);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001038 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001039 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001040 return;
1041 }
1042 {
1043 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001044 DestroyObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, pAllocator, VALIDATION_ERROR_00214,
1045 VALIDATION_ERROR_00215);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001046 }
1047 get_dispatch_table(ot_device_table_map, device)->DestroyEvent(device, event, pAllocator);
1048}
1049
1050VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001051 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001052 {
1053 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001054 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00220,
1055 VALIDATION_ERROR_UNDEFINED);
1056 skip |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00221,
1057 VALIDATION_ERROR_00222);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001058 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001059 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001060 return VK_ERROR_VALIDATION_FAILED_EXT;
1061 }
1062 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetEventStatus(device, event);
1063 return result;
1064}
1065
1066VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001067 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001068 {
1069 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001070 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00223,
1071 VALIDATION_ERROR_UNDEFINED);
1072 skip |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00224,
1073 VALIDATION_ERROR_00225);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001074 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001075 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001076 return VK_ERROR_VALIDATION_FAILED_EXT;
1077 }
1078 VkResult result = get_dispatch_table(ot_device_table_map, device)->SetEvent(device, event);
1079 return result;
1080}
1081
1082VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001083 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001084 {
1085 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001086 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00227,
1087 VALIDATION_ERROR_UNDEFINED);
1088 skip |= ValidateObject(device, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00228,
1089 VALIDATION_ERROR_00229);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001090 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001091 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001092 return VK_ERROR_VALIDATION_FAILED_EXT;
1093 }
1094 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetEvent(device, event);
1095 return result;
1096}
1097
1098VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1099 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001100 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001101 {
1102 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001103 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01002,
1104 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001105 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001106 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001107 return VK_ERROR_VALIDATION_FAILED_EXT;
1108 }
1109 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
1110 {
1111 std::lock_guard<std::mutex> lock(global_lock);
1112 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001113 CreateObject(device, *pQueryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001114 }
1115 }
1116 return result;
1117}
1118
1119VKAPI_ATTR void VKAPI_CALL DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001120 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001121 {
1122 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001123 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01015,
1124 VALIDATION_ERROR_UNDEFINED);
1125 skip |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, true, VALIDATION_ERROR_01016,
1126 VALIDATION_ERROR_01018);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001127 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001128 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001129 return;
1130 }
1131 {
1132 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001133 DestroyObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, pAllocator, VALIDATION_ERROR_01013,
1134 VALIDATION_ERROR_01014);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001135 }
1136 get_dispatch_table(ot_device_table_map, device)->DestroyQueryPool(device, queryPool, pAllocator);
1137}
1138
1139VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
1140 size_t dataSize, void *pData, VkDeviceSize stride, VkQueryResultFlags flags) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001141 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001142 {
1143 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001144 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01054,
1145 VALIDATION_ERROR_UNDEFINED);
1146 skip |= ValidateObject(device, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01055,
1147 VALIDATION_ERROR_01059);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001148 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001149 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001150 return VK_ERROR_VALIDATION_FAILED_EXT;
1151 }
1152 VkResult result = get_dispatch_table(ot_device_table_map, device)
1153 ->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
1154 return result;
1155}
1156
1157VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
1158 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001159 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001160 {
1161 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001162 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00659,
1163 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001164 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001165 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001166 return VK_ERROR_VALIDATION_FAILED_EXT;
1167 }
1168 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
1169 {
1170 std::lock_guard<std::mutex> lock(global_lock);
1171 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001172 CreateObject(device, *pBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001173 }
1174 }
1175 return result;
1176}
1177
1178VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001179 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001180 {
1181 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001182 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00679,
1183 VALIDATION_ERROR_UNDEFINED);
1184 skip |= ValidateObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, true, VALIDATION_ERROR_00680,
1185 VALIDATION_ERROR_00682);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001186 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001187 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001188 return;
1189 }
1190 {
1191 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001192 DestroyObject(device, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, pAllocator, VALIDATION_ERROR_00677,
1193 VALIDATION_ERROR_00678);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001194 }
1195 get_dispatch_table(ot_device_table_map, device)->DestroyBuffer(device, buffer, pAllocator);
1196}
1197
1198VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
1199 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001200 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001201 {
1202 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001203 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00683,
1204 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001205 if (pCreateInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001206 skip |= ValidateObject(device, pCreateInfo->buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false,
1207 VALIDATION_ERROR_00699, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001208 }
1209 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001210 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001211 return VK_ERROR_VALIDATION_FAILED_EXT;
1212 }
1213 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateBufferView(device, pCreateInfo, pAllocator, pView);
1214 {
1215 std::lock_guard<std::mutex> lock(global_lock);
1216 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001217 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001218 }
1219 }
1220 return result;
1221}
1222
1223VKAPI_ATTR void VKAPI_CALL DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001224 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001225 {
1226 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001227 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00704,
1228 VALIDATION_ERROR_UNDEFINED);
1229 skip |= ValidateObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, true, VALIDATION_ERROR_00705,
1230 VALIDATION_ERROR_00707);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001231 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001232 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001233 return;
1234 }
1235 {
1236 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001237 DestroyObject(device, bufferView, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, pAllocator, VALIDATION_ERROR_00702,
1238 VALIDATION_ERROR_00703);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001239 }
1240 get_dispatch_table(ot_device_table_map, device)->DestroyBufferView(device, bufferView, pAllocator);
1241}
1242
1243VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
1244 const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001245 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001246 {
1247 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001248 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00709,
1249 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001250 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001251 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001252 return VK_ERROR_VALIDATION_FAILED_EXT;
1253 }
1254 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImage(device, pCreateInfo, pAllocator, pImage);
1255 {
1256 std::lock_guard<std::mutex> lock(global_lock);
1257 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001258 CreateObject(device, *pImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001259 }
1260 }
1261 return result;
1262}
1263
1264VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001265 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001266 {
1267 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001268 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00746,
1269 VALIDATION_ERROR_UNDEFINED);
1270 skip |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, true, VALIDATION_ERROR_00747,
1271 VALIDATION_ERROR_00749);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001272 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001273 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001274 return;
1275 }
1276 {
1277 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001278 DestroyObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, pAllocator, VALIDATION_ERROR_00744,
1279 VALIDATION_ERROR_00745);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001280 }
1281 get_dispatch_table(ot_device_table_map, device)->DestroyImage(device, image, pAllocator);
1282}
1283
1284VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource,
1285 VkSubresourceLayout *pLayout) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001286 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001287 {
1288 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001289 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00734,
1290 VALIDATION_ERROR_UNDEFINED);
1291 skip |= ValidateObject(device, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00735,
1292 VALIDATION_ERROR_00738);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001293 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001294 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001295 return;
1296 }
1297 get_dispatch_table(ot_device_table_map, device)->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
1298}
1299
1300VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
1301 const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001302 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001303 {
1304 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001305 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00750,
1306 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001307 if (pCreateInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001308 skip |= ValidateObject(device, pCreateInfo->image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_00763,
1309 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001310 }
1311 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001312 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001313 return VK_ERROR_VALIDATION_FAILED_EXT;
1314 }
1315 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateImageView(device, pCreateInfo, pAllocator, pView);
1316 {
1317 std::lock_guard<std::mutex> lock(global_lock);
1318 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001319 CreateObject(device, *pView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001320 }
1321 }
1322 return result;
1323}
1324
1325VKAPI_ATTR void VKAPI_CALL DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001326 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001327 {
1328 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001329 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00779,
1330 VALIDATION_ERROR_UNDEFINED);
1331 skip |= ValidateObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, true, VALIDATION_ERROR_00780,
1332 VALIDATION_ERROR_00782);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001333 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001334 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001335 return;
1336 }
1337 {
1338 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001339 DestroyObject(device, imageView, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, pAllocator, VALIDATION_ERROR_00777,
1340 VALIDATION_ERROR_00778);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001341 }
1342 get_dispatch_table(ot_device_table_map, device)->DestroyImageView(device, imageView, pAllocator);
1343}
1344
1345VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
1346 const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001347 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001348 {
1349 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001350 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00466,
1351 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001352 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001353 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001354 return VK_ERROR_VALIDATION_FAILED_EXT;
1355 }
1356 VkResult result =
1357 get_dispatch_table(ot_device_table_map, device)->CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
1358 {
1359 std::lock_guard<std::mutex> lock(global_lock);
1360 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001361 CreateObject(device, *pShaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001362 }
1363 }
1364 return result;
1365}
1366
1367VKAPI_ATTR void VKAPI_CALL DestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1368 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001369 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001370 {
1371 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001372 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00481,
1373 VALIDATION_ERROR_UNDEFINED);
1374 skip |= ValidateObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, true, VALIDATION_ERROR_00482,
1375 VALIDATION_ERROR_00484);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001376 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001377 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001378 return;
1379 }
1380 {
1381 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001382 DestroyObject(device, shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, pAllocator, VALIDATION_ERROR_00479,
1383 VALIDATION_ERROR_00480);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001384 }
1385 get_dispatch_table(ot_device_table_map, device)->DestroyShaderModule(device, shaderModule, pAllocator);
1386}
1387
1388VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
1389 const VkAllocationCallbacks *pAllocator, VkPipelineCache *pPipelineCache) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001390 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001391 {
1392 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001393 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00562,
1394 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001395 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001396 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001397 return VK_ERROR_VALIDATION_FAILED_EXT;
1398 }
1399 VkResult result =
1400 get_dispatch_table(ot_device_table_map, device)->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
1401 {
1402 std::lock_guard<std::mutex> lock(global_lock);
1403 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001404 CreateObject(device, *pPipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001405 }
1406 }
1407 return result;
1408}
1409
1410VKAPI_ATTR void VKAPI_CALL DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
1411 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001412 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001413 {
1414 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001415 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00585,
1416 VALIDATION_ERROR_UNDEFINED);
1417 skip |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00586,
1418 VALIDATION_ERROR_00588);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001419 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001420 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001421 return;
1422 }
1423 {
1424 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001425 DestroyObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, pAllocator, VALIDATION_ERROR_00583,
1426 VALIDATION_ERROR_00584);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001427 }
1428 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineCache(device, pipelineCache, pAllocator);
1429}
1430
1431VKAPI_ATTR VkResult VKAPI_CALL GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize,
1432 void *pData) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001433 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001434 {
1435 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001436 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00578,
1437 VALIDATION_ERROR_UNDEFINED);
1438 skip |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false, VALIDATION_ERROR_00579,
1439 VALIDATION_ERROR_00582);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001440 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001441 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001442 return VK_ERROR_VALIDATION_FAILED_EXT;
1443 }
1444 VkResult result =
1445 get_dispatch_table(ot_device_table_map, device)->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
1446 return result;
1447}
1448
1449VKAPI_ATTR VkResult VKAPI_CALL MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount,
1450 const VkPipelineCache *pSrcCaches) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001451 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001452 {
1453 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001454 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00572,
1455 VALIDATION_ERROR_UNDEFINED);
1456 skip |= ValidateObject(device, dstCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false, VALIDATION_ERROR_00573,
1457 VALIDATION_ERROR_00576);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001458 if (pSrcCaches) {
1459 for (uint32_t idx0 = 0; idx0 < srcCacheCount; ++idx0) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001460 skip |= ValidateObject(device, pSrcCaches[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, false,
1461 VALIDATION_ERROR_00574, VALIDATION_ERROR_00577);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001462 }
1463 }
1464 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001465 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001466 return VK_ERROR_VALIDATION_FAILED_EXT;
1467 }
1468 VkResult result =
1469 get_dispatch_table(ot_device_table_map, device)->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
1470 return result;
1471}
1472
1473VKAPI_ATTR void VKAPI_CALL DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001474 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001475 {
1476 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001477 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00558,
1478 VALIDATION_ERROR_UNDEFINED);
1479 skip |= ValidateObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, true, VALIDATION_ERROR_00559,
1480 VALIDATION_ERROR_00561);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001481 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001482 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001483 return;
1484 }
1485 {
1486 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001487 DestroyObject(device, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator, VALIDATION_ERROR_00556,
1488 VALIDATION_ERROR_00557);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001489 }
1490 get_dispatch_table(ot_device_table_map, device)->DestroyPipeline(device, pipeline, pAllocator);
1491}
1492
1493VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
1494 const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001495 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001496 {
1497 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001498 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00861,
1499 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001500 if (pCreateInfo) {
1501 if (pCreateInfo->pSetLayouts) {
1502 for (uint32_t idx0 = 0; idx0 < pCreateInfo->setLayoutCount; ++idx0) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001503 skip |= ValidateObject(device, pCreateInfo->pSetLayouts[idx0],
1504 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false, VALIDATION_ERROR_00875,
1505 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001506 }
1507 }
1508 }
1509 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001510 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001511 return VK_ERROR_VALIDATION_FAILED_EXT;
1512 }
1513 VkResult result =
1514 get_dispatch_table(ot_device_table_map, device)->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
1515 {
1516 std::lock_guard<std::mutex> lock(global_lock);
1517 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001518 CreateObject(device, *pPipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001519 }
1520 }
1521 return result;
1522}
1523
1524VKAPI_ATTR void VKAPI_CALL DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1525 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001526 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001527 {
1528 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001529 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00885,
1530 VALIDATION_ERROR_UNDEFINED);
1531 skip |= ValidateObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, true,
1532 VALIDATION_ERROR_00886, VALIDATION_ERROR_00888);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001533 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001534 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001535 return;
1536 }
1537 {
1538 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001539 DestroyObject(device, pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pAllocator, VALIDATION_ERROR_00883,
1540 VALIDATION_ERROR_00884);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001541 }
1542 get_dispatch_table(ot_device_table_map, device)->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
1543}
1544
1545VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
1546 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001547 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001548 {
1549 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001550 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00812,
1551 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001552 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001553 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001554 return VK_ERROR_VALIDATION_FAILED_EXT;
1555 }
1556 VkResult result = get_dispatch_table(ot_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
1557 {
1558 std::lock_guard<std::mutex> lock(global_lock);
1559 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001560 CreateObject(device, *pSampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001561 }
1562 }
1563 return result;
1564}
1565
1566VKAPI_ATTR void VKAPI_CALL DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001567 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001568 {
1569 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001570 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00840,
1571 VALIDATION_ERROR_UNDEFINED);
1572 skip |= ValidateObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, true, VALIDATION_ERROR_00841,
1573 VALIDATION_ERROR_00843);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001574 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001575 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001576 return;
1577 }
1578 {
1579 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001580 DestroyObject(device, sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, pAllocator, VALIDATION_ERROR_00838,
1581 VALIDATION_ERROR_00839);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001582 }
1583 get_dispatch_table(ot_device_table_map, device)->DestroySampler(device, sampler, pAllocator);
1584}
1585
1586VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
1587 const VkAllocationCallbacks *pAllocator,
1588 VkDescriptorSetLayout *pSetLayout) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001589 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001590 {
1591 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001592 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00844,
1593 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001594 if (pCreateInfo) {
1595 if (pCreateInfo->pBindings) {
1596 for (uint32_t idx0 = 0; idx0 < pCreateInfo->bindingCount; ++idx0) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001597 if ((pCreateInfo->pBindings[idx0].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) ||
1598 (pCreateInfo->pBindings[idx0].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) {
1599 if (pCreateInfo->pBindings[idx0].pImmutableSamplers) {
1600 for (uint32_t idx1 = 0; idx1 < pCreateInfo->pBindings[idx0].descriptorCount; ++idx1) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001601 skip |= ValidateObject(device, pCreateInfo->pBindings[idx0].pImmutableSamplers[idx1],
1602 VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, false, VALIDATION_ERROR_00852,
1603 VALIDATION_ERROR_UNDEFINED);
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001604 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001605 }
1606 }
1607 }
1608 }
1609 }
1610 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001611 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001612 return VK_ERROR_VALIDATION_FAILED_EXT;
1613 }
1614 VkResult result =
1615 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
1616 {
1617 std::lock_guard<std::mutex> lock(global_lock);
1618 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001619 CreateObject(device, *pSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001620 }
1621 }
1622 return result;
1623}
1624
1625VKAPI_ATTR void VKAPI_CALL DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1626 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001627 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001628 {
1629 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001630 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00857,
1631 VALIDATION_ERROR_UNDEFINED);
1632 skip |= ValidateObject(device, descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, true,
1633 VALIDATION_ERROR_00858, VALIDATION_ERROR_00860);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001634 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001635 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001636 return;
1637 }
1638 {
1639 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001640 DestroyObject(device, descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, pAllocator,
1641 VALIDATION_ERROR_00855, VALIDATION_ERROR_00856);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001642 }
1643 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
1644}
1645
1646VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
1647 const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001648 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001649 {
1650 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001651 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00889,
1652 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001653 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001654 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001655 return VK_ERROR_VALIDATION_FAILED_EXT;
1656 }
1657 VkResult result =
1658 get_dispatch_table(ot_device_table_map, device)->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
1659 {
1660 std::lock_guard<std::mutex> lock(global_lock);
1661 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001662 CreateObject(device, *pDescriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001663 }
1664 }
1665 return result;
1666}
1667
1668VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1669 VkDescriptorPoolResetFlags flags) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001670 bool skip = false;
Chris Forbes2a947ce2016-09-29 18:47:50 +13001671 std::unique_lock<std::mutex> lock(global_lock);
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001672 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001673 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00929,
1674 VALIDATION_ERROR_UNDEFINED);
1675 skip |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false, VALIDATION_ERROR_00930,
1676 VALIDATION_ERROR_00932);
1677 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001678 return VK_ERROR_VALIDATION_FAILED_EXT;
1679 }
Chris Forbes2a947ce2016-09-29 18:47:50 +13001680 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is reset.
1681 // Remove this pool's descriptor sets from our descriptorSet map.
1682 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
1683 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
1684 OBJTRACK_NODE *pNode = (*itr).second;
1685 auto del_itr = itr++;
1686 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
Mike Schuchardt3796a882016-12-06 18:03:56 -07001687 DestroyObject(device, (VkDescriptorSet)((*del_itr).first), VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr,
1688 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Chris Forbes2a947ce2016-09-29 18:47:50 +13001689 }
1690 }
1691 lock.unlock();
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001692 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags);
1693 return result;
1694}
1695
1696VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
1697 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
1698 const VkCopyDescriptorSet *pDescriptorCopies) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001699 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001700 {
1701 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001702 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00933,
1703 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001704 if (pDescriptorCopies) {
1705 for (uint32_t idx0 = 0; idx0 < descriptorCopyCount; ++idx0) {
1706 if (pDescriptorCopies[idx0].dstSet) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001707 skip |= ValidateObject(device, pDescriptorCopies[idx0].dstSet, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
1708 false, VALIDATION_ERROR_00972, VALIDATION_ERROR_00973);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001709 }
1710 if (pDescriptorCopies[idx0].srcSet) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001711 skip |= ValidateObject(device, pDescriptorCopies[idx0].srcSet, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
1712 false, VALIDATION_ERROR_00971, VALIDATION_ERROR_00973);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001713 }
1714 }
1715 }
1716 if (pDescriptorWrites) {
1717 for (uint32_t idx1 = 0; idx1 < descriptorWriteCount; ++idx1) {
1718 if (pDescriptorWrites[idx1].dstSet) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001719 skip |= ValidateObject(device, pDescriptorWrites[idx1].dstSet, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
1720 false, VALIDATION_ERROR_00955, VALIDATION_ERROR_00958);
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001721 }
1722 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
1723 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
1724 for (uint32_t idx2 = 0; idx2 < pDescriptorWrites[idx1].descriptorCount; ++idx2) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001725 skip |= ValidateObject(device, pDescriptorWrites[idx1].pTexelBufferView[idx2],
1726 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, false, VALIDATION_ERROR_00940,
1727 VALIDATION_ERROR_00958);
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001728 }
1729 }
1730 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
1731 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) ||
1732 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
1733 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
1734 for (uint32_t idx3 = 0; idx3 < pDescriptorWrites[idx1].descriptorCount; ++idx3) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001735 skip |= ValidateObject(device, pDescriptorWrites[idx1].pImageInfo[idx3].imageView,
1736 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, false, VALIDATION_ERROR_00943,
1737 VALIDATION_ERROR_00963);
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001738 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001739 }
1740 if ((pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
1741 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
1742 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
1743 (pDescriptorWrites[idx1].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001744 for (uint32_t idx4 = 0; idx4 < pDescriptorWrites[idx1].descriptorCount; ++idx4) {
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001745 if (pDescriptorWrites[idx1].pBufferInfo[idx4].buffer) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001746 skip |= ValidateObject(device, pDescriptorWrites[idx1].pBufferInfo[idx4].buffer,
1747 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_00962,
1748 VALIDATION_ERROR_UNDEFINED);
Karl Schultz4a13e0f2016-10-17 18:27:20 -06001749 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001750 }
1751 }
1752 }
1753 }
1754 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001755 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001756 return;
1757 }
1758 get_dispatch_table(ot_device_table_map, device)
1759 ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
1760}
1761
1762VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
1763 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001764 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001765 {
1766 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001767 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00400,
1768 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001769 if (pCreateInfo) {
1770 if (pCreateInfo->pAttachments) {
1771 for (uint32_t idx0 = 0; idx0 < pCreateInfo->attachmentCount; ++idx0) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001772 skip |= ValidateObject(device, pCreateInfo->pAttachments[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT,
1773 false, VALIDATION_ERROR_00420, VALIDATION_ERROR_00421);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001774 }
1775 }
1776 if (pCreateInfo->renderPass) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001777 skip |= ValidateObject(device, pCreateInfo->renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false,
1778 VALIDATION_ERROR_00419, VALIDATION_ERROR_00421);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001779 }
1780 }
1781 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001782 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001783 return VK_ERROR_VALIDATION_FAILED_EXT;
1784 }
1785 VkResult result =
1786 get_dispatch_table(ot_device_table_map, device)->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
1787 {
1788 std::lock_guard<std::mutex> lock(global_lock);
1789 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001790 CreateObject(device, *pFramebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001791 }
1792 }
1793 return result;
1794}
1795
1796VKAPI_ATTR void VKAPI_CALL DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001797 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001798 {
1799 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001800 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00425,
1801 VALIDATION_ERROR_UNDEFINED);
1802 skip |= ValidateObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, true, VALIDATION_ERROR_00426,
1803 VALIDATION_ERROR_00428);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001804 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001805 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001806 return;
1807 }
1808 {
1809 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001810 DestroyObject(device, framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, pAllocator, VALIDATION_ERROR_00423,
1811 VALIDATION_ERROR_00424);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001812 }
1813 get_dispatch_table(ot_device_table_map, device)->DestroyFramebuffer(device, framebuffer, pAllocator);
1814}
1815
1816VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
1817 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001818 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001819 {
1820 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001821 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00319,
1822 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001823 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001824 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001825 return VK_ERROR_VALIDATION_FAILED_EXT;
1826 }
1827 VkResult result =
1828 get_dispatch_table(ot_device_table_map, device)->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
1829 {
1830 std::lock_guard<std::mutex> lock(global_lock);
1831 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001832 CreateObject(device, *pRenderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001833 }
1834 }
1835 return result;
1836}
1837
1838VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001839 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001840 {
1841 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001842 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00396,
1843 VALIDATION_ERROR_UNDEFINED);
1844 skip |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, true, VALIDATION_ERROR_00397,
1845 VALIDATION_ERROR_00399);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001846 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001847 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001848 return;
1849 }
1850 {
1851 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07001852 DestroyObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, pAllocator, VALIDATION_ERROR_00394,
1853 VALIDATION_ERROR_00395);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001854 }
1855 get_dispatch_table(ot_device_table_map, device)->DestroyRenderPass(device, renderPass, pAllocator);
1856}
1857
1858VKAPI_ATTR void VKAPI_CALL GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001859 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001860 {
1861 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001862 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00449,
1863 VALIDATION_ERROR_UNDEFINED);
1864 skip |= ValidateObject(device, renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false, VALIDATION_ERROR_00450,
1865 VALIDATION_ERROR_00452);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001866 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001867 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001868 return;
1869 }
1870 get_dispatch_table(ot_device_table_map, device)->GetRenderAreaGranularity(device, renderPass, pGranularity);
1871}
1872
1873VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1874 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001875 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001876 {
1877 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001878 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00064,
1879 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001880 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001881 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001882 return VK_ERROR_VALIDATION_FAILED_EXT;
1883 }
1884 VkResult result =
1885 get_dispatch_table(ot_device_table_map, device)->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
1886 {
1887 std::lock_guard<std::mutex> lock(global_lock);
1888 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13001889 CreateObject(device, *pCommandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001890 }
1891 }
1892 return result;
1893}
1894
1895VKAPI_ATTR VkResult VKAPI_CALL ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001896 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001897 {
1898 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001899 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00073,
1900 VALIDATION_ERROR_UNDEFINED);
1901 skip |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false, VALIDATION_ERROR_00074,
1902 VALIDATION_ERROR_00076);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001903 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001904 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001905 return VK_ERROR_VALIDATION_FAILED_EXT;
1906 }
1907 VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetCommandPool(device, commandPool, flags);
1908 return result;
1909}
1910
1911VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer command_buffer, const VkCommandBufferBeginInfo *begin_info) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07001912 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(command_buffer), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001913 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001914 {
1915 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001916 skip |= ValidateObject(command_buffer, command_buffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1917 VALIDATION_ERROR_00108, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001918 if (begin_info) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001919 OBJTRACK_NODE *pNode =
1920 device_data
1921 ->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT][reinterpret_cast<const uint64_t>(command_buffer)];
Mike Schuchardt662c39c2016-11-11 16:10:51 -07001922 if ((begin_info->pInheritanceInfo) && (pNode->status & OBJSTATUS_COMMAND_BUFFER_SECONDARY) &&
1923 (begin_info->flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001924 skip |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->framebuffer,
1925 VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, true, VALIDATION_ERROR_00112,
1926 VALIDATION_ERROR_00121);
1927 skip |= ValidateObject(command_buffer, begin_info->pInheritanceInfo->renderPass,
1928 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false, VALIDATION_ERROR_00110,
1929 VALIDATION_ERROR_00121);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001930 }
1931 }
1932 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001933 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001934 return VK_ERROR_VALIDATION_FAILED_EXT;
1935 }
1936 VkResult result = get_dispatch_table(ot_device_table_map, command_buffer)->BeginCommandBuffer(command_buffer, begin_info);
1937 return result;
1938}
1939
1940VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001941 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001942 {
1943 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001944 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1945 VALIDATION_ERROR_00125, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001946 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001947 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001948 return VK_ERROR_VALIDATION_FAILED_EXT;
1949 }
1950 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->EndCommandBuffer(commandBuffer);
1951 return result;
1952}
1953
1954VKAPI_ATTR VkResult VKAPI_CALL ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001955 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001956 {
1957 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001958 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1959 VALIDATION_ERROR_00094, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001960 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001961 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001962 return VK_ERROR_VALIDATION_FAILED_EXT;
1963 }
1964 VkResult result = get_dispatch_table(ot_device_table_map, commandBuffer)->ResetCommandBuffer(commandBuffer, flags);
1965 return result;
1966}
1967
1968VKAPI_ATTR void VKAPI_CALL CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1969 VkPipeline pipeline) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001970 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001971 {
1972 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001973 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1974 VALIDATION_ERROR_00599, VALIDATION_ERROR_UNDEFINED);
1975 skip |= ValidateObject(commandBuffer, pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, false, VALIDATION_ERROR_00601,
1976 VALIDATION_ERROR_00604);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001977 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001978 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001979 return;
1980 }
1981 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
1982}
1983
1984VKAPI_ATTR void VKAPI_CALL CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
1985 const VkViewport *pViewports) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001986 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001987 {
1988 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001989 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
1990 VALIDATION_ERROR_01443, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001991 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06001992 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06001993 return;
1994 }
1995 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
1996}
1997
1998VKAPI_ATTR void VKAPI_CALL CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
1999 const VkRect2D *pScissors) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002000 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002001 {
2002 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002003 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2004 VALIDATION_ERROR_01492, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002005 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002006 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002007 return;
2008 }
2009 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
2010}
2011
2012VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002013 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002014 {
2015 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002016 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2017 VALIDATION_ERROR_01478, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002018 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002019 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002020 return;
2021 }
2022 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth);
2023}
2024
2025VKAPI_ATTR void VKAPI_CALL CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp,
2026 float depthBiasSlopeFactor) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002027 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002028 {
2029 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002030 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2031 VALIDATION_ERROR_01483, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002032 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002033 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002034 return;
2035 }
2036 get_dispatch_table(ot_device_table_map, commandBuffer)
2037 ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
2038}
2039
2040VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002041 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002042 {
2043 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002044 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2045 VALIDATION_ERROR_01551, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002046 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002047 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002048 return;
2049 }
2050 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetBlendConstants(commandBuffer, blendConstants);
2051}
2052
2053VKAPI_ATTR void VKAPI_CALL CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002054 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002055 {
2056 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002057 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2058 VALIDATION_ERROR_01507, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002059 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002060 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002061 return;
2062 }
2063 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
2064}
2065
2066VKAPI_ATTR void VKAPI_CALL CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2067 uint32_t compareMask) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002068 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002069 {
2070 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002071 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2072 VALIDATION_ERROR_01515, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002073 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002074 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002075 return;
2076 }
2077 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
2078}
2079
2080VKAPI_ATTR void VKAPI_CALL CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002081 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002082 {
2083 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002084 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2085 VALIDATION_ERROR_01521, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002086 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002087 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002088 return;
2089 }
2090 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
2091}
2092
2093VKAPI_ATTR void VKAPI_CALL CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002094 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002095 {
2096 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002097 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2098 VALIDATION_ERROR_01527, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002099 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002100 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002101 return;
2102 }
2103 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetStencilReference(commandBuffer, faceMask, reference);
2104}
2105
2106VKAPI_ATTR void VKAPI_CALL CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2107 VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount,
2108 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2109 const uint32_t *pDynamicOffsets) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002110 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002111 {
2112 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002113 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2114 VALIDATION_ERROR_00979, VALIDATION_ERROR_UNDEFINED);
2115 skip |= ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false,
2116 VALIDATION_ERROR_00981, VALIDATION_ERROR_00987);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002117 if (pDescriptorSets) {
2118 for (uint32_t idx0 = 0; idx0 < descriptorSetCount; ++idx0) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002119 skip |= ValidateObject(commandBuffer, pDescriptorSets[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false,
2120 VALIDATION_ERROR_00982, VALIDATION_ERROR_00987);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002121 }
2122 }
2123 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002124 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002125 return;
2126 }
2127 get_dispatch_table(ot_device_table_map, commandBuffer)
2128 ->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
2129 dynamicOffsetCount, pDynamicOffsets);
2130}
2131
2132VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2133 VkIndexType indexType) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002134 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002135 {
2136 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002137 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2138 VALIDATION_ERROR_01353, VALIDATION_ERROR_UNDEFINED);
2139 skip |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01354,
2140 VALIDATION_ERROR_01358);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002141 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002142 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002143 return;
2144 }
2145 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
2146}
2147
2148VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
2149 const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002150 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002151 {
2152 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002153 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2154 VALIDATION_ERROR_01419, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002155 if (pBuffers) {
2156 for (uint32_t idx0 = 0; idx0 < bindingCount; ++idx0) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002157 skip |= ValidateObject(commandBuffer, pBuffers[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false,
2158 VALIDATION_ERROR_01420, VALIDATION_ERROR_01425);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002159 }
2160 }
2161 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002162 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002163 return;
2164 }
2165 get_dispatch_table(ot_device_table_map, commandBuffer)
2166 ->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
2167}
2168
2169VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
2170 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002171 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002172 {
2173 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002174 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2175 VALIDATION_ERROR_01362, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002176 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002177 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002178 return;
2179 }
2180 get_dispatch_table(ot_device_table_map, commandBuffer)
2181 ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
2182}
2183
2184VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
2185 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002186 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002187 {
2188 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002189 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2190 VALIDATION_ERROR_01369, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002191 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002192 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002193 return;
2194 }
2195 get_dispatch_table(ot_device_table_map, commandBuffer)
2196 ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
2197}
2198
2199VKAPI_ATTR void VKAPI_CALL CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
2200 uint32_t stride) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002201 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002202 {
2203 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002204 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2205 VALIDATION_ERROR_01377, VALIDATION_ERROR_UNDEFINED);
2206 skip |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01378,
2207 VALIDATION_ERROR_01382);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002208 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002209 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002210 return;
2211 }
2212 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
2213}
2214
2215VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2216 uint32_t drawCount, uint32_t stride) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002217 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002218 {
2219 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002220 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2221 VALIDATION_ERROR_01389, VALIDATION_ERROR_UNDEFINED);
2222 skip |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01390,
2223 VALIDATION_ERROR_01394);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002224 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002225 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002226 return;
2227 }
2228 get_dispatch_table(ot_device_table_map, commandBuffer)
2229 ->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
2230}
2231
2232VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002233 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002234 {
2235 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002236 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2237 VALIDATION_ERROR_01559, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002238 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002239 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002240 return;
2241 }
2242 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z);
2243}
2244
2245VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002246 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002247 {
2248 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002249 skip |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01566,
2250 VALIDATION_ERROR_01570);
2251 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2252 VALIDATION_ERROR_01565, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002253 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002254 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002255 return;
2256 }
2257 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdDispatchIndirect(commandBuffer, buffer, offset);
2258}
2259
2260VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
2261 uint32_t regionCount, const VkBufferCopy *pRegions) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002262 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002263 {
2264 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002265 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2266 VALIDATION_ERROR_01166, VALIDATION_ERROR_UNDEFINED);
2267 skip |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01168,
2268 VALIDATION_ERROR_01174);
2269 skip |= ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01167,
2270 VALIDATION_ERROR_01174);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002271 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002272 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002273 return;
2274 }
2275 get_dispatch_table(ot_device_table_map, commandBuffer)
2276 ->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
2277}
2278
2279VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2280 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2281 const VkImageCopy *pRegions) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002282 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002283 {
2284 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002285 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2286 VALIDATION_ERROR_01186, VALIDATION_ERROR_UNDEFINED);
2287 skip |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01189,
2288 VALIDATION_ERROR_01196);
2289 skip |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01187,
2290 VALIDATION_ERROR_01196);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002291 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002292 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002293 return;
2294 }
2295 get_dispatch_table(ot_device_table_map, commandBuffer)
2296 ->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2297}
2298
2299VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2300 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2301 const VkImageBlit *pRegions, VkFilter filter) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002302 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002303 {
2304 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002305 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2306 VALIDATION_ERROR_01291, VALIDATION_ERROR_UNDEFINED);
2307 skip |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01294,
2308 VALIDATION_ERROR_01302);
2309 skip |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01292,
2310 VALIDATION_ERROR_01302);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002311 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002312 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002313 return;
2314 }
2315 get_dispatch_table(ot_device_table_map, commandBuffer)
2316 ->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
2317}
2318
2319VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
2320 VkImageLayout dstImageLayout, uint32_t regionCount,
2321 const VkBufferImageCopy *pRegions) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002322 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002323 {
2324 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002325 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2326 VALIDATION_ERROR_01235, VALIDATION_ERROR_UNDEFINED);
2327 skip |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01237,
2328 VALIDATION_ERROR_01244);
2329 skip |= ValidateObject(commandBuffer, srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01236,
2330 VALIDATION_ERROR_01244);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002331 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002332 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002333 return;
2334 }
2335 get_dispatch_table(ot_device_table_map, commandBuffer)
2336 ->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
2337}
2338
2339VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2340 VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002341 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002342 {
2343 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002344 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2345 VALIDATION_ERROR_01253, VALIDATION_ERROR_UNDEFINED);
2346 skip |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01256,
2347 VALIDATION_ERROR_01262);
2348 skip |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01254,
2349 VALIDATION_ERROR_01262);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002350 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002351 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002352 return;
2353 }
2354 get_dispatch_table(ot_device_table_map, commandBuffer)
2355 ->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
2356}
2357
2358VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2359 VkDeviceSize dataSize, const uint32_t *pData) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002360 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002361 {
2362 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002363 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2364 VALIDATION_ERROR_01150, VALIDATION_ERROR_UNDEFINED);
2365 skip |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01151,
2366 VALIDATION_ERROR_01157);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002367 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002368 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002369 return;
2370 }
2371 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
2372}
2373
2374VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2375 VkDeviceSize size, uint32_t data) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002376 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002377 {
2378 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002379 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2380 VALIDATION_ERROR_01138, VALIDATION_ERROR_UNDEFINED);
2381 skip |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01139,
2382 VALIDATION_ERROR_01143);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002383 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002384 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002385 return;
2386 }
2387 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
2388}
2389
2390VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2391 const VkClearColorValue *pColor, uint32_t rangeCount,
2392 const VkImageSubresourceRange *pRanges) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002393 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002394 {
2395 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002396 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2397 VALIDATION_ERROR_01089, VALIDATION_ERROR_UNDEFINED);
2398 skip |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01090,
2399 VALIDATION_ERROR_01098);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002400 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002401 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002402 return;
2403 }
2404 get_dispatch_table(ot_device_table_map, commandBuffer)
2405 ->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
2406}
2407
2408VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
2409 const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
2410 const VkImageSubresourceRange *pRanges) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002411 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002412 {
2413 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002414 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2415 VALIDATION_ERROR_01104, VALIDATION_ERROR_UNDEFINED);
2416 skip |= ValidateObject(commandBuffer, image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01105,
2417 VALIDATION_ERROR_01113);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002418 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002419 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002420 return;
2421 }
2422 get_dispatch_table(ot_device_table_map, commandBuffer)
2423 ->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
2424}
2425
2426VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
2427 const VkClearAttachment *pAttachments, uint32_t rectCount,
2428 const VkClearRect *pRects) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002429 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002430 {
2431 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002432 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2433 VALIDATION_ERROR_01117, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002434 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002435 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002436 return;
2437 }
2438 get_dispatch_table(ot_device_table_map, commandBuffer)
2439 ->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
2440}
2441
2442VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
2443 VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
2444 const VkImageResolve *pRegions) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002445 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002446 {
2447 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002448 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2449 VALIDATION_ERROR_01327, VALIDATION_ERROR_UNDEFINED);
2450 skip |= ValidateObject(commandBuffer, dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01330,
2451 VALIDATION_ERROR_01337);
2452 skip |= ValidateObject(commandBuffer, srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false, VALIDATION_ERROR_01328,
2453 VALIDATION_ERROR_01337);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002454 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002455 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002456 return;
2457 }
2458 get_dispatch_table(ot_device_table_map, commandBuffer)
2459 ->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2460}
2461
2462VKAPI_ATTR void VKAPI_CALL CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002463 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002464 {
2465 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002466 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2467 VALIDATION_ERROR_00232, VALIDATION_ERROR_UNDEFINED);
2468 skip |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00233,
2469 VALIDATION_ERROR_00239);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002470 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002471 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002472 return;
2473 }
2474 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetEvent(commandBuffer, event, stageMask);
2475}
2476
2477VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002478 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002479 {
2480 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002481 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2482 VALIDATION_ERROR_00243, VALIDATION_ERROR_UNDEFINED);
2483 skip |= ValidateObject(commandBuffer, event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false, VALIDATION_ERROR_00244,
2484 VALIDATION_ERROR_00250);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002485 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002486 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002487 return;
2488 }
2489 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetEvent(commandBuffer, event, stageMask);
2490}
2491
2492VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2493 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
2494 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2495 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2496 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002497 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002498 {
2499 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002500 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2501 VALIDATION_ERROR_00252, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002502 if (pBufferMemoryBarriers) {
2503 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2504 if (pBufferMemoryBarriers[idx0].buffer) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002505 skip |=
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07002506 ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
2507 false, VALIDATION_ERROR_00259, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002508 }
2509 }
2510 }
2511 if (pEvents) {
2512 for (uint32_t idx1 = 0; idx1 < eventCount; ++idx1) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002513 skip |= ValidateObject(commandBuffer, pEvents[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, false,
2514 VALIDATION_ERROR_00253, VALIDATION_ERROR_00264);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002515 }
2516 }
2517 if (pImageMemoryBarriers) {
2518 for (uint32_t idx2 = 0; idx2 < imageMemoryBarrierCount; ++idx2) {
2519 if (pImageMemoryBarriers[idx2].image) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002520 skip |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx2].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
2521 false, VALIDATION_ERROR_00260, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002522 }
2523 }
2524 }
2525 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002526 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002527 return;
2528 }
2529 get_dispatch_table(ot_device_table_map, commandBuffer)
2530 ->CmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
2531 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2532}
2533
2534VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2535 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2536 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2537 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2538 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002539 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002540 {
2541 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002542 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2543 VALIDATION_ERROR_00270, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002544 if (pBufferMemoryBarriers) {
2545 for (uint32_t idx0 = 0; idx0 < bufferMemoryBarrierCount; ++idx0) {
2546 if (pBufferMemoryBarriers[idx0].buffer) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002547 skip |=
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07002548 ValidateObject(commandBuffer, pBufferMemoryBarriers[idx0].buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
2549 false, VALIDATION_ERROR_00277, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002550 }
2551 }
2552 }
2553 if (pImageMemoryBarriers) {
2554 for (uint32_t idx1 = 0; idx1 < imageMemoryBarrierCount; ++idx1) {
2555 if (pImageMemoryBarriers[idx1].image) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002556 skip |= ValidateObject(commandBuffer, pImageMemoryBarriers[idx1].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
2557 false, VALIDATION_ERROR_00278, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002558 }
2559 }
2560 }
2561 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002562 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002563 return;
2564 }
2565 get_dispatch_table(ot_device_table_map, commandBuffer)
2566 ->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
2567 bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2568}
2569
2570VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query,
2571 VkQueryControlFlags flags) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002572 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002573 {
2574 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002575 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2576 VALIDATION_ERROR_01035, VALIDATION_ERROR_UNDEFINED);
2577 skip |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01036,
2578 VALIDATION_ERROR_01040);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002579 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002580 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002581 return;
2582 }
2583 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginQuery(commandBuffer, queryPool, query, flags);
2584}
2585
2586VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002587 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002588 {
2589 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002590 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2591 VALIDATION_ERROR_01043, VALIDATION_ERROR_UNDEFINED);
2592 skip |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01044,
2593 VALIDATION_ERROR_01047);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002594 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002595 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002596 return;
2597 }
2598 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndQuery(commandBuffer, queryPool, query);
2599}
2600
2601VKAPI_ATTR void VKAPI_CALL CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2602 uint32_t queryCount) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002603 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002604 {
2605 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002606 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2607 VALIDATION_ERROR_01021, VALIDATION_ERROR_UNDEFINED);
2608 skip |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01022,
2609 VALIDATION_ERROR_01026);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002610 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002611 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002612 return;
2613 }
2614 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
2615}
2616
2617VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2618 VkQueryPool queryPool, uint32_t query) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002619 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002620 {
2621 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002622 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2623 VALIDATION_ERROR_01078, VALIDATION_ERROR_UNDEFINED);
2624 skip |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01080,
2625 VALIDATION_ERROR_01083);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002626 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002627 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002628 return;
2629 }
2630 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
2631}
2632
2633VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
2634 uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2635 VkDeviceSize stride, VkQueryResultFlags flags) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002636 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002637 {
2638 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002639 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2640 VALIDATION_ERROR_01068, VALIDATION_ERROR_UNDEFINED);
2641 skip |= ValidateObject(commandBuffer, dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01070,
2642 VALIDATION_ERROR_01075);
2643 skip |= ValidateObject(commandBuffer, queryPool, VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, false, VALIDATION_ERROR_01069,
2644 VALIDATION_ERROR_01075);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002645 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002646 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002647 return;
2648 }
2649 get_dispatch_table(ot_device_table_map, commandBuffer)
2650 ->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
2651}
2652
2653VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags,
2654 uint32_t offset, uint32_t size, const void *pValues) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002655 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002656 {
2657 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002658 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2659 VALIDATION_ERROR_00993, VALIDATION_ERROR_UNDEFINED);
2660 skip |= ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false,
2661 VALIDATION_ERROR_00994, VALIDATION_ERROR_01001);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002662 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002663 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002664 return;
2665 }
2666 get_dispatch_table(ot_device_table_map, commandBuffer)
2667 ->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
2668}
2669
2670VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
2671 VkSubpassContents contents) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002672 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002673 {
2674 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002675 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2676 VALIDATION_ERROR_00435, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002677 if (pRenderPassBegin) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002678 skip |= ValidateObject(commandBuffer, pRenderPassBegin->framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, false,
2679 VALIDATION_ERROR_00446, VALIDATION_ERROR_00448);
2680 skip |= ValidateObject(commandBuffer, pRenderPassBegin->renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false,
2681 VALIDATION_ERROR_00445, VALIDATION_ERROR_00448);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002682 }
2683 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002684 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002685 return;
2686 }
2687 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
2688}
2689
2690VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002691 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002692 {
2693 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002694 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2695 VALIDATION_ERROR_00454, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002696 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002697 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002698 return;
2699 }
2700 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdNextSubpass(commandBuffer, contents);
2701}
2702
2703VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002704 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002705 {
2706 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002707 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2708 VALIDATION_ERROR_00461, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002709 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002710 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002711 return;
2712 }
2713 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer);
2714}
2715
2716VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
2717 const VkCommandBuffer *pCommandBuffers) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002718 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002719 {
2720 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002721 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2722 VALIDATION_ERROR_00159, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002723 if (pCommandBuffers) {
2724 for (uint32_t idx0 = 0; idx0 < commandBufferCount; ++idx0) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002725 skip |= ValidateObject(commandBuffer, pCommandBuffers[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
2726 VALIDATION_ERROR_00160, VALIDATION_ERROR_00165);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002727 }
2728 }
2729 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002730 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002731 return;
2732 }
2733 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
2734}
2735
2736VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002737 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002738 {
2739 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002740 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01847,
2741 VALIDATION_ERROR_UNDEFINED);
2742 skip |= ValidateObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, true, VALIDATION_ERROR_01848,
2743 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002744 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002745 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002746 return;
2747 }
2748 {
2749 std::lock_guard<std::mutex> lock(global_lock);
Mike Schuchardt3796a882016-12-06 18:03:56 -07002750 DestroyObject(instance, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator, VALIDATION_ERROR_01845,
2751 VALIDATION_ERROR_01846);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002752 }
2753 get_dispatch_table(ot_instance_table_map, instance)->DestroySurfaceKHR(instance, surface, pAllocator);
2754}
2755
2756VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex,
2757 VkSurfaceKHR surface, VkBool32 *pSupported) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002758 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002759 {
2760 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002761 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2762 VALIDATION_ERROR_01890, VALIDATION_ERROR_UNDEFINED);
2763 skip |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01891,
2764 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002765 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002766 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002767 return VK_ERROR_VALIDATION_FAILED_EXT;
2768 }
2769 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2770 ->GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
2771 return result;
2772}
2773
2774VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2775 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002776 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002777 {
2778 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002779 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2780 VALIDATION_ERROR_01907, VALIDATION_ERROR_UNDEFINED);
2781 skip |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01908,
2782 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002783 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002784 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002785 return VK_ERROR_VALIDATION_FAILED_EXT;
2786 }
2787 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2788 ->GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
2789 return result;
2790}
2791
2792VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2793 uint32_t *pSurfaceFormatCount,
2794 VkSurfaceFormatKHR *pSurfaceFormats) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002795 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002796 {
2797 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002798 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2799 VALIDATION_ERROR_01910, VALIDATION_ERROR_UNDEFINED);
2800 skip |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01911,
2801 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002802 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002803 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002804 return VK_ERROR_VALIDATION_FAILED_EXT;
2805 }
2806 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2807 ->GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
2808 return result;
2809}
2810
2811VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
2812 uint32_t *pPresentModeCount,
2813 VkPresentModeKHR *pPresentModes) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002814 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002815 {
2816 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002817 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2818 VALIDATION_ERROR_01914, VALIDATION_ERROR_UNDEFINED);
2819 skip |= ValidateObject(physicalDevice, surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01915,
2820 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002821 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002822 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002823 return VK_ERROR_VALIDATION_FAILED_EXT;
2824 }
2825 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2826 ->GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
2827 return result;
2828}
2829
2830VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
2831 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002832 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002833 {
2834 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002835 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01918,
2836 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002837 if (pCreateInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002838 skip |= ValidateObject(device, pCreateInfo->oldSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, true,
2839 VALIDATION_ERROR_01935, VALIDATION_ERROR_UNDEFINED);
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07002840 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002841 skip |= ValidateObject(device_data->physical_device, pCreateInfo->surface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT,
2842 false, VALIDATION_ERROR_01926, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002843 }
2844 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002845 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002846 return VK_ERROR_VALIDATION_FAILED_EXT;
2847 }
2848 VkResult result =
2849 get_dispatch_table(ot_device_table_map, device)->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
2850 {
2851 std::lock_guard<std::mutex> lock(global_lock);
2852 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002853 CreateObject(device, *pSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002854 }
2855 }
2856 return result;
2857}
2858
2859VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
2860 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002861 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002862 {
2863 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002864 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01954,
2865 VALIDATION_ERROR_UNDEFINED);
2866 skip |= ValidateObject(device, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_01957,
2867 VALIDATION_ERROR_01960);
2868 skip |= ValidateObject(device, semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, true, VALIDATION_ERROR_01956,
2869 VALIDATION_ERROR_01959);
2870 skip |= ValidateObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false, VALIDATION_ERROR_01955,
2871 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002872 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002873 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002874 return VK_ERROR_VALIDATION_FAILED_EXT;
2875 }
2876 VkResult result = get_dispatch_table(ot_device_table_map, device)
2877 ->AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
2878 return result;
2879}
2880
2881VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002882 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002883 {
2884 std::lock_guard<std::mutex> lock(global_lock);
2885 if (pPresentInfo) {
2886 if (pPresentInfo->pSwapchains) {
2887 for (uint32_t idx0 = 0; idx0 < pPresentInfo->swapchainCount; ++idx0) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002888 skip |= ValidateObject(queue, pPresentInfo->pSwapchains[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT,
2889 false, VALIDATION_ERROR_01969, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002890 }
2891 }
2892 if (pPresentInfo->pWaitSemaphores) {
2893 for (uint32_t idx1 = 0; idx1 < pPresentInfo->waitSemaphoreCount; ++idx1) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002894 skip |= ValidateObject(queue, pPresentInfo->pWaitSemaphores[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT,
2895 false, VALIDATION_ERROR_01968, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002896 }
2897 }
2898 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002899 skip |= ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_01962,
2900 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002901 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002902 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002903 return VK_ERROR_VALIDATION_FAILED_EXT;
2904 }
2905 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueuePresentKHR(queue, pPresentInfo);
2906 return result;
2907}
2908
2909#ifdef VK_USE_PLATFORM_WIN32_KHR
2910VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
2911 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002912 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002913 {
2914 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002915 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01820,
2916 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002917 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002918 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002919 return VK_ERROR_VALIDATION_FAILED_EXT;
2920 }
2921 VkResult result =
2922 get_dispatch_table(ot_instance_table_map, instance)->CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2923 {
2924 std::lock_guard<std::mutex> lock(global_lock);
2925 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002926 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002927 }
2928 }
2929 return result;
2930}
2931
2932VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice,
2933 uint32_t queueFamilyIndex) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002934 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002935 {
2936 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002937 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2938 VALIDATION_ERROR_01900, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002939 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002940 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002941 return VK_FALSE;
2942 }
2943 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2944 ->GetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
2945 return result;
2946}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002947#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002948
2949#ifdef VK_USE_PLATFORM_XCB_KHR
2950VKAPI_ATTR VkResult VKAPI_CALL CreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
2951 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002952 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002953 {
2954 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002955 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01827,
2956 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002957 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002958 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002959 return VK_ERROR_VALIDATION_FAILED_EXT;
2960 }
2961 VkResult result =
2962 get_dispatch_table(ot_instance_table_map, instance)->CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
2963 {
2964 std::lock_guard<std::mutex> lock(global_lock);
2965 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13002966 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002967 }
2968 }
2969 return result;
2970}
2971
2972VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXcbPresentationSupportKHR(VkPhysicalDevice physicalDevice,
2973 uint32_t queueFamilyIndex, xcb_connection_t *connection,
2974 xcb_visualid_t visual_id) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002975 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002976 {
2977 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002978 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
2979 VALIDATION_ERROR_01902, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002980 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002981 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002982 return VK_FALSE;
2983 }
2984 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
2985 ->GetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
2986 return result;
2987}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002988#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002989
2990#ifdef VK_USE_PLATFORM_XLIB_KHR
2991VKAPI_ATTR VkResult VKAPI_CALL CreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
2992 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002993 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002994 {
2995 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002996 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01836,
2997 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06002998 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06002999 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003000 return VK_ERROR_VALIDATION_FAILED_EXT;
3001 }
3002 VkResult result =
3003 get_dispatch_table(ot_instance_table_map, instance)->CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
3004 {
3005 std::lock_guard<std::mutex> lock(global_lock);
3006 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003007 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003008 }
3009 }
3010 return result;
3011}
3012
3013VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice,
3014 uint32_t queueFamilyIndex, Display *dpy,
3015 VisualID visualID) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003016 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003017 {
3018 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003019 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3020 VALIDATION_ERROR_01905, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003021 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003022 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003023 return VK_FALSE;
3024 }
3025 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3026 ->GetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
3027 return result;
3028}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003029#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003030
3031#ifdef VK_USE_PLATFORM_MIR_KHR
3032VKAPI_ATTR VkResult VKAPI_CALL CreateMirSurfaceKHR(VkInstance instance, const VkMirSurfaceCreateInfoKHR *pCreateInfo,
3033 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003034 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003035 {
3036 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003037 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01802,
3038 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003039 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003040 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003041 return VK_ERROR_VALIDATION_FAILED_EXT;
3042 }
3043 VkResult result =
3044 get_dispatch_table(ot_instance_table_map, instance)->CreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
3045 {
3046 std::lock_guard<std::mutex> lock(global_lock);
3047 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003048 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003049 }
3050 }
3051 return result;
3052}
3053
3054VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceMirPresentationSupportKHR(VkPhysicalDevice physicalDevice,
3055 uint32_t queueFamilyIndex, MirConnection *connection) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003056 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003057 {
3058 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003059 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3060 VALIDATION_ERROR_01894, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003061 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003062 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003063 return VK_FALSE;
3064 }
3065 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3066 ->GetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
3067 return result;
3068}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003069#endif // VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003070
3071#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3072VKAPI_ATTR VkResult VKAPI_CALL CreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3073 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003074 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003075 {
3076 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003077 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01811,
3078 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003079 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003080 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003081 return VK_ERROR_VALIDATION_FAILED_EXT;
3082 }
3083 VkResult result =
3084 get_dispatch_table(ot_instance_table_map, instance)->CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
3085 {
3086 std::lock_guard<std::mutex> lock(global_lock);
3087 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003088 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003089 }
3090 }
3091 return result;
3092}
3093
3094VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice,
3095 uint32_t queueFamilyIndex,
3096 struct wl_display *display) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003097 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003098 {
3099 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003100 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
3101 VALIDATION_ERROR_01897, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003102 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003103 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003104 return VK_FALSE;
3105 }
3106 VkBool32 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
3107 ->GetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
3108 return result;
3109}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003110#endif // VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003111
3112#ifdef VK_USE_PLATFORM_ANDROID_KHR
3113VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3114 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003115 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003116 {
3117 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003118 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01794,
3119 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003120 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003121 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003122 return VK_ERROR_VALIDATION_FAILED_EXT;
3123 }
3124 VkResult result =
3125 get_dispatch_table(ot_instance_table_map, instance)->CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
3126 {
3127 std::lock_guard<std::mutex> lock(global_lock);
3128 if (result == VK_SUCCESS) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003129 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003130 }
3131 }
3132 return result;
3133}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003134#endif // VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003135
Mark Lobodzinskie5dbb042017-03-29 10:51:30 -06003136#ifdef VK_USE_PLATFORM_IOS_MVK
3137VKAPI_ATTR VkResult VKAPI_CALL vkCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3138 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
3139 bool skip = false;
3140 {
3141 std::lock_guard<std::mutex> lock(global_lock);
3142 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_UNDEFINED,
3143 VALIDATION_ERROR_UNDEFINED);
3144 }
3145 if (skip) {
3146 return VK_ERROR_VALIDATION_FAILED_EXT;
3147 }
3148 VkResult result =
3149 get_dispatch_table(ot_instance_table_map, instance)->CreateIOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface);
3150 if (result == VK_SUCCESS) {
3151 std::lock_guard<std::mutex> lock(global_lock);
3152 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
3153 }
3154 return result;
3155}
3156#endif // VK_USE_PLATFORM_IOS_MVK
3157
3158#ifdef VK_USE_PLATFORM_MACOS_MVK
3159VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3160 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
3161 bool skip = false;
3162 {
3163 std::lock_guard<std::mutex> lock(global_lock);
3164 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_UNDEFINED,
3165 VALIDATION_ERROR_UNDEFINED);
3166 }
3167 if (skip) {
3168 return VK_ERROR_VALIDATION_FAILED_EXT;
3169 }
3170 VkResult result =
3171 get_dispatch_table(ot_instance_table_map, instance)->CreateMacOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface);
3172 if (result == VK_SUCCESS) {
3173 std::lock_guard<std::mutex> lock(global_lock);
3174 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
3175 }
3176 return result;
3177}
3178#endif // VK_USE_PLATFORM_MACOS_MVK
3179
3180#ifdef VK_USE_PLATFORM_VI_NN
3181VKAPI_ATTR VkResult VKAPI_CALL vkCreateViSurfaceNN(VkInstance instance, const VkViSurfaceCreateInfoNN *pCreateInfo,
3182 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
3183 bool skip = false;
3184 {
3185 std::lock_guard<std::mutex> lock(global_lock);
3186 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_UNDEFINED,
3187 VALIDATION_ERROR_UNDEFINED);
3188 }
3189 if (skip) {
3190 return VK_ERROR_VALIDATION_FAILED_EXT;
3191 }
3192 VkResult result =
3193 get_dispatch_table(ot_instance_table_map, instance)->CreateViSurfaceNN(instance, pCreateInfo, pAllocator, pSurface);
3194 if (result == VK_SUCCESS) {
3195 std::lock_guard<std::mutex> lock(global_lock);
3196 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
3197 }
3198 return result;
3199}
3200#endif // VK_USE_PLATFORM_VI_NN
3201
Mark Youngead9b932016-09-08 12:28:38 -06003202VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3203 const VkSwapchainCreateInfoKHR *pCreateInfos,
3204 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003205 bool skip = false;
Mark Youngead9b932016-09-08 12:28:38 -06003206 uint32_t i = 0;
3207 {
3208 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003209 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01943,
3210 VALIDATION_ERROR_UNDEFINED);
Mark Youngead9b932016-09-08 12:28:38 -06003211 if (NULL != pCreateInfos) {
3212 for (i = 0; i < swapchainCount; i++) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003213 skip |= ValidateObject(device, pCreateInfos[i].oldSwapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, true,
3214 VALIDATION_ERROR_01935, VALIDATION_ERROR_UNDEFINED);
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003215 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003216 skip |= ValidateObject(device_data->physical_device, pCreateInfos[i].surface,
3217 VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, false, VALIDATION_ERROR_01926,
3218 VALIDATION_ERROR_UNDEFINED);
Mark Youngead9b932016-09-08 12:28:38 -06003219 }
3220 }
3221 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003222 if (skip) {
Mark Youngead9b932016-09-08 12:28:38 -06003223 return VK_ERROR_VALIDATION_FAILED_EXT;
3224 }
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003225 VkResult result = get_dispatch_table(ot_device_table_map, device)
3226 ->CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
Mark Youngead9b932016-09-08 12:28:38 -06003227 {
3228 std::lock_guard<std::mutex> lock(global_lock);
3229 if (result == VK_SUCCESS) {
3230 for (i = 0; i < swapchainCount; i++) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003231 CreateObject(device, pSwapchains[i], VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator);
Mark Youngead9b932016-09-08 12:28:38 -06003232 }
3233 }
3234 }
3235 return result;
3236}
3237
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003238VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance,
3239 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
3240 const VkAllocationCallbacks *pAllocator,
3241 VkDebugReportCallbackEXT *pCallback) {
3242 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3243 VkResult result = pInstanceTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback);
3244 if (VK_SUCCESS == result) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003245 layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003246 result = layer_create_msg_callback(instance_data->report_data, false, pCreateInfo, pAllocator, pCallback);
Chris Forbesfeecd402016-09-29 14:53:50 +13003247 CreateObject(instance, *pCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003248 }
3249 return result;
3250}
3251
3252VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
3253 const VkAllocationCallbacks *pAllocator) {
3254 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3255 pInstanceTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003256 layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003257 layer_destroy_msg_callback(instance_data->report_data, msgCallback, pAllocator);
Mike Schuchardt3796a882016-12-06 18:03:56 -07003258 DestroyObject(instance, msgCallback, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, pAllocator, VALIDATION_ERROR_02049,
3259 VALIDATION_ERROR_02050);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003260}
3261
3262VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
3263 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
3264 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
3265 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, instance);
3266 pInstanceTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
3267}
3268
3269static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
3270
3271static const VkLayerProperties globalLayerProps = {"VK_LAYER_LUNARG_object_tracker",
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003272 VK_LAYER_API_VERSION, // specVersion
3273 1, // implementationVersion
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003274 "LunarG Validation Layer"};
3275
3276VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
3277 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
3278}
3279
3280VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
3281 VkLayerProperties *pProperties) {
3282 return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);
3283}
3284
3285VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
3286 VkExtensionProperties *pProperties) {
3287 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3288 return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);
3289
3290 return VK_ERROR_LAYER_NOT_PRESENT;
3291}
3292
3293VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName,
3294 uint32_t *pCount, VkExtensionProperties *pProperties) {
3295 if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))
3296 return util_GetExtensionProperties(0, nullptr, pCount, pProperties);
3297
3298 assert(physicalDevice);
3299 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, physicalDevice);
3300 return pTable->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
3301}
3302
3303static inline PFN_vkVoidFunction InterceptMsgCallbackGetProcAddrCommand(const char *name, VkInstance instance) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003304 layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(instance), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003305 return debug_report_get_instance_proc_addr(instance_data->report_data, name);
3306}
3307
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003308VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003309 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07003310
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003311static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkInstance instance) {
3312 VkLayerInstanceDispatchTable *pTable = get_dispatch_table(ot_instance_table_map, instance);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003313 if (instanceExtMap.size() == 0 || !instanceExtMap[pTable].wsi_enabled) return nullptr;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003314
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003315 if (!strcmp("vkDestroySurfaceKHR", name)) return reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003316 if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name))
3317 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR);
3318 if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", name))
3319 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR);
3320 if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", name))
3321 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR);
3322 if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name))
3323 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR);
Norbert Nopper1dec9a52016-11-25 07:55:13 +01003324 if ((instanceExtMap[pTable].display_enabled == true) && !strcmp("vkCreateDisplayPlaneSurfaceKHR", name))
3325 return reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003326
3327#ifdef VK_USE_PLATFORM_WIN32_KHR
3328 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name))
3329 return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
3330 if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", name))
3331 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003332#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003333#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003334 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkCreateXcbSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003335 return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003336 if ((instanceExtMap[pTable].xcb_enabled == true) && !strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003337 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003338#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003339#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003340 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkCreateXlibSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003341 return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003342 if ((instanceExtMap[pTable].xlib_enabled == true) && !strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003343 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003344#endif // VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003345#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003346 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkCreateMirSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003347 return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003348 if ((instanceExtMap[pTable].mir_enabled == true) && !strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003349 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003350#endif // VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003351#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003352 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkCreateWaylandSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003353 return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
Mark Lobodzinski38080682016-07-22 15:30:27 -06003354 if ((instanceExtMap[pTable].wayland_enabled == true) && !strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003355 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003356#endif // VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003357#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski38080682016-07-22 15:30:27 -06003358 if ((instanceExtMap[pTable].android_enabled == true) && !strcmp("vkCreateAndroidSurfaceKHR", name))
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003359 return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003360#endif // VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003361
3362 return nullptr;
3363}
3364
3365static void CheckDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo, VkDevice device) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003366 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003367
3368 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Young0f183a82017-02-28 09:58:04 -07003369 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
3370 device_data->enables.wsi_display_extension = true;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003371 }
Mark Youngead9b932016-09-08 12:28:38 -06003372 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) == 0) {
Mark Young0f183a82017-02-28 09:58:04 -07003373 device_data->enables.wsi_display_swapchain = true;
Mark Youngead9b932016-09-08 12:28:38 -06003374 }
Mark Young0f183a82017-02-28 09:58:04 -07003375 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME) == 0) {
3376 device_data->enables.khr_descriptor_update_template = true;
3377 }
3378 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
3379 device_data->enables.khr_maintenance1 = true;
3380 }
3381 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME) == 0) {
3382 device_data->enables.khr_push_descriptor = true;
3383 }
3384 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
3385 device_data->enables.wsi = true;
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07003386 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003387 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], "OBJTRACK_EXTENSIONS") == 0) {
Mark Young0f183a82017-02-28 09:58:04 -07003388 device_data->enables.objtrack_extensions = true;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003389 }
Mark Young0f183a82017-02-28 09:58:04 -07003390 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHX_DEVICE_GROUP_EXTENSION_NAME) == 0) {
3391 device_data->enables.khx_device_group = true;
3392 }
3393 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHX_EXTERNAL_MEMORY_FD_EXTENSION_NAME) == 0) {
3394 device_data->enables.khx_external_memory_fd = true;
3395 }
Mark Lobodzinski337c8702017-04-03 10:39:08 -06003396#ifdef VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07003397 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHX_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME) == 0) {
3398 device_data->enables.khx_external_memory_win32 = true;
3399 }
Mark Lobodzinski337c8702017-04-03 10:39:08 -06003400#endif // VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07003401 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHX_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME) == 0) {
3402 device_data->enables.khx_external_semaphore_fd = true;
3403 }
Jamie Madill0f941442017-03-16 12:53:42 -04003404#ifdef VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07003405 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHX_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME) == 0) {
3406 device_data->enables.khx_external_semaphore_win32 = true;
3407 }
Jamie Madill0f941442017-03-16 12:53:42 -04003408#endif // VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07003409 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME) == 0) {
3410 device_data->enables.ext_discard_rectangles = true;
Mark Young39389872017-01-19 21:10:49 -07003411 }
3412 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME) == 0) {
Mark Young0f183a82017-02-28 09:58:04 -07003413 device_data->enables.ext_display_control = true;
3414 }
3415 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME) == 0) {
3416 device_data->enables.nv_clip_space_w_scaling = true;
3417 }
3418 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_NVX_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME) == 0) {
3419 device_data->enables.nvx_device_generated_commands = true;
Mark Young39389872017-01-19 21:10:49 -07003420 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003421 }
3422}
3423
3424static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateInfo, VkInstance instance) {
3425 VkLayerInstanceDispatchTable *pDisp = get_dispatch_table(ot_instance_table_map, instance);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003426
3427 instanceExtMap[pDisp] = {};
3428
3429 for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
Mark Young0f183a82017-02-28 09:58:04 -07003430#ifdef VK_USE_PLATFORM_ANDROID_KHR
3431 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
3432 instanceExtMap[pDisp].android_enabled = true;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003433 }
Mark Young0f183a82017-02-28 09:58:04 -07003434#endif
Norbert Nopper1dec9a52016-11-25 07:55:13 +01003435 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
3436 instanceExtMap[pDisp].display_enabled = true;
3437 }
Mark Young0f183a82017-02-28 09:58:04 -07003438 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
3439 instanceExtMap[pDisp].wsi_enabled = true;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003440 }
Mark Young0f183a82017-02-28 09:58:04 -07003441#ifdef VK_USE_PLATFORM_MIR_KHR
3442 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
3443 instanceExtMap[pDisp].mir_enabled = true;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003444 }
3445#endif
3446#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3447 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
3448 instanceExtMap[pDisp].wayland_enabled = true;
3449 }
3450#endif
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003451#ifdef VK_USE_PLATFORM_WIN32_KHR
3452 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
3453 instanceExtMap[pDisp].win32_enabled = true;
3454 }
3455#endif
Mark Young0f183a82017-02-28 09:58:04 -07003456#ifdef VK_USE_PLATFORM_XCB_KHR
3457 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
3458 instanceExtMap[pDisp].xcb_enabled = true;
3459 }
3460#endif
3461#ifdef VK_USE_PLATFORM_XLIB_KHR
3462 if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
3463 instanceExtMap[pDisp].xlib_enabled = true;
3464 }
3465#endif
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003466 }
3467}
3468
3469VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
3470 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
3471 std::lock_guard<std::mutex> lock(global_lock);
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003472 layer_data *phy_dev_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003473 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3474
3475 assert(chain_info->u.pLayerInfo);
3476 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3477 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
3478 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(phy_dev_data->instance, "vkCreateDevice");
3479 if (fpCreateDevice == NULL) {
3480 return VK_ERROR_INITIALIZATION_FAILED;
3481 }
3482
3483 // Advance the link info for the next element on the chain
3484 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3485
3486 VkResult result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
3487 if (result != VK_SUCCESS) {
3488 return result;
3489 }
3490
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003491 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003492 device_data->report_data = layer_debug_report_create_device(phy_dev_data->report_data, *pDevice);
Tobin Ehlis8ad41932016-12-01 09:37:56 -07003493 layer_init_device_dispatch_table(*pDevice, &device_data->dispatch_table, fpGetDeviceProcAddr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003494
3495 // Add link back to physDev
3496 device_data->physical_device = physicalDevice;
3497
3498 initDeviceTable(*pDevice, fpGetDeviceProcAddr, ot_device_table_map);
3499
3500 CheckDeviceRegisterExtensions(pCreateInfo, *pDevice);
Chris Forbesfeecd402016-09-29 14:53:50 +13003501 CreateObject(*pDevice, *pDevice, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003502
3503 return result;
3504}
3505
3506VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3507 uint32_t *pQueueFamilyPropertyCount,
3508 VkQueueFamilyProperties *pQueueFamilyProperties) {
Tobin Ehlise6fdaf12017-02-07 15:21:00 -07003509 bool skip = false;
3510 {
3511 std::lock_guard<std::mutex> lock(global_lock);
3512 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07003513 VALIDATION_ERROR_00028, VALIDATION_ERROR_UNDEFINED);
Tobin Ehlise6fdaf12017-02-07 15:21:00 -07003514 }
3515 if (skip) {
3516 return;
3517 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003518 get_dispatch_table(ot_instance_table_map, physicalDevice)
3519 ->GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
3520 std::lock_guard<std::mutex> lock(global_lock);
3521 if (pQueueFamilyProperties != NULL) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003522 layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map);
Tobin Ehlise28c6d52017-02-06 17:02:03 -07003523 if (instance_data->queue_family_properties.size() < *pQueueFamilyPropertyCount) {
3524 instance_data->queue_family_properties.resize(*pQueueFamilyPropertyCount);
3525 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003526 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
Tobin Ehlise28c6d52017-02-06 17:02:03 -07003527 instance_data->queue_family_properties[i] = pQueueFamilyProperties[i];
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003528 }
3529 }
3530}
3531
3532VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3533 VkInstance *pInstance) {
3534 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
3535
3536 assert(chain_info->u.pLayerInfo);
3537 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
3538 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
3539 if (fpCreateInstance == NULL) {
3540 return VK_ERROR_INITIALIZATION_FAILED;
3541 }
3542
3543 // Advance the link info for the next element on the chain
3544 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
3545
3546 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
3547 if (result != VK_SUCCESS) {
3548 return result;
3549 }
3550
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003551 layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(*pInstance), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003552 instance_data->instance = *pInstance;
3553 initInstanceTable(*pInstance, fpGetInstanceProcAddr, ot_instance_table_map);
3554 VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(ot_instance_table_map, *pInstance);
3555
3556 // Look for one or more debug report create info structures, and copy the
3557 // callback(s) for each one found (for use by vkDestroyInstance)
3558 layer_copy_tmp_callbacks(pCreateInfo->pNext, &instance_data->num_tmp_callbacks, &instance_data->tmp_dbg_create_infos,
3559 &instance_data->tmp_callbacks);
3560
3561 instance_data->report_data = debug_report_create_instance(pInstanceTable, *pInstance, pCreateInfo->enabledExtensionCount,
3562 pCreateInfo->ppEnabledExtensionNames);
3563
3564 InitObjectTracker(instance_data, pAllocator);
3565 CheckInstanceRegisterExtensions(pCreateInfo, *pInstance);
3566
Chris Forbesfeecd402016-09-29 14:53:50 +13003567 CreateObject(*pInstance, *pInstance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003568
3569 return result;
3570}
3571
3572VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
3573 VkPhysicalDevice *pPhysicalDevices) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003574 bool skip = VK_FALSE;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003575 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003576 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_00023,
3577 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003578 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003579 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003580 return VK_ERROR_VALIDATION_FAILED_EXT;
3581 }
3582 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
3583 ->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
3584 lock.lock();
3585 if (result == VK_SUCCESS) {
3586 if (pPhysicalDevices) {
3587 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
Mark Lobodzinski4dc768c2016-10-03 16:01:12 -06003588 CreateObject(instance, pPhysicalDevices[i], VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, nullptr);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003589 }
3590 }
3591 }
3592 lock.unlock();
3593 return result;
3594}
3595
3596VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
3597 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07003598 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00062,
3599 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003600 lock.unlock();
3601
3602 get_dispatch_table(ot_device_table_map, device)->GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
3603
3604 lock.lock();
3605
3606 CreateQueue(device, *pQueue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT);
3607 AddQueueInfo(device, queueFamilyIndex, *pQueue);
3608}
3609
3610VKAPI_ATTR void VKAPI_CALL FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
Tobin Ehlis02337352016-10-20 14:42:57 -06003611 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003612 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07003613 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00621,
3614 VALIDATION_ERROR_UNDEFINED);
3615 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, true, VALIDATION_ERROR_00622,
3616 VALIDATION_ERROR_00624);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003617 lock.unlock();
Tobin Ehlis02337352016-10-20 14:42:57 -06003618 if (!skip) {
3619 get_dispatch_table(ot_device_table_map, device)->FreeMemory(device, memory, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003620
Tobin Ehlis02337352016-10-20 14:42:57 -06003621 lock.lock();
Mike Schuchardt3796a882016-12-06 18:03:56 -07003622 DestroyObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, pAllocator, VALIDATION_ERROR_UNDEFINED,
3623 VALIDATION_ERROR_UNDEFINED);
Tobin Ehlis02337352016-10-20 14:42:57 -06003624 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003625}
3626
3627VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size,
3628 VkMemoryMapFlags flags, void **ppData) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003629 bool skip = VK_FALSE;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003630 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003631 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00630,
3632 VALIDATION_ERROR_UNDEFINED);
3633 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00631,
3634 VALIDATION_ERROR_00634);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003635 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003636 if (skip == VK_TRUE) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003637 return VK_ERROR_VALIDATION_FAILED_EXT;
3638 }
3639 VkResult result = get_dispatch_table(ot_device_table_map, device)->MapMemory(device, memory, offset, size, flags, ppData);
3640 return result;
3641}
3642
3643VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003644 bool skip = VK_FALSE;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003645 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003646 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00650,
3647 VALIDATION_ERROR_UNDEFINED);
3648 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_00651,
3649 VALIDATION_ERROR_00652);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003650 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003651 if (skip == VK_TRUE) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003652 return;
3653 }
3654
3655 get_dispatch_table(ot_device_table_map, device)->UnmapMemory(device, memory);
3656}
3657VKAPI_ATTR VkResult VKAPI_CALL QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
3658 VkFence fence) {
3659 std::unique_lock<std::mutex> lock(global_lock);
3660 ValidateQueueFlags(queue, "QueueBindSparse");
3661
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07003662 ValidateObject(queue, queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, false, VALIDATION_ERROR_01648, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski611d6b52017-03-17 10:52:57 -06003663 ValidateObject(queue, fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, true, VALIDATION_ERROR_01650, VALIDATION_ERROR_01652);
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07003664
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003665 for (uint32_t i = 0; i < bindInfoCount; i++) {
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07003666 for (uint32_t j = 0; j < pBindInfo[i].bufferBindCount; j++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003667 ValidateObject(queue, pBindInfo[i].pBufferBinds[j].buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07003668 VALIDATION_ERROR_01656, VALIDATION_ERROR_UNDEFINED);
3669 }
3670 for (uint32_t j = 0; j < pBindInfo[i].imageOpaqueBindCount; j++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003671 ValidateObject(queue, pBindInfo[i].pImageOpaqueBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07003672 VALIDATION_ERROR_01657, VALIDATION_ERROR_UNDEFINED);
3673 }
3674 for (uint32_t j = 0; j < pBindInfo[i].imageBindCount; j++) {
Mike Schuchardt662c39c2016-11-11 16:10:51 -07003675 ValidateObject(queue, pBindInfo[i].pImageBinds[j].image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07003676 VALIDATION_ERROR_01658, VALIDATION_ERROR_UNDEFINED);
3677 }
3678 for (uint32_t j = 0; j < pBindInfo[i].waitSemaphoreCount; j++) {
3679 ValidateObject(queue, pBindInfo[i].pWaitSemaphores[j], VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false,
3680 VALIDATION_ERROR_01655, VALIDATION_ERROR_01660);
3681 }
3682 for (uint32_t j = 0; j < pBindInfo[i].signalSemaphoreCount; j++) {
3683 ValidateObject(queue, pBindInfo[i].pSignalSemaphores[j], VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, false,
3684 VALIDATION_ERROR_01659, VALIDATION_ERROR_01660);
3685 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003686 }
3687 lock.unlock();
3688
3689 VkResult result = get_dispatch_table(ot_device_table_map, queue)->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
3690 return result;
3691}
3692
3693VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
3694 VkCommandBuffer *pCommandBuffers) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003695 bool skip = VK_FALSE;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003696 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003697 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00084,
3698 VALIDATION_ERROR_UNDEFINED);
3699 skip |= ValidateObject(device, pAllocateInfo->commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false,
3700 VALIDATION_ERROR_00090, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003701 lock.unlock();
3702
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003703 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003704 return VK_ERROR_VALIDATION_FAILED_EXT;
3705 }
3706
3707 VkResult result =
3708 get_dispatch_table(ot_device_table_map, device)->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
3709
3710 lock.lock();
3711 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {
3712 AllocateCommandBuffer(device, pAllocateInfo->commandPool, pCommandBuffers[i],
3713 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, pAllocateInfo->level);
3714 }
3715 lock.unlock();
3716
3717 return result;
3718}
3719
3720VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
3721 VkDescriptorSet *pDescriptorSets) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003722 bool skip = VK_FALSE;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003723 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003724 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00908,
3725 VALIDATION_ERROR_UNDEFINED);
3726 skip |= ValidateObject(device, pAllocateInfo->descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false,
3727 VALIDATION_ERROR_00915, VALIDATION_ERROR_00918);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003728 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003729 skip |= ValidateObject(device, pAllocateInfo->pSetLayouts[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, false,
3730 VALIDATION_ERROR_00916, VALIDATION_ERROR_00918);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003731 }
3732 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003733 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003734 return VK_ERROR_VALIDATION_FAILED_EXT;
3735 }
3736
3737 VkResult result =
3738 get_dispatch_table(ot_device_table_map, device)->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
3739
3740 if (VK_SUCCESS == result) {
3741 lock.lock();
3742 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
3743 AllocateDescriptorSet(device, pAllocateInfo->descriptorPool, pDescriptorSets[i],
3744 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
3745 }
3746 lock.unlock();
3747 }
3748
3749 return result;
3750}
3751
3752VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
3753 const VkCommandBuffer *pCommandBuffers) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003754 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003755 std::unique_lock<std::mutex> lock(global_lock);
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07003756 ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00098,
3757 VALIDATION_ERROR_UNDEFINED);
3758 ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false, VALIDATION_ERROR_00099,
3759 VALIDATION_ERROR_00101);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003760 for (uint32_t i = 0; i < commandBufferCount; i++) {
Tony Barbour5b28fe72017-02-02 09:31:30 -07003761 if (pCommandBuffers[i] != VK_NULL_HANDLE) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003762 skip |= ValidateCommandBuffer(device, commandPool, pCommandBuffers[i]);
Tony Barbour5b28fe72017-02-02 09:31:30 -07003763 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003764 }
3765
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003766 for (uint32_t i = 0; i < commandBufferCount; i++) {
Mike Schuchardt3796a882016-12-06 18:03:56 -07003767 DestroyObject(device, pCommandBuffers[i], VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr,
3768 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003769 }
3770
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003771 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003772 if (!skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003773 get_dispatch_table(ot_device_table_map, device)
3774 ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
3775 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003776}
3777VKAPI_ATTR void VKAPI_CALL DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003778 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003779 std::unique_lock<std::mutex> lock(global_lock);
3780 // A swapchain's images are implicitly deleted when the swapchain is deleted.
3781 // Remove this swapchain's images from our map of such images.
3782 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr = device_data->swapchainImageMap.begin();
3783 while (itr != device_data->swapchainImageMap.end()) {
3784 OBJTRACK_NODE *pNode = (*itr).second;
3785 if (pNode->parent_object == reinterpret_cast<uint64_t &>(swapchain)) {
3786 delete pNode;
3787 auto delete_item = itr++;
3788 device_data->swapchainImageMap.erase(delete_item);
3789 } else {
3790 ++itr;
3791 }
3792 }
Mike Schuchardt3796a882016-12-06 18:03:56 -07003793 DestroyObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, pAllocator, VALIDATION_ERROR_01938,
3794 VALIDATION_ERROR_01939);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003795 lock.unlock();
3796
3797 get_dispatch_table(ot_device_table_map, device)->DestroySwapchainKHR(device, swapchain, pAllocator);
3798}
3799
3800VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
3801 const VkDescriptorSet *pDescriptorSets) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003802 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003803 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
3804 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003805 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00923,
3806 VALIDATION_ERROR_UNDEFINED);
3807 skip |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false, VALIDATION_ERROR_00924,
3808 VALIDATION_ERROR_00926);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003809 for (uint32_t i = 0; i < descriptorSetCount; i++) {
Tony Barbour5b28fe72017-02-02 09:31:30 -07003810 if (pDescriptorSets[i] != VK_NULL_HANDLE) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003811 skip |= ValidateDescriptorSet(device, descriptorPool, pDescriptorSets[i]);
Tony Barbour5b28fe72017-02-02 09:31:30 -07003812 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003813 }
3814
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003815 for (uint32_t i = 0; i < descriptorSetCount; i++) {
Mike Schuchardt3796a882016-12-06 18:03:56 -07003816 DestroyObject(device, pDescriptorSets[i], VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr,
3817 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bb11542016-07-13 11:29:00 -06003818 }
3819
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003820 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003821 if (!skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003822 result = get_dispatch_table(ot_device_table_map, device)
3823 ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
3824 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003825 return result;
3826}
3827
3828VKAPI_ATTR void VKAPI_CALL DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
3829 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003830 bool skip = VK_FALSE;
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003831 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003832 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003833 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00904,
3834 VALIDATION_ERROR_UNDEFINED);
3835 skip |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, true, VALIDATION_ERROR_00905,
3836 VALIDATION_ERROR_00907);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003837 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003838 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003839 return;
3840 }
3841 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is deleted.
3842 // Remove this pool's descriptor sets from our descriptorSet map.
3843 lock.lock();
3844 std::unordered_map<uint64_t, OBJTRACK_NODE *>::iterator itr =
3845 device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin();
3846 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) {
3847 OBJTRACK_NODE *pNode = (*itr).second;
3848 auto del_itr = itr++;
3849 if (pNode->parent_object == reinterpret_cast<uint64_t &>(descriptorPool)) {
Mike Schuchardt3796a882016-12-06 18:03:56 -07003850 DestroyObject(device, (VkDescriptorSet)((*del_itr).first), VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, nullptr,
3851 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003852 }
3853 }
Mike Schuchardt3796a882016-12-06 18:03:56 -07003854 DestroyObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, pAllocator, VALIDATION_ERROR_00902,
3855 VALIDATION_ERROR_00903);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003856 lock.unlock();
3857 get_dispatch_table(ot_device_table_map, device)->DestroyDescriptorPool(device, descriptorPool, pAllocator);
3858}
3859
3860VKAPI_ATTR void VKAPI_CALL DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07003861 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003862 bool skip = false;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003863 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003864 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00080,
3865 VALIDATION_ERROR_UNDEFINED);
3866 skip |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, true, VALIDATION_ERROR_00081,
3867 VALIDATION_ERROR_00083);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003868 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003869 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003870 return;
3871 }
3872 lock.lock();
3873 // A CommandPool's command buffers are implicitly deleted when the pool is deleted.
3874 // Remove this pool's cmdBuffers from our cmd buffer map.
3875 auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].begin();
3876 auto del_itr = itr;
3877 while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT].end()) {
3878 OBJTRACK_NODE *pNode = (*itr).second;
3879 del_itr = itr++;
3880 if (pNode->parent_object == reinterpret_cast<uint64_t &>(commandPool)) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003881 skip |= ValidateCommandBuffer(device, commandPool, reinterpret_cast<VkCommandBuffer>((*del_itr).first));
Chris Forbesec461992016-09-29 14:41:44 +13003882 DestroyObject(device, reinterpret_cast<VkCommandBuffer>((*del_itr).first),
Mike Schuchardt3796a882016-12-06 18:03:56 -07003883 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, nullptr, VALIDATION_ERROR_UNDEFINED,
3884 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003885 }
3886 }
Mike Schuchardt3796a882016-12-06 18:03:56 -07003887 DestroyObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, pAllocator, VALIDATION_ERROR_00078,
3888 VALIDATION_ERROR_00079);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003889 lock.unlock();
3890 get_dispatch_table(ot_device_table_map, device)->DestroyCommandPool(device, commandPool, pAllocator);
3891}
3892
3893VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
3894 VkImage *pSwapchainImages) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003895 bool skip = VK_FALSE;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003896 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003897 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01948,
3898 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003899 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003900 if (skip) {
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003901 return VK_ERROR_VALIDATION_FAILED_EXT;
3902 }
3903 VkResult result = get_dispatch_table(ot_device_table_map, device)
3904 ->GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
3905 if (pSwapchainImages != NULL) {
3906 lock.lock();
3907 for (uint32_t i = 0; i < *pSwapchainImageCount; i++) {
3908 CreateSwapchainImageObject(device, pSwapchainImages[i], swapchain);
3909 }
3910 lock.unlock();
3911 }
3912 return result;
3913}
3914
3915VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3916 const VkGraphicsPipelineCreateInfo *pCreateInfos,
3917 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003918 bool skip = VK_FALSE;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003919 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003920 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00519,
3921 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003922 if (pCreateInfos) {
3923 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3924 if (pCreateInfos[idx0].basePipelineHandle) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003925 skip |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3926 true, VALIDATION_ERROR_00529, VALIDATION_ERROR_00549);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003927 }
3928 if (pCreateInfos[idx0].layout) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003929 skip |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false,
3930 VALIDATION_ERROR_00546, VALIDATION_ERROR_00549);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003931 }
3932 if (pCreateInfos[idx0].pStages) {
3933 for (uint32_t idx1 = 0; idx1 < pCreateInfos[idx0].stageCount; ++idx1) {
3934 if (pCreateInfos[idx0].pStages[idx1].module) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003935 skip |= ValidateObject(device, pCreateInfos[idx0].pStages[idx1].module,
3936 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, false, VALIDATION_ERROR_00515,
3937 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003938 }
3939 }
3940 }
3941 if (pCreateInfos[idx0].renderPass) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003942 skip |= ValidateObject(device, pCreateInfos[idx0].renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, false,
3943 VALIDATION_ERROR_00547, VALIDATION_ERROR_00549);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003944 }
3945 }
3946 }
3947 if (pipelineCache) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003948 skip |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00520,
3949 VALIDATION_ERROR_00525);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003950 }
3951 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003952 if (skip) {
Chris Forbes8d24dc92016-11-30 14:56:52 +13003953 for (uint32_t i = 0; i < createInfoCount; i++) {
3954 pPipelines[i] = VK_NULL_HANDLE;
3955 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003956 return VK_ERROR_VALIDATION_FAILED_EXT;
3957 }
3958 VkResult result = get_dispatch_table(ot_device_table_map, device)
3959 ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
3960 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01003961 for (uint32_t idx2 = 0; idx2 < createInfoCount; ++idx2) {
3962 if (pPipelines[idx2] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13003963 CreateObject(device, pPipelines[idx2], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003964 }
3965 }
3966 lock.unlock();
3967 return result;
3968}
3969
3970VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
3971 const VkComputePipelineCreateInfo *pCreateInfos,
3972 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003973 bool skip = VK_FALSE;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003974 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003975 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_00486,
3976 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003977 if (pCreateInfos) {
3978 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
3979 if (pCreateInfos[idx0].basePipelineHandle) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003980 skip |= ValidateObject(device, pCreateInfos[idx0].basePipelineHandle, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
3981 true, VALIDATION_ERROR_00496, VALIDATION_ERROR_00506);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003982 }
3983 if (pCreateInfos[idx0].layout) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003984 skip |= ValidateObject(device, pCreateInfos[idx0].layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false,
3985 VALIDATION_ERROR_00505, VALIDATION_ERROR_00506);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003986 }
3987 if (pCreateInfos[idx0].stage.module) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003988 skip |= ValidateObject(device, pCreateInfos[idx0].stage.module, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT,
3989 false, VALIDATION_ERROR_00515, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003990 }
3991 }
3992 }
3993 if (pipelineCache) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003994 skip |= ValidateObject(device, pipelineCache, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, true, VALIDATION_ERROR_00487,
3995 VALIDATION_ERROR_00492);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06003996 }
3997 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06003998 if (skip) {
Chris Forbes8d24dc92016-11-30 14:56:52 +13003999 for (uint32_t i = 0; i < createInfoCount; i++) {
4000 pPipelines[i] = VK_NULL_HANDLE;
4001 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004002 return VK_ERROR_VALIDATION_FAILED_EXT;
4003 }
4004 VkResult result = get_dispatch_table(ot_device_table_map, device)
4005 ->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
4006 lock.lock();
Maciej Jesionowski42200702016-11-23 10:44:34 +01004007 for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
4008 if (pPipelines[idx1] != VK_NULL_HANDLE) {
Chris Forbesfeecd402016-09-29 14:53:50 +13004009 CreateObject(device, pPipelines[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06004010 }
4011 }
4012 lock.unlock();
4013 return result;
4014}
4015
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07004016// VK_KHR_display Extension
4017VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
4018 VkDisplayPropertiesKHR *pProperties) {
4019 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4020 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004021 {
4022 std::unique_lock<std::mutex> lock(global_lock);
4023 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004024 VALIDATION_ERROR_01851, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004025 }
4026 if (!skip) {
4027 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004028 ->GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004029 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07004030 return result;
4031}
4032
4033VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
4034 VkDisplayPlanePropertiesKHR *pProperties) {
4035 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4036 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004037 {
4038 std::unique_lock<std::mutex> lock(global_lock);
4039 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004040 VALIDATION_ERROR_01854, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004041 }
4042 if (!skip) {
4043 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004044 ->GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004045 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07004046 return result;
4047}
4048
4049VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
4050 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
4051 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4052 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004053 {
4054 std::unique_lock<std::mutex> lock(global_lock);
4055 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004056 VALIDATION_ERROR_01858, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004057 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07004058 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
4059 ->GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004060 if (((result == VK_SUCCESS) || (result == VK_INCOMPLETE)) && (pDisplays != NULL)) {
4061 std::lock_guard<std::mutex> lock(global_lock);
4062 for (uint32_t displays = 0; displays < *pDisplayCount; displays++) {
4063 CreateObject(physicalDevice, pDisplays[displays], VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, nullptr);
4064 }
4065 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07004066 return result;
4067}
4068
4069VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
4070 uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties) {
4071 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4072 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004073 {
4074 std::unique_lock<std::mutex> lock(global_lock);
4075 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004076 VALIDATION_ERROR_01861, VALIDATION_ERROR_UNDEFINED);
4077 skip |= ValidateObject(physicalDevice, display, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, false, VALIDATION_ERROR_01862,
4078 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004079 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07004080 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
4081 ->GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
4082
4083 return result;
4084}
4085
4086VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
4087 const VkDisplayModeCreateInfoKHR *pCreateInfo,
4088 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode) {
4089 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4090 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004091 {
4092 std::unique_lock<std::mutex> lock(global_lock);
4093 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004094 VALIDATION_ERROR_01865, VALIDATION_ERROR_UNDEFINED);
4095 skip |= ValidateObject(physicalDevice, display, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, false, VALIDATION_ERROR_01866,
4096 VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004097 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07004098 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
4099 ->CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004100 {
4101 std::lock_guard<std::mutex> lock(global_lock);
4102 if (result == VK_SUCCESS) {
4103 CreateObject(physicalDevice, *pMode, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT, pAllocator);
4104 }
4105 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07004106 return result;
4107}
4108
4109VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode,
4110 uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) {
4111 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4112 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004113 {
4114 std::unique_lock<std::mutex> lock(global_lock);
4115 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004116 VALIDATION_ERROR_01875, VALIDATION_ERROR_UNDEFINED);
4117 skip |= ValidateObject(physicalDevice, mode, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT, false,
4118 VALIDATION_ERROR_01876, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004119 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07004120 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
4121 ->GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
4122
4123 return result;
4124}
4125
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004126VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004127 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004128 bool skip = false;
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004129 {
4130 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004131 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01878,
4132 VALIDATION_ERROR_UNDEFINED);
4133 skip |= ValidateObject(instance, pCreateInfo->displayMode, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT, false,
4134 VALIDATION_ERROR_01886, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004135 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004136 if (skip) {
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004137 return VK_ERROR_VALIDATION_FAILED_EXT;
4138 }
4139 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004140 ->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
Mark Lobodzinski3aa148a2016-11-14 10:32:41 -07004141 {
4142 std::lock_guard<std::mutex> lock(global_lock);
4143 if (result == VK_SUCCESS) {
4144 CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator);
4145 }
4146 }
4147 return result;
4148}
4149
Mark Young39389872017-01-19 21:10:49 -07004150// VK_KHR_get_physical_device_properties2 Extension
4151VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures2KHR(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2KHR *pFeatures) {
4152 bool skip = false;
4153 {
Tobin Ehlisfc85c622017-02-06 16:15:55 -07004154 std::lock_guard<std::mutex> lock(global_lock);
Mark Young39389872017-01-19 21:10:49 -07004155 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004156 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07004157 }
4158 if (!skip) {
4159 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures);
4160 }
4161}
4162
4163VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties2KHR(VkPhysicalDevice physicalDevice,
4164 VkPhysicalDeviceProperties2KHR *pProperties) {
4165 bool skip = false;
4166 {
Tobin Ehlisfc85c622017-02-06 16:15:55 -07004167 std::lock_guard<std::mutex> lock(global_lock);
Mark Young39389872017-01-19 21:10:49 -07004168 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004169 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07004170 }
4171 if (!skip) {
4172 get_dispatch_table(ot_instance_table_map, physicalDevice)->GetPhysicalDeviceProperties2KHR(physicalDevice, pProperties);
4173 }
4174}
4175
4176VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties2KHR(VkPhysicalDevice physicalDevice, VkFormat format,
4177 VkFormatProperties2KHR *pFormatProperties) {
4178 bool skip = false;
4179 {
Tobin Ehlisfc85c622017-02-06 16:15:55 -07004180 std::lock_guard<std::mutex> lock(global_lock);
Mark Young39389872017-01-19 21:10:49 -07004181 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004182 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07004183 }
4184 if (!skip) {
4185 get_dispatch_table(ot_instance_table_map, physicalDevice)
4186 ->GetPhysicalDeviceFormatProperties2KHR(physicalDevice, format, pFormatProperties);
4187 }
4188}
4189
4190VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceImageFormatProperties2KHR(
4191 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2KHR *pImageFormatInfo,
4192 VkImageFormatProperties2KHR *pImageFormatProperties) {
Mark Young39389872017-01-19 21:10:49 -07004193 bool skip = false;
4194 {
Tobin Ehlisfc85c622017-02-06 16:15:55 -07004195 std::lock_guard<std::mutex> lock(global_lock);
Mark Young39389872017-01-19 21:10:49 -07004196 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004197 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07004198 }
4199 if (skip) {
4200 return VK_ERROR_VALIDATION_FAILED_EXT;
4201 }
Tobin Ehlisfc85c622017-02-06 16:15:55 -07004202 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
4203 ->GetPhysicalDeviceImageFormatProperties2KHR(physicalDevice, pImageFormatInfo, pImageFormatProperties);
Mark Young39389872017-01-19 21:10:49 -07004204
4205 return result;
4206}
4207
4208VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceQueueFamilyProperties2KHR(VkPhysicalDevice physicalDevice,
4209 uint32_t *pQueueFamilyPropertyCount,
4210 VkQueueFamilyProperties2KHR *pQueueFamilyProperties) {
4211 bool skip = false;
4212 {
Tobin Ehlisfc85c622017-02-06 16:15:55 -07004213 std::lock_guard<std::mutex> lock(global_lock);
Mark Young39389872017-01-19 21:10:49 -07004214 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004215 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07004216 }
Tobin Ehlisfc85c622017-02-06 16:15:55 -07004217 if (skip) {
4218 return;
4219 }
4220 get_dispatch_table(ot_instance_table_map, physicalDevice)
4221 ->GetPhysicalDeviceQueueFamilyProperties2KHR(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
4222 std::lock_guard<std::mutex> lock(global_lock);
4223 if (pQueueFamilyProperties != NULL) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07004224 layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map);
Tobin Ehlise28c6d52017-02-06 17:02:03 -07004225 if (instance_data->queue_family_properties.size() < *pQueueFamilyPropertyCount) {
4226 instance_data->queue_family_properties.resize(*pQueueFamilyPropertyCount);
4227 }
Tobin Ehlisfc85c622017-02-06 16:15:55 -07004228 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
Tobin Ehlise28c6d52017-02-06 17:02:03 -07004229 instance_data->queue_family_properties[i] = pQueueFamilyProperties[i].queueFamilyProperties;
Tobin Ehlisfc85c622017-02-06 16:15:55 -07004230 }
Mark Young39389872017-01-19 21:10:49 -07004231 }
4232}
4233
4234VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceMemoryProperties2KHR(VkPhysicalDevice physicalDevice,
4235 VkPhysicalDeviceMemoryProperties2KHR *pMemoryProperties) {
4236 bool skip = false;
4237 {
Tobin Ehlisfc85c622017-02-06 16:15:55 -07004238 std::lock_guard<std::mutex> lock(global_lock);
Mark Young39389872017-01-19 21:10:49 -07004239 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004240 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07004241 }
4242 if (!skip) {
4243 get_dispatch_table(ot_instance_table_map, physicalDevice)
4244 ->GetPhysicalDeviceMemoryProperties2KHR(physicalDevice, pMemoryProperties);
4245 }
4246}
4247
4248VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceSparseImageFormatProperties2KHR(
4249 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2KHR *pFormatInfo, uint32_t *pPropertyCount,
4250 VkSparseImageFormatProperties2KHR *pProperties) {
4251 bool skip = false;
4252 {
Tobin Ehlisfc85c622017-02-06 16:15:55 -07004253 std::lock_guard<std::mutex> lock(global_lock);
Mark Young39389872017-01-19 21:10:49 -07004254 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07004255 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07004256 }
4257 if (!skip) {
4258 get_dispatch_table(ot_instance_table_map, physicalDevice)
4259 ->GetPhysicalDeviceSparseImageFormatProperties2KHR(physicalDevice, pFormatInfo, pPropertyCount, pProperties);
4260 }
4261}
4262
Mark Young0f183a82017-02-28 09:58:04 -07004263// VK_KHR_descriptor_update_template
4264VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorUpdateTemplateKHR(VkDevice device,
4265 const VkDescriptorUpdateTemplateCreateInfoKHR *pCreateInfo,
4266 const VkAllocationCallbacks *pAllocator,
4267 VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004268 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004269 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004270 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4271 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004272 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004273 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004274 return VK_ERROR_VALIDATION_FAILED_EXT;
4275 }
4276 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
4277 VkResult result = VK_SUCCESS;
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004278 result = dev_data->dispatch_table.CreateDescriptorUpdateTemplateKHR(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
4279 // TODO: Add tracking of VkDescriptorUpdateTemplateKHR
Mark Young0f183a82017-02-28 09:58:04 -07004280 return result;
4281}
4282
4283VKAPI_ATTR void VKAPI_CALL DestroyDescriptorUpdateTemplateKHR(VkDevice device,
4284 VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate,
4285 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004286 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004287 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004288 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4289 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004290 // TODO: Add tracking of VkDescriptorUpdateTemplateKHR
4291 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004292 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004293 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06004294 dev_data->dispatch_table.DestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator);
Mark Young0f183a82017-02-28 09:58:04 -07004295 }
4296}
4297
4298VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
4299 VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate,
4300 const void *pData) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004301 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004302 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004303 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4304 VALIDATION_ERROR_UNDEFINED);
4305 skip |= ValidateObject(device, descriptorSet, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false, VALIDATION_ERROR_UNDEFINED,
4306 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004307 // TODO: Add tracking of VkDescriptorUpdateTemplateKHR
4308 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004309 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004310 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06004311 dev_data->dispatch_table.UpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, pData);
Mark Young0f183a82017-02-28 09:58:04 -07004312 }
4313}
4314
4315VKAPI_ATTR void VKAPI_CALL CmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
4316 VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate,
4317 VkPipelineLayout layout, uint32_t set, const void *pData) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004318 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004319 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004320 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4321 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
4322 skip |= ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false,
4323 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004324 // TODO: Add tracking of VkDescriptorUpdateTemplateKHR
4325 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004326 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004327 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06004328 dev_data->dispatch_table.CmdPushDescriptorSetWithTemplateKHR(commandBuffer, descriptorUpdateTemplate, layout, set, pData);
Mark Young0f183a82017-02-28 09:58:04 -07004329 }
4330}
4331
4332// VK_KHR_maintenance1 Extension
4333VKAPI_ATTR void VKAPI_CALL TrimCommandPoolKHR(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlagsKHR flags) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004334 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004335 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004336 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4337 VALIDATION_ERROR_UNDEFINED);
4338 skip |= ValidateObject(device, commandPool, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, false, VALIDATION_ERROR_UNDEFINED,
4339 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004340 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004341 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004342 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06004343 dev_data->dispatch_table.TrimCommandPoolKHR(device, commandPool, flags);
Mark Young0f183a82017-02-28 09:58:04 -07004344 }
4345}
4346
4347// VK_KHR_push_descriptor Extension
4348VKAPI_ATTR void VKAPI_CALL CmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
4349 VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount,
4350 const VkWriteDescriptorSet *pDescriptorWrites) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004351 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004352 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004353 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4354 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
4355 skip |= ValidateObject(commandBuffer, layout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, false,
4356 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004357 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004358 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004359 get_dispatch_table(ot_device_table_map, commandBuffer)
4360 ->CmdPushDescriptorSetKHR(commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites);
4361 }
4362}
4363
4364// VK_KHX_device_group Extension
4365VKAPI_ATTR void VKAPI_CALL GetDeviceGroupPeerMemoryFeaturesKHX(VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex,
4366 uint32_t remoteDeviceIndex,
4367 VkPeerMemoryFeatureFlagsKHX *pPeerMemoryFeatures) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004368 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004369 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004370 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4371 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004372 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004373 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004374 get_dispatch_table(ot_device_table_map, device)
4375 ->GetDeviceGroupPeerMemoryFeaturesKHX(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
4376 }
4377}
4378
4379VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory2KHX(VkDevice device, uint32_t bindInfoCount,
4380 const VkBindBufferMemoryInfoKHX *pBindInfos) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004381 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004382 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004383 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4384 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004385 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004386 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004387 return VK_ERROR_VALIDATION_FAILED_EXT;
4388 }
4389 VkResult result = VK_SUCCESS;
4390 result = get_dispatch_table(ot_device_table_map, device)->BindBufferMemory2KHX(device, bindInfoCount, pBindInfos);
4391 return result;
4392}
4393
4394VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory2KHX(VkDevice device, uint32_t bindInfoCount,
4395 const VkBindImageMemoryInfoKHX *pBindInfos) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004396 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004397 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004398 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4399 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004400 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004401 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004402 return VK_ERROR_VALIDATION_FAILED_EXT;
4403 }
4404 VkResult result = VK_SUCCESS;
4405 result = get_dispatch_table(ot_device_table_map, device)->BindImageMemory2KHX(device, bindInfoCount, pBindInfos);
4406 return result;
4407}
4408
4409VKAPI_ATTR void VKAPI_CALL CmdSetDeviceMaskKHX(VkCommandBuffer commandBuffer, uint32_t deviceMask) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004410 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004411 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004412 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4413 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004414 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004415 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004416 get_dispatch_table(ot_device_table_map, commandBuffer)->CmdSetDeviceMaskKHX(commandBuffer, deviceMask);
4417 }
4418}
4419
4420VKAPI_ATTR VkResult VKAPI_CALL
4421GetDeviceGroupPresentCapabilitiesKHX(VkDevice device, VkDeviceGroupPresentCapabilitiesKHX *pDeviceGroupPresentCapabilities) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004422 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004423 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004424 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4425 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004426 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004427 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004428 return VK_ERROR_VALIDATION_FAILED_EXT;
4429 }
4430 VkResult result = VK_SUCCESS;
4431 result = get_dispatch_table(ot_device_table_map, device)
4432 ->GetDeviceGroupPresentCapabilitiesKHX(device, pDeviceGroupPresentCapabilities);
4433 return result;
4434}
4435
4436VKAPI_ATTR VkResult VKAPI_CALL GetDeviceGroupSurfacePresentModesKHX(VkDevice device, VkSurfaceKHR surface,
4437 VkDeviceGroupPresentModeFlagsKHX *pModes) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004438 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004439 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004440 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4441 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004442 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004443 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004444 return VK_ERROR_VALIDATION_FAILED_EXT;
4445 }
4446 VkResult result = VK_SUCCESS;
4447 result = get_dispatch_table(ot_device_table_map, device)->GetDeviceGroupSurfacePresentModesKHX(device, surface, pModes);
4448 return result;
4449}
4450
4451VKAPI_ATTR VkResult VKAPI_CALL AcquireNextImage2KHX(VkDevice device, const VkAcquireNextImageInfoKHX *pAcquireInfo,
4452 uint32_t *pImageIndex) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004453 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004454 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004455 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4456 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004457 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004458 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004459 return VK_ERROR_VALIDATION_FAILED_EXT;
4460 }
4461 VkResult result = VK_SUCCESS;
4462 result = get_dispatch_table(ot_device_table_map, device)->AcquireNextImage2KHX(device, pAcquireInfo, pImageIndex);
4463 return result;
4464}
4465
4466VKAPI_ATTR void VKAPI_CALL CmdDispatchBaseKHX(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
4467 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
4468 uint32_t groupCountZ) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004469 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004470 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004471 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4472 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004473 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004474 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004475 get_dispatch_table(ot_device_table_map, commandBuffer)
4476 ->CmdDispatchBaseKHX(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
4477 }
4478}
4479
4480VKAPI_ATTR void VKAPI_CALL GetPhysicalDevicePresentRectanglesKHX(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4481 uint32_t *pRectCount, VkRect2D *pRects) {
4482 bool skip = false;
4483 {
4484 std::unique_lock<std::mutex> lock(global_lock);
4485 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4486 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
4487 }
4488 if (!skip) {
4489 get_dispatch_table(ot_instance_table_map, physicalDevice)
4490 ->GetPhysicalDevicePresentRectanglesKHX(physicalDevice, surface, pRectCount, pRects);
4491 }
4492}
4493
4494// VK_KHX_device_group_creation Extension
4495VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDeviceGroupsKHX(
4496 VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX *pPhysicalDeviceGroupProperties) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004497 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004498 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004499 skip |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4500 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004501 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004502 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004503 return VK_ERROR_VALIDATION_FAILED_EXT;
4504 }
4505 VkResult result = get_dispatch_table(ot_instance_table_map, instance)
4506 ->EnumeratePhysicalDeviceGroupsKHX(instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
4507 {
4508 lock.lock();
4509 if (result == VK_SUCCESS) {
4510 if (nullptr != pPhysicalDeviceGroupProperties) {
4511 // NOTE: Each physical device should only appear in one group
4512 for (uint32_t i = 0; i < *pPhysicalDeviceGroupCount; i++) {
4513 for (uint32_t j = 0; j < pPhysicalDeviceGroupProperties[i].physicalDeviceCount; j++) {
4514 CreateObject(instance, pPhysicalDeviceGroupProperties[i].physicalDevices[j],
4515 VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, nullptr);
4516 }
4517 }
4518 }
4519 }
4520 lock.unlock();
4521 }
4522 return result;
4523}
4524
4525// VK_KHX_external_memory_capabilities Extension
4526VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceExternalBufferPropertiesKHX(
4527 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfoKHX *pExternalBufferInfo,
4528 VkExternalBufferPropertiesKHX *pExternalBufferProperties) {
4529 bool skip = false;
4530 {
4531 std::unique_lock<std::mutex> lock(global_lock);
4532 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4533 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
4534 }
4535 if (!skip) {
4536 get_dispatch_table(ot_instance_table_map, physicalDevice)
4537 ->GetPhysicalDeviceExternalBufferPropertiesKHX(physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
4538 }
4539}
4540
Mark Young0f183a82017-02-28 09:58:04 -07004541// VK_KHX_external_memory_fd Extension
4542VKAPI_ATTR VkResult VKAPI_CALL GetMemoryFdKHX(VkDevice device, VkDeviceMemory memory,
4543 VkExternalMemoryHandleTypeFlagBitsKHX handleType, int *pFd) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004544 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004545 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004546 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4547 VALIDATION_ERROR_UNDEFINED);
4548 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_UNDEFINED,
4549 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004550 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004551 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004552 return VK_ERROR_VALIDATION_FAILED_EXT;
4553 }
4554 VkResult result = VK_SUCCESS;
4555 result = get_dispatch_table(ot_device_table_map, device)->GetMemoryFdKHX(device, memory, handleType, pFd);
4556 return result;
4557}
4558
4559VKAPI_ATTR VkResult VKAPI_CALL GetMemoryFdPropertiesKHX(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHX handleType, int fd,
4560 VkMemoryFdPropertiesKHX *pMemoryFdProperties) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004561 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004562 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004563 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4564 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004565 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004566 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004567 return VK_ERROR_VALIDATION_FAILED_EXT;
4568 }
4569 VkResult result = VK_SUCCESS;
4570 result = get_dispatch_table(ot_device_table_map, device)->GetMemoryFdPropertiesKHX(device, handleType, fd, pMemoryFdProperties);
4571 return result;
4572}
4573
4574// VK_KHX_external_memory_win32 Extension
Jamie Madillc9a76922017-03-21 13:46:11 -04004575#ifdef VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07004576VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleKHX(VkDevice device, VkDeviceMemory memory,
4577 VkExternalMemoryHandleTypeFlagBitsKHX handleType, HANDLE *pHandle) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004578 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004579 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004580 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4581 VALIDATION_ERROR_UNDEFINED);
4582 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_UNDEFINED,
4583 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004584 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004585 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004586 return VK_ERROR_VALIDATION_FAILED_EXT;
4587 }
4588 VkResult result = VK_SUCCESS;
4589 result = get_dispatch_table(ot_device_table_map, device)->GetMemoryWin32HandleKHX(device, memory, handleType, pHandle);
4590 return result;
4591}
4592
4593VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandlePropertiesKHX(VkDevice device, VkExternalMemoryHandleTypeFlagBitsKHX handleType,
4594 HANDLE handle,
4595 VkMemoryWin32HandlePropertiesKHX *pMemoryWin32HandleProperties) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004596 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004597 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004598 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4599 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004600 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004601 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004602 return VK_ERROR_VALIDATION_FAILED_EXT;
4603 }
4604 VkResult result = VK_SUCCESS;
4605 result = get_dispatch_table(ot_device_table_map, device)
4606 ->GetMemoryWin32HandlePropertiesKHX(device, handleType, handle, pMemoryWin32HandleProperties);
4607 return result;
4608}
Jamie Madillc9a76922017-03-21 13:46:11 -04004609#endif // VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07004610
4611// VK_KHX_external_semaphore_capabilities Extension
4612VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceExternalSemaphorePropertiesKHX(
4613 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfoKHX *pExternalSemaphoreInfo,
4614 VkExternalSemaphorePropertiesKHX *pExternalSemaphoreProperties) {
4615 bool skip = false;
4616 {
4617 std::unique_lock<std::mutex> lock(global_lock);
4618 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4619 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
4620 }
4621 if (!skip) {
4622 get_dispatch_table(ot_instance_table_map, physicalDevice)
4623 ->GetPhysicalDeviceExternalSemaphorePropertiesKHX(physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
4624 }
4625}
4626
4627// VK_KHX_external_semaphore_fd Extension
4628VKAPI_ATTR VkResult VKAPI_CALL ImportSemaphoreFdKHX(VkDevice device, const VkImportSemaphoreFdInfoKHX *pImportSemaphoreFdInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004629 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004630 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004631 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4632 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004633 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004634 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004635 return VK_ERROR_VALIDATION_FAILED_EXT;
4636 }
4637 VkResult result = VK_SUCCESS;
4638 result = get_dispatch_table(ot_device_table_map, device)->ImportSemaphoreFdKHX(device, pImportSemaphoreFdInfo);
4639 return result;
4640}
4641
4642VKAPI_ATTR VkResult VKAPI_CALL GetSemaphoreFdKHX(VkDevice device, VkSemaphore semaphore,
4643 VkExternalSemaphoreHandleTypeFlagBitsKHX handleType, int *pFd) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004644 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004645 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004646 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4647 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004648 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004649 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004650 return VK_ERROR_VALIDATION_FAILED_EXT;
4651 }
4652 VkResult result = VK_SUCCESS;
4653 result = get_dispatch_table(ot_device_table_map, device)->GetSemaphoreFdKHX(device, semaphore, handleType, pFd);
4654 return result;
4655}
4656
4657// VK_KHX_external_semaphore_win32 Extension
Jamie Madillc9a76922017-03-21 13:46:11 -04004658#ifdef VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07004659VKAPI_ATTR VkResult VKAPI_CALL
4660ImportSemaphoreWin32HandleKHX(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHX *pImportSemaphoreWin32HandleInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004661 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004662 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004663 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4664 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004665 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004666 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004667 return VK_ERROR_VALIDATION_FAILED_EXT;
4668 }
4669 VkResult result = VK_SUCCESS;
4670 result =
4671 get_dispatch_table(ot_device_table_map, device)->ImportSemaphoreWin32HandleKHX(device, pImportSemaphoreWin32HandleInfo);
4672 return result;
4673}
4674
4675VKAPI_ATTR VkResult VKAPI_CALL GetSemaphoreWin32HandleKHX(VkDevice device, VkSemaphore semaphore,
4676 VkExternalSemaphoreHandleTypeFlagBitsKHX handleType, HANDLE *pHandle) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004677 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004678 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004679 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4680 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004681 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004682 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004683 return VK_ERROR_VALIDATION_FAILED_EXT;
4684 }
4685 VkResult result = VK_SUCCESS;
4686 result = get_dispatch_table(ot_device_table_map, device)->GetSemaphoreWin32HandleKHX(device, semaphore, handleType, pHandle);
4687 return result;
4688}
Jamie Madillc9a76922017-03-21 13:46:11 -04004689#endif // VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07004690
4691// VK_EXT_acquire_xlib_display Extension
4692#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
4693VKAPI_ATTR VkResult VKAPI_CALL AcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, VkDisplayKHR display) {
4694 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4695 bool skip = false;
4696 {
4697 std::unique_lock<std::mutex> lock(global_lock);
4698 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4699 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004700 skip |= ValidateObject(physicalDevice, display, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, false,
4701 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004702 }
4703 if (skip) {
4704 return VK_ERROR_VALIDATION_FAILED_EXT;
4705 }
4706 result = get_dispatch_table(ot_instance_table_map, physicalDevice)->AcquireXlibDisplayEXT(physicalDevice, dpy, display);
4707
4708 return result;
4709}
4710
4711VKAPI_ATTR VkResult VKAPI_CALL GetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, RROutput rrOutput,
4712 VkDisplayKHR *pDisplay) {
4713 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4714 bool skip = false;
4715 {
4716 std::unique_lock<std::mutex> lock(global_lock);
4717 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4718 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
4719 }
4720 if (skip) {
4721 return VK_ERROR_VALIDATION_FAILED_EXT;
4722 }
4723 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
4724 ->GetRandROutputDisplayEXT(physicalDevice, dpy, rrOutput, pDisplay);
4725 if (result == VK_SUCCESS && pDisplay != NULL) {
4726 std::lock_guard<std::mutex> lock(global_lock);
4727 CreateObject(physicalDevice, pDisplay, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, nullptr);
4728 }
4729
4730 return result;
4731}
4732#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
4733
4734// VK_EXT_debug_marker Extension
4735VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004736 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004737 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004738 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_02007,
4739 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004740 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004741 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004742 return VK_ERROR_VALIDATION_FAILED_EXT;
4743 }
4744 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06004745 VkResult result = dev_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
Mark Young0f183a82017-02-28 09:58:04 -07004746 return result;
4747}
4748
4749VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004750 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004751 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004752 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01999,
4753 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004754 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004755 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004756 return VK_ERROR_VALIDATION_FAILED_EXT;
4757 }
4758 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06004759 VkResult result = dev_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
Mark Young0f183a82017-02-28 09:58:04 -07004760 return result;
4761}
4762
4763VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004764 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004765 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004766 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4767 VALIDATION_ERROR_02014, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004768 lock.unlock();
4769 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004770 if (!skip && dev_data->dispatch_table.CmdDebugMarkerBeginEXT) {
Mark Young0f183a82017-02-28 09:58:04 -07004771 dev_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
4772 }
4773}
4774
4775VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerEndEXT(VkCommandBuffer commandBuffer) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004776 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004777 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004778 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4779 VALIDATION_ERROR_02022, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004780 lock.unlock();
4781 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004782 if (!skip && dev_data->dispatch_table.CmdDebugMarkerEndEXT) {
Mark Young0f183a82017-02-28 09:58:04 -07004783 dev_data->dispatch_table.CmdDebugMarkerEndEXT(commandBuffer);
4784 }
4785}
4786
4787VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004788 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004789 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004790 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4791 VALIDATION_ERROR_02025, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004792 lock.unlock();
4793 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004794 if (!skip && dev_data->dispatch_table.CmdDebugMarkerInsertEXT) {
Mark Young0f183a82017-02-28 09:58:04 -07004795 dev_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
4796 }
4797}
4798
4799// VK_EXT_direct_mode_display Extension
4800VKAPI_ATTR VkResult VKAPI_CALL ReleaseDisplayEXT(VkPhysicalDevice physicalDevice, VkDisplayKHR display) {
4801 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
4802 bool skip = false;
4803 {
4804 std::unique_lock<std::mutex> lock(global_lock);
4805 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4806 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004807 skip |= ValidateObject(physicalDevice, display, VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT, false,
4808 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004809 }
4810 if (skip) {
4811 return VK_ERROR_VALIDATION_FAILED_EXT;
4812 }
4813 result = get_dispatch_table(ot_instance_table_map, physicalDevice)->ReleaseDisplayEXT(physicalDevice, display);
4814
4815 return result;
4816}
4817
4818// VK_EXT_discard_rectangles
4819VKAPI_ATTR void VKAPI_CALL CmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4820 uint32_t discardRectangleCount, const VkRect2D *pDiscardRectangles) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004821 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004822 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004823 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4824 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004825 lock.unlock();
4826 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004827 if (!skip && dev_data->dispatch_table.CmdSetDiscardRectangleEXT) {
Mark Young0f183a82017-02-28 09:58:04 -07004828 dev_data->dispatch_table.CmdSetDiscardRectangleEXT(commandBuffer, firstDiscardRectangle, discardRectangleCount,
4829 pDiscardRectangles);
4830 }
4831}
4832
4833// VK_EXT_display_control Extension
4834VKAPI_ATTR VkResult VKAPI_CALL DisplayPowerControlEXT(VkDevice device, VkDisplayKHR display,
4835 const VkDisplayPowerInfoEXT *pDisplayPowerInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004836 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004837 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004838 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4839 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004840 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004841 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004842 return VK_ERROR_VALIDATION_FAILED_EXT;
4843 }
4844 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06004845 VkResult result = dev_data->dispatch_table.DisplayPowerControlEXT(device, display, pDisplayPowerInfo);
Mark Young0f183a82017-02-28 09:58:04 -07004846 return result;
4847}
4848
4849VKAPI_ATTR VkResult VKAPI_CALL RegisterDeviceEventEXT(VkDevice device, const VkDeviceEventInfoEXT *pDeviceEventInfo,
4850 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004851 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004852 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004853 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4854 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004855 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004856 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004857 return VK_ERROR_VALIDATION_FAILED_EXT;
4858 }
4859 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06004860 VkResult result = dev_data->dispatch_table.RegisterDeviceEventEXT(device, pDeviceEventInfo, pAllocator, pFence);
4861 if (result == VK_SUCCESS && pFence != NULL) {
4862 std::lock_guard<std::mutex> create_lock(global_lock);
4863 CreateObject(device, *pFence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Young0f183a82017-02-28 09:58:04 -07004864 }
4865 return result;
4866}
4867
4868VKAPI_ATTR VkResult VKAPI_CALL RegisterDisplayEventEXT(VkDevice device, VkDisplayKHR display,
4869 const VkDisplayEventInfoEXT *pDisplayEventInfo,
4870 const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004871 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004872 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004873 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4874 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004875 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004876 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004877 return VK_ERROR_VALIDATION_FAILED_EXT;
4878 }
4879 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06004880 VkResult result = dev_data->dispatch_table.RegisterDisplayEventEXT(device, display, pDisplayEventInfo, pAllocator, pFence);
4881 if (result == VK_SUCCESS && pFence != NULL) {
4882 std::lock_guard<std::mutex> create_lock(global_lock);
4883 CreateObject(device, *pFence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, pAllocator);
Mark Young0f183a82017-02-28 09:58:04 -07004884 }
4885 return result;
4886}
4887
4888VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainCounterEXT(VkDevice device, VkSwapchainKHR swapchain,
4889 VkSurfaceCounterFlagBitsEXT counter, uint64_t *pCounterValue) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004890 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004891 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004892 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
4893 VALIDATION_ERROR_UNDEFINED);
4894 skip |= ValidateObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false, VALIDATION_ERROR_UNDEFINED,
4895 VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004896 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004897 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004898 return VK_ERROR_VALIDATION_FAILED_EXT;
4899 }
4900 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06004901 VkResult result = dev_data->dispatch_table.GetSwapchainCounterEXT(device, swapchain, counter, pCounterValue);
Mark Young0f183a82017-02-28 09:58:04 -07004902 return result;
4903}
4904
4905// VK_EXT_display_surface_counter Extension
4906VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
4907 VkSurfaceCapabilities2EXT *pSurfaceCapabilities) {
4908 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004909 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004910 {
4911 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004912 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4913 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004914 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004915 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004916 return VK_ERROR_VALIDATION_FAILED_EXT;
4917 }
4918 result = get_dispatch_table(ot_instance_table_map, physicalDevice)
4919 ->GetPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, pSurfaceCapabilities);
4920
4921 return result;
4922}
4923
4924// VK_AMD_draw_indirect_count Extension
4925VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4926 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4927 uint32_t stride) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004928 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004929 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004930 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4931 VALIDATION_ERROR_01771, VALIDATION_ERROR_UNDEFINED);
4932 skip |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01772,
4933 VALIDATION_ERROR_01777);
4934 skip |= ValidateObject(commandBuffer, countBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01773,
4935 VALIDATION_ERROR_01777);
4936 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01774,
4937 VALIDATION_ERROR_01777);
Mark Young0f183a82017-02-28 09:58:04 -07004938 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004939 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004940 get_dispatch_table(ot_device_table_map, commandBuffer)
4941 ->CmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
4942 }
4943}
4944
4945VKAPI_ATTR void VKAPI_CALL CmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4946 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
4947 uint32_t maxDrawCount, uint32_t stride) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004948 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004949 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004950 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4951 VALIDATION_ERROR_01783, VALIDATION_ERROR_UNDEFINED);
4952 skip |= ValidateObject(commandBuffer, buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01784,
4953 VALIDATION_ERROR_01789);
4954 skip |= ValidateObject(commandBuffer, countBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01785,
4955 VALIDATION_ERROR_01789);
4956 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, false, VALIDATION_ERROR_01786,
4957 VALIDATION_ERROR_01789);
Mark Young0f183a82017-02-28 09:58:04 -07004958 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004959 if (!skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004960 get_dispatch_table(ot_device_table_map, commandBuffer)
4961 ->CmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
4962 }
4963}
4964
4965// VK_NV_clip_space_w_scaling Extension
4966VKAPI_ATTR void VKAPI_CALL CmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
4967 const VkViewportWScalingNV *pViewportWScalings) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004968 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07004969 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004970 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
4971 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004972 lock.unlock();
4973 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004974 if (!skip && dev_data->dispatch_table.CmdSetViewportWScalingNV) {
Mark Young0f183a82017-02-28 09:58:04 -07004975 dev_data->dispatch_table.CmdSetViewportWScalingNV(commandBuffer, firstViewport, viewportCount, pViewportWScalings);
4976 }
4977}
4978
4979// VK_NV_external_memory_capabilities Extension
4980VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceExternalImageFormatPropertiesNV(
4981 VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
4982 VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType,
4983 VkExternalImageFormatPropertiesNV *pExternalImageFormatProperties) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004984 bool skip = false;
Mark Young0f183a82017-02-28 09:58:04 -07004985 {
4986 std::lock_guard<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004987 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
4988 VALIDATION_ERROR_01980, VALIDATION_ERROR_UNDEFINED);
Mark Young0f183a82017-02-28 09:58:04 -07004989 }
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06004990 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07004991 return VK_ERROR_VALIDATION_FAILED_EXT;
4992 }
4993 VkResult result = get_dispatch_table(ot_instance_table_map, physicalDevice)
4994 ->GetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags,
4995 externalHandleType, pExternalImageFormatProperties);
4996 return result;
4997}
4998
4999#ifdef VK_USE_PLATFORM_WIN32_KHR
5000// VK_NV_external_memory_win32 Extension
5001VKAPI_ATTR VkResult VKAPI_CALL GetMemoryWin32HandleNV(VkDevice device, VkDeviceMemory memory,
5002 VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005003 bool skip = VK_FALSE;
Mark Young0f183a82017-02-28 09:58:04 -07005004 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005005 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_01725,
5006 VALIDATION_ERROR_UNDEFINED);
5007 skip |= ValidateObject(device, memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, false, VALIDATION_ERROR_01726,
5008 VALIDATION_ERROR_01730);
Mark Young0f183a82017-02-28 09:58:04 -07005009 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005010 if (skip) {
Mark Young0f183a82017-02-28 09:58:04 -07005011 return VK_ERROR_VALIDATION_FAILED_EXT;
5012 }
5013 VkResult result = get_dispatch_table(ot_device_table_map, device)->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
5014 return result;
5015}
5016#endif // VK_USE_PLATFORM_WIN32_KHR
5017
Mark Young39389872017-01-19 21:10:49 -07005018// VK_NVX_device_generated_commands Extension
5019VKAPI_ATTR void VKAPI_CALL CmdProcessCommandsNVX(VkCommandBuffer commandBuffer,
5020 const VkCmdProcessCommandsInfoNVX *pProcessCommandsInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005021 bool skip = VK_FALSE;
Mark Young39389872017-01-19 21:10:49 -07005022 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005023 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
5024 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07005025 lock.unlock();
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005026 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005027 if (!skip && dev_data->dispatch_table.CmdProcessCommandsNVX) {
Mark Young39389872017-01-19 21:10:49 -07005028 dev_data->dispatch_table.CmdProcessCommandsNVX(commandBuffer, pProcessCommandsInfo);
5029 }
5030}
5031
5032VKAPI_ATTR void VKAPI_CALL CmdReserveSpaceForCommandsNVX(VkCommandBuffer commandBuffer,
5033 const VkCmdReserveSpaceForCommandsInfoNVX *pReserveSpaceInfo) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005034 bool skip = VK_FALSE;
Mark Young39389872017-01-19 21:10:49 -07005035 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005036 skip |= ValidateObject(commandBuffer, commandBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, false,
5037 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07005038 lock.unlock();
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005039 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005040 if (!skip && dev_data->dispatch_table.CmdReserveSpaceForCommandsNVX) {
Mark Young39389872017-01-19 21:10:49 -07005041 dev_data->dispatch_table.CmdReserveSpaceForCommandsNVX(commandBuffer, pReserveSpaceInfo);
5042 }
5043}
5044
5045VKAPI_ATTR VkResult VKAPI_CALL CreateIndirectCommandsLayoutNVX(VkDevice device,
5046 const VkIndirectCommandsLayoutCreateInfoNVX *pCreateInfo,
5047 const VkAllocationCallbacks *pAllocator,
5048 VkIndirectCommandsLayoutNVX *pIndirectCommandsLayout) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005049 bool skip = VK_FALSE;
Mark Young39389872017-01-19 21:10:49 -07005050 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005051 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
5052 VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07005053 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005054 if (skip) {
Mark Young39389872017-01-19 21:10:49 -07005055 return VK_ERROR_VALIDATION_FAILED_EXT;
5056 }
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005057 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06005058 VkResult result =
5059 dev_data->dispatch_table.CreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout);
Mark Young39389872017-01-19 21:10:49 -07005060 return result;
5061}
5062
5063VKAPI_ATTR void VKAPI_CALL DestroyIndirectCommandsLayoutNVX(VkDevice device, VkIndirectCommandsLayoutNVX indirectCommandsLayout,
5064 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005065 bool skip = VK_FALSE;
Mark Young39389872017-01-19 21:10:49 -07005066 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005067 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
5068 VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07005069 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005070 if (!skip) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005071 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06005072 dev_data->dispatch_table.DestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator);
Mark Young39389872017-01-19 21:10:49 -07005073 }
5074}
5075
5076VKAPI_ATTR VkResult VKAPI_CALL CreateObjectTableNVX(VkDevice device, const VkObjectTableCreateInfoNVX *pCreateInfo,
5077 const VkAllocationCallbacks *pAllocator, VkObjectTableNVX *pObjectTable) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005078 bool skip = VK_FALSE;
Mark Young39389872017-01-19 21:10:49 -07005079 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005080 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
5081 VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07005082 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005083 if (skip) {
Mark Young39389872017-01-19 21:10:49 -07005084 return VK_ERROR_VALIDATION_FAILED_EXT;
5085 }
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005086 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06005087 VkResult result = dev_data->dispatch_table.CreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable);
Mark Young39389872017-01-19 21:10:49 -07005088 return result;
5089}
5090
5091VKAPI_ATTR void VKAPI_CALL DestroyObjectTableNVX(VkDevice device, VkObjectTableNVX objectTable,
5092 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005093 bool skip = VK_FALSE;
Mark Young39389872017-01-19 21:10:49 -07005094 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005095 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
5096 VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07005097 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005098 if (!skip) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005099 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06005100 dev_data->dispatch_table.DestroyObjectTableNVX(device, objectTable, pAllocator);
Mark Young39389872017-01-19 21:10:49 -07005101 }
5102}
5103
5104VKAPI_ATTR VkResult VKAPI_CALL RegisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
5105 const VkObjectTableEntryNVX *const *ppObjectTableEntries,
5106 const uint32_t *pObjectIndices) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005107 bool skip = VK_FALSE;
Mark Young39389872017-01-19 21:10:49 -07005108 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005109 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
5110 VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07005111 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005112 if (skip) {
Mark Young39389872017-01-19 21:10:49 -07005113 return VK_ERROR_VALIDATION_FAILED_EXT;
5114 }
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005115 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06005116 VkResult result =
5117 dev_data->dispatch_table.RegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices);
Mark Young39389872017-01-19 21:10:49 -07005118 return result;
5119}
5120
5121VKAPI_ATTR VkResult VKAPI_CALL UnregisterObjectsNVX(VkDevice device, VkObjectTableNVX objectTable, uint32_t objectCount,
5122 const VkObjectEntryTypeNVX *pObjectEntryTypes, const uint32_t *pObjectIndices) {
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005123 bool skip = VK_FALSE;
Mark Young39389872017-01-19 21:10:49 -07005124 std::unique_lock<std::mutex> lock(global_lock);
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005125 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
5126 VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07005127 lock.unlock();
Mark Lobodzinski14ecf022017-04-03 11:36:40 -06005128 if (skip) {
Mark Young39389872017-01-19 21:10:49 -07005129 return VK_ERROR_VALIDATION_FAILED_EXT;
5130 }
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005131 layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski2d84f5a2017-04-03 11:34:36 -06005132 VkResult result =
5133 dev_data->dispatch_table.UnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices);
Mark Young39389872017-01-19 21:10:49 -07005134 return result;
5135}
5136
5137VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceGeneratedCommandsPropertiesNVX(VkPhysicalDevice physicalDevice,
5138 VkDeviceGeneratedCommandsFeaturesNVX *pFeatures,
5139 VkDeviceGeneratedCommandsLimitsNVX *pLimits) {
5140 bool skip = false;
5141 {
5142 std::unique_lock<std::mutex> lock(global_lock);
5143 skip |= ValidateObject(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false,
Mike Schuchardtdc2cb782017-02-14 15:33:52 -07005144 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
Mark Young39389872017-01-19 21:10:49 -07005145 }
5146 if (skip) {
5147 get_dispatch_table(ot_instance_table_map, physicalDevice)
5148 ->GetPhysicalDeviceGeneratedCommandsPropertiesNVX(physicalDevice, pFeatures, pLimits);
5149 }
5150}
5151
Mark Lobodzinski1d218cc2017-03-14 10:12:43 -06005152VKAPI_ATTR VkResult VKAPI_CALL GetPastPresentationTimingGOOGLE(VkDevice device, VkSwapchainKHR swapchain,
5153 uint32_t *pPresentationTimingCount,
5154 VkPastPresentationTimingGOOGLE *pPresentationTimings) {
5155 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5156 bool skip = false;
5157 {
5158 std::unique_lock<std::mutex> lock(global_lock);
5159 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
5160 VALIDATION_ERROR_UNDEFINED);
5161 skip |= ValidateObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false, VALIDATION_ERROR_UNDEFINED,
5162 VALIDATION_ERROR_UNDEFINED);
5163 }
5164
5165 if (!skip) {
5166 result = get_dispatch_table(ot_device_table_map, device)
5167 ->GetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings);
5168 }
5169 return result;
5170}
5171
5172VKAPI_ATTR VkResult VKAPI_CALL GetRefreshCycleDurationGOOGLE(VkDevice device, VkSwapchainKHR swapchain,
5173 VkRefreshCycleDurationGOOGLE *pDisplayTimingProperties) {
5174 VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
5175 bool skip = false;
5176 {
5177 std::unique_lock<std::mutex> lock(global_lock);
5178 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
5179 VALIDATION_ERROR_UNDEFINED);
5180 skip |= ValidateObject(device, swapchain, VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false, VALIDATION_ERROR_UNDEFINED,
5181 VALIDATION_ERROR_UNDEFINED);
5182 }
5183
5184 if (!skip) {
5185 result = get_dispatch_table(ot_device_table_map, device)
5186 ->GetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties);
5187 }
5188 return result;
5189}
5190
5191VKAPI_ATTR void VKAPI_CALL SetHdrMetadataEXT(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR *pSwapchains,
5192 const VkHdrMetadataEXT *pMetadata) {
5193 bool skip = false;
5194 {
5195 std::lock_guard<std::mutex> lock(global_lock);
5196 if (pSwapchains) {
5197 for (uint32_t idx0 = 0; idx0 < swapchainCount; ++idx0) {
5198 skip |= ValidateObject(device, pSwapchains[idx0], VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, false,
5199 VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
5200 }
5201 }
5202 skip |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false, VALIDATION_ERROR_UNDEFINED,
5203 VALIDATION_ERROR_UNDEFINED);
5204 }
5205 if (!skip) {
5206 get_dispatch_table(ot_device_table_map, device)->SetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata);
5207 }
5208}
5209
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005210static inline PFN_vkVoidFunction InterceptCoreDeviceCommand(const char *name) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005211 if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005212
5213 name += 2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005214 if (!strcmp(name, "GetDeviceProcAddr")) return (PFN_vkVoidFunction)GetDeviceProcAddr;
5215 if (!strcmp(name, "DestroyDevice")) return (PFN_vkVoidFunction)DestroyDevice;
5216 if (!strcmp(name, "GetDeviceQueue")) return (PFN_vkVoidFunction)GetDeviceQueue;
5217 if (!strcmp(name, "QueueSubmit")) return (PFN_vkVoidFunction)QueueSubmit;
5218 if (!strcmp(name, "QueueWaitIdle")) return (PFN_vkVoidFunction)QueueWaitIdle;
5219 if (!strcmp(name, "DeviceWaitIdle")) return (PFN_vkVoidFunction)DeviceWaitIdle;
5220 if (!strcmp(name, "AllocateMemory")) return (PFN_vkVoidFunction)AllocateMemory;
5221 if (!strcmp(name, "FreeMemory")) return (PFN_vkVoidFunction)FreeMemory;
5222 if (!strcmp(name, "MapMemory")) return (PFN_vkVoidFunction)MapMemory;
5223 if (!strcmp(name, "UnmapMemory")) return (PFN_vkVoidFunction)UnmapMemory;
5224 if (!strcmp(name, "FlushMappedMemoryRanges")) return (PFN_vkVoidFunction)FlushMappedMemoryRanges;
5225 if (!strcmp(name, "InvalidateMappedMemoryRanges")) return (PFN_vkVoidFunction)InvalidateMappedMemoryRanges;
5226 if (!strcmp(name, "GetDeviceMemoryCommitment")) return (PFN_vkVoidFunction)GetDeviceMemoryCommitment;
5227 if (!strcmp(name, "BindBufferMemory")) return (PFN_vkVoidFunction)BindBufferMemory;
5228 if (!strcmp(name, "BindImageMemory")) return (PFN_vkVoidFunction)BindImageMemory;
5229 if (!strcmp(name, "GetBufferMemoryRequirements")) return (PFN_vkVoidFunction)GetBufferMemoryRequirements;
5230 if (!strcmp(name, "GetImageMemoryRequirements")) return (PFN_vkVoidFunction)GetImageMemoryRequirements;
5231 if (!strcmp(name, "GetImageSparseMemoryRequirements")) return (PFN_vkVoidFunction)GetImageSparseMemoryRequirements;
5232 if (!strcmp(name, "QueueBindSparse")) return (PFN_vkVoidFunction)QueueBindSparse;
5233 if (!strcmp(name, "CreateFence")) return (PFN_vkVoidFunction)CreateFence;
5234 if (!strcmp(name, "DestroyFence")) return (PFN_vkVoidFunction)DestroyFence;
5235 if (!strcmp(name, "ResetFences")) return (PFN_vkVoidFunction)ResetFences;
5236 if (!strcmp(name, "GetFenceStatus")) return (PFN_vkVoidFunction)GetFenceStatus;
5237 if (!strcmp(name, "WaitForFences")) return (PFN_vkVoidFunction)WaitForFences;
5238 if (!strcmp(name, "CreateSemaphore")) return (PFN_vkVoidFunction)CreateSemaphore;
5239 if (!strcmp(name, "DestroySemaphore")) return (PFN_vkVoidFunction)DestroySemaphore;
5240 if (!strcmp(name, "CreateEvent")) return (PFN_vkVoidFunction)CreateEvent;
5241 if (!strcmp(name, "DestroyEvent")) return (PFN_vkVoidFunction)DestroyEvent;
5242 if (!strcmp(name, "GetEventStatus")) return (PFN_vkVoidFunction)GetEventStatus;
5243 if (!strcmp(name, "SetEvent")) return (PFN_vkVoidFunction)SetEvent;
5244 if (!strcmp(name, "ResetEvent")) return (PFN_vkVoidFunction)ResetEvent;
5245 if (!strcmp(name, "CreateQueryPool")) return (PFN_vkVoidFunction)CreateQueryPool;
5246 if (!strcmp(name, "DestroyQueryPool")) return (PFN_vkVoidFunction)DestroyQueryPool;
5247 if (!strcmp(name, "GetQueryPoolResults")) return (PFN_vkVoidFunction)GetQueryPoolResults;
5248 if (!strcmp(name, "CreateBuffer")) return (PFN_vkVoidFunction)CreateBuffer;
5249 if (!strcmp(name, "DestroyBuffer")) return (PFN_vkVoidFunction)DestroyBuffer;
5250 if (!strcmp(name, "CreateBufferView")) return (PFN_vkVoidFunction)CreateBufferView;
5251 if (!strcmp(name, "DestroyBufferView")) return (PFN_vkVoidFunction)DestroyBufferView;
5252 if (!strcmp(name, "CreateImage")) return (PFN_vkVoidFunction)CreateImage;
5253 if (!strcmp(name, "DestroyImage")) return (PFN_vkVoidFunction)DestroyImage;
5254 if (!strcmp(name, "GetImageSubresourceLayout")) return (PFN_vkVoidFunction)GetImageSubresourceLayout;
5255 if (!strcmp(name, "CreateImageView")) return (PFN_vkVoidFunction)CreateImageView;
5256 if (!strcmp(name, "DestroyImageView")) return (PFN_vkVoidFunction)DestroyImageView;
5257 if (!strcmp(name, "CreateShaderModule")) return (PFN_vkVoidFunction)CreateShaderModule;
5258 if (!strcmp(name, "DestroyShaderModule")) return (PFN_vkVoidFunction)DestroyShaderModule;
5259 if (!strcmp(name, "CreatePipelineCache")) return (PFN_vkVoidFunction)CreatePipelineCache;
5260 if (!strcmp(name, "DestroyPipelineCache")) return (PFN_vkVoidFunction)DestroyPipelineCache;
5261 if (!strcmp(name, "GetPipelineCacheData")) return (PFN_vkVoidFunction)GetPipelineCacheData;
5262 if (!strcmp(name, "MergePipelineCaches")) return (PFN_vkVoidFunction)MergePipelineCaches;
5263 if (!strcmp(name, "CreateGraphicsPipelines")) return (PFN_vkVoidFunction)CreateGraphicsPipelines;
5264 if (!strcmp(name, "CreateComputePipelines")) return (PFN_vkVoidFunction)CreateComputePipelines;
5265 if (!strcmp(name, "DestroyPipeline")) return (PFN_vkVoidFunction)DestroyPipeline;
5266 if (!strcmp(name, "CreatePipelineLayout")) return (PFN_vkVoidFunction)CreatePipelineLayout;
5267 if (!strcmp(name, "DestroyPipelineLayout")) return (PFN_vkVoidFunction)DestroyPipelineLayout;
5268 if (!strcmp(name, "CreateSampler")) return (PFN_vkVoidFunction)CreateSampler;
5269 if (!strcmp(name, "DestroySampler")) return (PFN_vkVoidFunction)DestroySampler;
5270 if (!strcmp(name, "CreateDescriptorSetLayout")) return (PFN_vkVoidFunction)CreateDescriptorSetLayout;
5271 if (!strcmp(name, "DestroyDescriptorSetLayout")) return (PFN_vkVoidFunction)DestroyDescriptorSetLayout;
5272 if (!strcmp(name, "CreateDescriptorPool")) return (PFN_vkVoidFunction)CreateDescriptorPool;
5273 if (!strcmp(name, "DestroyDescriptorPool")) return (PFN_vkVoidFunction)DestroyDescriptorPool;
5274 if (!strcmp(name, "ResetDescriptorPool")) return (PFN_vkVoidFunction)ResetDescriptorPool;
5275 if (!strcmp(name, "AllocateDescriptorSets")) return (PFN_vkVoidFunction)AllocateDescriptorSets;
5276 if (!strcmp(name, "FreeDescriptorSets")) return (PFN_vkVoidFunction)FreeDescriptorSets;
5277 if (!strcmp(name, "UpdateDescriptorSets")) return (PFN_vkVoidFunction)UpdateDescriptorSets;
5278 if (!strcmp(name, "CreateFramebuffer")) return (PFN_vkVoidFunction)CreateFramebuffer;
5279 if (!strcmp(name, "DestroyFramebuffer")) return (PFN_vkVoidFunction)DestroyFramebuffer;
5280 if (!strcmp(name, "CreateRenderPass")) return (PFN_vkVoidFunction)CreateRenderPass;
5281 if (!strcmp(name, "DestroyRenderPass")) return (PFN_vkVoidFunction)DestroyRenderPass;
5282 if (!strcmp(name, "GetRenderAreaGranularity")) return (PFN_vkVoidFunction)GetRenderAreaGranularity;
5283 if (!strcmp(name, "CreateCommandPool")) return (PFN_vkVoidFunction)CreateCommandPool;
5284 if (!strcmp(name, "DestroyCommandPool")) return (PFN_vkVoidFunction)DestroyCommandPool;
5285 if (!strcmp(name, "ResetCommandPool")) return (PFN_vkVoidFunction)ResetCommandPool;
5286 if (!strcmp(name, "AllocateCommandBuffers")) return (PFN_vkVoidFunction)AllocateCommandBuffers;
5287 if (!strcmp(name, "FreeCommandBuffers")) return (PFN_vkVoidFunction)FreeCommandBuffers;
5288 if (!strcmp(name, "BeginCommandBuffer")) return (PFN_vkVoidFunction)BeginCommandBuffer;
5289 if (!strcmp(name, "EndCommandBuffer")) return (PFN_vkVoidFunction)EndCommandBuffer;
5290 if (!strcmp(name, "ResetCommandBuffer")) return (PFN_vkVoidFunction)ResetCommandBuffer;
5291 if (!strcmp(name, "CmdBindPipeline")) return (PFN_vkVoidFunction)CmdBindPipeline;
5292 if (!strcmp(name, "CmdSetViewport")) return (PFN_vkVoidFunction)CmdSetViewport;
5293 if (!strcmp(name, "CmdSetScissor")) return (PFN_vkVoidFunction)CmdSetScissor;
5294 if (!strcmp(name, "CmdSetLineWidth")) return (PFN_vkVoidFunction)CmdSetLineWidth;
5295 if (!strcmp(name, "CmdSetDepthBias")) return (PFN_vkVoidFunction)CmdSetDepthBias;
5296 if (!strcmp(name, "CmdSetBlendConstants")) return (PFN_vkVoidFunction)CmdSetBlendConstants;
5297 if (!strcmp(name, "CmdSetDepthBounds")) return (PFN_vkVoidFunction)CmdSetDepthBounds;
5298 if (!strcmp(name, "CmdSetStencilCompareMask")) return (PFN_vkVoidFunction)CmdSetStencilCompareMask;
5299 if (!strcmp(name, "CmdSetStencilWriteMask")) return (PFN_vkVoidFunction)CmdSetStencilWriteMask;
5300 if (!strcmp(name, "CmdSetStencilReference")) return (PFN_vkVoidFunction)CmdSetStencilReference;
5301 if (!strcmp(name, "CmdBindDescriptorSets")) return (PFN_vkVoidFunction)CmdBindDescriptorSets;
5302 if (!strcmp(name, "CmdBindIndexBuffer")) return (PFN_vkVoidFunction)CmdBindIndexBuffer;
5303 if (!strcmp(name, "CmdBindVertexBuffers")) return (PFN_vkVoidFunction)CmdBindVertexBuffers;
5304 if (!strcmp(name, "CmdDraw")) return (PFN_vkVoidFunction)CmdDraw;
5305 if (!strcmp(name, "CmdDrawIndexed")) return (PFN_vkVoidFunction)CmdDrawIndexed;
5306 if (!strcmp(name, "CmdDrawIndirect")) return (PFN_vkVoidFunction)CmdDrawIndirect;
5307 if (!strcmp(name, "CmdDrawIndexedIndirect")) return (PFN_vkVoidFunction)CmdDrawIndexedIndirect;
5308 if (!strcmp(name, "CmdDispatch")) return (PFN_vkVoidFunction)CmdDispatch;
5309 if (!strcmp(name, "CmdDispatchIndirect")) return (PFN_vkVoidFunction)CmdDispatchIndirect;
5310 if (!strcmp(name, "CmdCopyBuffer")) return (PFN_vkVoidFunction)CmdCopyBuffer;
5311 if (!strcmp(name, "CmdCopyImage")) return (PFN_vkVoidFunction)CmdCopyImage;
5312 if (!strcmp(name, "CmdBlitImage")) return (PFN_vkVoidFunction)CmdBlitImage;
5313 if (!strcmp(name, "CmdCopyBufferToImage")) return (PFN_vkVoidFunction)CmdCopyBufferToImage;
5314 if (!strcmp(name, "CmdCopyImageToBuffer")) return (PFN_vkVoidFunction)CmdCopyImageToBuffer;
5315 if (!strcmp(name, "CmdUpdateBuffer")) return (PFN_vkVoidFunction)CmdUpdateBuffer;
5316 if (!strcmp(name, "CmdFillBuffer")) return (PFN_vkVoidFunction)CmdFillBuffer;
5317 if (!strcmp(name, "CmdClearColorImage")) return (PFN_vkVoidFunction)CmdClearColorImage;
5318 if (!strcmp(name, "CmdClearDepthStencilImage")) return (PFN_vkVoidFunction)CmdClearDepthStencilImage;
5319 if (!strcmp(name, "CmdClearAttachments")) return (PFN_vkVoidFunction)CmdClearAttachments;
5320 if (!strcmp(name, "CmdResolveImage")) return (PFN_vkVoidFunction)CmdResolveImage;
5321 if (!strcmp(name, "CmdSetEvent")) return (PFN_vkVoidFunction)CmdSetEvent;
5322 if (!strcmp(name, "CmdResetEvent")) return (PFN_vkVoidFunction)CmdResetEvent;
5323 if (!strcmp(name, "CmdWaitEvents")) return (PFN_vkVoidFunction)CmdWaitEvents;
5324 if (!strcmp(name, "CmdPipelineBarrier")) return (PFN_vkVoidFunction)CmdPipelineBarrier;
5325 if (!strcmp(name, "CmdBeginQuery")) return (PFN_vkVoidFunction)CmdBeginQuery;
5326 if (!strcmp(name, "CmdEndQuery")) return (PFN_vkVoidFunction)CmdEndQuery;
5327 if (!strcmp(name, "CmdResetQueryPool")) return (PFN_vkVoidFunction)CmdResetQueryPool;
5328 if (!strcmp(name, "CmdWriteTimestamp")) return (PFN_vkVoidFunction)CmdWriteTimestamp;
5329 if (!strcmp(name, "CmdCopyQueryPoolResults")) return (PFN_vkVoidFunction)CmdCopyQueryPoolResults;
5330 if (!strcmp(name, "CmdPushConstants")) return (PFN_vkVoidFunction)CmdPushConstants;
5331 if (!strcmp(name, "CmdBeginRenderPass")) return (PFN_vkVoidFunction)CmdBeginRenderPass;
5332 if (!strcmp(name, "CmdNextSubpass")) return (PFN_vkVoidFunction)CmdNextSubpass;
5333 if (!strcmp(name, "CmdEndRenderPass")) return (PFN_vkVoidFunction)CmdEndRenderPass;
5334 if (!strcmp(name, "CmdExecuteCommands")) return (PFN_vkVoidFunction)CmdExecuteCommands;
5335 if (!strcmp(name, "DebugMarkerSetObjectTagEXT")) return (PFN_vkVoidFunction)DebugMarkerSetObjectTagEXT;
5336 if (!strcmp(name, "DebugMarkerSetObjectNameEXT")) return (PFN_vkVoidFunction)DebugMarkerSetObjectNameEXT;
5337 if (!strcmp(name, "CmdDebugMarkerBeginEXT")) return (PFN_vkVoidFunction)CmdDebugMarkerBeginEXT;
5338 if (!strcmp(name, "CmdDebugMarkerEndEXT")) return (PFN_vkVoidFunction)CmdDebugMarkerEndEXT;
5339 if (!strcmp(name, "CmdDebugMarkerInsertEXT")) return (PFN_vkVoidFunction)CmdDebugMarkerInsertEXT;
Mark Lobodzinski8cc72bd2016-09-28 12:53:27 -06005340#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005341 if (!strcmp(name, "GetMemoryWin32HandleNV")) return (PFN_vkVoidFunction)GetMemoryWin32HandleNV;
5342#endif // VK_USE_PLATFORM_WIN32_KHR
5343 if (!strcmp(name, "CmdDrawIndirectCountAMD")) return (PFN_vkVoidFunction)CmdDrawIndirectCountAMD;
5344 if (!strcmp(name, "CmdDrawIndexedIndirectCountAMD")) return (PFN_vkVoidFunction)CmdDrawIndexedIndirectCountAMD;
Mark Lobodzinski1d218cc2017-03-14 10:12:43 -06005345 if (!strcmp(name, "GetPastPresentationTimingGOOGLE")) return (PFN_vkVoidFunction)GetPastPresentationTimingGOOGLE;
5346 if (!strcmp(name, "GetRefreshCycleDurationGOOGLE")) return (PFN_vkVoidFunction)GetRefreshCycleDurationGOOGLE;
5347 if (!strcmp(name, "SetHdrMetadataEXT")) return (PFN_vkVoidFunction)SetHdrMetadataEXT;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005348
5349 return NULL;
5350}
Mark Young39389872017-01-19 21:10:49 -07005351
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005352static inline PFN_vkVoidFunction InterceptCoreInstanceCommand(const char *name) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005353 if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005354
5355 name += 2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005356 if (!strcmp(name, "CreateInstance")) return (PFN_vkVoidFunction)CreateInstance;
5357 if (!strcmp(name, "DestroyInstance")) return (PFN_vkVoidFunction)DestroyInstance;
5358 if (!strcmp(name, "EnumeratePhysicalDevices")) return (PFN_vkVoidFunction)EnumeratePhysicalDevices;
5359 if (!strcmp(name, "_layerGetPhysicalDeviceProcAddr")) return (PFN_vkVoidFunction)GetPhysicalDeviceProcAddr;
5360 if (!strcmp(name, "GetPhysicalDeviceFeatures")) return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures;
5361 if (!strcmp(name, "GetPhysicalDeviceFormatProperties")) return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties;
5362 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties")) return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties;
5363 if (!strcmp(name, "GetPhysicalDeviceProperties")) return (PFN_vkVoidFunction)GetPhysicalDeviceProperties;
5364 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties")) return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties;
5365 if (!strcmp(name, "GetPhysicalDeviceMemoryProperties")) return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties;
5366 if (!strcmp(name, "GetInstanceProcAddr")) return (PFN_vkVoidFunction)GetInstanceProcAddr;
5367 if (!strcmp(name, "CreateDevice")) return (PFN_vkVoidFunction)CreateDevice;
5368 if (!strcmp(name, "EnumerateInstanceExtensionProperties")) return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
5369 if (!strcmp(name, "EnumerateInstanceLayerProperties")) return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties;
5370 if (!strcmp(name, "EnumerateDeviceLayerProperties")) return (PFN_vkVoidFunction)EnumerateDeviceLayerProperties;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005371 if (!strcmp(name, "GetPhysicalDeviceSparseImageFormatProperties"))
5372 return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties;
Mark Lobodzinski5fcb92b2016-09-28 12:48:56 -06005373 if (!strcmp(name, "GetPhysicalDeviceExternalImageFormatPropertiesNV"))
5374 return (PFN_vkVoidFunction)GetPhysicalDeviceExternalImageFormatPropertiesNV;
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005375
5376 return NULL;
5377}
5378
Mark Young39389872017-01-19 21:10:49 -07005379static inline PFN_vkVoidFunction InterceptInstanceExtensionCommand(const char *name) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005380 if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
Mark Young39389872017-01-19 21:10:49 -07005381
5382 name += 2;
5383
5384 // VK_KHR_get_physical_device_properties2 Extension
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005385 if (!strcmp(name, "GetPhysicalDeviceFeatures2KHR")) return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures2KHR;
5386 if (!strcmp(name, "GetPhysicalDeviceProperties2KHR")) return (PFN_vkVoidFunction)GetPhysicalDeviceProperties2KHR;
5387 if (!strcmp(name, "GetPhysicalDeviceFormatProperties2KHR")) return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties2KHR;
Mark Young39389872017-01-19 21:10:49 -07005388 if (!strcmp(name, "GetPhysicalDeviceImageFormatProperties2KHR"))
5389 return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties2KHR;
5390 if (!strcmp(name, "GetPhysicalDeviceQueueFamilyProperties2KHR"))
5391 return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties2KHR;
Mark Young0f183a82017-02-28 09:58:04 -07005392 // VK_KHX_device_group Extension
5393 if (!strcmp(name, "GetPhysicalDevicePresentRectanglesKHX")) return (PFN_vkVoidFunction)GetPhysicalDevicePresentRectanglesKHX;
5394 // VK_KHX_device_group_creation Extension
5395 if (!strcmp(name, "EnumeratePhysicalDeviceGroupsKHX")) return (PFN_vkVoidFunction)EnumeratePhysicalDeviceGroupsKHX;
5396 // VK_KHX_external_memory_capabilities Extension
5397 if (!strcmp(name, "GetPhysicalDeviceExternalBufferPropertiesKHX"))
5398 return (PFN_vkVoidFunction)GetPhysicalDeviceExternalBufferPropertiesKHX;
Mark Young0f183a82017-02-28 09:58:04 -07005399 // VK_KHX_external_semaphore_capabilities Extension
5400 if (!strcmp(name, "GetPhysicalDeviceExternalSemaphorePropertiesKHX"))
5401 return (PFN_vkVoidFunction)GetPhysicalDeviceExternalSemaphorePropertiesKHX;
Mark Young39389872017-01-19 21:10:49 -07005402#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
5403 // VK_EXT_acquire_xlib_display Extension
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005404 if (!strcmp(name, "AcquireXlibDisplayEXT")) return (PFN_vkVoidFunction)AcquireXlibDisplayEXT;
5405 if (!strcmp(name, "GetRandROutputDisplayEXT")) return (PFN_vkVoidFunction)GetRandROutputDisplayEXT;
5406#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
Mark Young0f183a82017-02-28 09:58:04 -07005407 // VK_EXT_direct_mode_display Extension
5408 if (!strcmp(name, "ReleaseDisplayEXT")) return (PFN_vkVoidFunction)ReleaseDisplayEXT;
Mark Young39389872017-01-19 21:10:49 -07005409 // VK_EXT_display_surface_counter Extension
5410 if (!strcmp(name, "GetPhysicalDeviceSurfaceCapabilities2EXT"))
5411 return (PFN_vkVoidFunction)GetPhysicalDeviceSurfaceCapabilities2EXT;
Mark Young0f183a82017-02-28 09:58:04 -07005412 // VK_NV_clip_space_w_scaling Extension
5413 if (!strcmp(name, "CmdSetViewportWScalingNV")) return (PFN_vkVoidFunction)CmdSetViewportWScalingNV;
5414 // VK_NVX_device_generated_commands Extension
5415 if (!strcmp(name, "GetPhysicalDeviceGeneratedCommandsPropertiesNVX"))
5416 return (PFN_vkVoidFunction)GetPhysicalDeviceGeneratedCommandsPropertiesNVX;
5417
5418 return NULL;
5419}
5420
5421static inline PFN_vkVoidFunction InterceptDeviceExtensionCommand(const char *name, VkDevice device) {
5422 if (device) {
5423 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
5424
5425 if (!name || name[0] != 'v' || name[1] != 'k') return NULL;
5426
5427 name += 2;
5428
5429 if (device_data->enables.khr_descriptor_update_template) {
5430 if (!strcmp(name, "CreateDescriptorUpdateTemplateKHR")) return (PFN_vkVoidFunction)CreateDescriptorUpdateTemplateKHR;
5431 if (!strcmp(name, "DestroyDescriptorUpdateTemplateKHR")) return (PFN_vkVoidFunction)DestroyDescriptorUpdateTemplateKHR;
5432 if (!strcmp(name, "UpdateDescriptorSetWithTemplateKHR")) return (PFN_vkVoidFunction)UpdateDescriptorSetWithTemplateKHR;
5433 if (!strcmp(name, "CmdPushDescriptorSetWithTemplateKHR"))
5434 return (PFN_vkVoidFunction)CmdPushDescriptorSetWithTemplateKHR;
5435 }
5436 if (device_data->enables.khr_maintenance1) {
5437 if (!strcmp(name, "TrimCommandPoolKHR")) return (PFN_vkVoidFunction)TrimCommandPoolKHR;
5438 }
5439 if (device_data->enables.khr_push_descriptor) {
5440 if (!strcmp(name, "CmdPushDescriptorSetKHR")) return (PFN_vkVoidFunction)CmdPushDescriptorSetKHR;
5441 }
5442 if (device_data->enables.khx_device_group) {
5443 // VK_KHX_device_group Extension
5444 if (!strcmp(name, "GetDeviceGroupPeerMemoryFeaturesKHX"))
5445 return (PFN_vkVoidFunction)GetDeviceGroupPeerMemoryFeaturesKHX;
5446 if (!strcmp(name, "BindBufferMemory2KHX")) return (PFN_vkVoidFunction)BindBufferMemory2KHX;
5447 if (!strcmp(name, "BindImageMemory2KHX")) return (PFN_vkVoidFunction)BindImageMemory2KHX;
5448 if (!strcmp(name, "CmdSetDeviceMaskKHX")) return (PFN_vkVoidFunction)CmdSetDeviceMaskKHX;
5449 if (!strcmp(name, "GetDeviceGroupPresentCapabilitiesKHX"))
5450 return (PFN_vkVoidFunction)GetDeviceGroupPresentCapabilitiesKHX;
5451 if (!strcmp(name, "GetDeviceGroupSurfacePresentModesKHX"))
5452 return (PFN_vkVoidFunction)GetDeviceGroupSurfacePresentModesKHX;
5453 if (!strcmp(name, "AcquireNextImage2KHX")) return (PFN_vkVoidFunction)AcquireNextImage2KHX;
5454 if (!strcmp(name, "CmdDispatchBaseKHX")) return (PFN_vkVoidFunction)CmdDispatchBaseKHX;
5455 }
Jamie Madillc9a76922017-03-21 13:46:11 -04005456#ifdef VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07005457 if (device_data->enables.khx_external_memory_win32) {
5458 if (!strcmp(name, "GetMemoryWin32HandleKHX")) return (PFN_vkVoidFunction)GetMemoryWin32HandleKHX;
5459 if (!strcmp(name, "GetMemoryWin32HandlePropertiesKHX")) return (PFN_vkVoidFunction)GetMemoryWin32HandlePropertiesKHX;
5460 }
Jamie Madillc9a76922017-03-21 13:46:11 -04005461#endif // VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07005462 if (device_data->enables.khx_external_memory_fd) {
5463 if (!strcmp(name, "GetMemoryFdKHX")) return (PFN_vkVoidFunction)GetMemoryFdKHX;
5464 if (!strcmp(name, "GetMemoryFdPropertiesKHX")) return (PFN_vkVoidFunction)GetMemoryFdPropertiesKHX;
5465 }
Jamie Madillc9a76922017-03-21 13:46:11 -04005466#ifdef VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07005467 if (device_data->enables.khx_external_semaphore_win32) {
5468 if (!strcmp(name, "ImportSemaphoreWin32HandleKHX")) return (PFN_vkVoidFunction)ImportSemaphoreWin32HandleKHX;
5469 if (!strcmp(name, "GetSemaphoreWin32HandleKHX")) return (PFN_vkVoidFunction)GetSemaphoreWin32HandleKHX;
5470 }
Jamie Madillc9a76922017-03-21 13:46:11 -04005471#endif // VK_USE_PLATFORM_WIN32_KHX
Mark Young0f183a82017-02-28 09:58:04 -07005472 if (device_data->enables.khx_external_semaphore_fd) {
5473 if (!strcmp(name, "ImportSemaphoreFdKHX")) return (PFN_vkVoidFunction)ImportSemaphoreFdKHX;
5474 if (!strcmp(name, "GetSemaphoreFdKHX")) return (PFN_vkVoidFunction)GetSemaphoreFdKHX;
5475 }
5476 if (device_data->enables.ext_discard_rectangles) {
5477 if (!strcmp(name, "CmdSetDiscardRectangleEXT")) return (PFN_vkVoidFunction)CmdSetDiscardRectangleEXT;
5478 }
5479 if (device_data->enables.ext_display_control) {
5480 if (!strcmp(name, "DisplayPowerControlEXT")) return (PFN_vkVoidFunction)DisplayPowerControlEXT;
5481 if (!strcmp(name, "RegisterDeviceEventEXT")) return (PFN_vkVoidFunction)RegisterDeviceEventEXT;
5482 if (!strcmp(name, "RegisterDisplayEventEXT")) return (PFN_vkVoidFunction)RegisterDisplayEventEXT;
5483 if (!strcmp(name, "GetSwapchainCounterEXT")) return (PFN_vkVoidFunction)GetSwapchainCounterEXT;
5484 }
5485 if (device_data->enables.nvx_device_generated_commands) {
5486 if (!strcmp(name, "CmdProcessCommandsNVX")) return (PFN_vkVoidFunction)CmdProcessCommandsNVX;
5487 if (!strcmp(name, "CmdReserveSpaceForCommandsNVX")) return (PFN_vkVoidFunction)CmdReserveSpaceForCommandsNVX;
5488 if (!strcmp(name, "CreateIndirectCommandsLayoutNVX")) return (PFN_vkVoidFunction)CreateIndirectCommandsLayoutNVX;
5489 if (!strcmp(name, "DestroyIndirectCommandsLayoutNVX")) return (PFN_vkVoidFunction)DestroyIndirectCommandsLayoutNVX;
5490 if (!strcmp(name, "CreateObjectTableNVX")) return (PFN_vkVoidFunction)CreateObjectTableNVX;
5491 if (!strcmp(name, "DestroyObjectTableNVX")) return (PFN_vkVoidFunction)DestroyObjectTableNVX;
5492 if (!strcmp(name, "RegisterObjectsNVX")) return (PFN_vkVoidFunction)RegisterObjectsNVX;
5493 if (!strcmp(name, "UnregisterObjectsNVX")) return (PFN_vkVoidFunction)UnregisterObjectsNVX;
5494 }
5495 }
Mark Young39389872017-01-19 21:10:49 -07005496
5497 return NULL;
5498}
5499
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005500static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, VkDevice device) {
5501 if (device) {
Tobin Ehlis8d6acde2017-02-08 07:40:40 -07005502 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Youngead9b932016-09-08 12:28:38 -06005503
Mark Young0f183a82017-02-28 09:58:04 -07005504 if (device_data->enables.wsi) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005505 if (!strcmp("vkCreateSwapchainKHR", name)) return reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR);
5506 if (!strcmp("vkDestroySwapchainKHR", name)) return reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR);
5507 if (!strcmp("vkGetSwapchainImagesKHR", name)) return reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR);
5508 if (!strcmp("vkAcquireNextImageKHR", name)) return reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR);
5509 if (!strcmp("vkQueuePresentKHR", name)) return reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR);
Mark Youngead9b932016-09-08 12:28:38 -06005510 }
5511
Mark Young0f183a82017-02-28 09:58:04 -07005512 if (device_data->enables.wsi_display_swapchain) {
Mark Youngead9b932016-09-08 12:28:38 -06005513 if (!strcmp("vkCreateSharedSwapchainsKHR", name)) {
5514 return reinterpret_cast<PFN_vkVoidFunction>(CreateSharedSwapchainsKHR);
5515 }
5516 }
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07005517
Mark Young0f183a82017-02-28 09:58:04 -07005518 if (device_data->enables.wsi_display_extension) {
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07005519 if (!strcmp("vkGetPhysicalDeviceDisplayPropertiesKHR", name))
5520 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR);
5521 if (!strcmp("vkGetPhysicalDeviceDisplayPlanePropertiesKHR", name))
5522 return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR);
5523 if (!strcmp("vkGetDisplayPlaneSupportedDisplaysKHR", name))
5524 return reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR);
5525 if (!strcmp("vkGetDisplayModePropertiesKHR", name))
5526 return reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005527 if (!strcmp("vkCreateDisplayModeKHR", name)) return reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR);
Mark Lobodzinski39853ea2016-11-14 10:00:41 -07005528 if (!strcmp("vkGetDisplayPlaneCapabilitiesKHR", name))
5529 return reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR);
5530 if (!strcmp("vkCreateDisplayPlaneSurfaceKHR", name))
5531 return reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR);
5532 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005533 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005534
5535 return nullptr;
5536}
5537
5538VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
5539 PFN_vkVoidFunction addr;
5540 addr = InterceptCoreDeviceCommand(funcName);
5541 if (addr) {
5542 return addr;
5543 }
5544 assert(device);
5545
5546 addr = InterceptWsiEnabledCommand(funcName, device);
5547 if (addr) {
5548 return addr;
5549 }
Mark Young39389872017-01-19 21:10:49 -07005550 addr = InterceptDeviceExtensionCommand(funcName, device);
5551 if (addr) {
5552 return addr;
5553 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005554 if (get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr == NULL) {
5555 return NULL;
5556 }
5557 return get_dispatch_table(ot_device_table_map, device)->GetDeviceProcAddr(device, funcName);
5558}
5559
5560VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
5561 PFN_vkVoidFunction addr;
5562 addr = InterceptCoreInstanceCommand(funcName);
5563 if (!addr) {
5564 addr = InterceptCoreDeviceCommand(funcName);
5565 }
5566 if (!addr) {
5567 addr = InterceptWsiEnabledCommand(funcName, VkDevice(VK_NULL_HANDLE));
5568 }
5569 if (addr) {
5570 return addr;
5571 }
5572 assert(instance);
5573
5574 addr = InterceptMsgCallbackGetProcAddrCommand(funcName, instance);
5575 if (addr) {
5576 return addr;
5577 }
5578 addr = InterceptWsiEnabledCommand(funcName, instance);
5579 if (addr) {
5580 return addr;
5581 }
Mark Young39389872017-01-19 21:10:49 -07005582 addr = InterceptInstanceExtensionCommand(funcName);
5583 if (addr) {
5584 return addr;
5585 }
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005586 if (get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr == NULL) {
5587 return NULL;
5588 }
5589 return get_dispatch_table(ot_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName);
5590}
5591
Mark Young39389872017-01-19 21:10:49 -07005592VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *funcName) {
5593 assert(instance);
5594
5595 if (get_dispatch_table(ot_instance_table_map, instance)->GetPhysicalDeviceProcAddr == NULL) {
5596 return NULL;
5597 }
5598 return get_dispatch_table(ot_instance_table_map, instance)->GetPhysicalDeviceProcAddr(instance, funcName);
5599}
5600
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005601} // namespace object_tracker
Mark Lobodzinski9bab8662016-07-01 10:53:31 -06005602
5603// vk_layer_logging.h expects these to be defined
5604VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance,
5605 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
5606 const VkAllocationCallbacks *pAllocator,
5607 VkDebugReportCallbackEXT *pMsgCallback) {
5608 return object_tracker::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
5609}
5610
5611VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
5612 const VkAllocationCallbacks *pAllocator) {
5613 object_tracker::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);
5614}
5615
5616VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags,
5617 VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location,
5618 int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {
5619 object_tracker::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);
5620}
5621
5622// Loader-layer interface v0, just wrappers since there is only a layer
5623VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
5624 VkExtensionProperties *pProperties) {
5625 return object_tracker::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
5626}
5627
5628VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
5629 VkLayerProperties *pProperties) {
5630 return object_tracker::EnumerateInstanceLayerProperties(pCount, pProperties);
5631}
5632
5633VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
5634 VkLayerProperties *pProperties) {
5635 // The layer command handles VK_NULL_HANDLE just fine internally
5636 assert(physicalDevice == VK_NULL_HANDLE);
5637 return object_tracker::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);
5638}
5639
5640VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
5641 return object_tracker::GetDeviceProcAddr(dev, funcName);
5642}
5643
5644VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
5645 return object_tracker::GetInstanceProcAddr(instance, funcName);
5646}
5647
5648VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
5649 const char *pLayerName, uint32_t *pCount,
5650 VkExtensionProperties *pProperties) {
5651 // The layer command handles VK_NULL_HANDLE just fine internally
5652 assert(physicalDevice == VK_NULL_HANDLE);
5653 return object_tracker::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);
Mark Lobodzinski38080682016-07-22 15:30:27 -06005654}
Mark Young39389872017-01-19 21:10:49 -07005655
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07005656VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_layerGetPhysicalDeviceProcAddr(VkInstance instance,
5657 const char *funcName) {
Mark Young39389872017-01-19 21:10:49 -07005658 return object_tracker::GetPhysicalDeviceProcAddr(instance, funcName);
5659}
5660
5661VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface *pVersionStruct) {
5662 assert(pVersionStruct != NULL);
5663 assert(pVersionStruct->sType == LAYER_NEGOTIATE_INTERFACE_STRUCT);
5664
5665 // Fill in the function pointers if our version is at least capable of having the structure contain them.
5666 if (pVersionStruct->loaderLayerInterfaceVersion >= 2) {
5667 pVersionStruct->pfnGetInstanceProcAddr = vkGetInstanceProcAddr;
5668 pVersionStruct->pfnGetDeviceProcAddr = vkGetDeviceProcAddr;
5669 pVersionStruct->pfnGetPhysicalDeviceProcAddr = vk_layerGetPhysicalDeviceProcAddr;
5670 }
5671
5672 if (pVersionStruct->loaderLayerInterfaceVersion < CURRENT_LOADER_LAYER_INTERFACE_VERSION) {
5673 object_tracker::loader_layer_if_version = pVersionStruct->loaderLayerInterfaceVersion;
5674 } else if (pVersionStruct->loaderLayerInterfaceVersion > CURRENT_LOADER_LAYER_INTERFACE_VERSION) {
5675 pVersionStruct->loaderLayerInterfaceVersion = CURRENT_LOADER_LAYER_INTERFACE_VERSION;
5676 }
5677
5678 return VK_SUCCESS;
5679}