blob: 8206c07545e98154368c09594dbfb3016b3d028a [file] [log] [blame]
Dave Houltonb817a872018-06-26 13:22:01 -06001/* Copyright (c) 2015-2018 The Khronos Group Inc.
2 * Copyright (c) 2015-2018 Valve Corporation
3 * Copyright (c) 2015-2018 LunarG, Inc.
4 * Copyright (C) 2015-2018 Google Inc.
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -06005 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * Author: Mark Lobodzinski <mark@lunarg.com>
19 * Author: Jon Ashburn <jon@lunarg.com>
20 * Author: Tobin Ehlis <tobin@lunarg.com>
21 */
22
23#include "object_tracker.h"
Mark Lobodzinski63902f02018-09-21 10:36:44 -060024#include "object_lifetime_validation.h"
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060025
26namespace object_tracker {
27
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060028uint64_t object_track_index = 0;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060029
30// Add new queue to head of global queue list
31void AddQueueInfo(VkDevice device, uint32_t queue_node_index, VkQueue queue) {
32 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -060033 auto queueItem = device_data->objdata.queue_info_map.find(queue);
34 if (queueItem == device_data->objdata.queue_info_map.end()) {
Mark Lobodzinskiefc64392017-07-18 13:15:47 -060035 ObjTrackQueueInfo *p_queue_info = new ObjTrackQueueInfo;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060036 if (p_queue_info != NULL) {
Mark Lobodzinskiefc64392017-07-18 13:15:47 -060037 memset(p_queue_info, 0, sizeof(ObjTrackQueueInfo));
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060038 p_queue_info->queue = queue;
39 p_queue_info->queue_node_index = queue_node_index;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -060040 device_data->objdata.queue_info_map[queue] = p_queue_info;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060041 } else {
42 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
Dave Houltonb817a872018-06-26 13:22:01 -060043 HandleToUint64(queue), kVUID_ObjectTracker_InternalError,
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060044 "ERROR: VK_ERROR_OUT_OF_HOST_MEMORY -- could not allocate memory for Queue Information");
45 }
46 }
47}
48
49// Destroy memRef lists and free all memory
50void DestroyQueueDataStructures(VkDevice device) {
51 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
52
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -060053 for (auto queue_item : device_data->objdata.queue_info_map) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060054 delete queue_item.second;
55 }
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -060056 device_data->objdata.queue_info_map.clear();
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060057
58 // Destroy the items in the queue map
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -060059 auto queue = device_data->objdata.object_map[kVulkanObjectTypeQueue].begin();
60 while (queue != device_data->objdata.object_map[kVulkanObjectTypeQueue].end()) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060061 uint32_t obj_index = queue->second->object_type;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -060062 assert(device_data->objdata.num_total_objects > 0);
63 device_data->objdata.num_total_objects--;
64 assert(device_data->objdata.num_objects[obj_index] > 0);
65 device_data->objdata.num_objects[obj_index]--;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060066 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
Dave Houltonb817a872018-06-26 13:22:01 -060067 queue->second->handle, kVUID_ObjectTracker_Info,
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060068 "OBJ_STAT Destroy Queue obj 0x%" PRIxLEAST64 " (%" PRIu64 " total objs remain & %" PRIu64 " Queue objs).",
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -060069 queue->second->handle, device_data->objdata.num_total_objects, device_data->objdata.num_objects[obj_index]);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060070 delete queue->second;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -060071 queue = device_data->objdata.object_map[kVulkanObjectTypeQueue].erase(queue);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060072 }
73}
74
75// Check Queue type flags for selected queue operations
76void ValidateQueueFlags(VkQueue queue, const char *function) {
77 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(queue), layer_data_map);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -060078 auto queue_item = device_data->objdata.queue_info_map.find(queue);
79 if (queue_item != device_data->objdata.queue_info_map.end()) {
Mark Lobodzinskiefc64392017-07-18 13:15:47 -060080 ObjTrackQueueInfo *pQueueInfo = queue_item->second;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060081 if (pQueueInfo != NULL) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -060082 instance_layer_data *instance_data =
83 GetLayerDataPtr(get_dispatch_key(device_data->physical_device), instance_layer_data_map);
84 if ((instance_data->objdata.queue_family_properties[pQueueInfo->queue_node_index].queueFlags &
85 VK_QUEUE_SPARSE_BINDING_BIT) == 0) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060086 log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
Dave Houlton57ae22f2018-05-18 16:20:52 -060087 HandleToUint64(queue), "VUID-vkQueueBindSparse-queuetype",
Mark Lobodzinski487a0d12018-03-30 10:09:03 -060088 "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_SPARSE_BINDING_BIT not set.", function);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -060089 }
90 }
91 }
92}
93
Mark Lobodzinski9bd81192017-11-13 09:38:23 -070094// Look for this device object in any of the instance child devices lists.
95// NOTE: This is of dubious value. In most circumstances Vulkan will die a flaming death if a dispatchable object is invalid.
96// However, if this layer is loaded first and GetProcAddress is used to make API calls, it will detect bad DOs.
Dave Houlton379f1422018-05-23 12:47:07 -060097bool ValidateDeviceObject(uint64_t device_handle, const std::string &invalid_handle_code, const std::string &wrong_device_code) {
Mark Lobodzinski9bd81192017-11-13 09:38:23 -070098 VkInstance last_instance = nullptr;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -060099 for (auto instance_data : instance_layer_data_map) {
100 for (auto object : instance_data.second->objdata.object_map[kVulkanObjectTypeDevice]) {
Mark Lobodzinski9bd81192017-11-13 09:38:23 -0700101 // Grab last instance to use for possible error message
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600102 last_instance = instance_data.second->instance;
Mark Lobodzinski9bd81192017-11-13 09:38:23 -0700103 if (object.second->handle == device_handle) return false;
104 }
105 }
106
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600107 instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(last_instance), instance_layer_data_map);
Mark Lobodzinski9bd81192017-11-13 09:38:23 -0700108 return log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, device_handle,
Mark Lobodzinski88529492018-04-01 10:38:15 -0600109 invalid_handle_code, "Invalid Device Object 0x%" PRIxLEAST64 ".", device_handle);
Mark Lobodzinski9bd81192017-11-13 09:38:23 -0700110}
111
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600112void AllocateCommandBuffer(VkDevice device, const VkCommandPool command_pool, const VkCommandBuffer command_buffer,
113 VkCommandBufferLevel level) {
114 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
115
116 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Dave Houltonb817a872018-06-26 13:22:01 -0600117 HandleToUint64(command_buffer), kVUID_ObjectTracker_Info, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64,
Mark Lobodzinskib1fd9d12018-03-30 14:26:00 -0600118 object_track_index++, "VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT", HandleToUint64(command_buffer));
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600119
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600120 ObjTrackState *pNewObjNode = new ObjTrackState;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600121 pNewObjNode->object_type = kVulkanObjectTypeCommandBuffer;
122 pNewObjNode->handle = HandleToUint64(command_buffer);
123 pNewObjNode->parent_object = HandleToUint64(command_pool);
124 if (level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) {
125 pNewObjNode->status = OBJSTATUS_COMMAND_BUFFER_SECONDARY;
126 } else {
127 pNewObjNode->status = OBJSTATUS_NONE;
128 }
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600129 device_data->objdata.object_map[kVulkanObjectTypeCommandBuffer][HandleToUint64(command_buffer)] = pNewObjNode;
130 device_data->objdata.num_objects[kVulkanObjectTypeCommandBuffer]++;
131 device_data->objdata.num_total_objects++;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600132}
133
134bool ValidateCommandBuffer(VkDevice device, VkCommandPool command_pool, VkCommandBuffer command_buffer) {
135 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
136 bool skip = false;
137 uint64_t object_handle = HandleToUint64(command_buffer);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600138 if (device_data->objdata.object_map[kVulkanObjectTypeCommandBuffer].find(object_handle) !=
139 device_data->objdata.object_map[kVulkanObjectTypeCommandBuffer].end()) {
140 ObjTrackState *pNode = device_data->objdata.object_map[kVulkanObjectTypeCommandBuffer][HandleToUint64(command_buffer)];
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600141
142 if (pNode->parent_object != HandleToUint64(command_pool)) {
143 skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Dave Houlton57ae22f2018-05-18 16:20:52 -0600144 object_handle, "VUID-vkFreeCommandBuffers-pCommandBuffers-parent",
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600145 "FreeCommandBuffers is attempting to free Command Buffer 0x%" PRIxLEAST64
Mark Lobodzinski487a0d12018-03-30 10:09:03 -0600146 " belonging to Command Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").",
147 HandleToUint64(command_buffer), pNode->parent_object, HandleToUint64(command_pool));
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600148 }
149 } else {
Mark Lobodzinski487a0d12018-03-30 10:09:03 -0600150 skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Dave Houlton57ae22f2018-05-18 16:20:52 -0600151 object_handle, "VUID-vkFreeCommandBuffers-pCommandBuffers-00048", "Invalid %s Object 0x%" PRIxLEAST64 ".",
Mark Lobodzinski487a0d12018-03-30 10:09:03 -0600152 object_string[kVulkanObjectTypeCommandBuffer], object_handle);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600153 }
154 return skip;
155}
156
157void AllocateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set) {
158 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
159
160 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
Dave Houltonb817a872018-06-26 13:22:01 -0600161 HandleToUint64(descriptor_set), kVUID_ObjectTracker_Info, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64,
Mark Lobodzinskib1fd9d12018-03-30 14:26:00 -0600162 object_track_index++, "VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT", HandleToUint64(descriptor_set));
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600163
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600164 ObjTrackState *pNewObjNode = new ObjTrackState;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600165 pNewObjNode->object_type = kVulkanObjectTypeDescriptorSet;
166 pNewObjNode->status = OBJSTATUS_NONE;
167 pNewObjNode->handle = HandleToUint64(descriptor_set);
168 pNewObjNode->parent_object = HandleToUint64(descriptor_pool);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600169 device_data->objdata.object_map[kVulkanObjectTypeDescriptorSet][HandleToUint64(descriptor_set)] = pNewObjNode;
170 device_data->objdata.num_objects[kVulkanObjectTypeDescriptorSet]++;
171 device_data->objdata.num_total_objects++;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600172}
173
174bool ValidateDescriptorSet(VkDevice device, VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set) {
175 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
176 bool skip = false;
177 uint64_t object_handle = HandleToUint64(descriptor_set);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600178 auto dsItem = device_data->objdata.object_map[kVulkanObjectTypeDescriptorSet].find(object_handle);
179 if (dsItem != device_data->objdata.object_map[kVulkanObjectTypeDescriptorSet].end()) {
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600180 ObjTrackState *pNode = dsItem->second;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600181
182 if (pNode->parent_object != HandleToUint64(descriptor_pool)) {
183 skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
Dave Houlton57ae22f2018-05-18 16:20:52 -0600184 object_handle, "VUID-vkFreeDescriptorSets-pDescriptorSets-parent",
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600185 "FreeDescriptorSets is attempting to free descriptorSet 0x%" PRIxLEAST64
Mark Lobodzinski487a0d12018-03-30 10:09:03 -0600186 " belonging to Descriptor Pool 0x%" PRIxLEAST64 " from pool 0x%" PRIxLEAST64 ").",
187 HandleToUint64(descriptor_set), pNode->parent_object, HandleToUint64(descriptor_pool));
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600188 }
189 } else {
Mark Lobodzinski487a0d12018-03-30 10:09:03 -0600190 skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
Dave Houlton57ae22f2018-05-18 16:20:52 -0600191 object_handle, "VUID-vkFreeDescriptorSets-pDescriptorSets-00310", "Invalid %s Object 0x%" PRIxLEAST64 ".",
Mark Lobodzinski487a0d12018-03-30 10:09:03 -0600192 object_string[kVulkanObjectTypeDescriptorSet], object_handle);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600193 }
194 return skip;
195}
196
Dave Houltona9df0ce2018-02-07 10:51:23 -0700197template <typename DispObj>
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600198bool ValidateDescriptorWrite(DispObj disp, VkWriteDescriptorSet const *desc, bool isPush) {
Chris Forbes2c600e92017-10-20 11:13:20 -0700199 bool skip = false;
200
201 if (!isPush && desc->dstSet) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600202 skip |= DeviceValidateObject(disp, desc->dstSet, kVulkanObjectTypeDescriptorSet, false,
203 "VUID-VkWriteDescriptorSet-dstSet-00320", "VUID-VkWriteDescriptorSet-commonparent");
Chris Forbes2c600e92017-10-20 11:13:20 -0700204 }
205
206 if ((desc->descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
207 (desc->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
208 for (uint32_t idx2 = 0; idx2 < desc->descriptorCount; ++idx2) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600209 skip |=
210 DeviceValidateObject(disp, desc->pTexelBufferView[idx2], kVulkanObjectTypeBufferView, false,
211 "VUID-VkWriteDescriptorSet-descriptorType-00323", "VUID-VkWriteDescriptorSet-commonparent");
Chris Forbes2c600e92017-10-20 11:13:20 -0700212 }
213 }
214
215 if ((desc->descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
Dave Houltona9df0ce2018-02-07 10:51:23 -0700216 (desc->descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) || (desc->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
Chris Forbes2c600e92017-10-20 11:13:20 -0700217 (desc->descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
218 for (uint32_t idx3 = 0; idx3 < desc->descriptorCount; ++idx3) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600219 skip |=
220 DeviceValidateObject(disp, desc->pImageInfo[idx3].imageView, kVulkanObjectTypeImageView, false,
221 "VUID-VkWriteDescriptorSet-descriptorType-00326", "VUID-VkDescriptorImageInfo-commonparent");
Chris Forbes2c600e92017-10-20 11:13:20 -0700222 }
223 }
224
225 if ((desc->descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
226 (desc->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) ||
227 (desc->descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
228 (desc->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
229 for (uint32_t idx4 = 0; idx4 < desc->descriptorCount; ++idx4) {
230 if (desc->pBufferInfo[idx4].buffer) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600231 skip |= DeviceValidateObject(disp, desc->pBufferInfo[idx4].buffer, kVulkanObjectTypeBuffer, false,
232 "VUID-VkDescriptorBufferInfo-buffer-parameter", kVUIDUndefined);
Chris Forbes2c600e92017-10-20 11:13:20 -0700233 }
234 }
235 }
236
237 return skip;
238}
239
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600240bool PreCallValidateCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
241 VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount,
242 const VkWriteDescriptorSet *pDescriptorWrites) {
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600243 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600244 skip |= DeviceValidateObject(commandBuffer, commandBuffer, kVulkanObjectTypeCommandBuffer, false,
245 "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-parameter",
246 "VUID-vkCmdPushDescriptorSetKHR-commonparent");
247 skip |= DeviceValidateObject(commandBuffer, layout, kVulkanObjectTypePipelineLayout, false,
248 "VUID-vkCmdPushDescriptorSetKHR-layout-parameter", "VUID-vkCmdPushDescriptorSetKHR-commonparent");
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600249 if (pDescriptorWrites) {
250 for (uint32_t index0 = 0; index0 < descriptorWriteCount; ++index0) {
251 skip |= ValidateDescriptorWrite(commandBuffer, &pDescriptorWrites[index0], true);
252 }
253 }
254 return skip;
255}
256
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600257void CreateQueue(VkDevice device, VkQueue vkObj) {
258 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
259
260 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
Dave Houltonb817a872018-06-26 13:22:01 -0600261 HandleToUint64(vkObj), kVUID_ObjectTracker_Info, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64,
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600262 object_track_index++, "VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT", HandleToUint64(vkObj));
263
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600264 ObjTrackState *p_obj_node = NULL;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600265 auto queue_item = device_data->objdata.object_map[kVulkanObjectTypeQueue].find(HandleToUint64(vkObj));
266 if (queue_item == device_data->objdata.object_map[kVulkanObjectTypeQueue].end()) {
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600267 p_obj_node = new ObjTrackState;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600268 device_data->objdata.object_map[kVulkanObjectTypeQueue][HandleToUint64(vkObj)] = p_obj_node;
269 device_data->objdata.num_objects[kVulkanObjectTypeQueue]++;
270 device_data->objdata.num_total_objects++;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600271 } else {
272 p_obj_node = queue_item->second;
273 }
274 p_obj_node->object_type = kVulkanObjectTypeQueue;
275 p_obj_node->status = OBJSTATUS_NONE;
276 p_obj_node->handle = HandleToUint64(vkObj);
277}
278
279void CreateSwapchainImageObject(VkDevice dispatchable_object, VkImage swapchain_image, VkSwapchainKHR swapchain) {
280 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(dispatchable_object), layer_data_map);
281 log_msg(device_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
Dave Houltonb817a872018-06-26 13:22:01 -0600282 HandleToUint64(swapchain_image), kVUID_ObjectTracker_Info, "OBJ[0x%" PRIxLEAST64 "] : CREATE %s object 0x%" PRIxLEAST64,
Mark Lobodzinskib1fd9d12018-03-30 14:26:00 -0600283 object_track_index++, "SwapchainImage", HandleToUint64(swapchain_image));
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600284
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600285 ObjTrackState *pNewObjNode = new ObjTrackState;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600286 pNewObjNode->object_type = kVulkanObjectTypeImage;
287 pNewObjNode->status = OBJSTATUS_NONE;
288 pNewObjNode->handle = HandleToUint64(swapchain_image);
289 pNewObjNode->parent_object = HandleToUint64(swapchain);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600290 device_data->objdata.swapchainImageMap[HandleToUint64(swapchain_image)] = pNewObjNode;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600291}
292
Mark Lobodzinski5183a032018-09-13 14:44:28 -0600293bool DeviceReportUndestroyedObjects(VkDevice device, VulkanObjectType object_type, const std::string &error_code) {
294 bool skip = false;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600295 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600296 for (const auto &item : device_data->objdata.object_map[object_type]) {
Gabríel Arthúr Péturssonfdcb5402018-03-20 21:52:06 +0000297 const ObjTrackState *object_info = item.second;
Mark Lobodzinski5183a032018-09-13 14:44:28 -0600298 skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, get_debug_report_enum[object_type],
299 object_info->handle, error_code,
300 "OBJ ERROR : For device 0x%" PRIxLEAST64 ", %s object 0x%" PRIxLEAST64 " has not been destroyed.",
301 HandleToUint64(device), object_string[object_type], object_info->handle);
Gabríel Arthúr Péturssonfdcb5402018-03-20 21:52:06 +0000302 }
Mark Lobodzinski5183a032018-09-13 14:44:28 -0600303 return skip;
Gabríel Arthúr Péturssonfdcb5402018-03-20 21:52:06 +0000304}
305
306void DeviceDestroyUndestroyedObjects(VkDevice device, VulkanObjectType object_type) {
307 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600308 while (!device_data->objdata.object_map[object_type].empty()) {
309 auto item = device_data->objdata.object_map[object_type].begin();
Gabríel Arthúr Péturssonfdcb5402018-03-20 21:52:06 +0000310
311 ObjTrackState *object_info = item->second;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600312 DestroyObjectSilently(&device_data->objdata, object_info->handle, object_type);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600313 }
314}
315
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600316bool PreCallValidateDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600317 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600318 instance_layer_data *instance_data = GetLayerDataPtr(key, instance_layer_data_map);
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600319 bool skip = false;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600320
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600321 // We validate here for coverage, though we'd not have made it this for with a bad instance.
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600322 skip |= InstanceValidateObject(instance, instance, kVulkanObjectTypeInstance, true, "VUID-vkDestroyInstance-instance-parameter",
323 kVUIDUndefined);
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600324
325 // Validate that child devices have been destroyed
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600326 for (const auto &iit : instance_data->objdata.object_map[kVulkanObjectTypeDevice]) {
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600327 ObjTrackState *pNode = iit.second;
328
329 VkDevice device = reinterpret_cast<VkDevice>(pNode->handle);
330 VkDebugReportObjectTypeEXT debug_object_type = get_debug_report_enum[pNode->object_type];
331
332 skip |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, debug_object_type, pNode->handle,
333 kVUID_ObjectTracker_ObjectLeak, "OBJ ERROR : %s object 0x%" PRIxLEAST64 " has not been destroyed.",
334 string_VkDebugReportObjectTypeEXT(debug_object_type), pNode->handle);
335
336 // Report any remaining objects in LL
337 skip |= ReportUndestroyedObjects(device, "VUID-vkDestroyInstance-instance-00629");
338
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600339 skip |= InstanceValidateDestroyObject(instance, device, kVulkanObjectTypeDevice, pAllocator,
340 "VUID-vkDestroyInstance-instance-00630", "VUID-vkDestroyInstance-instance-00631");
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600341 }
342
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600343 InstanceValidateDestroyObject(instance, instance, kVulkanObjectTypeInstance, pAllocator,
344 "VUID-vkDestroyInstance-instance-00630", "VUID-vkDestroyInstance-instance-00631");
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600345
346 return skip;
347}
348
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600349void PreCallRecordDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600350 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600351 instance_layer_data *instance_data = GetLayerDataPtr(key, instance_layer_data_map);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600352
353 // Enable the temporary callback(s) here to catch cleanup issues:
Mark Young6ba8abe2017-11-09 10:37:04 -0700354 if (instance_data->num_tmp_debug_messengers > 0) {
355 layer_enable_tmp_debug_messengers(instance_data->report_data, instance_data->num_tmp_debug_messengers,
356 instance_data->tmp_messenger_create_infos, instance_data->tmp_debug_messengers);
357 }
358 if (instance_data->num_tmp_report_callbacks > 0) {
359 layer_enable_tmp_report_callbacks(instance_data->report_data, instance_data->num_tmp_report_callbacks,
360 instance_data->tmp_report_create_infos, instance_data->tmp_report_callbacks);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600361 }
362
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600363 // Destroy physical devices
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600364 for (auto iit = instance_data->objdata.object_map[kVulkanObjectTypePhysicalDevice].begin();
365 iit != instance_data->objdata.object_map[kVulkanObjectTypePhysicalDevice].end();) {
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600366 ObjTrackState *pNode = iit->second;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600367 VkPhysicalDevice physical_device = reinterpret_cast<VkPhysicalDevice>(pNode->handle);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600368 InstanceRecordDestroyObject(instance, physical_device, kVulkanObjectTypePhysicalDevice);
369 iit = instance_data->objdata.object_map[kVulkanObjectTypePhysicalDevice].begin();
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600370 }
371
Mark Lobodzinski9bd81192017-11-13 09:38:23 -0700372 // Destroy child devices
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600373 for (auto iit = instance_data->objdata.object_map[kVulkanObjectTypeDevice].begin();
374 iit != instance_data->objdata.object_map[kVulkanObjectTypeDevice].end();) {
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600375 ObjTrackState *pNode = iit->second;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600376 VkDevice device = reinterpret_cast<VkDevice>(pNode->handle);
Gabríel Arthúr Péturssonfdcb5402018-03-20 21:52:06 +0000377 DestroyUndestroyedObjects(device);
Mark Lobodzinski9bd81192017-11-13 09:38:23 -0700378
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600379 InstanceRecordDestroyObject(instance, device, kVulkanObjectTypeDevice);
380 iit = instance_data->objdata.object_map[kVulkanObjectTypeDevice].begin();
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600381 }
Mark Lobodzinski9bd81192017-11-13 09:38:23 -0700382
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600383 instance_data->objdata.object_map[kVulkanObjectTypeDevice].clear();
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600384}
385
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600386void PostCallRecordDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600387 dispatch_key key = get_dispatch_key(instance);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600388 instance_layer_data *instance_data = GetLayerDataPtr(key, instance_layer_data_map);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600389
390 // Disable and cleanup the temporary callback(s):
Mark Young6ba8abe2017-11-09 10:37:04 -0700391 layer_disable_tmp_debug_messengers(instance_data->report_data, instance_data->num_tmp_debug_messengers,
392 instance_data->tmp_debug_messengers);
393 layer_disable_tmp_report_callbacks(instance_data->report_data, instance_data->num_tmp_report_callbacks,
394 instance_data->tmp_report_callbacks);
395 if (instance_data->num_tmp_debug_messengers > 0) {
396 layer_free_tmp_debug_messengers(instance_data->tmp_messenger_create_infos, instance_data->tmp_debug_messengers);
397 instance_data->num_tmp_debug_messengers = 0;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600398 }
Mark Young6ba8abe2017-11-09 10:37:04 -0700399 if (instance_data->num_tmp_report_callbacks > 0) {
400 layer_free_tmp_report_callbacks(instance_data->tmp_report_create_infos, instance_data->tmp_report_callbacks);
401 instance_data->num_tmp_report_callbacks = 0;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600402 }
403
404 // Clean up logging callback, if any
Mark Young6ba8abe2017-11-09 10:37:04 -0700405 while (instance_data->logging_messenger.size() > 0) {
406 VkDebugUtilsMessengerEXT messenger = instance_data->logging_messenger.back();
407 layer_destroy_messenger_callback(instance_data->report_data, messenger, pAllocator);
408 instance_data->logging_messenger.pop_back();
409 }
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600410 while (instance_data->logging_callback.size() > 0) {
411 VkDebugReportCallbackEXT callback = instance_data->logging_callback.back();
Mark Young6ba8abe2017-11-09 10:37:04 -0700412 layer_destroy_report_callback(instance_data->report_data, callback, pAllocator);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600413 instance_data->logging_callback.pop_back();
414 }
415
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600416 InstanceRecordDestroyObject(instance, instance, kVulkanObjectTypeInstance);
Gabríel Arthúr Pétursson3de74ca2018-03-18 01:50:54 +0000417
Mark Young6ba8abe2017-11-09 10:37:04 -0700418 layer_debug_utils_destroy_instance(instance_data->report_data);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600419 FreeLayerDataPtr(key, instance_layer_data_map);
Mark Lobodzinski34f5ea62018-09-14 09:51:43 -0600420}
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600421
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600422bool PreCallValidateDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski9bd81192017-11-13 09:38:23 -0700423 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600424 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600425 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, true, "VUID-vkDestroyDevice-device-parameter",
426 kVUIDUndefined);
427 skip |= InstanceValidateDestroyObject(device_data->physical_device, device, kVulkanObjectTypeDevice, pAllocator,
428 "VUID-vkDestroyDevice-device-00379", "VUID-vkDestroyDevice-device-00380");
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600429 // Report any remaining objects associated with this VkDevice object in LL
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600430 skip |= ReportUndestroyedObjects(device, "VUID-vkDestroyDevice-device-00378");
431
432 return skip;
433}
434
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600435void PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600436 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600437 InstanceRecordDestroyObject(device_data->physical_device, device, kVulkanObjectTypeDevice);
Gabríel Arthúr Péturssonfdcb5402018-03-20 21:52:06 +0000438 DestroyUndestroyedObjects(device);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600439
440 // Clean up Queue's MemRef Linked Lists
441 DestroyQueueDataStructures(device);
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600442}
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600443
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600444bool PreCallValidateGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600445 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600446 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkGetDeviceQueue-device-parameter",
447 kVUIDUndefined);
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600448 return skip;
449}
Mark Lobodzinski439645a2017-07-19 15:18:15 -0600450
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600451void PostCallRecordGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
Mark Lobodzinski439645a2017-07-19 15:18:15 -0600452 CreateQueue(device, *pQueue);
453 AddQueueInfo(device, queueFamilyIndex, *pQueue);
454}
455
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600456bool PreCallValidateGetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2 *pQueueInfo, VkQueue *pQueue) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600457 return DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkGetDeviceQueue2-device-parameter",
458 kVUIDUndefined);
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600459}
460
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600461void PostCallRecordGetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2 *pQueueInfo, VkQueue *pQueue) {
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600462 CreateQueue(device, *pQueue);
463 AddQueueInfo(device, pQueueInfo->queueFamilyIndex, *pQueue);
464}
465
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600466bool PreCallValidateUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
467 const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
468 const VkCopyDescriptorSet *pDescriptorCopies) {
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600469 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600470 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkUpdateDescriptorSets-device-parameter",
471 kVUIDUndefined);
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600472 if (pDescriptorCopies) {
473 for (uint32_t idx0 = 0; idx0 < descriptorCopyCount; ++idx0) {
474 if (pDescriptorCopies[idx0].dstSet) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600475 skip |= DeviceValidateObject(device, pDescriptorCopies[idx0].dstSet, kVulkanObjectTypeDescriptorSet, false,
476 "VUID-VkCopyDescriptorSet-dstSet-parameter", "VUID-VkCopyDescriptorSet-commonparent");
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600477 }
478 if (pDescriptorCopies[idx0].srcSet) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600479 skip |= DeviceValidateObject(device, pDescriptorCopies[idx0].srcSet, kVulkanObjectTypeDescriptorSet, false,
480 "VUID-VkCopyDescriptorSet-srcSet-parameter", "VUID-VkCopyDescriptorSet-commonparent");
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600481 }
482 }
483 }
484 if (pDescriptorWrites) {
485 for (uint32_t idx1 = 0; idx1 < descriptorWriteCount; ++idx1) {
486 skip |= ValidateDescriptorWrite(device, &pDescriptorWrites[idx1], false);
487 }
488 }
489 return skip;
490}
491
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600492bool PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
493 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
494 VkPipeline *pPipelines) {
Mark Lobodzinski2d26c5f2017-07-19 12:37:04 -0600495 bool skip = VK_FALSE;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600496 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkCreateComputePipelines-device-parameter",
497 kVUIDUndefined);
Mark Lobodzinski2d26c5f2017-07-19 12:37:04 -0600498 if (pCreateInfos) {
499 for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
500 if (pCreateInfos[idx0].basePipelineHandle) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600501 skip |= DeviceValidateObject(device, pCreateInfos[idx0].basePipelineHandle, kVulkanObjectTypePipeline, true,
502 "VUID-VkComputePipelineCreateInfo-flags-00697",
503 "VUID-VkComputePipelineCreateInfo-commonparent");
Mark Lobodzinski2d26c5f2017-07-19 12:37:04 -0600504 }
505 if (pCreateInfos[idx0].layout) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600506 skip |= DeviceValidateObject(device, pCreateInfos[idx0].layout, kVulkanObjectTypePipelineLayout, false,
507 "VUID-VkComputePipelineCreateInfo-layout-parameter",
508 "VUID-VkComputePipelineCreateInfo-commonparent");
Mark Lobodzinski2d26c5f2017-07-19 12:37:04 -0600509 }
510 if (pCreateInfos[idx0].stage.module) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600511 skip |= DeviceValidateObject(device, pCreateInfos[idx0].stage.module, kVulkanObjectTypeShaderModule, false,
512 "VUID-VkPipelineShaderStageCreateInfo-module-parameter", kVUIDUndefined);
Mark Lobodzinski2d26c5f2017-07-19 12:37:04 -0600513 }
514 }
515 }
516 if (pipelineCache) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600517 skip |= DeviceValidateObject(device, pipelineCache, kVulkanObjectTypePipelineCache, true,
518 "VUID-vkCreateComputePipelines-pipelineCache-parameter",
519 "VUID-vkCreateComputePipelines-pipelineCache-parent");
Mark Lobodzinski2d26c5f2017-07-19 12:37:04 -0600520 }
Mark Lobodzinski2d26c5f2017-07-19 12:37:04 -0600521 if (skip) {
522 for (uint32_t i = 0; i < createInfoCount; i++) {
523 pPipelines[i] = VK_NULL_HANDLE;
524 }
Mark Lobodzinski2d26c5f2017-07-19 12:37:04 -0600525 }
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600526 return skip;
527}
Mark Lobodzinski17de5fd2018-06-22 15:09:53 -0600528
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600529void PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
530 const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator,
531 VkPipeline *pPipelines) {
Mark Lobodzinski2d26c5f2017-07-19 12:37:04 -0600532 for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
533 if (pPipelines[idx1] != VK_NULL_HANDLE) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600534 DeviceCreateObject(device, pPipelines[idx1], kVulkanObjectTypePipeline, pAllocator);
Mark Lobodzinski2d26c5f2017-07-19 12:37:04 -0600535 }
536 }
Mark Lobodzinskib58fe782018-09-14 11:50:27 -0600537}
538
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600539bool PreCallValidateResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600540 bool skip = false;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600541 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600542
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600543 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkResetDescriptorPool-device-parameter",
544 kVUIDUndefined);
545 skip |= DeviceValidateObject(device, descriptorPool, kVulkanObjectTypeDescriptorPool, false,
546 "VUID-vkResetDescriptorPool-descriptorPool-parameter",
547 "VUID-vkResetDescriptorPool-descriptorPool-parent");
548 for (const auto &itr : device_data->objdata.object_map[kVulkanObjectTypeDescriptorSet]) {
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600549 if (itr.second->parent_object == HandleToUint64(descriptorPool)) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600550 skip |= DeviceValidateDestroyObject(device, (VkDescriptorSet)(itr.first), kVulkanObjectTypeDescriptorSet, nullptr,
551 kVUIDUndefined, kVUIDUndefined);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600552 }
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600553 }
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600554 return skip;
555}
556
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600557void PreCallRecordResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600558 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
559
560 // A DescriptorPool's descriptor sets are implicitly deleted when the pool is reset. Remove this pool's descriptor sets from
561 // our descriptorSet map.
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600562 auto itr = device_data->objdata.object_map[kVulkanObjectTypeDescriptorSet].begin();
563 while (itr != device_data->objdata.object_map[kVulkanObjectTypeDescriptorSet].end()) {
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600564 ObjTrackState *pNode = (*itr).second;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600565 auto del_itr = itr++;
566 if (pNode->parent_object == HandleToUint64(descriptorPool)) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600567 DeviceRecordDestroyObject(device, (VkDescriptorSet)((*del_itr).first), kVulkanObjectTypeDescriptorSet);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600568 }
569 }
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600570}
571
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600572bool PreCallValidateBeginCommandBuffer(VkCommandBuffer command_buffer, const VkCommandBufferBeginInfo *begin_info) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600573 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(command_buffer), layer_data_map);
574 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600575 skip |= DeviceValidateObject(command_buffer, command_buffer, kVulkanObjectTypeCommandBuffer, false,
576 "VUID-vkBeginCommandBuffer-commandBuffer-parameter", kVUIDUndefined);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600577 if (begin_info) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600578 ObjTrackState *pNode = device_data->objdata.object_map[kVulkanObjectTypeCommandBuffer][HandleToUint64(command_buffer)];
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600579 if ((begin_info->pInheritanceInfo) && (pNode->status & OBJSTATUS_COMMAND_BUFFER_SECONDARY) &&
580 (begin_info->flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600581 skip |= DeviceValidateObject(command_buffer, begin_info->pInheritanceInfo->framebuffer, kVulkanObjectTypeFramebuffer,
582 true, "VUID-VkCommandBufferBeginInfo-flags-00055",
583 "VUID-VkCommandBufferInheritanceInfo-commonparent");
584 skip |= DeviceValidateObject(command_buffer, begin_info->pInheritanceInfo->renderPass, kVulkanObjectTypeRenderPass,
585 false, "VUID-VkCommandBufferBeginInfo-flags-00053",
586 "VUID-VkCommandBufferInheritanceInfo-commonparent");
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600587 }
588 }
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600589 return skip;
590}
591
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600592void PostCallRecordCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
593 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pCallback) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600594 InstanceCreateObject(instance, *pCallback, kVulkanObjectTypeDebugReportCallbackEXT, pAllocator);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600595}
596
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600597bool PreCallValidateDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
598 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600599 bool skip = InstanceValidateDestroyObject(instance, msgCallback, kVulkanObjectTypeDebugReportCallbackEXT, pAllocator,
600 "VUID-vkDestroyDebugReportCallbackEXT-instance-01242",
601 "VUID-vkDestroyDebugReportCallbackEXT-instance-01243");
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600602 return skip;
603}
604
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600605void PreCallRecordDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback,
606 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600607 InstanceRecordDestroyObject(instance, msgCallback, kVulkanObjectTypeDebugReportCallbackEXT);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600608}
609
Mark Young6ba8abe2017-11-09 10:37:04 -0700610// VK_EXT_debug_utils commands
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600611
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600612bool PreCallValidateSetDebugUtilsObjectNameEXT(VkDevice device, const VkDebugUtilsObjectNameInfoEXT *pNameInfo) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600613 return DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false,
614 "VUID-vkSetDebugUtilsObjectNameEXT-device-parameter", kVUIDUndefined);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600615}
616
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600617bool PreCallValidateSetDebugUtilsObjectTagEXT(VkDevice device, const VkDebugUtilsObjectTagInfoEXT *pTagInfo) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600618 return DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkSetDebugUtilsObjectTagEXT-device-parameter",
619 kVUIDUndefined);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600620}
621
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600622bool PreCallValidateQueueBeginDebugUtilsLabelEXT(VkQueue queue, const VkDebugUtilsLabelEXT *pLabelInfo) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600623 return DeviceValidateObject(queue, queue, kVulkanObjectTypeQueue, false, "VUID-vkQueueBeginDebugUtilsLabelEXT-queue-parameter",
624 kVUIDUndefined);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600625}
626
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600627bool PreCallValidateQueueEndDebugUtilsLabelEXT(VkQueue queue) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600628 return DeviceValidateObject(queue, queue, kVulkanObjectTypeQueue, false, "VUID-vkQueueEndDebugUtilsLabelEXT-queue-parameter",
629 kVUIDUndefined);
Mark Young6ba8abe2017-11-09 10:37:04 -0700630}
631
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600632bool PreCallValidateQueueInsertDebugUtilsLabelEXT(VkQueue queue, const VkDebugUtilsLabelEXT *pLabelInfo) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600633 return DeviceValidateObject(queue, queue, kVulkanObjectTypeQueue, false, "VUID-vkQueueInsertDebugUtilsLabelEXT-queue-parameter",
634 kVUIDUndefined);
Mark Young6ba8abe2017-11-09 10:37:04 -0700635}
636
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600637bool PreCallValidateCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT *pLabelInfo) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600638 return DeviceValidateObject(commandBuffer, commandBuffer, kVulkanObjectTypeCommandBuffer, false,
639 "VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-parameter", kVUIDUndefined);
Mark Young6ba8abe2017-11-09 10:37:04 -0700640}
641
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600642bool PreCallValidateCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600643 return DeviceValidateObject(commandBuffer, commandBuffer, kVulkanObjectTypeCommandBuffer, false,
644 "VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-parameter", kVUIDUndefined);
Mark Young6ba8abe2017-11-09 10:37:04 -0700645}
646
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600647bool PreCallValidateCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT *pLabelInfo) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600648 return DeviceValidateObject(commandBuffer, commandBuffer, kVulkanObjectTypeCommandBuffer, false,
649 "VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-parameter", kVUIDUndefined);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600650}
651
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600652bool PreCallValidateCreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo,
653 const VkAllocationCallbacks *pAllocator, VkDebugUtilsMessengerEXT *pMessenger) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600654 return InstanceValidateObject(instance, instance, kVulkanObjectTypeInstance, false,
655 "VUID-vkCreateDebugUtilsMessengerEXT-instance-parameter", kVUIDUndefined);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600656}
657
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600658void PostCallRecordCreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo,
659 const VkAllocationCallbacks *pAllocator, VkDebugUtilsMessengerEXT *pMessenger) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600660 InstanceCreateObject(instance, *pMessenger, kVulkanObjectTypeDebugUtilsMessengerEXT, pAllocator);
Mark Young6ba8abe2017-11-09 10:37:04 -0700661}
662
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600663bool PreCallValidateDestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT messenger,
664 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600665 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600666 skip |= InstanceValidateObject(instance, instance, kVulkanObjectTypeInstance, false,
667 "VUID-vkDestroyDebugUtilsMessengerEXT-instance-parameter", kVUIDUndefined);
668 skip |= InstanceValidateObject(instance, messenger, kVulkanObjectTypeDebugUtilsMessengerEXT, false,
669 "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter",
670 "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent");
671 skip |= InstanceValidateDestroyObject(instance, messenger, kVulkanObjectTypeDebugUtilsMessengerEXT, pAllocator,
672 "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01915",
673 "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01916");
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600674 return skip;
675}
676
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600677void PreCallRecordDestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT messenger,
678 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600679 InstanceRecordDestroyObject(instance, messenger, kVulkanObjectTypeDebugUtilsMessengerEXT);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600680}
681
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600682bool PreCallValidateSubmitDebugUtilsMessageEXT(VkInstance instance, VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
683 VkDebugUtilsMessageTypeFlagsEXT messageTypes,
684 const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData) {
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600685 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600686 skip |= InstanceValidateObject(instance, instance, kVulkanObjectTypeInstance, false,
687 "VUID-vkeSubmitDebugUtilsMessageEXT-instance-parameter", kVUIDUndefined);
Mark Lobodzinski0de500d2018-09-14 15:14:01 -0600688 return skip;
Mark Young6ba8abe2017-11-09 10:37:04 -0700689}
690
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600691bool PreCallValidateEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
692 VkLayerProperties *pProperties) {
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600693 // Set null_allowed to true here to cover for the lame loader-layer interface wrapper calls
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600694 return InstanceValidateObject(physicalDevice, physicalDevice, kVulkanObjectTypePhysicalDevice, true,
695 "VUID-vkEnumerateDeviceLayerProperties-physicalDevice-parameter", kVUIDUndefined);
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600696}
697
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600698bool PreCallValidateEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount,
699 VkExtensionProperties *pProperties) {
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600700 // Set null_allowed to true here to cover for the lame loader-layer interface wrapper calls
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600701 return InstanceValidateObject(physicalDevice, physicalDevice, kVulkanObjectTypePhysicalDevice, true,
702 "VUID-vkEnumerateDeviceExtensionProperties-physicalDevice-parameter", kVUIDUndefined);
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600703}
704
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600705bool PreCallValidateCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
706 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600707 return InstanceValidateObject(physicalDevice, physicalDevice, kVulkanObjectTypePhysicalDevice, false,
708 "VUID-vkCreateDevice-physicalDevice-parameter", kVUIDUndefined);
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600709}
710
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600711void PostCallRecordCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
712 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600713 instance_layer_data *phy_dev_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
714 InstanceCreateObject(phy_dev_data->instance, *pDevice, kVulkanObjectTypeDevice, pAllocator);
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600715}
716
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600717bool PreCallValidateGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
718 VkImage *pSwapchainImages) {
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600719 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600720 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkGetSwapchainImagesKHR-device-parameter",
721 "VUID-vkGetSwapchainImagesKHR-commonparent");
722 skip |= DeviceValidateObject(device, swapchain, kVulkanObjectTypeSwapchainKHR, false,
723 "VUID-vkGetSwapchainImagesKHR-swapchain-parameter", "VUID-vkGetSwapchainImagesKHR-commonparent");
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600724 return skip;
725}
726
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600727void PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
728 VkImage *pSwapchainImages) {
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600729 if (pSwapchainImages != NULL) {
730 for (uint32_t i = 0; i < *pSwapchainImageCount; i++) {
731 CreateSwapchainImageObject(device, pSwapchainImages[i], swapchain);
732 }
733 }
734}
735
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600736bool PreCallValidateCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
737 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
Petr Kraus42f6f8d2017-12-17 17:37:33 +0100738 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600739 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false,
740 "VUID-vkCreateDescriptorSetLayout-device-parameter", kVUIDUndefined);
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600741 if (pCreateInfo) {
742 if (pCreateInfo->pBindings) {
743 for (uint32_t binding_index = 0; binding_index < pCreateInfo->bindingCount; ++binding_index) {
744 const VkDescriptorSetLayoutBinding &binding = pCreateInfo->pBindings[binding_index];
745 const bool is_sampler_type = binding.descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER ||
746 binding.descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
747 if (binding.pImmutableSamplers && is_sampler_type) {
748 for (uint32_t index2 = 0; index2 < binding.descriptorCount; ++index2) {
749 const VkSampler sampler = binding.pImmutableSamplers[index2];
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600750 skip |= DeviceValidateObject(device, sampler, kVulkanObjectTypeSampler, false,
751 "VUID-VkDescriptorSetLayoutBinding-descriptorType-00282", kVUIDUndefined);
Petr Kraus42f6f8d2017-12-17 17:37:33 +0100752 }
753 }
754 }
755 }
756 }
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600757 return skip;
758}
759
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600760void PostCallRecordCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
761 const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600762 DeviceCreateObject(device, *pSetLayout, kVulkanObjectTypeDescriptorSetLayout, pAllocator);
Mark Lobodzinskibe4b3452018-09-14 16:14:33 -0600763}
764
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600765inline bool ValidateSamplerObjects(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo) {
Mark Lobodzinski88a1a662018-07-02 14:09:39 -0600766 bool skip = false;
767 if (pCreateInfo->pBindings) {
768 for (uint32_t index1 = 0; index1 < pCreateInfo->bindingCount; ++index1) {
769 for (uint32_t index2 = 0; index2 < pCreateInfo->pBindings[index1].descriptorCount; ++index2) {
770 if (pCreateInfo->pBindings[index1].pImmutableSamplers) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600771 skip |= DeviceValidateObject(device, pCreateInfo->pBindings[index1].pImmutableSamplers[index2],
772 kVulkanObjectTypeSampler, true,
773 "VUID-VkDescriptorSetLayoutBinding-descriptorType-00282", kVUIDUndefined);
Mark Lobodzinski88a1a662018-07-02 14:09:39 -0600774 }
775 }
776 }
777 }
778 return skip;
779}
780
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600781bool PreCallValidateGetDescriptorSetLayoutSupport(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
782 VkDescriptorSetLayoutSupport *pSupport) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600783 bool skip = DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false,
784 "VUID-vkGetDescriptorSetLayoutSupport-device-parameter", kVUIDUndefined);
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600785 if (pCreateInfo) {
786 skip |= ValidateSamplerObjects(device, pCreateInfo);
787 }
788 return skip;
789}
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600790bool PreCallValidateGetDescriptorSetLayoutSupportKHR(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
791 VkDescriptorSetLayoutSupport *pSupport) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600792 bool skip = DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false,
793 "VUID-vkGetDescriptorSetLayoutSupportKHR-device-parameter", kVUIDUndefined);
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600794 if (pCreateInfo) {
795 skip |= ValidateSamplerObjects(device, pCreateInfo);
796 }
797 return skip;
798}
799
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600800bool PreCallValidateGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
801 VkQueueFamilyProperties *pQueueFamilyProperties) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600802 bool skip = InstanceValidateObject(physicalDevice, physicalDevice, kVulkanObjectTypePhysicalDevice, false,
803 "VUID-vkGetPhysicalDeviceQueueFamilyProperties-physicalDevice-parameter", kVUIDUndefined);
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600804 return skip;
805}
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600806
807void PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
808 VkQueueFamilyProperties *pQueueFamilyProperties) {
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600809 if (pQueueFamilyProperties != NULL) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600810 auto instance_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
811 if (instance_data->objdata.queue_family_properties.size() < *pQueueFamilyPropertyCount) {
812 instance_data->objdata.queue_family_properties.resize(*pQueueFamilyPropertyCount);
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600813 }
814 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600815 instance_data->objdata.queue_family_properties[i] = pQueueFamilyProperties[i];
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600816 }
817 }
818}
819
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600820void PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
821 VkInstance *pInstance) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600822 InstanceCreateObject(*pInstance, *pInstance, kVulkanObjectTypeInstance, pAllocator);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600823}
824
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600825bool PreCallValidateEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
826 VkPhysicalDevice *pPhysicalDevices) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600827 bool skip = InstanceValidateObject(instance, instance, kVulkanObjectTypeInstance, false,
828 "VUID-vkEnumeratePhysicalDevices-instance-parameter", kVUIDUndefined);
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600829 return skip;
830}
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600831
832void PostCallRecordEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
833 VkPhysicalDevice *pPhysicalDevices) {
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600834 if (pPhysicalDevices) {
835 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600836 InstanceCreateObject(instance, pPhysicalDevices[i], kVulkanObjectTypePhysicalDevice, nullptr);
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600837 }
838 }
839}
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600840
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600841bool PreCallValidateAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
842 VkCommandBuffer *pCommandBuffers) {
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600843 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600844 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkAllocateCommandBuffers-device-parameter",
845 kVUIDUndefined);
846 skip |= DeviceValidateObject(device, pAllocateInfo->commandPool, kVulkanObjectTypeCommandPool, false,
847 "VUID-VkCommandBufferAllocateInfo-commandPool-parameter", kVUIDUndefined);
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600848 return skip;
849}
850
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600851void PostCallRecordAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
852 VkCommandBuffer *pCommandBuffers) {
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600853 for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {
854 AllocateCommandBuffer(device, pAllocateInfo->commandPool, pCommandBuffers[i], pAllocateInfo->level);
855 }
856}
857
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600858bool PreCallValidateAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
859 VkDescriptorSet *pDescriptorSets) {
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600860 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600861 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkAllocateDescriptorSets-device-parameter",
862 kVUIDUndefined);
863 skip |= DeviceValidateObject(device, pAllocateInfo->descriptorPool, kVulkanObjectTypeDescriptorPool, false,
864 "VUID-VkDescriptorSetAllocateInfo-descriptorPool-parameter",
865 "VUID-VkDescriptorSetAllocateInfo-commonparent");
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600866 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600867 skip |= DeviceValidateObject(device, pAllocateInfo->pSetLayouts[i], kVulkanObjectTypeDescriptorSetLayout, false,
868 "VUID-VkDescriptorSetAllocateInfo-pSetLayouts-parameter",
869 "VUID-VkDescriptorSetAllocateInfo-commonparent");
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600870 }
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600871 return skip;
872}
873
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600874void PostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
875 VkDescriptorSet *pDescriptorSets) {
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600876 for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
877 AllocateDescriptorSet(device, pAllocateInfo->descriptorPool, pDescriptorSets[i]);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600878 }
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600879}
880
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600881bool PreCallValidateFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
882 const VkCommandBuffer *pCommandBuffers) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600883 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600884 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkFreeCommandBuffers-device-parameter",
885 kVUIDUndefined);
886 skip |= DeviceValidateObject(device, commandPool, kVulkanObjectTypeCommandPool, false,
887 "VUID-vkFreeCommandBuffers-commandPool-parameter", "VUID-vkFreeCommandBuffers-commandPool-parent");
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600888 for (uint32_t i = 0; i < commandBufferCount; i++) {
889 if (pCommandBuffers[i] != VK_NULL_HANDLE) {
890 skip |= ValidateCommandBuffer(device, commandPool, pCommandBuffers[i]);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600891 skip |= DeviceValidateDestroyObject(device, pCommandBuffers[i], kVulkanObjectTypeCommandBuffer, nullptr, kVUIDUndefined,
892 kVUIDUndefined);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600893 }
894 }
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600895 return skip;
896}
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600897
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600898void PreCallRecordFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
899 const VkCommandBuffer *pCommandBuffers) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600900 for (uint32_t i = 0; i < commandBufferCount; i++) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600901 DeviceRecordDestroyObject(device, pCommandBuffers[i], kVulkanObjectTypeCommandBuffer);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600902 }
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600903}
904
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600905bool PreCallValidateDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600906 return DeviceValidateDestroyObject(device, swapchain, kVulkanObjectTypeSwapchainKHR, pAllocator,
907 "VUID-vkDestroySwapchainKHR-swapchain-01283", "VUID-vkDestroySwapchainKHR-swapchain-01284");
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600908}
909
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600910void PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600911 DeviceRecordDestroyObject(device, swapchain, kVulkanObjectTypeSwapchainKHR);
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600912 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600913 std::unordered_map<uint64_t, ObjTrackState *>::iterator itr = device_data->objdata.swapchainImageMap.begin();
914 while (itr != device_data->objdata.swapchainImageMap.end()) {
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600915 ObjTrackState *pNode = (*itr).second;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600916 if (pNode->parent_object == HandleToUint64(swapchain)) {
917 delete pNode;
918 auto delete_item = itr++;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600919 device_data->objdata.swapchainImageMap.erase(delete_item);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600920 } else {
921 ++itr;
922 }
923 }
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600924}
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600925
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600926bool PreCallValidateFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
927 const VkDescriptorSet *pDescriptorSets) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600928 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600929 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkFreeDescriptorSets-device-parameter",
930 kVUIDUndefined);
931 skip |= DeviceValidateObject(device, descriptorPool, kVulkanObjectTypeDescriptorPool, false,
932 "VUID-vkFreeDescriptorSets-descriptorPool-parameter",
933 "VUID-vkFreeDescriptorSets-descriptorPool-parent");
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600934 for (uint32_t i = 0; i < descriptorSetCount; i++) {
935 if (pDescriptorSets[i] != VK_NULL_HANDLE) {
936 skip |= ValidateDescriptorSet(device, descriptorPool, pDescriptorSets[i]);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600937 skip |= DeviceValidateDestroyObject(device, pDescriptorSets[i], kVulkanObjectTypeDescriptorSet, nullptr, kVUIDUndefined,
938 kVUIDUndefined);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600939 }
940 }
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600941 return skip;
942}
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600943void PreCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
944 const VkDescriptorSet *pDescriptorSets) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600945 for (uint32_t i = 0; i < descriptorSetCount; i++) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600946 DeviceRecordDestroyObject(device, pDescriptorSets[i], kVulkanObjectTypeDescriptorSet);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600947 }
Mark Lobodzinski1c7fa372018-09-17 11:35:00 -0600948}
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600949
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600950bool PreCallValidateDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
951 const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600952 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -0600953 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600954 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkDestroyDescriptorPool-device-parameter",
955 kVUIDUndefined);
956 skip |= DeviceValidateObject(device, descriptorPool, kVulkanObjectTypeDescriptorPool, true,
957 "VUID-vkDestroyDescriptorPool-descriptorPool-parameter",
958 "VUID-vkDestroyDescriptorPool-descriptorPool-parent");
959 std::unordered_map<uint64_t, ObjTrackState *>::iterator itr =
960 device_data->objdata.object_map[kVulkanObjectTypeDescriptorSet].begin();
961 while (itr != device_data->objdata.object_map[kVulkanObjectTypeDescriptorSet].end()) {
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600962 ObjTrackState *pNode = (*itr).second;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600963 auto del_itr = itr++;
964 if (pNode->parent_object == HandleToUint64(descriptorPool)) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600965 skip |= DeviceValidateDestroyObject(device, (VkDescriptorSet)((*del_itr).first), kVulkanObjectTypeDescriptorSet,
966 nullptr, kVUIDUndefined, kVUIDUndefined);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -0600967 }
968 }
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600969 skip |= DeviceValidateDestroyObject(device, descriptorPool, kVulkanObjectTypeDescriptorPool, pAllocator,
970 "VUID-vkDestroyDescriptorPool-descriptorPool-00304",
971 "VUID-vkDestroyDescriptorPool-descriptorPool-00305");
Mark Lobodzinskia2e97362018-09-17 13:58:32 -0600972 return skip;
973}
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600974void PreCallRecordDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskia2e97362018-09-17 13:58:32 -0600975 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600976 std::unordered_map<uint64_t, ObjTrackState *>::iterator itr =
977 device_data->objdata.object_map[kVulkanObjectTypeDescriptorSet].begin();
978 while (itr != device_data->objdata.object_map[kVulkanObjectTypeDescriptorSet].end()) {
Mark Lobodzinskia2e97362018-09-17 13:58:32 -0600979 ObjTrackState *pNode = (*itr).second;
980 auto del_itr = itr++;
981 if (pNode->parent_object == HandleToUint64(descriptorPool)) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600982 DeviceRecordDestroyObject(device, (VkDescriptorSet)((*del_itr).first), kVulkanObjectTypeDescriptorSet);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600983 }
984 }
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600985 DeviceRecordDestroyObject(device, descriptorPool, kVulkanObjectTypeDescriptorPool);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -0600986}
987
Mark Lobodzinski63902f02018-09-21 10:36:44 -0600988bool PreCallValidateDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600989 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
990 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600991 skip |= DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkDestroyCommandPool-device-parameter",
992 kVUIDUndefined);
993 skip |= DeviceValidateObject(device, commandPool, kVulkanObjectTypeCommandPool, true,
994 "VUID-vkDestroyCommandPool-commandPool-parameter", "VUID-vkDestroyCommandPool-commandPool-parent");
995 auto itr = device_data->objdata.object_map[kVulkanObjectTypeCommandBuffer].begin();
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600996 auto del_itr = itr;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -0600997 while (itr != device_data->objdata.object_map[kVulkanObjectTypeCommandBuffer].end()) {
Mark Lobodzinskiefc64392017-07-18 13:15:47 -0600998 ObjTrackState *pNode = (*itr).second;
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -0600999 del_itr = itr++;
1000 if (pNode->parent_object == HandleToUint64(commandPool)) {
1001 skip |= ValidateCommandBuffer(device, commandPool, reinterpret_cast<VkCommandBuffer>((*del_itr).first));
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001002 skip |= DeviceValidateDestroyObject(device, reinterpret_cast<VkCommandBuffer>((*del_itr).first),
1003 kVulkanObjectTypeCommandBuffer, nullptr, kVUIDUndefined, kVUIDUndefined);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001004 }
1005 }
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001006 skip |=
1007 DeviceValidateDestroyObject(device, commandPool, kVulkanObjectTypeCommandPool, pAllocator,
1008 "VUID-vkDestroyCommandPool-commandPool-00042", "VUID-vkDestroyCommandPool-commandPool-00043");
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001009 return skip;
1010}
1011
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001012void PreCallRecordDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001013 layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001014 auto itr = device_data->objdata.object_map[kVulkanObjectTypeCommandBuffer].begin();
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001015 auto del_itr = itr;
1016 // A CommandPool's cmd buffers are implicitly deleted when pool is deleted. Remove this pool's cmdBuffers from cmd buffer map.
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001017 while (itr != device_data->objdata.object_map[kVulkanObjectTypeCommandBuffer].end()) {
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001018 ObjTrackState *pNode = (*itr).second;
1019 del_itr = itr++;
1020 if (pNode->parent_object == HandleToUint64(commandPool)) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001021 DeviceRecordDestroyObject(device, reinterpret_cast<VkCommandBuffer>((*del_itr).first), kVulkanObjectTypeCommandBuffer);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -06001022 }
1023 }
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001024 DeviceRecordDestroyObject(device, commandPool, kVulkanObjectTypeCommandPool);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001025}
1026
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001027bool PreCallValidateGetPhysicalDeviceQueueFamilyProperties2(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1028 VkQueueFamilyProperties2KHR *pQueueFamilyProperties) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001029 return InstanceValidateObject(physicalDevice, physicalDevice, kVulkanObjectTypePhysicalDevice, false,
1030 "VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter", kVUIDUndefined);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001031}
1032
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001033void PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount,
1034 VkQueueFamilyProperties2KHR *pQueueFamilyProperties) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001035 instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001036 if (pQueueFamilyProperties != NULL) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001037 if (instance_data->objdata.queue_family_properties.size() < *pQueueFamilyPropertyCount) {
1038 instance_data->objdata.queue_family_properties.resize(*pQueueFamilyPropertyCount);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001039 }
1040 for (uint32_t i = 0; i < *pQueueFamilyPropertyCount; i++) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001041 instance_data->objdata.queue_family_properties[i] = pQueueFamilyProperties[i].queueFamilyProperties;
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001042 }
1043 }
1044}
1045
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001046bool PreCallValidateGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
1047 VkDisplayPropertiesKHR *pProperties) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001048 bool skip = InstanceValidateObject(physicalDevice, physicalDevice, kVulkanObjectTypePhysicalDevice, false,
1049 "VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-physicalDevice-parameter", kVUIDUndefined);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001050 return skip;
1051}
1052
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001053void PostCallRecordGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
1054 VkDisplayPropertiesKHR *pProperties) {
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001055 if (pProperties) {
1056 for (uint32_t i = 0; i < *pPropertyCount; ++i) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001057 InstanceCreateObject(physicalDevice, pProperties[i].display, kVulkanObjectTypeDisplayKHR, nullptr);
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -06001058 }
1059 }
1060}
1061
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001062bool PreCallValidateGetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t *pPropertyCount,
1063 VkDisplayModePropertiesKHR *pProperties) {
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001064 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001065 skip |= InstanceValidateObject(physicalDevice, physicalDevice, kVulkanObjectTypePhysicalDevice, false,
1066 "VUID-vkGetDisplayModePropertiesKHR-physicalDevice-parameter", kVUIDUndefined);
1067 skip |= InstanceValidateObject(physicalDevice, display, kVulkanObjectTypeDisplayKHR, false,
1068 "VUID-vkGetDisplayModePropertiesKHR-display-parameter", kVUIDUndefined);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001069
1070 return skip;
1071}
1072
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001073void PostCallRecordGetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t *pPropertyCount,
1074 VkDisplayModePropertiesKHR *pProperties) {
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001075 if (pProperties) {
Tony-LunarGcd0c6b02018-10-26 14:56:44 -06001076 for (uint32_t i = 0; i < *pPropertyCount; ++i) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001077 InstanceCreateObject(physicalDevice, pProperties[i].displayMode, kVulkanObjectTypeDisplayModeKHR, nullptr);
Shannon McPherson9d5167f2018-05-02 15:24:37 -06001078 }
1079 }
Shannon McPherson9d5167f2018-05-02 15:24:37 -06001080}
1081
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001082bool PreCallValidateDebugMarkerSetObjectNameEXT(VkDevice device, const VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001083 return DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false,
1084 "VUID-vkDebugMarkerSetObjectNameEXT-device-parameter", kVUIDUndefined);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001085}
1086
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001087bool PreCallValidateGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001088 return DeviceValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkGetDeviceProcAddr-device-parameter",
1089 kVUIDUndefined);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001090}
1091
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001092bool PreCallValidateGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001093 return InstanceValidateObject(instance, instance, kVulkanObjectTypeInstance, false,
1094 "VUID-vkGetInstanceProcAddr-instance-parameter", kVUIDUndefined);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001095}
1096
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001097bool PreCallValidateGetPhysicalDeviceDisplayProperties2KHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
1098 VkDisplayProperties2KHR *pProperties) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001099 return InstanceValidateObject(physicalDevice, physicalDevice, kVulkanObjectTypePhysicalDevice, false,
1100 "VUID-vkGetPhysicalDeviceDisplayProperties2KHR-physicalDevice-parameter", kVUIDUndefined);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001101}
1102
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001103void PostCallRecordGetPhysicalDeviceDisplayProperties2KHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount,
1104 VkDisplayProperties2KHR *pProperties) {
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001105 for (uint32_t index = 0; index < *pPropertyCount; ++index) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001106 InstanceCreateObject(physicalDevice, pProperties[index].displayProperties.display, kVulkanObjectTypeDisplayKHR, nullptr);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001107 }
1108}
1109
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001110bool PreCallValidateGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
1111 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001112 return InstanceValidateObject(physicalDevice, physicalDevice, kVulkanObjectTypePhysicalDevice, false,
1113 "VUID-vkGetDisplayPlaneSupportedDisplaysKHR-physicalDevice-parameter", kVUIDUndefined);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001114}
1115
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001116void PostCallRecordGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
1117 uint32_t *pDisplayCount, VkDisplayKHR *pDisplays) {
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001118 for (uint32_t index = 0; index < *pDisplayCount; ++index) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001119 InstanceCreateObject(physicalDevice, pDisplays[index], kVulkanObjectTypeDisplayKHR, nullptr);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001120 }
1121}
1122
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001123bool PreCallValidateGetDisplayModeProperties2KHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t *pPropertyCount,
1124 VkDisplayModeProperties2KHR *pProperties) {
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001125 bool skip = false;
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001126 skip |= InstanceValidateObject(physicalDevice, physicalDevice, kVulkanObjectTypePhysicalDevice, false,
1127 "VUID-vkGetDisplayModeProperties2KHR-physicalDevice-parameter", kVUIDUndefined);
1128 skip |= InstanceValidateObject(physicalDevice, display, kVulkanObjectTypeDisplayKHR, false,
1129 "VUID-vkGetDisplayModeProperties2KHR-display-parameter", kVUIDUndefined);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001130 return skip;
1131}
1132
Mark Lobodzinski63902f02018-09-21 10:36:44 -06001133void PostCallRecordGetDisplayModeProperties2KHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t *pPropertyCount,
1134 VkDisplayModeProperties2KHR *pProperties) {
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001135 for (uint32_t index = 0; index < *pPropertyCount; ++index) {
Mark Lobodzinskic3ff7a92018-09-20 11:05:57 -06001136 InstanceCreateObject(physicalDevice, pProperties[index].displayModeProperties.displayMode, kVulkanObjectTypeDisplayModeKHR,
1137 nullptr);
Mark Lobodzinskia2e97362018-09-17 13:58:32 -06001138 }
1139}
1140
Mark Lobodzinskib2de97f2017-07-06 15:28:11 -06001141} // namespace object_tracker