blob: 14d2e4c664db8ed1d15aedd7c120bada3aaf1a5e [file] [log] [blame]
sfricke-samsung486a51e2021-01-02 00:10:15 -08001/* Copyright (c) 2015-2021 The Khronos Group Inc.
2 * Copyright (c) 2015-2021 Valve Corporation
3 * Copyright (c) 2015-2021 LunarG, Inc.
4 * Copyright (C) 2015-2021 Google Inc.
Tobias Hector6663c9b2020-11-05 10:18:02 +00005 * Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
locke-lunargd556cc32019-09-17 01:21:23 -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: Dave Houlton <daveh@lunarg.com>
21 * Shannon McPherson <shannon@lunarg.com>
Tobias Hector6663c9b2020-11-05 10:18:02 +000022 * Author: Tobias Hector <tobias.hector@amd.com>
locke-lunargd556cc32019-09-17 01:21:23 -060023 */
24
David Zhao Akeley44139b12021-04-26 16:16:13 -070025#include <algorithm>
locke-lunargd556cc32019-09-17 01:21:23 -060026#include <cmath>
locke-lunargd556cc32019-09-17 01:21:23 -060027
28#include "vk_enum_string_helper.h"
29#include "vk_format_utils.h"
30#include "vk_layer_data.h"
31#include "vk_layer_utils.h"
32#include "vk_layer_logging.h"
33#include "vk_typemap_helper.h"
34
35#include "chassis.h"
36#include "state_tracker.h"
37#include "shader_validation.h"
Jeremy Gebben74aa7622020-12-15 11:18:00 -070038#include "sync_utils.h"
Jeremy Gebben159b3cc2021-06-03 09:09:03 -060039#include "cmd_buffer_state.h"
40#include "render_pass_state.h"
locke-lunarg4189aa22020-10-21 00:23:48 -060041
Jeremy Gebben11af9792021-08-20 10:20:09 -060042extern template PIPELINE_STATE::PIPELINE_STATE(const ValidationStateTracker *, const VkRayTracingPipelineCreateInfoKHR *,
43 std::shared_ptr<const PIPELINE_LAYOUT_STATE> &&);
44extern template PIPELINE_STATE::PIPELINE_STATE(const ValidationStateTracker *, const VkRayTracingPipelineCreateInfoNV *,
45 std::shared_ptr<const PIPELINE_LAYOUT_STATE> &&);
46
Mark Lobodzinskib4ab6ac2020-04-02 13:12:06 -060047void ValidationStateTracker::InitDeviceValidationObject(bool add_obj, ValidationObject *inst_obj, ValidationObject *dev_obj) {
48 if (add_obj) {
49 instance_state = reinterpret_cast<ValidationStateTracker *>(GetValidationObject(inst_obj->object_dispatch, container_type));
50 // Call base class
51 ValidationObject::InitDeviceValidationObject(add_obj, inst_obj, dev_obj);
52 }
53}
54
John Zulauf2bc1fde2020-04-24 15:09:51 -060055// NOTE: Beware the lifespan of the rp_begin when holding the return. If the rp_begin isn't a "safe" copy, "IMAGELESS"
56// attachments won't persist past the API entry point exit.
Jeremy Gebben88f58142021-06-01 10:07:52 -060057static std::pair<uint32_t, const VkImageView *> GetFramebufferAttachments(const VkRenderPassBeginInfo &rp_begin,
58 const FRAMEBUFFER_STATE &fb_state) {
John Zulauf2bc1fde2020-04-24 15:09:51 -060059 const VkImageView *attachments = fb_state.createInfo.pAttachments;
60 uint32_t count = fb_state.createInfo.attachmentCount;
61 if (fb_state.createInfo.flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -070062 const auto *framebuffer_attachments = LvlFindInChain<VkRenderPassAttachmentBeginInfo>(rp_begin.pNext);
John Zulauf2bc1fde2020-04-24 15:09:51 -060063 if (framebuffer_attachments) {
64 attachments = framebuffer_attachments->pAttachments;
65 count = framebuffer_attachments->attachmentCount;
66 }
67 }
68 return std::make_pair(count, attachments);
69}
70
John Zulauf64ffe552021-02-06 10:25:07 -070071template <typename ImageViewPointer, typename Get>
72std::vector<ImageViewPointer> GetAttachmentViewsImpl(const VkRenderPassBeginInfo &rp_begin, const FRAMEBUFFER_STATE &fb_state,
73 const Get &get_fn) {
74 std::vector<ImageViewPointer> views;
John Zulauf2bc1fde2020-04-24 15:09:51 -060075
76 const auto count_attachment = GetFramebufferAttachments(rp_begin, fb_state);
77 const auto attachment_count = count_attachment.first;
78 const auto *attachments = count_attachment.second;
79 views.resize(attachment_count, nullptr);
80 for (uint32_t i = 0; i < attachment_count; i++) {
81 if (attachments[i] != VK_NULL_HANDLE) {
John Zulauf64ffe552021-02-06 10:25:07 -070082 views[i] = get_fn(attachments[i]);
John Zulauf2bc1fde2020-04-24 15:09:51 -060083 }
84 }
85 return views;
86}
87
John Zulauf64ffe552021-02-06 10:25:07 -070088std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> ValidationStateTracker::GetSharedAttachmentViews(
89 const VkRenderPassBeginInfo &rp_begin, const FRAMEBUFFER_STATE &fb_state) const {
90 auto get_fn = [this](VkImageView handle) { return this->GetShared<IMAGE_VIEW_STATE>(handle); };
91 return GetAttachmentViewsImpl<std::shared_ptr<const IMAGE_VIEW_STATE>>(rp_begin, fb_state, get_fn);
92}
93
locke-lunargd556cc32019-09-17 01:21:23 -060094#ifdef VK_USE_PLATFORM_ANDROID_KHR
95// Android-specific validation that uses types defined only with VK_USE_PLATFORM_ANDROID_KHR
96// This could also move into a seperate core_validation_android.cpp file... ?
97
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -060098template <typename CreateInfo>
99VkFormatFeatureFlags ValidationStateTracker::GetExternalFormatFeaturesANDROID(const CreateInfo *create_info) const {
100 VkFormatFeatureFlags format_features = 0;
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700101 const VkExternalFormatANDROID *ext_fmt_android = LvlFindInChain<VkExternalFormatANDROID>(create_info->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -0600102 if (ext_fmt_android && (0 != ext_fmt_android->externalFormat)) {
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700103 // VUID 01894 will catch if not found in map
104 auto it = ahb_ext_formats_map.find(ext_fmt_android->externalFormat);
105 if (it != ahb_ext_formats_map.end()) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -0600106 format_features = it->second;
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700107 }
locke-lunargd556cc32019-09-17 01:21:23 -0600108 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -0600109 return format_features;
locke-lunargd556cc32019-09-17 01:21:23 -0600110}
111
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700112void ValidationStateTracker::PostCallRecordGetAndroidHardwareBufferPropertiesANDROID(
113 VkDevice device, const struct AHardwareBuffer *buffer, VkAndroidHardwareBufferPropertiesANDROID *pProperties, VkResult result) {
114 if (VK_SUCCESS != result) return;
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700115 auto ahb_format_props = LvlFindInChain<VkAndroidHardwareBufferFormatPropertiesANDROID>(pProperties->pNext);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700116 if (ahb_format_props) {
Jeremy Gebbenfc6f8152021-03-18 16:58:55 -0600117 ahb_ext_formats_map.emplace(ahb_format_props->externalFormat, ahb_format_props->formatFeatures);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700118 }
119}
120
locke-lunargd556cc32019-09-17 01:21:23 -0600121#else
122
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -0600123template <typename CreateInfo>
124VkFormatFeatureFlags ValidationStateTracker::GetExternalFormatFeaturesANDROID(const CreateInfo *create_info) const {
125 return 0;
126}
locke-lunargd556cc32019-09-17 01:21:23 -0600127
128#endif // VK_USE_PLATFORM_ANDROID_KHR
129
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600130VkFormatFeatureFlags GetImageFormatFeatures(VkPhysicalDevice physical_device, VkDevice device, VkImage image, VkFormat format,
131 VkImageTiling tiling) {
132 VkFormatFeatureFlags format_features = 0;
Petr Kraus44f1c482020-04-25 20:09:25 +0200133 // Add feature support according to Image Format Features (vkspec.html#resources-image-format-features)
134 // if format is AHB external format then the features are already set
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600135 if (tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
136 VkImageDrmFormatModifierPropertiesEXT drm_format_properties = {VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
137 nullptr};
138 DispatchGetImageDrmFormatModifierPropertiesEXT(device, image, &drm_format_properties);
Petr Kraus44f1c482020-04-25 20:09:25 +0200139
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600140 VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, nullptr};
141 VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
142 nullptr};
143 format_properties_2.pNext = (void *)&drm_properties_list;
144 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
145 std::vector<VkDrmFormatModifierPropertiesEXT> drm_properties;
146 drm_properties.resize(drm_properties_list.drmFormatModifierCount);
147 drm_properties_list.pDrmFormatModifierProperties = &drm_properties[0];
148 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
Petr Kraus44f1c482020-04-25 20:09:25 +0200149
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600150 for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
151 if (drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifier == drm_format_properties.drmFormatModifier) {
152 format_features = drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
153 break;
Petr Kraus44f1c482020-04-25 20:09:25 +0200154 }
Petr Kraus44f1c482020-04-25 20:09:25 +0200155 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600156 } else {
157 VkFormatProperties format_properties;
158 DispatchGetPhysicalDeviceFormatProperties(physical_device, format, &format_properties);
159 format_features =
160 (tiling == VK_IMAGE_TILING_LINEAR) ? format_properties.linearTilingFeatures : format_properties.optimalTilingFeatures;
Petr Kraus44f1c482020-04-25 20:09:25 +0200161 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600162 return format_features;
Petr Kraus44f1c482020-04-25 20:09:25 +0200163}
164
locke-lunargd556cc32019-09-17 01:21:23 -0600165void ValidationStateTracker::PostCallRecordCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
166 const VkAllocationCallbacks *pAllocator, VkImage *pImage, VkResult result) {
167 if (VK_SUCCESS != result) return;
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600168 VkFormatFeatureFlags format_features = 0;
sfricke-samsung45996a42021-09-16 13:45:27 -0700169 if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600170 format_features = GetExternalFormatFeaturesANDROID(pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -0600171 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600172 if (format_features == 0) {
173 format_features = GetImageFormatFeatures(physical_device, device, *pImage, pCreateInfo->format, pCreateInfo->tiling);
locke-lunargd556cc32019-09-17 01:21:23 -0600174 }
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -0600175 imageMap[*pImage] = std::make_shared<IMAGE_STATE>(this, *pImage, pCreateInfo, format_features);
locke-lunargd556cc32019-09-17 01:21:23 -0600176}
177
178void ValidationStateTracker::PreCallRecordDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
179 if (!image) return;
180 IMAGE_STATE *image_state = GetImageState(image);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600181 if (!image_state) return;
182
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600183 image_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -0600184 imageMap.erase(image);
185}
186
187void ValidationStateTracker::PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
188 VkImageLayout imageLayout, const VkClearColorValue *pColor,
189 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600190
191 if (disabled[command_buffer_state]) return;
192
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600193 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600194 if (cb_node) {
195 cb_node->RecordTransferCmd(CMD_CLEARCOLORIMAGE, GetImageState(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600196 }
197}
198
199void ValidationStateTracker::PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image,
200 VkImageLayout imageLayout,
201 const VkClearDepthStencilValue *pDepthStencil,
202 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600203 if (disabled[command_buffer_state]) return;
204
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600205 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600206 if (cb_node) {
207 cb_node->RecordTransferCmd(CMD_CLEARDEPTHSTENCILIMAGE, GetImageState(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600208 }
209}
210
211void ValidationStateTracker::PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage,
212 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
213 uint32_t regionCount, const VkImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600214 if (disabled[command_buffer_state]) return;
215
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600216 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600217 cb_node->RecordTransferCmd(CMD_COPYIMAGE, GetImageState(srcImage), GetImageState(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600218}
219
Jeff Leger178b1e52020-10-05 12:22:23 -0400220void ValidationStateTracker::PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer,
221 const VkCopyImageInfo2KHR *pCopyImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600222 if (disabled[command_buffer_state]) return;
223
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600224 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600225 cb_node->RecordTransferCmd(CMD_COPYIMAGE2KHR, GetImageState(pCopyImageInfo->srcImage), GetImageState(pCopyImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400226}
227
locke-lunargd556cc32019-09-17 01:21:23 -0600228void ValidationStateTracker::PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage,
229 VkImageLayout srcImageLayout, VkImage dstImage,
230 VkImageLayout dstImageLayout, uint32_t regionCount,
231 const VkImageResolve *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600232 if (disabled[command_buffer_state]) return;
233
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600234 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600235 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE, GetImageState(srcImage), GetImageState(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600236}
237
Jeff Leger178b1e52020-10-05 12:22:23 -0400238void ValidationStateTracker::PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer,
239 const VkResolveImageInfo2KHR *pResolveImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600240 if (disabled[command_buffer_state]) return;
241
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600242 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600243 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE2KHR, GetImageState(pResolveImageInfo->srcImage),
244 GetImageState(pResolveImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400245}
246
locke-lunargd556cc32019-09-17 01:21:23 -0600247void ValidationStateTracker::PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage,
248 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
249 uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600250 if (disabled[command_buffer_state]) return;
251
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600252 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600253 cb_node->RecordTransferCmd(CMD_BLITIMAGE, GetImageState(srcImage), GetImageState(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600254}
255
Jeff Leger178b1e52020-10-05 12:22:23 -0400256void ValidationStateTracker::PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer,
257 const VkBlitImageInfo2KHR *pBlitImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600258 if (disabled[command_buffer_state]) return;
259
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600260 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600261 cb_node->RecordTransferCmd(CMD_BLITIMAGE2KHR, GetImageState(pBlitImageInfo->srcImage), GetImageState(pBlitImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400262}
263
locke-lunargd556cc32019-09-17 01:21:23 -0600264void ValidationStateTracker::PostCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
265 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer,
266 VkResult result) {
267 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600268
Jeremy Gebbenc8937b62021-09-24 15:50:56 -0600269 auto buffer_state = std::make_shared<BUFFER_STATE>(this, *pBuffer, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -0600270
James Rumble2f6e7bb2021-07-13 15:21:20 +0100271 if (pCreateInfo) {
272 const auto *opaque_capture_address = LvlFindInChain<VkBufferOpaqueCaptureAddressCreateInfo>(pCreateInfo->pNext);
273 if (opaque_capture_address) {
274 // address is used for GPU-AV and ray tracing buffer validation
275 buffer_state->deviceAddress = opaque_capture_address->opaqueCaptureAddress;
276 buffer_address_map_.emplace(opaque_capture_address->opaqueCaptureAddress, buffer_state.get());
277 }
278 }
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700279 bufferMap.emplace(*pBuffer, std::move(buffer_state));
locke-lunargd556cc32019-09-17 01:21:23 -0600280}
281
282void ValidationStateTracker::PostCallRecordCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
283 const VkAllocationCallbacks *pAllocator, VkBufferView *pView,
284 VkResult result) {
285 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600286
Jeff Bolze7fc67b2019-10-04 12:29:31 -0500287 auto buffer_state = GetBufferShared(pCreateInfo->buffer);
locke-lunarg25b6c352020-08-06 17:44:18 -0600288
289 VkFormatProperties format_properties;
290 DispatchGetPhysicalDeviceFormatProperties(physical_device, pCreateInfo->format, &format_properties);
locke-lunarg25b6c352020-08-06 17:44:18 -0600291
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600292 bufferViewMap[*pView] =
293 std::make_shared<BUFFER_VIEW_STATE>(buffer_state, *pView, pCreateInfo, format_properties.bufferFeatures);
locke-lunargd556cc32019-09-17 01:21:23 -0600294}
295
296void ValidationStateTracker::PostCallRecordCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
297 const VkAllocationCallbacks *pAllocator, VkImageView *pView,
298 VkResult result) {
299 if (result != VK_SUCCESS) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -0500300 auto image_state = GetImageShared(pCreateInfo->image);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700301
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600302 VkFormatFeatureFlags format_features = 0;
303 if (image_state->HasAHBFormat() == true) {
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700304 // The ImageView uses same Image's format feature since they share same AHB
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600305 format_features = image_state->format_features;
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700306 } else {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600307 format_features = GetImageFormatFeatures(physical_device, device, image_state->image(), pCreateInfo->format,
308 image_state->createInfo.tiling);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700309 }
310
locke-lunarg9939d4b2020-10-26 20:11:08 -0600311 // filter_cubic_props is used in CmdDraw validation. But it takes a lot of performance if it does in CmdDraw.
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600312 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600313 if (IsExtEnabled(device_extensions.vk_ext_filter_cubic)) {
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700314 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600315 imageview_format_info.imageViewType = pCreateInfo->viewType;
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700316 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600317 image_format_info.type = image_state->createInfo.imageType;
318 image_format_info.format = image_state->createInfo.format;
319 image_format_info.tiling = image_state->createInfo.tiling;
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600320 auto usage_create_info = LvlFindInChain<VkImageViewUsageCreateInfo>(pCreateInfo->pNext);
321 image_format_info.usage = usage_create_info ? usage_create_info->usage : image_state->createInfo.usage;
locke-lunarg9939d4b2020-10-26 20:11:08 -0600322 image_format_info.flags = image_state->createInfo.flags;
323
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600324 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600325
326 DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_format_info, &image_format_properties);
327 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600328
329 imageViewMap[*pView] =
330 std::make_shared<IMAGE_VIEW_STATE>(image_state, *pView, pCreateInfo, format_features, filter_cubic_props);
locke-lunargd556cc32019-09-17 01:21:23 -0600331}
332
333void ValidationStateTracker::PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
334 uint32_t regionCount, const VkBufferCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600335 if (disabled[command_buffer_state]) return;
336
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600337 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600338 cb_node->RecordTransferCmd(CMD_COPYBUFFER, GetBufferState(srcBuffer), GetBufferState(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600339}
340
Jeff Leger178b1e52020-10-05 12:22:23 -0400341void ValidationStateTracker::PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600342 const VkCopyBufferInfo2KHR *pCopyBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600343 if (disabled[command_buffer_state]) return;
344
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600345 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600346 cb_node->RecordTransferCmd(CMD_COPYBUFFER2KHR, GetBufferState(pCopyBufferInfo->srcBuffer),
347 GetBufferState(pCopyBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400348}
349
locke-lunargd556cc32019-09-17 01:21:23 -0600350void ValidationStateTracker::PreCallRecordDestroyImageView(VkDevice device, VkImageView imageView,
351 const VkAllocationCallbacks *pAllocator) {
352 IMAGE_VIEW_STATE *image_view_state = GetImageViewState(imageView);
353 if (!image_view_state) return;
locke-lunargd556cc32019-09-17 01:21:23 -0600354
355 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600356 image_view_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -0600357 imageViewMap.erase(imageView);
358}
359
360void ValidationStateTracker::PreCallRecordDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
361 if (!buffer) return;
362 auto buffer_state = GetBufferState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600363
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600364 buffer_state->Destroy();
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -0600365 bufferMap.erase(buffer_state->buffer());
locke-lunargd556cc32019-09-17 01:21:23 -0600366}
367
368void ValidationStateTracker::PreCallRecordDestroyBufferView(VkDevice device, VkBufferView bufferView,
369 const VkAllocationCallbacks *pAllocator) {
370 if (!bufferView) return;
371 auto buffer_view_state = GetBufferViewState(bufferView);
locke-lunargd556cc32019-09-17 01:21:23 -0600372
373 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600374 buffer_view_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -0600375 bufferViewMap.erase(bufferView);
376}
377
378void ValidationStateTracker::PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
379 VkDeviceSize size, uint32_t data) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600380 if (disabled[command_buffer_state]) return;
381
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600382 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600383 cb_node->RecordTransferCmd(CMD_FILLBUFFER, GetBufferState(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600384}
385
386void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
387 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
388 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600389 if (disabled[command_buffer_state]) return;
390
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600391 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600392
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600393 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER, GetImageState(srcImage), GetBufferState(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600394}
395
Jeff Leger178b1e52020-10-05 12:22:23 -0400396void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
397 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600398 if (disabled[command_buffer_state]) return;
399
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600400 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600401 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER2KHR, GetImageState(pCopyImageToBufferInfo->srcImage),
402 GetBufferState(pCopyImageToBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400403}
404
locke-lunargd556cc32019-09-17 01:21:23 -0600405void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
406 VkImageLayout dstImageLayout, uint32_t regionCount,
407 const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600408 if (disabled[command_buffer_state]) return;
409
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600410 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600411 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE, GetBufferState(srcBuffer), GetImageState(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600412}
413
Jeff Leger178b1e52020-10-05 12:22:23 -0400414void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
415 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600416
417 if (disabled[command_buffer_state]) return;
418
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600419 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600420 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE2KHR, GetBufferState(pCopyBufferToImageInfo->srcBuffer),
421 GetImageState(pCopyBufferToImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400422}
423
locke-lunargd556cc32019-09-17 01:21:23 -0600424// Return ptr to memory binding for given handle of specified type
425template <typename State, typename Result>
426static Result GetObjectMemBindingImpl(State state, const VulkanTypedHandle &typed_handle) {
427 switch (typed_handle.type) {
428 case kVulkanObjectTypeImage:
429 return state->GetImageState(typed_handle.Cast<VkImage>());
430 case kVulkanObjectTypeBuffer:
431 return state->GetBufferState(typed_handle.Cast<VkBuffer>());
432 case kVulkanObjectTypeAccelerationStructureNV:
sourav parmarcd5fb182020-07-17 12:58:44 -0700433 return state->GetAccelerationStructureStateNV(typed_handle.Cast<VkAccelerationStructureNV>());
locke-lunargd556cc32019-09-17 01:21:23 -0600434 default:
435 break;
436 }
437 return nullptr;
438}
439
440const BINDABLE *ValidationStateTracker::GetObjectMemBinding(const VulkanTypedHandle &typed_handle) const {
441 return GetObjectMemBindingImpl<const ValidationStateTracker *, const BINDABLE *>(this, typed_handle);
442}
443
444BINDABLE *ValidationStateTracker::GetObjectMemBinding(const VulkanTypedHandle &typed_handle) {
445 return GetObjectMemBindingImpl<ValidationStateTracker *, BINDABLE *>(this, typed_handle);
446}
447
locke-lunargd556cc32019-09-17 01:21:23 -0600448// Remove set from setMap and delete the set
449void ValidationStateTracker::FreeDescriptorSet(cvdescriptorset::DescriptorSet *descriptor_set) {
Jeff Bolz41a1ced2019-10-11 11:40:49 -0500450 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600451 descriptor_set->Destroy();
Jeff Bolz41a1ced2019-10-11 11:40:49 -0500452
locke-lunargd556cc32019-09-17 01:21:23 -0600453 setMap.erase(descriptor_set->GetSet());
454}
455
456// Free all DS Pools including their Sets & related sub-structs
457// NOTE : Calls to this function should be wrapped in mutex
458void ValidationStateTracker::DeleteDescriptorSetPools() {
459 for (auto ii = descriptorPoolMap.begin(); ii != descriptorPoolMap.end();) {
460 // Remove this pools' sets from setMap and delete them
John Zulauf79f06582021-02-27 18:38:39 -0700461 for (auto *ds : ii->second->sets) {
locke-lunargd556cc32019-09-17 01:21:23 -0600462 FreeDescriptorSet(ds);
463 }
464 ii->second->sets.clear();
465 ii = descriptorPoolMap.erase(ii);
466 }
467}
468
469// For given object struct return a ptr of BASE_NODE type for its wrapping struct
470BASE_NODE *ValidationStateTracker::GetStateStructPtrFromObject(const VulkanTypedHandle &object_struct) {
Jeff Bolzadbfa852019-10-04 13:53:30 -0500471 if (object_struct.node) {
472#ifdef _DEBUG
473 // assert that lookup would find the same object
474 VulkanTypedHandle other = object_struct;
475 other.node = nullptr;
476 assert(object_struct.node == GetStateStructPtrFromObject(other));
477#endif
478 return object_struct.node;
479 }
locke-lunargd556cc32019-09-17 01:21:23 -0600480 BASE_NODE *base_ptr = nullptr;
481 switch (object_struct.type) {
482 case kVulkanObjectTypeDescriptorSet: {
483 base_ptr = GetSetNode(object_struct.Cast<VkDescriptorSet>());
484 break;
485 }
486 case kVulkanObjectTypeSampler: {
487 base_ptr = GetSamplerState(object_struct.Cast<VkSampler>());
488 break;
489 }
490 case kVulkanObjectTypeQueryPool: {
491 base_ptr = GetQueryPoolState(object_struct.Cast<VkQueryPool>());
492 break;
493 }
494 case kVulkanObjectTypePipeline: {
495 base_ptr = GetPipelineState(object_struct.Cast<VkPipeline>());
496 break;
497 }
498 case kVulkanObjectTypeBuffer: {
499 base_ptr = GetBufferState(object_struct.Cast<VkBuffer>());
500 break;
501 }
502 case kVulkanObjectTypeBufferView: {
503 base_ptr = GetBufferViewState(object_struct.Cast<VkBufferView>());
504 break;
505 }
506 case kVulkanObjectTypeImage: {
507 base_ptr = GetImageState(object_struct.Cast<VkImage>());
508 break;
509 }
510 case kVulkanObjectTypeImageView: {
511 base_ptr = GetImageViewState(object_struct.Cast<VkImageView>());
512 break;
513 }
514 case kVulkanObjectTypeEvent: {
515 base_ptr = GetEventState(object_struct.Cast<VkEvent>());
516 break;
517 }
518 case kVulkanObjectTypeDescriptorPool: {
519 base_ptr = GetDescriptorPoolState(object_struct.Cast<VkDescriptorPool>());
520 break;
521 }
522 case kVulkanObjectTypeCommandPool: {
523 base_ptr = GetCommandPoolState(object_struct.Cast<VkCommandPool>());
524 break;
525 }
526 case kVulkanObjectTypeFramebuffer: {
527 base_ptr = GetFramebufferState(object_struct.Cast<VkFramebuffer>());
528 break;
529 }
530 case kVulkanObjectTypeRenderPass: {
531 base_ptr = GetRenderPassState(object_struct.Cast<VkRenderPass>());
532 break;
533 }
534 case kVulkanObjectTypeDeviceMemory: {
535 base_ptr = GetDevMemState(object_struct.Cast<VkDeviceMemory>());
536 break;
537 }
538 case kVulkanObjectTypeAccelerationStructureNV: {
sourav parmarcd5fb182020-07-17 12:58:44 -0700539 base_ptr = GetAccelerationStructureStateNV(object_struct.Cast<VkAccelerationStructureNV>());
540 break;
541 }
542 case kVulkanObjectTypeAccelerationStructureKHR: {
543 base_ptr = GetAccelerationStructureStateKHR(object_struct.Cast<VkAccelerationStructureKHR>());
locke-lunargd556cc32019-09-17 01:21:23 -0600544 break;
545 }
Jeff Bolzadbfa852019-10-04 13:53:30 -0500546 case kVulkanObjectTypeUnknown:
547 // This can happen if an element of the object_bindings vector has been
548 // zeroed out, after an object is destroyed.
549 break;
locke-lunargd556cc32019-09-17 01:21:23 -0600550 default:
551 // TODO : Any other objects to be handled here?
552 assert(0);
553 break;
554 }
555 return base_ptr;
556}
557
sfricke-samsungbf1a2ed2020-06-14 23:31:00 -0700558// Gets union of all features defined by Potential Format Features
559// except, does not handle the external format case for AHB as that only can be used for sampled images
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700560VkFormatFeatureFlags ValidationStateTracker::GetPotentialFormatFeatures(VkFormat format) const {
561 VkFormatFeatureFlags format_features = 0;
562
563 if (format != VK_FORMAT_UNDEFINED) {
564 VkFormatProperties format_properties;
565 DispatchGetPhysicalDeviceFormatProperties(physical_device, format, &format_properties);
566 format_features |= format_properties.linearTilingFeatures;
567 format_features |= format_properties.optimalTilingFeatures;
sfricke-samsung45996a42021-09-16 13:45:27 -0700568 if (IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier)) {
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700569 // VK_KHR_get_physical_device_properties2 is required in this case
570 VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2};
571 VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
572 nullptr};
573 format_properties_2.pNext = (void *)&drm_properties_list;
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100574
575 // First call is to get the number of modifiers compatible with the queried format
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700576 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100577
578 std::vector<VkDrmFormatModifierPropertiesEXT> drm_properties;
579 drm_properties.resize(drm_properties_list.drmFormatModifierCount);
580 drm_properties_list.pDrmFormatModifierProperties = drm_properties.data();
581
582 // Second call, now with an allocated array in pDrmFormatModifierProperties, is to get the modifiers
583 // compatible with the queried format
584 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
585
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700586 for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
587 format_features |= drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
588 }
589 }
590 }
591
592 return format_features;
593}
594
locke-lunargd556cc32019-09-17 01:21:23 -0600595void ValidationStateTracker::PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
596 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice,
597 VkResult result) {
598 if (VK_SUCCESS != result) return;
599
Locke Linf3873542021-04-26 11:25:10 -0600600 ValidationObject *device_object = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
601 ValidationObject *validation_data = GetValidationObject(device_object->object_dispatch, this->container_type);
602 ValidationStateTracker *state_tracker = static_cast<ValidationStateTracker *>(validation_data);
603
locke-lunargd556cc32019-09-17 01:21:23 -0600604 const VkPhysicalDeviceFeatures *enabled_features_found = pCreateInfo->pEnabledFeatures;
605 if (nullptr == enabled_features_found) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700606 const auto *features2 = LvlFindInChain<VkPhysicalDeviceFeatures2>(pCreateInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -0600607 if (features2) {
608 enabled_features_found = &(features2->features);
609 }
610 }
611
locke-lunargd556cc32019-09-17 01:21:23 -0600612 if (nullptr == enabled_features_found) {
613 state_tracker->enabled_features.core = {};
614 } else {
615 state_tracker->enabled_features.core = *enabled_features_found;
616 }
617
locke-lunargd556cc32019-09-17 01:21:23 -0600618 // Save local link to this device's physical device state
Jeremy Gebben383b9a32021-09-08 16:31:33 -0600619 state_tracker->physical_device_state = Get<PHYSICAL_DEVICE_STATE>(gpu);
locke-lunargd556cc32019-09-17 01:21:23 -0600620
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700621 const auto *vulkan_12_features = LvlFindInChain<VkPhysicalDeviceVulkan12Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700622 if (vulkan_12_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700623 state_tracker->enabled_features.core12 = *vulkan_12_features;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700624 } else {
sfricke-samsung27c70722020-05-02 08:42:39 -0700625 // Set Extension Feature Aliases to false as there is no struct to check
626 state_tracker->enabled_features.core12.drawIndirectCount = VK_FALSE;
627 state_tracker->enabled_features.core12.samplerMirrorClampToEdge = VK_FALSE;
628 state_tracker->enabled_features.core12.descriptorIndexing = VK_FALSE;
629 state_tracker->enabled_features.core12.samplerFilterMinmax = VK_FALSE;
630 state_tracker->enabled_features.core12.shaderOutputLayer = VK_FALSE;
631 state_tracker->enabled_features.core12.shaderOutputViewportIndex = VK_FALSE;
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800632 state_tracker->enabled_features.core12.subgroupBroadcastDynamicId = VK_FALSE;
sfricke-samsung27c70722020-05-02 08:42:39 -0700633
634 // These structs are only allowed in pNext chain if there is no VkPhysicalDeviceVulkan12Features
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700635
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700636 const auto *eight_bit_storage_features = LvlFindInChain<VkPhysicalDevice8BitStorageFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700637 if (eight_bit_storage_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700638 state_tracker->enabled_features.core12.storageBuffer8BitAccess = eight_bit_storage_features->storageBuffer8BitAccess;
639 state_tracker->enabled_features.core12.uniformAndStorageBuffer8BitAccess =
640 eight_bit_storage_features->uniformAndStorageBuffer8BitAccess;
641 state_tracker->enabled_features.core12.storagePushConstant8 = eight_bit_storage_features->storagePushConstant8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700642 }
643
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700644 const auto *float16_int8_features = LvlFindInChain<VkPhysicalDeviceShaderFloat16Int8Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700645 if (float16_int8_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700646 state_tracker->enabled_features.core12.shaderFloat16 = float16_int8_features->shaderFloat16;
647 state_tracker->enabled_features.core12.shaderInt8 = float16_int8_features->shaderInt8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700648 }
649
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700650 const auto *descriptor_indexing_features = LvlFindInChain<VkPhysicalDeviceDescriptorIndexingFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700651 if (descriptor_indexing_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700652 state_tracker->enabled_features.core12.shaderInputAttachmentArrayDynamicIndexing =
653 descriptor_indexing_features->shaderInputAttachmentArrayDynamicIndexing;
654 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayDynamicIndexing =
655 descriptor_indexing_features->shaderUniformTexelBufferArrayDynamicIndexing;
656 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayDynamicIndexing =
657 descriptor_indexing_features->shaderStorageTexelBufferArrayDynamicIndexing;
658 state_tracker->enabled_features.core12.shaderUniformBufferArrayNonUniformIndexing =
659 descriptor_indexing_features->shaderUniformBufferArrayNonUniformIndexing;
660 state_tracker->enabled_features.core12.shaderSampledImageArrayNonUniformIndexing =
661 descriptor_indexing_features->shaderSampledImageArrayNonUniformIndexing;
662 state_tracker->enabled_features.core12.shaderStorageBufferArrayNonUniformIndexing =
663 descriptor_indexing_features->shaderStorageBufferArrayNonUniformIndexing;
664 state_tracker->enabled_features.core12.shaderStorageImageArrayNonUniformIndexing =
665 descriptor_indexing_features->shaderStorageImageArrayNonUniformIndexing;
666 state_tracker->enabled_features.core12.shaderInputAttachmentArrayNonUniformIndexing =
667 descriptor_indexing_features->shaderInputAttachmentArrayNonUniformIndexing;
668 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayNonUniformIndexing =
669 descriptor_indexing_features->shaderUniformTexelBufferArrayNonUniformIndexing;
670 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayNonUniformIndexing =
671 descriptor_indexing_features->shaderStorageTexelBufferArrayNonUniformIndexing;
672 state_tracker->enabled_features.core12.descriptorBindingUniformBufferUpdateAfterBind =
673 descriptor_indexing_features->descriptorBindingUniformBufferUpdateAfterBind;
674 state_tracker->enabled_features.core12.descriptorBindingSampledImageUpdateAfterBind =
675 descriptor_indexing_features->descriptorBindingSampledImageUpdateAfterBind;
676 state_tracker->enabled_features.core12.descriptorBindingStorageImageUpdateAfterBind =
677 descriptor_indexing_features->descriptorBindingStorageImageUpdateAfterBind;
678 state_tracker->enabled_features.core12.descriptorBindingStorageBufferUpdateAfterBind =
679 descriptor_indexing_features->descriptorBindingStorageBufferUpdateAfterBind;
680 state_tracker->enabled_features.core12.descriptorBindingUniformTexelBufferUpdateAfterBind =
681 descriptor_indexing_features->descriptorBindingUniformTexelBufferUpdateAfterBind;
682 state_tracker->enabled_features.core12.descriptorBindingStorageTexelBufferUpdateAfterBind =
683 descriptor_indexing_features->descriptorBindingStorageTexelBufferUpdateAfterBind;
684 state_tracker->enabled_features.core12.descriptorBindingUpdateUnusedWhilePending =
685 descriptor_indexing_features->descriptorBindingUpdateUnusedWhilePending;
686 state_tracker->enabled_features.core12.descriptorBindingPartiallyBound =
687 descriptor_indexing_features->descriptorBindingPartiallyBound;
688 state_tracker->enabled_features.core12.descriptorBindingVariableDescriptorCount =
689 descriptor_indexing_features->descriptorBindingVariableDescriptorCount;
690 state_tracker->enabled_features.core12.runtimeDescriptorArray = descriptor_indexing_features->runtimeDescriptorArray;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700691 }
692
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700693 const auto *scalar_block_layout_features = LvlFindInChain<VkPhysicalDeviceScalarBlockLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700694 if (scalar_block_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700695 state_tracker->enabled_features.core12.scalarBlockLayout = scalar_block_layout_features->scalarBlockLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700696 }
697
698 const auto *imageless_framebuffer_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700699 LvlFindInChain<VkPhysicalDeviceImagelessFramebufferFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700700 if (imageless_framebuffer_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700701 state_tracker->enabled_features.core12.imagelessFramebuffer = imageless_framebuffer_features->imagelessFramebuffer;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700702 }
703
704 const auto *uniform_buffer_standard_layout_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700705 LvlFindInChain<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700706 if (uniform_buffer_standard_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700707 state_tracker->enabled_features.core12.uniformBufferStandardLayout =
708 uniform_buffer_standard_layout_features->uniformBufferStandardLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700709 }
710
711 const auto *subgroup_extended_types_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700712 LvlFindInChain<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700713 if (subgroup_extended_types_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700714 state_tracker->enabled_features.core12.shaderSubgroupExtendedTypes =
715 subgroup_extended_types_features->shaderSubgroupExtendedTypes;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700716 }
717
718 const auto *separate_depth_stencil_layouts_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700719 LvlFindInChain<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700720 if (separate_depth_stencil_layouts_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700721 state_tracker->enabled_features.core12.separateDepthStencilLayouts =
722 separate_depth_stencil_layouts_features->separateDepthStencilLayouts;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700723 }
724
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700725 const auto *host_query_reset_features = LvlFindInChain<VkPhysicalDeviceHostQueryResetFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700726 if (host_query_reset_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700727 state_tracker->enabled_features.core12.hostQueryReset = host_query_reset_features->hostQueryReset;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700728 }
729
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700730 const auto *timeline_semaphore_features = LvlFindInChain<VkPhysicalDeviceTimelineSemaphoreFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700731 if (timeline_semaphore_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700732 state_tracker->enabled_features.core12.timelineSemaphore = timeline_semaphore_features->timelineSemaphore;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700733 }
734
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700735 const auto *buffer_device_address = LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700736 if (buffer_device_address) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700737 state_tracker->enabled_features.core12.bufferDeviceAddress = buffer_device_address->bufferDeviceAddress;
738 state_tracker->enabled_features.core12.bufferDeviceAddressCaptureReplay =
739 buffer_device_address->bufferDeviceAddressCaptureReplay;
740 state_tracker->enabled_features.core12.bufferDeviceAddressMultiDevice =
741 buffer_device_address->bufferDeviceAddressMultiDevice;
742 }
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800743
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700744 const auto *atomic_int64_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicInt64Features>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800745 if (atomic_int64_features) {
746 state_tracker->enabled_features.core12.shaderBufferInt64Atomics = atomic_int64_features->shaderBufferInt64Atomics;
747 state_tracker->enabled_features.core12.shaderSharedInt64Atomics = atomic_int64_features->shaderSharedInt64Atomics;
748 }
749
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700750 const auto *memory_model_features = LvlFindInChain<VkPhysicalDeviceVulkanMemoryModelFeatures>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800751 if (memory_model_features) {
752 state_tracker->enabled_features.core12.vulkanMemoryModel = memory_model_features->vulkanMemoryModel;
753 state_tracker->enabled_features.core12.vulkanMemoryModelDeviceScope =
754 memory_model_features->vulkanMemoryModelDeviceScope;
755 state_tracker->enabled_features.core12.vulkanMemoryModelAvailabilityVisibilityChains =
756 memory_model_features->vulkanMemoryModelAvailabilityVisibilityChains;
757 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700758 }
759
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700760 const auto *vulkan_11_features = LvlFindInChain<VkPhysicalDeviceVulkan11Features>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700761 if (vulkan_11_features) {
762 state_tracker->enabled_features.core11 = *vulkan_11_features;
763 } else {
sfricke-samsung828e59d2021-08-22 23:20:49 -0700764 // These structs are only allowed in pNext chain if there is no vkPhysicalDeviceVulkan11Features
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700765
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700766 const auto *sixteen_bit_storage_features = LvlFindInChain<VkPhysicalDevice16BitStorageFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700767 if (sixteen_bit_storage_features) {
768 state_tracker->enabled_features.core11.storageBuffer16BitAccess =
769 sixteen_bit_storage_features->storageBuffer16BitAccess;
770 state_tracker->enabled_features.core11.uniformAndStorageBuffer16BitAccess =
771 sixteen_bit_storage_features->uniformAndStorageBuffer16BitAccess;
772 state_tracker->enabled_features.core11.storagePushConstant16 = sixteen_bit_storage_features->storagePushConstant16;
773 state_tracker->enabled_features.core11.storageInputOutput16 = sixteen_bit_storage_features->storageInputOutput16;
774 }
775
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700776 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700777 if (multiview_features) {
778 state_tracker->enabled_features.core11.multiview = multiview_features->multiview;
779 state_tracker->enabled_features.core11.multiviewGeometryShader = multiview_features->multiviewGeometryShader;
780 state_tracker->enabled_features.core11.multiviewTessellationShader = multiview_features->multiviewTessellationShader;
781 }
782
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700783 const auto *variable_pointers_features = LvlFindInChain<VkPhysicalDeviceVariablePointersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700784 if (variable_pointers_features) {
785 state_tracker->enabled_features.core11.variablePointersStorageBuffer =
786 variable_pointers_features->variablePointersStorageBuffer;
787 state_tracker->enabled_features.core11.variablePointers = variable_pointers_features->variablePointers;
788 }
789
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700790 const auto *protected_memory_features = LvlFindInChain<VkPhysicalDeviceProtectedMemoryFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700791 if (protected_memory_features) {
792 state_tracker->enabled_features.core11.protectedMemory = protected_memory_features->protectedMemory;
793 }
794
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700795 const auto *ycbcr_conversion_features = LvlFindInChain<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700796 if (ycbcr_conversion_features) {
797 state_tracker->enabled_features.core11.samplerYcbcrConversion = ycbcr_conversion_features->samplerYcbcrConversion;
798 }
799
800 const auto *shader_draw_parameters_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700801 LvlFindInChain<VkPhysicalDeviceShaderDrawParametersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700802 if (shader_draw_parameters_features) {
803 state_tracker->enabled_features.core11.shaderDrawParameters = shader_draw_parameters_features->shaderDrawParameters;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700804 }
805 }
806
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700807 const auto *device_group_ci = LvlFindInChain<VkDeviceGroupDeviceCreateInfo>(pCreateInfo->pNext);
Tony-LunarGca4891a2020-08-10 15:46:46 -0600808 if (device_group_ci) {
809 state_tracker->physical_device_count = device_group_ci->physicalDeviceCount;
810 state_tracker->device_group_create_info = *device_group_ci;
811 } else {
812 state_tracker->physical_device_count = 1;
813 }
locke-lunargd556cc32019-09-17 01:21:23 -0600814
sfricke-samsung828e59d2021-08-22 23:20:49 -0700815 // Features from other extensions passesd in create info
816 {
817 const auto *exclusive_scissor_features = LvlFindInChain<VkPhysicalDeviceExclusiveScissorFeaturesNV>(pCreateInfo->pNext);
818 if (exclusive_scissor_features) {
819 state_tracker->enabled_features.exclusive_scissor_features = *exclusive_scissor_features;
820 }
locke-lunargd556cc32019-09-17 01:21:23 -0600821
sfricke-samsung828e59d2021-08-22 23:20:49 -0700822 const auto *shading_rate_image_features = LvlFindInChain<VkPhysicalDeviceShadingRateImageFeaturesNV>(pCreateInfo->pNext);
823 if (shading_rate_image_features) {
824 state_tracker->enabled_features.shading_rate_image_features = *shading_rate_image_features;
825 }
locke-lunargd556cc32019-09-17 01:21:23 -0600826
sfricke-samsung828e59d2021-08-22 23:20:49 -0700827 const auto *mesh_shader_features = LvlFindInChain<VkPhysicalDeviceMeshShaderFeaturesNV>(pCreateInfo->pNext);
828 if (mesh_shader_features) {
829 state_tracker->enabled_features.mesh_shader_features = *mesh_shader_features;
830 }
locke-lunargd556cc32019-09-17 01:21:23 -0600831
sfricke-samsung828e59d2021-08-22 23:20:49 -0700832 const auto *inline_uniform_block_features =
833 LvlFindInChain<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(pCreateInfo->pNext);
834 if (inline_uniform_block_features) {
835 state_tracker->enabled_features.inline_uniform_block_features = *inline_uniform_block_features;
836 }
locke-lunargd556cc32019-09-17 01:21:23 -0600837
sfricke-samsung828e59d2021-08-22 23:20:49 -0700838 const auto *transform_feedback_features = LvlFindInChain<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(pCreateInfo->pNext);
839 if (transform_feedback_features) {
840 state_tracker->enabled_features.transform_feedback_features = *transform_feedback_features;
841 }
locke-lunargd556cc32019-09-17 01:21:23 -0600842
sfricke-samsung828e59d2021-08-22 23:20:49 -0700843 const auto *vtx_attrib_div_features = LvlFindInChain<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(pCreateInfo->pNext);
844 if (vtx_attrib_div_features) {
845 state_tracker->enabled_features.vtx_attrib_divisor_features = *vtx_attrib_div_features;
846 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700847
sfricke-samsung828e59d2021-08-22 23:20:49 -0700848 const auto *buffer_device_address_ext_features =
849 LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(pCreateInfo->pNext);
850 if (buffer_device_address_ext_features) {
851 state_tracker->enabled_features.buffer_device_address_ext_features = *buffer_device_address_ext_features;
852 }
locke-lunargd556cc32019-09-17 01:21:23 -0600853
sfricke-samsung828e59d2021-08-22 23:20:49 -0700854 const auto *cooperative_matrix_features = LvlFindInChain<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(pCreateInfo->pNext);
855 if (cooperative_matrix_features) {
856 state_tracker->enabled_features.cooperative_matrix_features = *cooperative_matrix_features;
857 }
locke-lunargd556cc32019-09-17 01:21:23 -0600858
sfricke-samsung828e59d2021-08-22 23:20:49 -0700859 const auto *compute_shader_derivatives_features =
860 LvlFindInChain<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(pCreateInfo->pNext);
861 if (compute_shader_derivatives_features) {
862 state_tracker->enabled_features.compute_shader_derivatives_features = *compute_shader_derivatives_features;
863 }
locke-lunargd556cc32019-09-17 01:21:23 -0600864
sfricke-samsung828e59d2021-08-22 23:20:49 -0700865 const auto *fragment_shader_barycentric_features =
866 LvlFindInChain<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(pCreateInfo->pNext);
867 if (fragment_shader_barycentric_features) {
868 state_tracker->enabled_features.fragment_shader_barycentric_features = *fragment_shader_barycentric_features;
869 }
locke-lunargd556cc32019-09-17 01:21:23 -0600870
sfricke-samsung828e59d2021-08-22 23:20:49 -0700871 const auto *shader_image_footprint_features =
872 LvlFindInChain<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(pCreateInfo->pNext);
873 if (shader_image_footprint_features) {
874 state_tracker->enabled_features.shader_image_footprint_features = *shader_image_footprint_features;
875 }
locke-lunargd556cc32019-09-17 01:21:23 -0600876
sfricke-samsung828e59d2021-08-22 23:20:49 -0700877 const auto *fragment_shader_interlock_features =
878 LvlFindInChain<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(pCreateInfo->pNext);
879 if (fragment_shader_interlock_features) {
880 state_tracker->enabled_features.fragment_shader_interlock_features = *fragment_shader_interlock_features;
881 }
locke-lunargd556cc32019-09-17 01:21:23 -0600882
sfricke-samsung828e59d2021-08-22 23:20:49 -0700883 const auto *demote_to_helper_invocation_features =
884 LvlFindInChain<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>(pCreateInfo->pNext);
885 if (demote_to_helper_invocation_features) {
886 state_tracker->enabled_features.demote_to_helper_invocation_features = *demote_to_helper_invocation_features;
887 }
locke-lunargd556cc32019-09-17 01:21:23 -0600888
sfricke-samsung828e59d2021-08-22 23:20:49 -0700889 const auto *texel_buffer_alignment_features =
890 LvlFindInChain<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(pCreateInfo->pNext);
891 if (texel_buffer_alignment_features) {
892 state_tracker->enabled_features.texel_buffer_alignment_features = *texel_buffer_alignment_features;
893 }
locke-lunargd556cc32019-09-17 01:21:23 -0600894
sfricke-samsung828e59d2021-08-22 23:20:49 -0700895 const auto *pipeline_exe_props_features =
896 LvlFindInChain<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(pCreateInfo->pNext);
897 if (pipeline_exe_props_features) {
898 state_tracker->enabled_features.pipeline_exe_props_features = *pipeline_exe_props_features;
899 }
locke-lunargd556cc32019-09-17 01:21:23 -0600900
sfricke-samsung828e59d2021-08-22 23:20:49 -0700901 const auto *dedicated_allocation_image_aliasing_features =
902 LvlFindInChain<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(pCreateInfo->pNext);
903 if (dedicated_allocation_image_aliasing_features) {
904 state_tracker->enabled_features.dedicated_allocation_image_aliasing_features =
905 *dedicated_allocation_image_aliasing_features;
906 }
Jeff Bolz82f854d2019-09-17 14:56:47 -0500907
sfricke-samsung828e59d2021-08-22 23:20:49 -0700908 const auto *performance_query_features = LvlFindInChain<VkPhysicalDevicePerformanceQueryFeaturesKHR>(pCreateInfo->pNext);
909 if (performance_query_features) {
910 state_tracker->enabled_features.performance_query_features = *performance_query_features;
911 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +0100912
sfricke-samsung828e59d2021-08-22 23:20:49 -0700913 const auto *device_coherent_memory_features = LvlFindInChain<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(pCreateInfo->pNext);
914 if (device_coherent_memory_features) {
915 state_tracker->enabled_features.device_coherent_memory_features = *device_coherent_memory_features;
916 }
Tobias Hector782bcde2019-11-28 16:19:42 +0000917
sfricke-samsung828e59d2021-08-22 23:20:49 -0700918 const auto *ycbcr_image_array_features = LvlFindInChain<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(pCreateInfo->pNext);
919 if (ycbcr_image_array_features) {
920 state_tracker->enabled_features.ycbcr_image_array_features = *ycbcr_image_array_features;
921 }
sfricke-samsungcead0802020-01-30 22:20:10 -0800922
sfricke-samsung828e59d2021-08-22 23:20:49 -0700923 const auto *ray_query_features = LvlFindInChain<VkPhysicalDeviceRayQueryFeaturesKHR>(pCreateInfo->pNext);
924 if (ray_query_features) {
925 state_tracker->enabled_features.ray_query_features = *ray_query_features;
926 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700927
sfricke-samsung828e59d2021-08-22 23:20:49 -0700928 const auto *ray_tracing_pipeline_features =
929 LvlFindInChain<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>(pCreateInfo->pNext);
930 if (ray_tracing_pipeline_features) {
931 state_tracker->enabled_features.ray_tracing_pipeline_features = *ray_tracing_pipeline_features;
932 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700933
sfricke-samsung828e59d2021-08-22 23:20:49 -0700934 const auto *ray_tracing_acceleration_structure_features =
935 LvlFindInChain<VkPhysicalDeviceAccelerationStructureFeaturesKHR>(pCreateInfo->pNext);
936 if (ray_tracing_acceleration_structure_features) {
937 state_tracker->enabled_features.ray_tracing_acceleration_structure_features =
938 *ray_tracing_acceleration_structure_features;
939 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500940
sfricke-samsung828e59d2021-08-22 23:20:49 -0700941 const auto *robustness2_features = LvlFindInChain<VkPhysicalDeviceRobustness2FeaturesEXT>(pCreateInfo->pNext);
942 if (robustness2_features) {
943 state_tracker->enabled_features.robustness2_features = *robustness2_features;
944 }
Jeff Bolz165818a2020-05-08 11:19:03 -0500945
sfricke-samsung828e59d2021-08-22 23:20:49 -0700946 const auto *fragment_density_map_features =
947 LvlFindInChain<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(pCreateInfo->pNext);
948 if (fragment_density_map_features) {
949 state_tracker->enabled_features.fragment_density_map_features = *fragment_density_map_features;
950 }
janharaldfredriksen-arm3b793772020-05-12 18:55:53 +0200951
sfricke-samsung828e59d2021-08-22 23:20:49 -0700952 const auto *fragment_density_map_features2 =
953 LvlFindInChain<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(pCreateInfo->pNext);
954 if (fragment_density_map_features2) {
955 state_tracker->enabled_features.fragment_density_map2_features = *fragment_density_map_features2;
956 }
janharaldfredriksen-arm36e17572020-07-07 13:59:28 +0200957
sfricke-samsung828e59d2021-08-22 23:20:49 -0700958 const auto *astc_decode_features = LvlFindInChain<VkPhysicalDeviceASTCDecodeFeaturesEXT>(pCreateInfo->pNext);
959 if (astc_decode_features) {
960 state_tracker->enabled_features.astc_decode_features = *astc_decode_features;
961 }
sfricke-samsung0c4a06f2020-06-27 01:24:32 -0700962
sfricke-samsung828e59d2021-08-22 23:20:49 -0700963 const auto *custom_border_color_features = LvlFindInChain<VkPhysicalDeviceCustomBorderColorFeaturesEXT>(pCreateInfo->pNext);
964 if (custom_border_color_features) {
965 state_tracker->enabled_features.custom_border_color_features = *custom_border_color_features;
966 }
Tony-LunarG7337b312020-04-15 16:40:25 -0600967
sfricke-samsung828e59d2021-08-22 23:20:49 -0700968 const auto *pipeline_creation_cache_control_features =
969 LvlFindInChain<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>(pCreateInfo->pNext);
970 if (pipeline_creation_cache_control_features) {
971 state_tracker->enabled_features.pipeline_creation_cache_control_features = *pipeline_creation_cache_control_features;
972 }
sfricke-samsungfd661d62020-05-16 00:57:27 -0700973
sfricke-samsung828e59d2021-08-22 23:20:49 -0700974 const auto *fragment_shading_rate_features =
975 LvlFindInChain<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(pCreateInfo->pNext);
976 if (fragment_shading_rate_features) {
977 state_tracker->enabled_features.fragment_shading_rate_features = *fragment_shading_rate_features;
978 }
Tobias Hector6663c9b2020-11-05 10:18:02 +0000979
sfricke-samsung828e59d2021-08-22 23:20:49 -0700980 const auto *extended_dynamic_state_features =
981 LvlFindInChain<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(pCreateInfo->pNext);
982 if (extended_dynamic_state_features) {
983 state_tracker->enabled_features.extended_dynamic_state_features = *extended_dynamic_state_features;
984 }
Piers Daniell39842ee2020-07-10 16:42:33 -0600985
sfricke-samsung828e59d2021-08-22 23:20:49 -0700986 const auto *extended_dynamic_state2_features =
987 LvlFindInChain<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>(pCreateInfo->pNext);
988 if (extended_dynamic_state2_features) {
989 state_tracker->enabled_features.extended_dynamic_state2_features = *extended_dynamic_state2_features;
990 }
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -0700991
sfricke-samsung828e59d2021-08-22 23:20:49 -0700992 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
993 if (multiview_features) {
994 state_tracker->enabled_features.multiview_features = *multiview_features;
995 }
locke-lunarg3fa463a2020-10-23 16:39:04 -0600996
sfricke-samsung828e59d2021-08-22 23:20:49 -0700997 const auto *portability_features = LvlFindInChain<VkPhysicalDevicePortabilitySubsetFeaturesKHR>(pCreateInfo->pNext);
998 if (portability_features) {
999 state_tracker->enabled_features.portability_subset_features = *portability_features;
1000 }
Nathaniel Cesariob3f2d702020-11-09 09:20:49 -07001001
sfricke-samsung828e59d2021-08-22 23:20:49 -07001002 const auto *shader_integer_functions2_features =
1003 LvlFindInChain<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(pCreateInfo->pNext);
1004 if (shader_integer_functions2_features) {
1005 state_tracker->enabled_features.shader_integer_functions2_features = *shader_integer_functions2_features;
1006 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001007
sfricke-samsung828e59d2021-08-22 23:20:49 -07001008 const auto *shader_sm_builtins_features = LvlFindInChain<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>(pCreateInfo->pNext);
1009 if (shader_sm_builtins_features) {
1010 state_tracker->enabled_features.shader_sm_builtins_features = *shader_sm_builtins_features;
1011 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001012
sfricke-samsung828e59d2021-08-22 23:20:49 -07001013 const auto *shader_atomic_float_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>(pCreateInfo->pNext);
1014 if (shader_atomic_float_features) {
1015 state_tracker->enabled_features.shader_atomic_float_features = *shader_atomic_float_features;
1016 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001017
sfricke-samsung828e59d2021-08-22 23:20:49 -07001018 const auto *shader_image_atomic_int64_features =
1019 LvlFindInChain<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>(pCreateInfo->pNext);
1020 if (shader_image_atomic_int64_features) {
1021 state_tracker->enabled_features.shader_image_atomic_int64_features = *shader_image_atomic_int64_features;
1022 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001023
sfricke-samsung828e59d2021-08-22 23:20:49 -07001024 const auto *shader_clock_features = LvlFindInChain<VkPhysicalDeviceShaderClockFeaturesKHR>(pCreateInfo->pNext);
1025 if (shader_clock_features) {
1026 state_tracker->enabled_features.shader_clock_features = *shader_clock_features;
1027 }
sfricke-samsung486a51e2021-01-02 00:10:15 -08001028
sfricke-samsung828e59d2021-08-22 23:20:49 -07001029 const auto *conditional_rendering_features =
1030 LvlFindInChain<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(pCreateInfo->pNext);
1031 if (conditional_rendering_features) {
1032 state_tracker->enabled_features.conditional_rendering_features = *conditional_rendering_features;
1033 }
Jeremy Gebben5f585ae2021-02-02 09:03:06 -07001034
sfricke-samsung828e59d2021-08-22 23:20:49 -07001035 const auto *workgroup_memory_explicit_layout_features =
1036 LvlFindInChain<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>(pCreateInfo->pNext);
1037 if (workgroup_memory_explicit_layout_features) {
1038 state_tracker->enabled_features.workgroup_memory_explicit_layout_features = *workgroup_memory_explicit_layout_features;
1039 }
Shannon McPhersondb287d42021-02-02 15:27:32 -07001040
sfricke-samsung828e59d2021-08-22 23:20:49 -07001041 const auto *synchronization2_features = LvlFindInChain<VkPhysicalDeviceSynchronization2FeaturesKHR>(pCreateInfo->pNext);
1042 if (synchronization2_features) {
1043 state_tracker->enabled_features.synchronization2_features = *synchronization2_features;
1044 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001045
sfricke-samsung828e59d2021-08-22 23:20:49 -07001046 const auto *provoking_vertex_features = lvl_find_in_chain<VkPhysicalDeviceProvokingVertexFeaturesEXT>(pCreateInfo->pNext);
1047 if (provoking_vertex_features) {
1048 state_tracker->enabled_features.provoking_vertex_features = *provoking_vertex_features;
1049 }
Locke Linf3873542021-04-26 11:25:10 -06001050
sfricke-samsung828e59d2021-08-22 23:20:49 -07001051 const auto *vertex_input_dynamic_state_features =
1052 LvlFindInChain<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>(pCreateInfo->pNext);
1053 if (vertex_input_dynamic_state_features) {
1054 state_tracker->enabled_features.vertex_input_dynamic_state_features = *vertex_input_dynamic_state_features;
1055 }
Piers Daniellcb6d8032021-04-19 18:51:26 -06001056
sfricke-samsung828e59d2021-08-22 23:20:49 -07001057 const auto *inherited_viewport_scissor_features =
1058 LvlFindInChain<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(pCreateInfo->pNext);
1059 if (inherited_viewport_scissor_features) {
1060 state_tracker->enabled_features.inherited_viewport_scissor_features = *inherited_viewport_scissor_features;
1061 }
David Zhao Akeley44139b12021-04-26 16:16:13 -07001062
sfricke-samsung828e59d2021-08-22 23:20:49 -07001063 const auto *multi_draw_features = LvlFindInChain<VkPhysicalDeviceMultiDrawFeaturesEXT>(pCreateInfo->pNext);
1064 if (multi_draw_features) {
1065 state_tracker->enabled_features.multi_draw_features = *multi_draw_features;
1066 }
Tony-LunarG4490de42021-06-21 15:49:19 -06001067
sfricke-samsung828e59d2021-08-22 23:20:49 -07001068 const auto *color_write_features = LvlFindInChain<VkPhysicalDeviceColorWriteEnableFeaturesEXT>(pCreateInfo->pNext);
1069 if (color_write_features) {
1070 state_tracker->enabled_features.color_write_features = *color_write_features;
1071 }
ziga-lunarg29ba2b92021-07-20 21:51:45 +02001072
sfricke-samsung828e59d2021-08-22 23:20:49 -07001073 const auto *shader_atomic_float2_features =
1074 LvlFindInChain<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT>(pCreateInfo->pNext);
1075 if (shader_atomic_float2_features) {
1076 state_tracker->enabled_features.shader_atomic_float2_features = *shader_atomic_float2_features;
1077 }
Mike Schuchardtb3870ea2021-07-20 18:56:51 -07001078
sfricke-samsung828e59d2021-08-22 23:20:49 -07001079 const auto *present_id_features = LvlFindInChain<VkPhysicalDevicePresentIdFeaturesKHR>(pCreateInfo->pNext);
1080 if (present_id_features) {
1081 state_tracker->enabled_features.present_id_features = *present_id_features;
1082 }
Tony-LunarG6f887e52021-07-27 11:23:14 -06001083
sfricke-samsung828e59d2021-08-22 23:20:49 -07001084 const auto *present_wait_features = LvlFindInChain<VkPhysicalDevicePresentWaitFeaturesKHR>(pCreateInfo->pNext);
1085 if (present_wait_features) {
1086 state_tracker->enabled_features.present_wait_features = *present_wait_features;
1087 }
Mike Schuchardt9f65d3f2021-08-25 15:11:39 -07001088
1089 const auto *ray_tracing_motion_blur_features =
1090 LvlFindInChain<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV>(pCreateInfo->pNext);
1091 if (ray_tracing_motion_blur_features) {
1092 state_tracker->enabled_features.ray_tracing_motion_blur_features = *ray_tracing_motion_blur_features;
1093 }
Mike Schuchardtb4d90452021-08-30 09:24:51 -07001094
1095 const auto *shader_integer_dot_product_features =
1096 LvlFindInChain<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR>(pCreateInfo->pNext);
1097 if (shader_integer_dot_product_features) {
1098 state_tracker->enabled_features.shader_integer_dot_product_features = *shader_integer_dot_product_features;
1099 }
Tony-LunarG0b0d8be2021-08-30 13:50:38 -06001100
1101 const auto *primitive_topology_list_restart_features =
1102 LvlFindInChain<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>(pCreateInfo->pNext);
1103 if (primitive_topology_list_restart_features) {
1104 state_tracker->enabled_features.primitive_topology_list_restart_features = *primitive_topology_list_restart_features;
1105 }
sfricke-samsung10b35ce2021-09-29 08:50:20 -07001106
1107 const auto *rgba10x6_formats_features = LvlFindInChain<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT>(pCreateInfo->pNext);
1108 if (rgba10x6_formats_features) {
1109 state_tracker->enabled_features.rgba10x6_formats_features = *rgba10x6_formats_features;
1110 }
Tony-LunarG6f887e52021-07-27 11:23:14 -06001111 }
1112
ziga-lunarg73163742021-08-25 13:15:29 +02001113 const auto *subgroup_size_control_features = LvlFindInChain<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>(pCreateInfo->pNext);
1114 if (subgroup_size_control_features) {
1115 state_tracker->enabled_features.subgroup_size_control_features = *subgroup_size_control_features;
1116 }
1117
locke-lunargd556cc32019-09-17 01:21:23 -06001118 // Store physical device properties and physical device mem limits into CoreChecks structs
1119 DispatchGetPhysicalDeviceMemoryProperties(gpu, &state_tracker->phys_dev_mem_props);
1120 DispatchGetPhysicalDeviceProperties(gpu, &state_tracker->phys_dev_props);
1121
1122 const auto &dev_ext = state_tracker->device_extensions;
1123 auto *phys_dev_props = &state_tracker->phys_dev_ext_props;
1124
sfricke-samsung828e59d2021-08-22 23:20:49 -07001125 // Vulkan 1.2 can get properties from single struct, otherwise need to add to it per extension
sfricke-samsung45996a42021-09-16 13:45:27 -07001126 if (dev_ext.vk_feature_version_1_2) {
1127 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core11);
1128 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core12);
sfricke-samsung828e59d2021-08-22 23:20:49 -07001129 } else {
1130 // VkPhysicalDeviceVulkan11Properties
1131 //
1132 // Can ingnore VkPhysicalDeviceIDProperties as it has no validation purpose
1133
1134 if (dev_ext.vk_khr_multiview) {
1135 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
1136 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &multiview_props);
1137 state_tracker->phys_dev_props_core11.maxMultiviewViewCount = multiview_props.maxMultiviewViewCount;
1138 state_tracker->phys_dev_props_core11.maxMultiviewInstanceIndex = multiview_props.maxMultiviewInstanceIndex;
1139 }
1140
1141 if (dev_ext.vk_khr_maintenance3) {
1142 auto maintenance3_props = LvlInitStruct<VkPhysicalDeviceMaintenance3Properties>();
1143 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_maintenance3, &maintenance3_props);
1144 state_tracker->phys_dev_props_core11.maxPerSetDescriptors = maintenance3_props.maxPerSetDescriptors;
1145 state_tracker->phys_dev_props_core11.maxMemoryAllocationSize = maintenance3_props.maxMemoryAllocationSize;
1146 }
1147
1148 // Some 1.1 properties were added to core without previous extensions
1149 if (state_tracker->api_version >= VK_API_VERSION_1_1) {
1150 auto subgroup_prop = LvlInitStruct<VkPhysicalDeviceSubgroupProperties>();
1151 auto protected_memory_prop = LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>(&subgroup_prop);
1152 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&protected_memory_prop);
1153 instance_dispatch_table.GetPhysicalDeviceProperties2(gpu, &prop2);
1154
1155 state_tracker->phys_dev_props_core11.subgroupSize = subgroup_prop.subgroupSize;
1156 state_tracker->phys_dev_props_core11.subgroupSupportedStages = subgroup_prop.supportedStages;
1157 state_tracker->phys_dev_props_core11.subgroupSupportedOperations = subgroup_prop.supportedOperations;
1158 state_tracker->phys_dev_props_core11.subgroupQuadOperationsInAllStages = subgroup_prop.quadOperationsInAllStages;
1159
1160 state_tracker->phys_dev_props_core11.protectedNoFault = protected_memory_prop.protectedNoFault;
1161 }
1162
1163 // VkPhysicalDeviceVulkan12Properties
1164 //
1165 // Can ingnore VkPhysicalDeviceDriverProperties as it has no validation purpose
1166
1167 if (dev_ext.vk_ext_descriptor_indexing) {
1168 auto descriptor_indexing_prop = LvlInitStruct<VkPhysicalDeviceDescriptorIndexingProperties>();
1169 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_descriptor_indexing, &descriptor_indexing_prop);
1170 state_tracker->phys_dev_props_core12.maxUpdateAfterBindDescriptorsInAllPools =
1171 descriptor_indexing_prop.maxUpdateAfterBindDescriptorsInAllPools;
1172 state_tracker->phys_dev_props_core12.shaderUniformBufferArrayNonUniformIndexingNative =
1173 descriptor_indexing_prop.shaderUniformBufferArrayNonUniformIndexingNative;
1174 state_tracker->phys_dev_props_core12.shaderSampledImageArrayNonUniformIndexingNative =
1175 descriptor_indexing_prop.shaderSampledImageArrayNonUniformIndexingNative;
1176 state_tracker->phys_dev_props_core12.shaderStorageBufferArrayNonUniformIndexingNative =
1177 descriptor_indexing_prop.shaderStorageBufferArrayNonUniformIndexingNative;
1178 state_tracker->phys_dev_props_core12.shaderStorageImageArrayNonUniformIndexingNative =
1179 descriptor_indexing_prop.shaderStorageImageArrayNonUniformIndexingNative;
1180 state_tracker->phys_dev_props_core12.shaderInputAttachmentArrayNonUniformIndexingNative =
1181 descriptor_indexing_prop.shaderInputAttachmentArrayNonUniformIndexingNative;
1182 state_tracker->phys_dev_props_core12.robustBufferAccessUpdateAfterBind =
1183 descriptor_indexing_prop.robustBufferAccessUpdateAfterBind;
1184 state_tracker->phys_dev_props_core12.quadDivergentImplicitLod = descriptor_indexing_prop.quadDivergentImplicitLod;
1185 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSamplers =
1186 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSamplers;
1187 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindUniformBuffers =
1188 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindUniformBuffers;
1189 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageBuffers =
1190 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageBuffers;
1191 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSampledImages =
1192 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSampledImages;
1193 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageImages =
1194 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageImages;
1195 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindInputAttachments =
1196 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindInputAttachments;
1197 state_tracker->phys_dev_props_core12.maxPerStageUpdateAfterBindResources =
1198 descriptor_indexing_prop.maxPerStageUpdateAfterBindResources;
1199 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSamplers =
1200 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSamplers;
1201 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffers =
1202 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffers;
1203 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic =
1204 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
1205 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffers =
1206 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffers;
1207 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic =
1208 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
1209 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSampledImages =
1210 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSampledImages;
1211 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageImages =
1212 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageImages;
1213 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindInputAttachments =
1214 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindInputAttachments;
1215 }
1216
1217 if (dev_ext.vk_khr_depth_stencil_resolve) {
1218 auto depth_stencil_resolve_props = LvlInitStruct<VkPhysicalDeviceDepthStencilResolveProperties>();
1219 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_depth_stencil_resolve, &depth_stencil_resolve_props);
1220 state_tracker->phys_dev_props_core12.supportedDepthResolveModes =
1221 depth_stencil_resolve_props.supportedDepthResolveModes;
1222 state_tracker->phys_dev_props_core12.supportedStencilResolveModes =
1223 depth_stencil_resolve_props.supportedStencilResolveModes;
1224 state_tracker->phys_dev_props_core12.independentResolveNone = depth_stencil_resolve_props.independentResolveNone;
1225 state_tracker->phys_dev_props_core12.independentResolve = depth_stencil_resolve_props.independentResolve;
1226 }
1227
1228 if (dev_ext.vk_khr_timeline_semaphore) {
1229 auto timeline_semaphore_props = LvlInitStruct<VkPhysicalDeviceTimelineSemaphoreProperties>();
1230 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_timeline_semaphore, &timeline_semaphore_props);
1231 state_tracker->phys_dev_props_core12.maxTimelineSemaphoreValueDifference =
1232 timeline_semaphore_props.maxTimelineSemaphoreValueDifference;
1233 }
1234
1235 if (dev_ext.vk_ext_sampler_filter_minmax) {
1236 auto sampler_filter_minmax_props = LvlInitStruct<VkPhysicalDeviceSamplerFilterMinmaxProperties>();
1237 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sampler_filter_minmax, &sampler_filter_minmax_props);
1238 state_tracker->phys_dev_props_core12.filterMinmaxSingleComponentFormats =
1239 sampler_filter_minmax_props.filterMinmaxSingleComponentFormats;
1240 state_tracker->phys_dev_props_core12.filterMinmaxImageComponentMapping =
1241 sampler_filter_minmax_props.filterMinmaxImageComponentMapping;
1242 }
1243
1244 if (dev_ext.vk_khr_shader_float_controls) {
1245 auto float_controls_props = LvlInitStruct<VkPhysicalDeviceFloatControlsProperties>();
1246 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_shader_float_controls, &float_controls_props);
1247 state_tracker->phys_dev_props_core12.denormBehaviorIndependence = float_controls_props.denormBehaviorIndependence;
1248 state_tracker->phys_dev_props_core12.roundingModeIndependence = float_controls_props.roundingModeIndependence;
1249 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat16 =
1250 float_controls_props.shaderSignedZeroInfNanPreserveFloat16;
1251 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat32 =
1252 float_controls_props.shaderSignedZeroInfNanPreserveFloat32;
1253 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat64 =
1254 float_controls_props.shaderSignedZeroInfNanPreserveFloat64;
1255 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat16 = float_controls_props.shaderDenormPreserveFloat16;
1256 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat32 = float_controls_props.shaderDenormPreserveFloat32;
1257 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat64 = float_controls_props.shaderDenormPreserveFloat64;
1258 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat16 =
1259 float_controls_props.shaderDenormFlushToZeroFloat16;
1260 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat32 =
1261 float_controls_props.shaderDenormFlushToZeroFloat32;
1262 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat64 =
1263 float_controls_props.shaderDenormFlushToZeroFloat64;
1264 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat16 = float_controls_props.shaderRoundingModeRTEFloat16;
1265 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat32 = float_controls_props.shaderRoundingModeRTEFloat32;
1266 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat64 = float_controls_props.shaderRoundingModeRTEFloat64;
1267 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat16 = float_controls_props.shaderRoundingModeRTZFloat16;
1268 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat32 = float_controls_props.shaderRoundingModeRTZFloat32;
1269 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat64 = float_controls_props.shaderRoundingModeRTZFloat64;
1270 }
locke-lunargd556cc32019-09-17 01:21:23 -06001271 }
1272
sfricke-samsung828e59d2021-08-22 23:20:49 -07001273 // Extensions with properties to extract to DeviceExtensionProperties
1274 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_push_descriptor, &phys_dev_props->push_descriptor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001275 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_shading_rate_image, &phys_dev_props->shading_rate_image_props);
1276 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_mesh_shader, &phys_dev_props->mesh_shader_props);
1277 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_inline_uniform_block, &phys_dev_props->inline_uniform_block_props);
1278 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_vertex_attribute_divisor, &phys_dev_props->vtx_attrib_divisor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001279 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_transform_feedback, &phys_dev_props->transform_feedback_props);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001280 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_ray_tracing, &phys_dev_props->ray_tracing_propsNV);
sourav parmarcd5fb182020-07-17 12:58:44 -07001281 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_ray_tracing_pipeline, &phys_dev_props->ray_tracing_propsKHR);
1282 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_acceleration_structure, &phys_dev_props->acc_structure_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001283 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_texel_buffer_alignment, &phys_dev_props->texel_buffer_alignment_props);
1284 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map, &phys_dev_props->fragment_density_map_props);
Mike Schuchardtc57de4a2021-07-20 17:26:32 -07001285 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map2, &phys_dev_props->fragment_density_map2_props);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001286 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_performance_query, &phys_dev_props->performance_query_props);
sfricke-samsung8f658d42020-05-03 20:12:24 -07001287 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sample_locations, &phys_dev_props->sample_locations_props);
Tony-LunarG7337b312020-04-15 16:40:25 -06001288 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_custom_border_color, &phys_dev_props->custom_border_color_props);
locke-lunarg3fa463a2020-10-23 16:39:04 -06001289 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &phys_dev_props->multiview_props);
Nathaniel Cesario3291c912020-11-17 16:54:41 -07001290 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_portability_subset, &phys_dev_props->portability_props);
sfricke-samsung828e59d2021-08-22 23:20:49 -07001291 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_fragment_shading_rate, &phys_dev_props->fragment_shading_rate_props);
Locke Lin016d8482021-05-27 12:11:31 -06001292 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_provoking_vertex, &phys_dev_props->provoking_vertex_props);
Tony-LunarG4490de42021-06-21 15:49:19 -06001293 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_multi_draw, &phys_dev_props->multi_draw_props);
ziga-lunarg128904a2021-07-30 13:49:01 +02001294 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_discard_rectangles, &phys_dev_props->discard_rectangle_props);
ziga-lunarg86492812021-08-05 23:58:16 +02001295 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_blend_operation_advanced, &phys_dev_props->blend_operation_advanced_props);
ziga-lunargbd8ded62021-09-20 18:24:39 +02001296 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_conservative_rasterization, &phys_dev_props->conservative_rasterization_props);
ziga-lunarg11fecb92021-09-20 16:48:06 +02001297 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_subgroup_size_control, &phys_dev_props->subgroup_size_control_props);
Piers Daniell41b8c5d2020-01-10 15:42:00 -07001298
sfricke-samsung45996a42021-09-16 13:45:27 -07001299 if (IsExtEnabled(dev_ext.vk_nv_cooperative_matrix)) {
locke-lunargd556cc32019-09-17 01:21:23 -06001300 // Get the needed cooperative_matrix properties
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001301 auto cooperative_matrix_props = LvlInitStruct<VkPhysicalDeviceCooperativeMatrixPropertiesNV>();
1302 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&cooperative_matrix_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001303 instance_dispatch_table.GetPhysicalDeviceProperties2KHR(gpu, &prop2);
1304 state_tracker->phys_dev_ext_props.cooperative_matrix_props = cooperative_matrix_props;
1305
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001306 uint32_t num_cooperative_matrix_properties = 0;
1307 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties, NULL);
1308 state_tracker->cooperative_matrix_properties.resize(num_cooperative_matrix_properties,
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001309 LvlInitStruct<VkCooperativeMatrixPropertiesNV>());
locke-lunargd556cc32019-09-17 01:21:23 -06001310
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001311 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties,
locke-lunargd556cc32019-09-17 01:21:23 -06001312 state_tracker->cooperative_matrix_properties.data());
1313 }
Tobias Hector6663c9b2020-11-05 10:18:02 +00001314
locke-lunargd556cc32019-09-17 01:21:23 -06001315 // Store queue family data
1316 if (pCreateInfo->pQueueCreateInfos != nullptr) {
1317 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
sfricke-samsung590ae1e2020-04-25 01:18:05 -07001318 const VkDeviceQueueCreateInfo &queue_create_info = pCreateInfo->pQueueCreateInfos[i];
sfricke-samsungb585ec12021-05-06 03:10:13 -07001319 state_tracker->queue_family_index_set.insert(queue_create_info.queueFamilyIndex);
1320 state_tracker->device_queue_info_list.push_back(
1321 {i, queue_create_info.queueFamilyIndex, queue_create_info.flags, queue_create_info.queueCount});
locke-lunargd556cc32019-09-17 01:21:23 -06001322 }
1323 }
1324}
1325
1326void ValidationStateTracker::PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
1327 if (!device) return;
1328
locke-lunargd556cc32019-09-17 01:21:23 -06001329 // Reset all command buffers before destroying them, to unlink object_bindings.
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001330 for (auto &command_buffer : commandBufferMap) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06001331 command_buffer.second->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001332 }
Jeff Bolzadbfa852019-10-04 13:53:30 -05001333 pipelineMap.clear();
1334 renderPassMap.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001335 commandBufferMap.clear();
1336
1337 // This will also delete all sets in the pool & remove them from setMap
1338 DeleteDescriptorSetPools();
1339 // All sets should be removed
1340 assert(setMap.empty());
1341 descriptorSetLayoutMap.clear();
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001342 // Because swapchains are associated with Surfaces, which are at instance level,
1343 // they need to be explicitly destroyed here to avoid continued references to
1344 // the device we're destroying.
1345 for (auto &entry : swapchainMap) {
1346 entry.second->Destroy();
1347 }
1348 swapchainMap.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001349 imageViewMap.clear();
1350 imageMap.clear();
1351 bufferViewMap.clear();
1352 bufferMap.clear();
1353 // Queues persist until device is destroyed
1354 queueMap.clear();
1355}
1356
Jeff Bolz8041c5b2019-10-20 22:14:20 -05001357void ValidationStateTracker::RetireWorkOnQueue(QUEUE_STATE *pQueue, uint64_t seq) {
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001358 layer_data::unordered_map<VkQueue, uint64_t> other_queue_seqs;
1359 layer_data::unordered_map<VkSemaphore, uint64_t> timeline_semaphore_counters;
locke-lunargd556cc32019-09-17 01:21:23 -06001360
1361 // Roll this queue forward, one submission at a time.
1362 while (pQueue->seq < seq) {
1363 auto &submission = pQueue->submissions.front();
1364
1365 for (auto &wait : submission.waitSemaphores) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001366 auto semaphore_state = GetSemaphoreState(wait.semaphore);
1367 if (semaphore_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001368 semaphore_state->EndUse();
locke-lunargd556cc32019-09-17 01:21:23 -06001369 }
Mike Schuchardt2df08912020-12-15 16:28:09 -08001370 if (wait.type == VK_SEMAPHORE_TYPE_TIMELINE) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001371 auto &last_counter = timeline_semaphore_counters[wait.semaphore];
1372 last_counter = std::max(last_counter, wait.payload);
Marshall Drew-Brook03847582020-11-06 15:10:45 -08001373 } else {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001374 auto &last_seq = other_queue_seqs[wait.queue];
1375 last_seq = std::max(last_seq, wait.seq);
Marshall Drew-Brook03847582020-11-06 15:10:45 -08001376 }
locke-lunargd556cc32019-09-17 01:21:23 -06001377 }
1378
Juan A. Suarez Romero9cef8852020-03-10 12:19:42 +01001379 for (auto &signal : submission.signalSemaphores) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001380 auto semaphore_state = GetSemaphoreState(signal.semaphore);
1381 if (semaphore_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001382 semaphore_state->EndUse();
Mike Schuchardt2df08912020-12-15 16:28:09 -08001383 if (semaphore_state->type == VK_SEMAPHORE_TYPE_TIMELINE && semaphore_state->payload < signal.payload) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001384 semaphore_state->payload = signal.payload;
Juan A. Suarez Romero9cef8852020-03-10 12:19:42 +01001385 }
locke-lunargd556cc32019-09-17 01:21:23 -06001386 }
1387 }
1388
1389 for (auto &semaphore : submission.externalSemaphores) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001390 auto semaphore_state = GetSemaphoreState(semaphore);
1391 if (semaphore_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001392 semaphore_state->EndUse();
locke-lunargd556cc32019-09-17 01:21:23 -06001393 }
1394 }
1395
1396 for (auto cb : submission.cbs) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06001397 auto cb_node = Get<CMD_BUFFER_STATE>(cb);
locke-lunargd556cc32019-09-17 01:21:23 -06001398 if (!cb_node) {
1399 continue;
1400 }
1401 // First perform decrement on general case bound objects
locke-lunargd556cc32019-09-17 01:21:23 -06001402 for (auto event : cb_node->writeEventsBeforeWait) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001403 auto event_node = eventMap.find(event);
1404 if (event_node != eventMap.end()) {
John Zulauf48057322020-12-02 11:59:31 -07001405 event_node->second->write_in_use--;
locke-lunargd556cc32019-09-17 01:21:23 -06001406 }
1407 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001408 QueryMap local_query_to_state_map;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02001409 VkQueryPool first_pool = VK_NULL_HANDLE;
Jeff Bolz310775c2019-10-09 00:46:33 -05001410 for (auto &function : cb_node->queryUpdates) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001411 function(nullptr, /*do_validate*/ false, first_pool, submission.perf_submit_pass, &local_query_to_state_map);
Jeff Bolz310775c2019-10-09 00:46:33 -05001412 }
1413
John Zulauf79f06582021-02-27 18:38:39 -07001414 for (const auto &query_state_pair : local_query_to_state_map) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001415 if (query_state_pair.second == QUERYSTATE_ENDED) {
1416 queryToStateMap[query_state_pair.first] = QUERYSTATE_AVAILABLE;
Jeff Bolz8041c5b2019-10-20 22:14:20 -05001417 }
locke-lunargd556cc32019-09-17 01:21:23 -06001418 }
Jeremy Gebben5570abe2021-05-16 18:35:13 -06001419 if (cb_node->createInfo.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
1420 cb_node->EndUse();
1421 }
locke-lunargd556cc32019-09-17 01:21:23 -06001422 }
1423
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001424 auto fence_state = GetFenceState(submission.fence);
1425 if (fence_state && fence_state->scope == kSyncScopeInternal) {
1426 fence_state->state = FENCE_RETIRED;
locke-lunargd556cc32019-09-17 01:21:23 -06001427 }
1428
1429 pQueue->submissions.pop_front();
1430 pQueue->seq++;
1431 }
1432
1433 // Roll other queues forward to the highest seq we saw a wait for
John Zulauf79f06582021-02-27 18:38:39 -07001434 for (const auto &qs : other_queue_seqs) {
Jeff Bolz8041c5b2019-10-20 22:14:20 -05001435 RetireWorkOnQueue(GetQueueState(qs.first), qs.second);
locke-lunargd556cc32019-09-17 01:21:23 -06001436 }
John Zulauf79f06582021-02-27 18:38:39 -07001437 for (const auto &sc : timeline_semaphore_counters) {
Marshall Drew-Brook03847582020-11-06 15:10:45 -08001438 RetireTimelineSemaphore(sc.first, sc.second);
1439 }
locke-lunargd556cc32019-09-17 01:21:23 -06001440}
1441
1442// Submit a fence to a queue, delimiting previous fences and previous untracked
1443// work by it.
1444static void SubmitFence(QUEUE_STATE *pQueue, FENCE_STATE *pFence, uint64_t submitCount) {
1445 pFence->state = FENCE_INFLIGHT;
Jeremy Gebben63f3cb02021-09-07 15:16:32 -06001446 pFence->signaler.first = pQueue->Queue();
locke-lunargd556cc32019-09-17 01:21:23 -06001447 pFence->signaler.second = pQueue->seq + pQueue->submissions.size() + submitCount;
1448}
1449
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001450uint64_t ValidationStateTracker::RecordSubmitFence(QUEUE_STATE *queue_state, VkFence fence, uint32_t submit_count) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001451 auto fence_state = GetFenceState(fence);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001452 uint64_t early_retire_seq = 0;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001453 if (fence_state) {
1454 if (fence_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06001455 // Mark fence in use
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001456 SubmitFence(queue_state, fence_state, std::max(1u, submit_count));
1457 if (!submit_count) {
locke-lunargd556cc32019-09-17 01:21:23 -06001458 // If no submissions, but just dropping a fence on the end of the queue,
1459 // record an empty submission with just the fence, so we can determine
1460 // its completion.
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001461 CB_SUBMISSION submission;
1462 submission.fence = fence;
1463 queue_state->submissions.emplace_back(std::move(submission));
locke-lunargd556cc32019-09-17 01:21:23 -06001464 }
1465 } else {
1466 // Retire work up until this fence early, we will not see the wait that corresponds to this signal
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001467 early_retire_seq = queue_state->seq + queue_state->submissions.size();
locke-lunargd556cc32019-09-17 01:21:23 -06001468 }
1469 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001470 return early_retire_seq;
1471}
1472
1473void ValidationStateTracker::RecordSubmitCommandBuffer(CB_SUBMISSION &submission, VkCommandBuffer command_buffer) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06001474 auto cb_node = Get<CMD_BUFFER_STATE>(command_buffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001475 if (cb_node) {
1476 submission.cbs.push_back(command_buffer);
John Zulauf79f06582021-02-27 18:38:39 -07001477 for (auto *secondary_cmd_buffer : cb_node->linkedCommandBuffers) {
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06001478 submission.cbs.push_back(secondary_cmd_buffer->commandBuffer());
Jeremy Gebben1ec89332021-08-05 13:51:49 -06001479 secondary_cmd_buffer->IncrementResources();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001480 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06001481 cb_node->IncrementResources();
Jeremy Gebben5570abe2021-05-16 18:35:13 -06001482 // increment use count for all bound objects including secondary cbs
1483 cb_node->BeginUse();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001484
1485 VkQueryPool first_pool = VK_NULL_HANDLE;
1486 EventToStageMap local_event_to_stage_map;
1487 QueryMap local_query_to_state_map;
1488 for (auto &function : cb_node->queryUpdates) {
1489 function(nullptr, /*do_validate*/ false, first_pool, submission.perf_submit_pass, &local_query_to_state_map);
1490 }
1491
John Zulauf79f06582021-02-27 18:38:39 -07001492 for (const auto &query_state_pair : local_query_to_state_map) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001493 queryToStateMap[query_state_pair.first] = query_state_pair.second;
1494 }
1495
John Zulauf79f06582021-02-27 18:38:39 -07001496 for (const auto &function : cb_node->eventUpdates) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001497 function(nullptr, /*do_validate*/ false, &local_event_to_stage_map);
1498 }
1499
John Zulauf79f06582021-02-27 18:38:39 -07001500 for (const auto &eventStagePair : local_event_to_stage_map) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001501 eventMap[eventStagePair.first]->stageMask = eventStagePair.second;
1502 }
1503 }
1504}
1505
1506void ValidationStateTracker::RecordSubmitWaitSemaphore(CB_SUBMISSION &submission, VkQueue queue, VkSemaphore semaphore,
1507 uint64_t value, uint64_t next_seq) {
1508 auto semaphore_state = GetSemaphoreState(semaphore);
1509 if (semaphore_state) {
1510 if (semaphore_state->scope == kSyncScopeInternal) {
1511 SEMAPHORE_WAIT wait;
1512 wait.semaphore = semaphore;
1513 wait.type = semaphore_state->type;
1514 if (semaphore_state->type == VK_SEMAPHORE_TYPE_BINARY) {
1515 if (semaphore_state->signaler.first != VK_NULL_HANDLE) {
1516 wait.queue = semaphore_state->signaler.first;
1517 wait.seq = semaphore_state->signaler.second;
1518 submission.waitSemaphores.emplace_back(std::move(wait));
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001519 semaphore_state->BeginUse();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001520 }
1521 semaphore_state->signaler.first = VK_NULL_HANDLE;
1522 semaphore_state->signaled = false;
1523 } else if (semaphore_state->payload < value) {
1524 wait.queue = queue;
1525 wait.seq = next_seq;
1526 wait.payload = value;
1527 submission.waitSemaphores.emplace_back(std::move(wait));
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001528 semaphore_state->BeginUse();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001529 }
1530 } else {
1531 submission.externalSemaphores.push_back(semaphore);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001532 semaphore_state->BeginUse();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001533 if (semaphore_state->scope == kSyncScopeExternalTemporary) {
1534 semaphore_state->scope = kSyncScopeInternal;
1535 }
1536 }
1537 }
1538}
1539
1540bool ValidationStateTracker::RecordSubmitSignalSemaphore(CB_SUBMISSION &submission, VkQueue queue, VkSemaphore semaphore,
1541 uint64_t value, uint64_t next_seq) {
1542 bool retire_early = false;
1543 auto semaphore_state = GetSemaphoreState(semaphore);
1544 if (semaphore_state) {
1545 if (semaphore_state->scope == kSyncScopeInternal) {
1546 SEMAPHORE_SIGNAL signal;
1547 signal.semaphore = semaphore;
1548 signal.seq = next_seq;
1549 if (semaphore_state->type == VK_SEMAPHORE_TYPE_BINARY) {
1550 semaphore_state->signaler.first = queue;
1551 semaphore_state->signaler.second = next_seq;
1552 semaphore_state->signaled = true;
1553 } else {
1554 signal.payload = value;
1555 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001556 semaphore_state->BeginUse();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001557 submission.signalSemaphores.emplace_back(std::move(signal));
1558 } else {
1559 // Retire work up until this submit early, we will not see the wait that corresponds to this signal
1560 retire_early = true;
1561 }
1562 }
1563 return retire_early;
1564}
1565
1566void ValidationStateTracker::PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1567 VkFence fence, VkResult result) {
1568 if (result != VK_SUCCESS) return;
1569 auto queue_state = GetQueueState(queue);
1570
1571 uint64_t early_retire_seq = RecordSubmitFence(queue_state, fence, submitCount);
locke-lunargd556cc32019-09-17 01:21:23 -06001572
1573 // Now process each individual submit
1574 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001575 CB_SUBMISSION submission;
locke-lunargd556cc32019-09-17 01:21:23 -06001576 const VkSubmitInfo *submit = &pSubmits[submit_idx];
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001577 const uint64_t next_seq = queue_state->seq + queue_state->submissions.size() + 1;
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001578 auto *timeline_semaphore_submit = LvlFindInChain<VkTimelineSemaphoreSubmitInfo>(submit->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06001579 for (uint32_t i = 0; i < submit->waitSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001580 uint64_t value = 0;
1581 if (timeline_semaphore_submit && timeline_semaphore_submit->pWaitSemaphoreValues != nullptr &&
1582 (i < timeline_semaphore_submit->waitSemaphoreValueCount)) {
1583 value = timeline_semaphore_submit->pWaitSemaphoreValues[i];
1584 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001585 RecordSubmitWaitSemaphore(submission, queue, submit->pWaitSemaphores[i], value, next_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001586 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001587
1588 bool retire_early = false;
locke-lunargd556cc32019-09-17 01:21:23 -06001589 for (uint32_t i = 0; i < submit->signalSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001590 uint64_t value = 0;
1591 if (timeline_semaphore_submit && timeline_semaphore_submit->pSignalSemaphoreValues != nullptr &&
1592 (i < timeline_semaphore_submit->signalSemaphoreValueCount)) {
1593 value = timeline_semaphore_submit->pSignalSemaphoreValues[i];
1594 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001595 retire_early |= RecordSubmitSignalSemaphore(submission, queue, submit->pSignalSemaphores[i], value, next_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001596 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001597 if (retire_early) {
1598 early_retire_seq = std::max(early_retire_seq, next_seq);
1599 }
1600
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001601 const auto perf_submit = LvlFindInChain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001602 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02001603
locke-lunargd556cc32019-09-17 01:21:23 -06001604 for (uint32_t i = 0; i < submit->commandBufferCount; i++) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001605 RecordSubmitCommandBuffer(submission, submit->pCommandBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06001606 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001607 submission.fence = submit_idx == (submitCount - 1) ? fence : VK_NULL_HANDLE;
1608 queue_state->submissions.emplace_back(std::move(submission));
1609 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001610
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001611 if (early_retire_seq) {
1612 RetireWorkOnQueue(queue_state, early_retire_seq);
1613 }
1614}
1615
1616void ValidationStateTracker::PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1617 VkFence fence, VkResult result) {
1618 if (result != VK_SUCCESS) return;
1619 auto queue_state = GetQueueState(queue);
1620
1621 uint64_t early_retire_seq = RecordSubmitFence(queue_state, fence, submitCount);
1622
1623 // Now process each individual submit
1624 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
1625 CB_SUBMISSION submission;
1626 const VkSubmitInfo2KHR *submit = &pSubmits[submit_idx];
1627 const uint64_t next_seq = queue_state->seq + queue_state->submissions.size() + 1;
1628 for (uint32_t i = 0; i < submit->waitSemaphoreInfoCount; ++i) {
1629 const auto &sem_info = submit->pWaitSemaphoreInfos[i];
1630 RecordSubmitWaitSemaphore(submission, queue, sem_info.semaphore, sem_info.value, next_seq);
1631 }
1632 bool retire_early = false;
1633 for (uint32_t i = 0; i < submit->signalSemaphoreInfoCount; ++i) {
1634 const auto &sem_info = submit->pSignalSemaphoreInfos[i];
1635 retire_early |= RecordSubmitSignalSemaphore(submission, queue, sem_info.semaphore, sem_info.value, next_seq);
1636 }
1637 if (retire_early) {
1638 early_retire_seq = std::max(early_retire_seq, next_seq);
1639 }
1640 const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
1641 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
1642
1643 for (uint32_t i = 0; i < submit->commandBufferInfoCount; i++) {
1644 RecordSubmitCommandBuffer(submission, submit->pCommandBufferInfos[i].commandBuffer);
1645 }
1646 submission.fence = submit_idx == (submitCount - 1) ? fence : VK_NULL_HANDLE;
1647 queue_state->submissions.emplace_back(std::move(submission));
locke-lunargd556cc32019-09-17 01:21:23 -06001648 }
1649
1650 if (early_retire_seq) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001651 RetireWorkOnQueue(queue_state, early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001652 }
1653}
1654
1655void ValidationStateTracker::PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1656 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory,
1657 VkResult result) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001658 if (VK_SUCCESS != result) {
1659 return;
locke-lunargd556cc32019-09-17 01:21:23 -06001660 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001661 const auto &memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
1662 const auto &memory_heap = phys_dev_mem_props.memoryHeaps[memory_type.heapIndex];
1663 auto fake_address = fake_memory.Alloc(pAllocateInfo->allocationSize);
1664
1665 layer_data::optional<DedicatedBinding> dedicated_binding;
1666
1667 auto dedicated = LvlFindInChain<VkMemoryDedicatedAllocateInfo>(pAllocateInfo->pNext);
1668 if (dedicated) {
1669 if (dedicated->buffer) {
1670 const auto *buffer_state = GetBufferState(dedicated->buffer);
1671 assert(buffer_state);
1672 if (!buffer_state) {
1673 return;
1674 }
1675 dedicated_binding.emplace(dedicated->buffer, buffer_state->createInfo);
1676 } else if (dedicated->image) {
1677 const auto *image_state = GetImageState(dedicated->image);
1678 assert(image_state);
1679 if (!image_state) {
1680 return;
1681 }
1682 dedicated_binding.emplace(dedicated->image, image_state->createInfo);
1683 }
1684 }
1685 memObjMap[*pMemory] = std::make_shared<DEVICE_MEMORY_STATE>(*pMemory, pAllocateInfo, fake_address, memory_type, memory_heap,
ziga-lunarg9663f4f2021-09-30 17:24:01 +02001686 std::move(dedicated_binding), physical_device_count);
locke-lunargd556cc32019-09-17 01:21:23 -06001687 return;
1688}
1689
1690void ValidationStateTracker::PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory mem, const VkAllocationCallbacks *pAllocator) {
1691 if (!mem) return;
1692 DEVICE_MEMORY_STATE *mem_info = GetDevMemState(mem);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001693 if (!mem_info) return;
locke-lunargd556cc32019-09-17 01:21:23 -06001694 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001695 mem_info->Destroy();
John Zulauf79952712020-04-07 11:25:54 -06001696 fake_memory.Free(mem_info->fake_base_address);
locke-lunargd556cc32019-09-17 01:21:23 -06001697 memObjMap.erase(mem);
1698}
1699
1700void ValidationStateTracker::PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
1701 VkFence fence, VkResult result) {
1702 if (result != VK_SUCCESS) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001703 auto queue_state = GetQueueState(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06001704
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001705 uint64_t early_retire_seq = RecordSubmitFence(queue_state, fence, bindInfoCount);
locke-lunargd556cc32019-09-17 01:21:23 -06001706
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001707 for (uint32_t bind_idx = 0; bind_idx < bindInfoCount; ++bind_idx) {
1708 const VkBindSparseInfo &bind_info = pBindInfo[bind_idx];
locke-lunargd556cc32019-09-17 01:21:23 -06001709 // Track objects tied to memory
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001710 for (uint32_t j = 0; j < bind_info.bufferBindCount; j++) {
1711 for (uint32_t k = 0; k < bind_info.pBufferBinds[j].bindCount; k++) {
1712 auto sparse_binding = bind_info.pBufferBinds[j].pBinds[k];
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001713 auto buffer_state = GetBufferState(bind_info.pBufferBinds[j].buffer);
1714 auto mem_state = GetDevMemShared(sparse_binding.memory);
1715 if (buffer_state && mem_state) {
1716 buffer_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1717 }
locke-lunargd556cc32019-09-17 01:21:23 -06001718 }
1719 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001720 for (uint32_t j = 0; j < bind_info.imageOpaqueBindCount; j++) {
1721 for (uint32_t k = 0; k < bind_info.pImageOpaqueBinds[j].bindCount; k++) {
1722 auto sparse_binding = bind_info.pImageOpaqueBinds[j].pBinds[k];
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001723 auto image_state = GetImageState(bind_info.pImageOpaqueBinds[j].image);
1724 auto mem_state = GetDevMemShared(sparse_binding.memory);
1725 if (image_state && mem_state) {
1726 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1727 }
locke-lunargd556cc32019-09-17 01:21:23 -06001728 }
1729 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001730 for (uint32_t j = 0; j < bind_info.imageBindCount; j++) {
1731 for (uint32_t k = 0; k < bind_info.pImageBinds[j].bindCount; k++) {
1732 auto sparse_binding = bind_info.pImageBinds[j].pBinds[k];
locke-lunargd556cc32019-09-17 01:21:23 -06001733 // TODO: This size is broken for non-opaque bindings, need to update to comprehend full sparse binding data
1734 VkDeviceSize size = sparse_binding.extent.depth * sparse_binding.extent.height * sparse_binding.extent.width * 4;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001735 auto image_state = GetImageState(bind_info.pImageBinds[j].image);
1736 auto mem_state = GetDevMemShared(sparse_binding.memory);
1737 if (image_state && mem_state) {
1738 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, size);
1739 }
locke-lunargd556cc32019-09-17 01:21:23 -06001740 }
1741 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001742 CB_SUBMISSION submission;
1743 const uint64_t next_seq = queue_state->seq + queue_state->submissions.size() + 1;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001744 for (uint32_t i = 0; i < bind_info.waitSemaphoreCount; ++i) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001745 RecordSubmitWaitSemaphore(submission, queue, bind_info.pWaitSemaphores[i], 0, next_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001746 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001747 bool retire_early = false;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001748 for (uint32_t i = 0; i < bind_info.signalSemaphoreCount; ++i) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001749 retire_early |= RecordSubmitSignalSemaphore(submission, queue, bind_info.pSignalSemaphores[i], 0, next_seq);
1750 }
1751 // Retire work up until this submit early, we will not see the wait that corresponds to this signal
1752 if (retire_early) {
1753 early_retire_seq = std::max(early_retire_seq, queue_state->seq + queue_state->submissions.size() + 1);
locke-lunargd556cc32019-09-17 01:21:23 -06001754 }
1755
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001756 submission.fence = bind_idx == (bindInfoCount - 1) ? fence : VK_NULL_HANDLE;
1757 queue_state->submissions.emplace_back(std::move(submission));
locke-lunargd556cc32019-09-17 01:21:23 -06001758 }
1759
1760 if (early_retire_seq) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001761 RetireWorkOnQueue(queue_state, early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001762 }
1763}
1764
1765void ValidationStateTracker::PostCallRecordCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
1766 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore,
1767 VkResult result) {
1768 if (VK_SUCCESS != result) return;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001769 semaphoreMap[*pSemaphore] = std::make_shared<SEMAPHORE_STATE>(*pSemaphore, LvlFindInChain<VkSemaphoreTypeCreateInfo>(pCreateInfo->pNext));
locke-lunargd556cc32019-09-17 01:21:23 -06001770}
1771
Mike Schuchardt2df08912020-12-15 16:28:09 -08001772void ValidationStateTracker::RecordImportSemaphoreState(VkSemaphore semaphore, VkExternalSemaphoreHandleTypeFlagBits handle_type,
1773 VkSemaphoreImportFlags flags) {
locke-lunargd556cc32019-09-17 01:21:23 -06001774 SEMAPHORE_STATE *sema_node = GetSemaphoreState(semaphore);
1775 if (sema_node && sema_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08001776 if ((handle_type == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06001777 sema_node->scope == kSyncScopeInternal) {
1778 sema_node->scope = kSyncScopeExternalTemporary;
1779 } else {
1780 sema_node->scope = kSyncScopeExternalPermanent;
1781 }
1782 }
1783}
1784
Mike Schuchardt2df08912020-12-15 16:28:09 -08001785void ValidationStateTracker::PostCallRecordSignalSemaphoreKHR(VkDevice device, const VkSemaphoreSignalInfo *pSignalInfo,
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001786 VkResult result) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001787 auto *semaphore_state = GetSemaphoreState(pSignalInfo->semaphore);
1788 semaphore_state->payload = pSignalInfo->value;
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001789}
1790
locke-lunargd556cc32019-09-17 01:21:23 -06001791void ValidationStateTracker::RecordMappedMemory(VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, void **ppData) {
1792 auto mem_info = GetDevMemState(mem);
1793 if (mem_info) {
1794 mem_info->mapped_range.offset = offset;
1795 mem_info->mapped_range.size = size;
1796 mem_info->p_driver_data = *ppData;
1797 }
1798}
1799
1800void ValidationStateTracker::RetireFence(VkFence fence) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001801 auto fence_state = GetFenceState(fence);
1802 if (fence_state && fence_state->scope == kSyncScopeInternal) {
1803 if (fence_state->signaler.first != VK_NULL_HANDLE) {
locke-lunargd556cc32019-09-17 01:21:23 -06001804 // Fence signaller is a queue -- use this as proof that prior operations on that queue have completed.
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001805 RetireWorkOnQueue(GetQueueState(fence_state->signaler.first), fence_state->signaler.second);
locke-lunargd556cc32019-09-17 01:21:23 -06001806 } else {
1807 // Fence signaller is the WSI. We're not tracking what the WSI op actually /was/ in CV yet, but we need to mark
1808 // the fence as retired.
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001809 fence_state->state = FENCE_RETIRED;
locke-lunargd556cc32019-09-17 01:21:23 -06001810 }
1811 }
1812}
1813
1814void ValidationStateTracker::PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1815 VkBool32 waitAll, uint64_t timeout, VkResult result) {
1816 if (VK_SUCCESS != result) return;
1817
1818 // When we know that all fences are complete we can clean/remove their CBs
1819 if ((VK_TRUE == waitAll) || (1 == fenceCount)) {
1820 for (uint32_t i = 0; i < fenceCount; i++) {
1821 RetireFence(pFences[i]);
1822 }
1823 }
1824 // NOTE : Alternate case not handled here is when some fences have completed. In
1825 // this case for app to guarantee which fences completed it will have to call
1826 // vkGetFenceStatus() at which point we'll clean/remove their CBs if complete.
1827}
1828
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001829void ValidationStateTracker::RetireTimelineSemaphore(VkSemaphore semaphore, uint64_t until_payload) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001830 auto semaphore_state = GetSemaphoreState(semaphore);
1831 if (semaphore_state) {
Jeremy Gebben63f3cb02021-09-07 15:16:32 -06001832 for (const auto &pair : queueMap) {
1833 const auto &queue_state = pair.second;
Tony-LunarG47d5e272020-04-07 15:35:55 -06001834 uint64_t max_seq = 0;
Jeremy Gebben63f3cb02021-09-07 15:16:32 -06001835 for (const auto &submission : queue_state->submissions) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001836 for (const auto &signal_semaphore : submission.signalSemaphores) {
1837 if (signal_semaphore.semaphore == semaphore && signal_semaphore.payload <= until_payload) {
1838 if (signal_semaphore.seq > max_seq) {
1839 max_seq = signal_semaphore.seq;
Tony-LunarG47d5e272020-04-07 15:35:55 -06001840 }
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001841 }
1842 }
1843 }
Tony-LunarG47d5e272020-04-07 15:35:55 -06001844 if (max_seq) {
Jeremy Gebben63f3cb02021-09-07 15:16:32 -06001845 RetireWorkOnQueue(queue_state.get(), max_seq);
Tony-LunarG47d5e272020-04-07 15:35:55 -06001846 }
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001847 }
1848 }
1849}
1850
John Zulauff89de662020-04-13 18:57:34 -06001851void ValidationStateTracker::RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1852 VkResult result) {
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001853 if (VK_SUCCESS != result) return;
1854
1855 for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
1856 RetireTimelineSemaphore(pWaitInfo->pSemaphores[i], pWaitInfo->pValues[i]);
1857 }
1858}
1859
John Zulauff89de662020-04-13 18:57:34 -06001860void ValidationStateTracker::PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1861 VkResult result) {
1862 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1863}
1864
1865void ValidationStateTracker::PostCallRecordWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo,
1866 uint64_t timeout, VkResult result) {
1867 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1868}
1869
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001870void ValidationStateTracker::RecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1871 VkResult result) {
1872 if (VK_SUCCESS != result) return;
1873
1874 RetireTimelineSemaphore(semaphore, *pValue);
1875}
1876
1877void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1878 VkResult result) {
1879 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1880}
1881void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValueKHR(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1882 VkResult result) {
1883 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1884}
1885
locke-lunargd556cc32019-09-17 01:21:23 -06001886void ValidationStateTracker::PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
1887 if (VK_SUCCESS != result) return;
1888 RetireFence(fence);
1889}
1890
1891void ValidationStateTracker::RecordGetDeviceQueueState(uint32_t queue_family_index, VkQueue queue) {
Jeremy Gebben63f3cb02021-09-07 15:16:32 -06001892 queueMap.emplace(queue, std::make_shared<QUEUE_STATE>(queue, queue_family_index));
locke-lunargd556cc32019-09-17 01:21:23 -06001893}
1894
1895void ValidationStateTracker::PostCallRecordGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex,
1896 VkQueue *pQueue) {
1897 RecordGetDeviceQueueState(queueFamilyIndex, *pQueue);
1898}
1899
1900void ValidationStateTracker::PostCallRecordGetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2 *pQueueInfo, VkQueue *pQueue) {
1901 RecordGetDeviceQueueState(pQueueInfo->queueFamilyIndex, *pQueue);
1902}
1903
1904void ValidationStateTracker::PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) {
1905 if (VK_SUCCESS != result) return;
1906 QUEUE_STATE *queue_state = GetQueueState(queue);
Jeff Bolz8041c5b2019-10-20 22:14:20 -05001907 RetireWorkOnQueue(queue_state, queue_state->seq + queue_state->submissions.size());
locke-lunargd556cc32019-09-17 01:21:23 -06001908}
1909
1910void ValidationStateTracker::PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) {
1911 if (VK_SUCCESS != result) return;
1912 for (auto &queue : queueMap) {
Jeremy Gebben63f3cb02021-09-07 15:16:32 -06001913 RetireWorkOnQueue(queue.second.get(), queue.second->seq + queue.second->submissions.size());
locke-lunargd556cc32019-09-17 01:21:23 -06001914 }
1915}
1916
1917void ValidationStateTracker::PreCallRecordDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
1918 if (!fence) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001919 auto fence_state = GetFenceState(fence);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001920 fence_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001921 fenceMap.erase(fence);
1922}
1923
1924void ValidationStateTracker::PreCallRecordDestroySemaphore(VkDevice device, VkSemaphore semaphore,
1925 const VkAllocationCallbacks *pAllocator) {
1926 if (!semaphore) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001927 auto semaphore_state = GetSemaphoreState(semaphore);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001928 semaphore_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001929 semaphoreMap.erase(semaphore);
1930}
1931
1932void ValidationStateTracker::PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
1933 if (!event) return;
John Zulauf48057322020-12-02 11:59:31 -07001934 EVENT_STATE *event_state = Get<EVENT_STATE>(event);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001935 event_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001936 eventMap.erase(event);
1937}
1938
1939void ValidationStateTracker::PreCallRecordDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
1940 const VkAllocationCallbacks *pAllocator) {
1941 if (!queryPool) return;
1942 QUERY_POOL_STATE *qp_state = GetQueryPoolState(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001943 qp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001944 queryPoolMap.erase(queryPool);
1945}
1946
locke-lunargd556cc32019-09-17 01:21:23 -06001947void ValidationStateTracker::UpdateBindBufferMemoryState(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
1948 BUFFER_STATE *buffer_state = GetBufferState(buffer);
1949 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001950 // Track objects tied to memory
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001951 auto mem_state = GetDevMemShared(mem);
1952 if (mem_state) {
1953 buffer_state->SetMemBinding(mem_state, memoryOffset);
1954 }
locke-lunargd556cc32019-09-17 01:21:23 -06001955 }
1956}
1957
1958void ValidationStateTracker::PostCallRecordBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
1959 VkDeviceSize memoryOffset, VkResult result) {
1960 if (VK_SUCCESS != result) return;
1961 UpdateBindBufferMemoryState(buffer, mem, memoryOffset);
1962}
1963
1964void ValidationStateTracker::PostCallRecordBindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001965 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001966 for (uint32_t i = 0; i < bindInfoCount; i++) {
1967 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1968 }
1969}
1970
1971void ValidationStateTracker::PostCallRecordBindBufferMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001972 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001973 for (uint32_t i = 0; i < bindInfoCount; i++) {
1974 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1975 }
1976}
1977
Spencer Fricke6c127102020-04-16 06:25:20 -07001978void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer) {
locke-lunargd556cc32019-09-17 01:21:23 -06001979 BUFFER_STATE *buffer_state = GetBufferState(buffer);
1980 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001981 buffer_state->memory_requirements_checked = true;
1982 }
1983}
1984
1985void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1986 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001987 RecordGetBufferMemoryRequirementsState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001988}
1989
1990void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001991 const VkBufferMemoryRequirementsInfo2 *pInfo,
1992 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001993 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001994}
1995
1996void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2KHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001997 const VkBufferMemoryRequirementsInfo2 *pInfo,
1998 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001999 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002000}
2001
Spencer Fricke6c127102020-04-16 06:25:20 -07002002void ValidationStateTracker::RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2 *pInfo) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002003 const VkImagePlaneMemoryRequirementsInfo *plane_info =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07002004 (pInfo == nullptr) ? nullptr : LvlFindInChain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06002005 IMAGE_STATE *image_state = GetImageState(image);
2006 if (image_state) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002007 if (plane_info != nullptr) {
2008 // Multi-plane image
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002009 if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_0_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002010 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002011 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_1_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002012 image_state->memory_requirements_checked[1] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002013 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_2_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002014 image_state->memory_requirements_checked[2] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002015 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002016 } else if (!image_state->disjoint) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002017 // Single Plane image
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002018 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002019 }
locke-lunargd556cc32019-09-17 01:21:23 -06002020 }
2021}
2022
2023void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements(VkDevice device, VkImage image,
2024 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07002025 RecordGetImageMemoryRequirementsState(image, nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06002026}
2027
2028void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
2029 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07002030 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002031}
2032
2033void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2KHR(VkDevice device,
2034 const VkImageMemoryRequirementsInfo2 *pInfo,
2035 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07002036 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002037}
2038
locke-lunargd556cc32019-09-17 01:21:23 -06002039void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements(
2040 VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2041 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2042 auto image_state = GetImageState(image);
2043 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06002044}
2045
2046void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002047 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
2048 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
locke-lunargd556cc32019-09-17 01:21:23 -06002049 auto image_state = GetImageState(pInfo->image);
2050 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06002051}
2052
2053void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002054 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
2055 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
locke-lunargd556cc32019-09-17 01:21:23 -06002056 auto image_state = GetImageState(pInfo->image);
2057 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06002058}
2059
2060void ValidationStateTracker::PreCallRecordDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2061 const VkAllocationCallbacks *pAllocator) {
2062 if (!shaderModule) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002063 auto shader_module_state = GetShaderModuleState(shaderModule);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002064 shader_module_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002065 shaderModuleMap.erase(shaderModule);
2066}
2067
2068void ValidationStateTracker::PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline,
2069 const VkAllocationCallbacks *pAllocator) {
2070 if (!pipeline) return;
2071 PIPELINE_STATE *pipeline_state = GetPipelineState(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06002072 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002073 pipeline_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002074 pipelineMap.erase(pipeline);
2075}
2076
2077void ValidationStateTracker::PreCallRecordDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
2078 const VkAllocationCallbacks *pAllocator) {
2079 if (!pipelineLayout) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002080 auto pipeline_layout_state = GetPipelineLayout(pipelineLayout);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002081 pipeline_layout_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002082 pipelineLayoutMap.erase(pipelineLayout);
2083}
2084
2085void ValidationStateTracker::PreCallRecordDestroySampler(VkDevice device, VkSampler sampler,
2086 const VkAllocationCallbacks *pAllocator) {
2087 if (!sampler) return;
2088 SAMPLER_STATE *sampler_state = GetSamplerState(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06002089 // Any bound cmd buffers are now invalid
2090 if (sampler_state) {
Yuly Novikov424cdd52020-05-26 16:45:12 -04002091 if (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
2092 sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
2093 custom_border_color_sampler_count--;
2094 }
2095
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002096 sampler_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002097 }
2098 samplerMap.erase(sampler);
2099}
2100
2101void ValidationStateTracker::PreCallRecordDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
2102 const VkAllocationCallbacks *pAllocator) {
2103 if (!descriptorSetLayout) return;
2104 auto layout_it = descriptorSetLayoutMap.find(descriptorSetLayout);
2105 if (layout_it != descriptorSetLayoutMap.end()) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002106 layout_it->second.get()->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002107 descriptorSetLayoutMap.erase(layout_it);
2108 }
2109}
2110
2111void ValidationStateTracker::PreCallRecordDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
2112 const VkAllocationCallbacks *pAllocator) {
2113 if (!descriptorPool) return;
2114 DESCRIPTOR_POOL_STATE *desc_pool_state = GetDescriptorPoolState(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06002115 if (desc_pool_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002116 // Free sets that were in this pool
John Zulauf79f06582021-02-27 18:38:39 -07002117 for (auto *ds : desc_pool_state->sets) {
locke-lunargd556cc32019-09-17 01:21:23 -06002118 FreeDescriptorSet(ds);
2119 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002120 desc_pool_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002121 descriptorPoolMap.erase(descriptorPool);
2122 }
2123}
2124
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002125// Free all command buffers in given list, removing all references/links to them using CMD_BUFFER_STATE::Reset
locke-lunargd556cc32019-09-17 01:21:23 -06002126void ValidationStateTracker::FreeCommandBufferStates(COMMAND_POOL_STATE *pool_state, const uint32_t command_buffer_count,
2127 const VkCommandBuffer *command_buffers) {
2128 for (uint32_t i = 0; i < command_buffer_count; i++) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002129 auto cb_state = Get<CMD_BUFFER_STATE>(command_buffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002130 // Remove references to command buffer's state and delete
2131 if (cb_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002132 cb_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002133 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002134 // Remove CBState from CB map
2135 pool_state->commandBuffers.erase(command_buffers[i]);
2136 commandBufferMap.erase(command_buffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002137 }
2138}
2139
2140void ValidationStateTracker::PreCallRecordFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
2141 uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002142 auto pool = GetCommandPoolState(commandPool);
2143 FreeCommandBufferStates(pool, commandBufferCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06002144}
2145
2146void ValidationStateTracker::PostCallRecordCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
2147 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool,
2148 VkResult result) {
2149 if (VK_SUCCESS != result) return;
Jeremy Gebben383b9a32021-09-08 16:31:33 -06002150 auto queue_flags = physical_device_state->queue_family_properties[pCreateInfo->queueFamilyIndex].queueFlags;
Jeremy Gebben159b3cc2021-06-03 09:09:03 -06002151 commandPoolMap[*pCommandPool] = std::make_shared<COMMAND_POOL_STATE>(*pCommandPool, pCreateInfo, queue_flags);
locke-lunargd556cc32019-09-17 01:21:23 -06002152}
2153
2154void ValidationStateTracker::PostCallRecordCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2155 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool,
2156 VkResult result) {
2157 if (VK_SUCCESS != result) return;
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06002158
2159 uint32_t index_count = 0, n_perf_pass = 0;
2160 bool has_cb = false, has_rb = false;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002161 if (pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07002162 const auto *perf = LvlFindInChain<VkQueryPoolPerformanceCreateInfoKHR>(pCreateInfo->pNext);
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06002163 index_count = perf->counterIndexCount;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002164
Mark Lobodzinski7e948e42020-09-09 10:23:36 -06002165 const QUEUE_FAMILY_PERF_COUNTERS &counters = *physical_device_state->perf_counters[perf->queueFamilyIndex];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002166 for (uint32_t i = 0; i < perf->counterIndexCount; i++) {
2167 const auto &counter = counters.counters[perf->pCounterIndices[i]];
2168 switch (counter.scope) {
2169 case VK_QUERY_SCOPE_COMMAND_BUFFER_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06002170 has_cb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002171 break;
2172 case VK_QUERY_SCOPE_RENDER_PASS_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06002173 has_rb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002174 break;
2175 default:
2176 break;
2177 }
2178 }
2179
Jeremy Gebben383b9a32021-09-08 16:31:33 -06002180 DispatchGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physical_device_state->PhysDev(), perf, &n_perf_pass);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002181 }
2182
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06002183 queryPoolMap[*pQueryPool] =
2184 std::make_shared<QUERY_POOL_STATE>(*pQueryPool, pCreateInfo, index_count, n_perf_pass, has_cb, has_rb);
locke-lunargd556cc32019-09-17 01:21:23 -06002185
2186 QueryObject query_obj{*pQueryPool, 0u};
2187 for (uint32_t i = 0; i < pCreateInfo->queryCount; ++i) {
2188 query_obj.query = i;
2189 queryToStateMap[query_obj] = QUERYSTATE_UNKNOWN;
2190 }
2191}
2192
2193void ValidationStateTracker::PreCallRecordDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
2194 const VkAllocationCallbacks *pAllocator) {
2195 if (!commandPool) return;
2196 COMMAND_POOL_STATE *cp_state = GetCommandPoolState(commandPool);
2197 // Remove cmdpool from cmdpoolmap, after freeing layer data for the command buffers
2198 // "When a pool is destroyed, all command buffers allocated from the pool are freed."
2199 if (cp_state) {
2200 // Create a vector, as FreeCommandBufferStates deletes from cp_state->commandBuffers during iteration.
2201 std::vector<VkCommandBuffer> cb_vec{cp_state->commandBuffers.begin(), cp_state->commandBuffers.end()};
2202 FreeCommandBufferStates(cp_state, static_cast<uint32_t>(cb_vec.size()), cb_vec.data());
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002203 cp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002204 commandPoolMap.erase(commandPool);
2205 }
2206}
2207
2208void ValidationStateTracker::PostCallRecordResetCommandPool(VkDevice device, VkCommandPool commandPool,
2209 VkCommandPoolResetFlags flags, VkResult result) {
2210 if (VK_SUCCESS != result) return;
2211 // Reset all of the CBs allocated from this pool
2212 auto command_pool_state = GetCommandPoolState(commandPool);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002213 for (auto cmd_buffer : command_pool_state->commandBuffers) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002214 auto cb_state = Get<CMD_BUFFER_STATE>(cmd_buffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002215 cb_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002216 }
2217}
2218
2219void ValidationStateTracker::PostCallRecordResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
2220 VkResult result) {
2221 for (uint32_t i = 0; i < fenceCount; ++i) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002222 auto fence_state = GetFenceState(pFences[i]);
2223 if (fence_state) {
2224 if (fence_state->scope == kSyncScopeInternal) {
2225 fence_state->state = FENCE_UNSIGNALED;
2226 } else if (fence_state->scope == kSyncScopeExternalTemporary) {
2227 fence_state->scope = kSyncScopeInternal;
locke-lunargd556cc32019-09-17 01:21:23 -06002228 }
2229 }
2230 }
2231}
2232
locke-lunargd556cc32019-09-17 01:21:23 -06002233void ValidationStateTracker::PreCallRecordDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
2234 const VkAllocationCallbacks *pAllocator) {
2235 if (!framebuffer) return;
2236 FRAMEBUFFER_STATE *framebuffer_state = GetFramebufferState(framebuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002237 framebuffer_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002238 frameBufferMap.erase(framebuffer);
2239}
2240
2241void ValidationStateTracker::PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
2242 const VkAllocationCallbacks *pAllocator) {
2243 if (!renderPass) return;
2244 RENDER_PASS_STATE *rp_state = GetRenderPassState(renderPass);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002245 rp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002246 renderPassMap.erase(renderPass);
2247}
2248
2249void ValidationStateTracker::PostCallRecordCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2250 const VkAllocationCallbacks *pAllocator, VkFence *pFence, VkResult result) {
2251 if (VK_SUCCESS != result) return;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002252 fenceMap[*pFence] = std::make_shared<FENCE_STATE>(*pFence, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002253}
2254
2255bool ValidationStateTracker::PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2256 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2257 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002258 void *cgpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002259 // Set up the state that CoreChecks, gpu_validation and later StateTracker Record will use.
2260 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2261 cgpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2262 cgpl_state->pipe_state.reserve(count);
2263 for (uint32_t i = 0; i < count; i++) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002264 cgpl_state->pipe_state.push_back(std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i],
2265 GetRenderPassShared(pCreateInfos[i].renderPass),
2266 GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002267 }
2268 return false;
2269}
2270
2271void ValidationStateTracker::PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2272 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2273 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2274 VkResult result, void *cgpl_state_data) {
2275 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2276 // This API may create pipelines regardless of the return value
2277 for (uint32_t i = 0; i < count; i++) {
2278 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002279 (cgpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002280 pipelineMap[pPipelines[i]] = std::move((cgpl_state->pipe_state)[i]);
2281 }
2282 }
2283 cgpl_state->pipe_state.clear();
2284}
2285
2286bool ValidationStateTracker::PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2287 const VkComputePipelineCreateInfo *pCreateInfos,
2288 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002289 void *ccpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002290 auto *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2291 ccpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2292 ccpl_state->pipe_state.reserve(count);
2293 for (uint32_t i = 0; i < count; i++) {
2294 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002295 ccpl_state->pipe_state.push_back(
2296 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002297 }
2298 return false;
2299}
2300
2301void ValidationStateTracker::PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2302 const VkComputePipelineCreateInfo *pCreateInfos,
2303 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2304 VkResult result, void *ccpl_state_data) {
2305 create_compute_pipeline_api_state *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2306
2307 // This API may create pipelines regardless of the return value
2308 for (uint32_t i = 0; i < count; i++) {
2309 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002310 (ccpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002311 pipelineMap[pPipelines[i]] = std::move((ccpl_state->pipe_state)[i]);
2312 }
2313 }
2314 ccpl_state->pipe_state.clear();
2315}
2316
2317bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache,
2318 uint32_t count,
2319 const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2320 const VkAllocationCallbacks *pAllocator,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002321 VkPipeline *pPipelines, void *crtpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002322 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2323 crtpl_state->pipe_state.reserve(count);
2324 for (uint32_t i = 0; i < count; i++) {
2325 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002326 crtpl_state->pipe_state.push_back(
2327 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002328 }
2329 return false;
2330}
2331
2332void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesNV(
2333 VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2334 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines, VkResult result, void *crtpl_state_data) {
2335 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2336 // This API may create pipelines regardless of the return value
2337 for (uint32_t i = 0; i < count; i++) {
2338 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002339 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002340 pipelineMap[pPipelines[i]] = std::move((crtpl_state->pipe_state)[i]);
2341 }
2342 }
2343 crtpl_state->pipe_state.clear();
2344}
2345
sourav parmarcd5fb182020-07-17 12:58:44 -07002346bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2347 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002348 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2349 const VkAllocationCallbacks *pAllocator,
2350 VkPipeline *pPipelines, void *crtpl_state_data) const {
2351 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
2352 crtpl_state->pipe_state.reserve(count);
2353 for (uint32_t i = 0; i < count; i++) {
2354 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002355 crtpl_state->pipe_state.push_back(
2356 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002357 }
2358 return false;
2359}
2360
sourav parmarcd5fb182020-07-17 12:58:44 -07002361void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2362 VkPipelineCache pipelineCache, uint32_t count,
2363 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2364 const VkAllocationCallbacks *pAllocator,
2365 VkPipeline *pPipelines, VkResult result,
2366 void *crtpl_state_data) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002367 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
2368 // This API may create pipelines regardless of the return value
2369 for (uint32_t i = 0; i < count; i++) {
2370 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002371 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002372 pipelineMap[pPipelines[i]] = std::move((crtpl_state->pipe_state)[i]);
2373 }
2374 }
2375 crtpl_state->pipe_state.clear();
2376}
2377
locke-lunargd556cc32019-09-17 01:21:23 -06002378void ValidationStateTracker::PostCallRecordCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2379 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler,
2380 VkResult result) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002381 samplerMap[*pSampler] = std::make_shared<SAMPLER_STATE>(pSampler, pCreateInfo);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002382 if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
2383 pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
Tony-LunarG7337b312020-04-15 16:40:25 -06002384 custom_border_color_sampler_count++;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002385 }
locke-lunargd556cc32019-09-17 01:21:23 -06002386}
2387
2388void ValidationStateTracker::PostCallRecordCreateDescriptorSetLayout(VkDevice device,
2389 const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2390 const VkAllocationCallbacks *pAllocator,
2391 VkDescriptorSetLayout *pSetLayout, VkResult result) {
2392 if (VK_SUCCESS != result) return;
2393 descriptorSetLayoutMap[*pSetLayout] = std::make_shared<cvdescriptorset::DescriptorSetLayout>(pCreateInfo, *pSetLayout);
2394}
2395
locke-lunargd556cc32019-09-17 01:21:23 -06002396void ValidationStateTracker::PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
2397 const VkAllocationCallbacks *pAllocator,
2398 VkPipelineLayout *pPipelineLayout, VkResult result) {
2399 if (VK_SUCCESS != result) return;
2400
Jeremy Gebbene6e45542021-08-05 16:39:49 -06002401 pipelineLayoutMap[*pPipelineLayout] = std::make_shared<PIPELINE_LAYOUT_STATE>(this, *pPipelineLayout, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002402}
2403
2404void ValidationStateTracker::PostCallRecordCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
2405 const VkAllocationCallbacks *pAllocator,
2406 VkDescriptorPool *pDescriptorPool, VkResult result) {
2407 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002408 descriptorPoolMap[*pDescriptorPool] = std::make_shared<DESCRIPTOR_POOL_STATE>(*pDescriptorPool, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002409}
2410
2411void ValidationStateTracker::PostCallRecordResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
2412 VkDescriptorPoolResetFlags flags, VkResult result) {
2413 if (VK_SUCCESS != result) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002414 DESCRIPTOR_POOL_STATE *pool = GetDescriptorPoolState(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06002415 // TODO: validate flags
2416 // For every set off of this pool, clear it, remove from setMap, and free cvdescriptorset::DescriptorSet
John Zulauf79f06582021-02-27 18:38:39 -07002417 for (auto *ds : pool->sets) {
locke-lunargd556cc32019-09-17 01:21:23 -06002418 FreeDescriptorSet(ds);
2419 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002420 pool->sets.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06002421 // Reset available count for each type and available sets for this pool
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002422 for (auto it = pool->availableDescriptorTypeCount.begin(); it != pool->availableDescriptorTypeCount.end(); ++it) {
2423 pool->availableDescriptorTypeCount[it->first] = pool->maxDescriptorTypeCount[it->first];
locke-lunargd556cc32019-09-17 01:21:23 -06002424 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002425 pool->availableSets = pool->maxSets;
locke-lunargd556cc32019-09-17 01:21:23 -06002426}
2427
2428bool ValidationStateTracker::PreCallValidateAllocateDescriptorSets(VkDevice device,
2429 const VkDescriptorSetAllocateInfo *pAllocateInfo,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002430 VkDescriptorSet *pDescriptorSets, void *ads_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002431 // Always update common data
2432 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2433 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2434 UpdateAllocateDescriptorSetsData(pAllocateInfo, ads_state);
2435
2436 return false;
2437}
2438
2439// Allocation state was good and call down chain was made so update state based on allocating descriptor sets
2440void ValidationStateTracker::PostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
2441 VkDescriptorSet *pDescriptorSets, VkResult result,
2442 void *ads_state_data) {
2443 if (VK_SUCCESS != result) return;
2444 // All the updates are contained in a single cvdescriptorset function
2445 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2446 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2447 PerformAllocateDescriptorSets(pAllocateInfo, pDescriptorSets, ads_state);
2448}
2449
2450void ValidationStateTracker::PreCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count,
2451 const VkDescriptorSet *pDescriptorSets) {
2452 DESCRIPTOR_POOL_STATE *pool_state = GetDescriptorPoolState(descriptorPool);
2453 // Update available descriptor sets in pool
2454 pool_state->availableSets += count;
2455
2456 // For each freed descriptor add its resources back into the pool as available and remove from pool and setMap
2457 for (uint32_t i = 0; i < count; ++i) {
2458 if (pDescriptorSets[i] != VK_NULL_HANDLE) {
2459 auto descriptor_set = setMap[pDescriptorSets[i]].get();
2460 uint32_t type_index = 0, descriptor_count = 0;
2461 for (uint32_t j = 0; j < descriptor_set->GetBindingCount(); ++j) {
2462 type_index = static_cast<uint32_t>(descriptor_set->GetTypeFromIndex(j));
2463 descriptor_count = descriptor_set->GetDescriptorCountFromIndex(j);
2464 pool_state->availableDescriptorTypeCount[type_index] += descriptor_count;
2465 }
2466 FreeDescriptorSet(descriptor_set);
2467 pool_state->sets.erase(descriptor_set);
2468 }
2469 }
2470}
2471
2472void ValidationStateTracker::PreCallRecordUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
2473 const VkWriteDescriptorSet *pDescriptorWrites,
2474 uint32_t descriptorCopyCount,
2475 const VkCopyDescriptorSet *pDescriptorCopies) {
2476 cvdescriptorset::PerformUpdateDescriptorSets(this, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
2477 pDescriptorCopies);
2478}
2479
2480void ValidationStateTracker::PostCallRecordAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo,
2481 VkCommandBuffer *pCommandBuffer, VkResult result) {
2482 if (VK_SUCCESS != result) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002483 auto pool = GetCommandPoolShared(pCreateInfo->commandPool);
2484 if (pool) {
locke-lunargd556cc32019-09-17 01:21:23 -06002485 for (uint32_t i = 0; i < pCreateInfo->commandBufferCount; i++) {
2486 // Add command buffer to its commandPool map
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002487 pool->commandBuffers.insert(pCommandBuffer[i]);
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002488 commandBufferMap[pCommandBuffer[i]] = CreateCmdBufferState(pCommandBuffer[i], pCreateInfo, pool);
locke-lunargfc78e932020-11-19 17:06:24 -07002489 }
2490 }
2491}
2492
locke-lunargd556cc32019-09-17 01:21:23 -06002493void ValidationStateTracker::PreCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer,
2494 const VkCommandBufferBeginInfo *pBeginInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002495 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002496 if (!cb_state) return;
locke-lunargfc78e932020-11-19 17:06:24 -07002497
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002498 cb_state->Begin(pBeginInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002499}
2500
2501void ValidationStateTracker::PostCallRecordEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002502 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002503 if (!cb_state) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002504
2505 cb_state->End(result);
locke-lunargd556cc32019-09-17 01:21:23 -06002506}
2507
2508void ValidationStateTracker::PostCallRecordResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags,
2509 VkResult result) {
2510 if (VK_SUCCESS == result) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002511 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002512 cb_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002513 }
2514}
2515
2516CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) {
2517 // initially assume everything is static state
2518 CBStatusFlags flags = CBSTATUS_ALL_STATE_SET;
2519
2520 if (ds) {
2521 for (uint32_t i = 0; i < ds->dynamicStateCount; i++) {
locke-lunarg4189aa22020-10-21 00:23:48 -06002522 flags &= ~ConvertToCBStatusFlagBits(ds->pDynamicStates[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002523 }
2524 }
locke-lunargd556cc32019-09-17 01:21:23 -06002525 return flags;
2526}
2527
2528// Validation cache:
2529// CV is the bottommost implementor of this extension. Don't pass calls down.
locke-lunargd556cc32019-09-17 01:21:23 -06002530
2531void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2532 VkPipeline pipeline) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002533 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002534 assert(cb_state);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002535 cb_state->RecordCmd(CMD_BINDPIPELINE);
locke-lunargd556cc32019-09-17 01:21:23 -06002536
2537 auto pipe_state = GetPipelineState(pipeline);
2538 if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002539 const auto &create_info = pipe_state->create_info.graphics;
2540 bool rasterization_enabled = VK_FALSE == create_info.pRasterizationState->rasterizerDiscardEnable;
2541 const auto *viewport_state = create_info.pViewportState;
2542 const auto *dynamic_state = create_info.pDynamicState;
locke-lunargd556cc32019-09-17 01:21:23 -06002543 cb_state->status &= ~cb_state->static_status;
Jeremy Gebben11af9792021-08-20 10:20:09 -06002544 cb_state->static_status = MakeStaticStateMask(dynamic_state->ptr());
locke-lunargd556cc32019-09-17 01:21:23 -06002545 cb_state->status |= cb_state->static_status;
locke-lunarg4189aa22020-10-21 00:23:48 -06002546 cb_state->dynamic_status = CBSTATUS_ALL_STATE_SET & (~cb_state->static_status);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002547
2548 // Used to calculate CMD_BUFFER_STATE::usedViewportScissorCount upon draw command with this graphics pipeline.
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002549 // If rasterization disabled (no viewport/scissors used), or the actual number of viewports/scissors is dynamic (unknown at
2550 // this time), then these are set to 0 to disable this checking.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002551 auto has_dynamic_viewport_count = cb_state->dynamic_status & CBSTATUS_VIEWPORT_WITH_COUNT_SET;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002552 auto has_dynamic_scissor_count = cb_state->dynamic_status & CBSTATUS_SCISSOR_WITH_COUNT_SET;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002553 cb_state->pipelineStaticViewportCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002554 has_dynamic_viewport_count || !rasterization_enabled ? 0 : viewport_state->viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002555 cb_state->pipelineStaticScissorCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002556 has_dynamic_scissor_count || !rasterization_enabled ? 0 : viewport_state->scissorCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002557
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002558 // Trash dynamic viewport/scissor state if pipeline defines static state and enabled rasterization.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002559 // akeley98 NOTE: There's a bit of an ambiguity in the spec, whether binding such a pipeline overwrites
2560 // the entire viewport (scissor) array, or only the subsection defined by the viewport (scissor) count.
2561 // I am taking the latter interpretation based on the implementation details of NVIDIA's Vulkan driver.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002562 if (!has_dynamic_viewport_count) {
2563 cb_state->trashedViewportCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002564 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_VIEWPORT_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002565 cb_state->trashedViewportMask |= (uint32_t(1) << viewport_state->viewportCount) - 1u;
2566 // should become = ~uint32_t(0) if the other interpretation is correct.
2567 }
2568 }
2569 if (!has_dynamic_scissor_count) {
2570 cb_state->trashedScissorCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002571 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_SCISSOR_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002572 cb_state->trashedScissorMask |= (uint32_t(1) << viewport_state->scissorCount) - 1u;
2573 // should become = ~uint32_t(0) if the other interpretation is correct.
2574 }
2575 }
locke-lunargd556cc32019-09-17 01:21:23 -06002576 }
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002577 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
2578 cb_state->lastBound[lv_bind_point].pipeline_state = pipe_state;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002579 if (!disabled[command_buffer_state]) {
2580 cb_state->AddChild(pipe_state);
2581 }
locke-lunargb8be8222020-10-20 00:34:37 -06002582 for (auto &slot : pipe_state->active_slots) {
2583 for (auto &req : slot.second) {
2584 for (auto &sampler : req.second.samplers_used_by_image) {
2585 for (auto &des : sampler) {
2586 des.second = nullptr;
2587 }
2588 }
2589 }
2590 }
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06002591 cb_state->lastBound[lv_bind_point].UpdateSamplerDescriptorsUsedByImage();
locke-lunargd556cc32019-09-17 01:21:23 -06002592}
2593
2594void ValidationStateTracker::PreCallRecordCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2595 uint32_t viewportCount, const VkViewport *pViewports) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002596 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002597 cb_state->RecordStateCmd(CMD_SETVIEWPORT, CBSTATUS_VIEWPORT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002598 uint32_t bits = ((1u << viewportCount) - 1u) << firstViewport;
2599 cb_state->viewportMask |= bits;
2600 cb_state->trashedViewportMask &= ~bits;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002601
2602 cb_state->dynamicViewports.resize(std::max(size_t(firstViewport + viewportCount), cb_state->dynamicViewports.size()));
2603 for (size_t i = 0; i < viewportCount; ++i) {
2604 cb_state->dynamicViewports[firstViewport + i] = pViewports[i];
2605 }
locke-lunargd556cc32019-09-17 01:21:23 -06002606}
2607
2608void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
2609 uint32_t exclusiveScissorCount,
2610 const VkRect2D *pExclusiveScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002611 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002612 cb_state->RecordStateCmd(CMD_SETEXCLUSIVESCISSORNV, CBSTATUS_EXCLUSIVE_SCISSOR_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002613 // TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
2614 // cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
locke-lunargd556cc32019-09-17 01:21:23 -06002615}
2616
2617void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
2618 VkImageLayout imageLayout) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002619 if (disabled[command_buffer_state]) return;
2620
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002621 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002622 cb_state->RecordCmd(CMD_BINDSHADINGRATEIMAGENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002623
2624 if (imageView != VK_NULL_HANDLE) {
2625 auto view_state = GetImageViewState(imageView);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002626 cb_state->AddChild(view_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002627 }
2628}
2629
2630void ValidationStateTracker::PreCallRecordCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2631 uint32_t viewportCount,
2632 const VkShadingRatePaletteNV *pShadingRatePalettes) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002633 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002634 cb_state->RecordStateCmd(CMD_SETVIEWPORTSHADINGRATEPALETTENV, CBSTATUS_SHADING_RATE_PALETTE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002635 // TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
2636 // cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
locke-lunargd556cc32019-09-17 01:21:23 -06002637}
2638
2639void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
2640 const VkAccelerationStructureCreateInfoNV *pCreateInfo,
2641 const VkAllocationCallbacks *pAllocator,
2642 VkAccelerationStructureNV *pAccelerationStructure,
2643 VkResult result) {
2644 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002645 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002646
2647 // Query the requirements in case the application doesn't (to avoid bind/validation time query)
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002648 auto as_memory_requirements_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002649 as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002650 as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002651 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &as_memory_requirements_info, &as_state->memory_requirements);
2652
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002653 auto scratch_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002654 scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002655 scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002656 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &scratch_memory_req_info,
2657 &as_state->build_scratch_memory_requirements);
2658
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002659 auto update_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002660 update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002661 update_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002662 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
2663 &as_state->update_scratch_memory_requirements);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002664 as_state->allocator = pAllocator;
locke-lunargd556cc32019-09-17 01:21:23 -06002665 accelerationStructureMap[*pAccelerationStructure] = std::move(as_state);
2666}
2667
Jeff Bolz95176d02020-04-01 00:36:16 -05002668void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
2669 const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
2670 const VkAllocationCallbacks *pAllocator,
2671 VkAccelerationStructureKHR *pAccelerationStructure,
2672 VkResult result) {
2673 if (VK_SUCCESS != result) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002674 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE_KHR>(*pAccelerationStructure, pCreateInfo);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002675 as_state->allocator = pAllocator;
sourav parmarcd5fb182020-07-17 12:58:44 -07002676 accelerationStructureMap_khr[*pAccelerationStructure] = std::move(as_state);
Jeff Bolz95176d02020-04-01 00:36:16 -05002677}
2678
sourav parmarcd5fb182020-07-17 12:58:44 -07002679void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresKHR(
2680 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2681 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002682 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002683 if (cb_state == nullptr) {
2684 return;
2685 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002686 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002687 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002688 auto *dst_as_state = GetAccelerationStructureStateKHR(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002689 if (dst_as_state != nullptr) {
2690 dst_as_state->built = true;
2691 dst_as_state->build_info_khr.initialize(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002692 if (!disabled[command_buffer_state]) {
2693 cb_state->AddChild(dst_as_state);
2694 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002695 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002696 if (!disabled[command_buffer_state]) {
2697 auto *src_as_state = GetAccelerationStructureStateKHR(pInfos[i].srcAccelerationStructure);
2698 if (src_as_state != nullptr) {
2699 cb_state->AddChild(src_as_state);
2700 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002701 }
2702 }
2703 cb_state->hasBuildAccelerationStructureCmd = true;
2704}
2705
2706void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresIndirectKHR(
2707 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2708 const VkDeviceAddress *pIndirectDeviceAddresses, const uint32_t *pIndirectStrides,
2709 const uint32_t *const *ppMaxPrimitiveCounts) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002710 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002711 if (cb_state == nullptr) {
2712 return;
2713 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002714 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESINDIRECTKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002715 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002716 auto *dst_as_state = GetAccelerationStructureStateKHR(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002717 if (dst_as_state != nullptr) {
2718 dst_as_state->built = true;
2719 dst_as_state->build_info_khr.initialize(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002720 if (!disabled[command_buffer_state]) {
2721 cb_state->AddChild(dst_as_state);
2722 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002723 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002724 if (!disabled[command_buffer_state]) {
2725 auto *src_as_state = GetAccelerationStructureStateKHR(pInfos[i].srcAccelerationStructure);
2726 if (src_as_state != nullptr) {
2727 cb_state->AddChild(src_as_state);
2728 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002729 }
2730 }
2731 cb_state->hasBuildAccelerationStructureCmd = true;
2732}
locke-lunargd556cc32019-09-17 01:21:23 -06002733void ValidationStateTracker::PostCallRecordGetAccelerationStructureMemoryRequirementsNV(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002734 VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV *pInfo, VkMemoryRequirements2 *pMemoryRequirements) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002735 ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureStateNV(pInfo->accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002736 if (as_state != nullptr) {
2737 if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV) {
2738 as_state->memory_requirements = *pMemoryRequirements;
2739 as_state->memory_requirements_checked = true;
2740 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV) {
2741 as_state->build_scratch_memory_requirements = *pMemoryRequirements;
2742 as_state->build_scratch_memory_requirements_checked = true;
2743 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV) {
2744 as_state->update_scratch_memory_requirements = *pMemoryRequirements;
2745 as_state->update_scratch_memory_requirements_checked = true;
2746 }
2747 }
2748}
2749
sourav parmarcd5fb182020-07-17 12:58:44 -07002750void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
2751 VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002752 if (VK_SUCCESS != result) return;
2753 for (uint32_t i = 0; i < bindInfoCount; i++) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002754 const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
locke-lunargd556cc32019-09-17 01:21:23 -06002755
sourav parmarcd5fb182020-07-17 12:58:44 -07002756 ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureStateNV(info.accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002757 if (as_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002758 // Track objects tied to memory
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002759 auto mem_state = GetDevMemShared(info.memory);
2760 if (mem_state) {
2761 as_state->SetMemBinding(mem_state, info.memoryOffset);
2762 }
locke-lunargd556cc32019-09-17 01:21:23 -06002763
2764 // GPU validation of top level acceleration structure building needs acceleration structure handles.
Jeff Bolz95176d02020-04-01 00:36:16 -05002765 // XXX TODO: Query device address for KHR extension
sourav parmarcd5fb182020-07-17 12:58:44 -07002766 if (enabled[gpu_validation]) {
locke-lunargd556cc32019-09-17 01:21:23 -06002767 DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
2768 }
2769 }
2770 }
2771}
2772
2773void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
2774 VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
2775 VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002776 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002777 if (cb_state == nullptr) {
2778 return;
2779 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002780 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002781
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002782 auto *dst_as_state = GetAccelerationStructureStateNV(dst);
locke-lunargd556cc32019-09-17 01:21:23 -06002783 if (dst_as_state != nullptr) {
2784 dst_as_state->built = true;
2785 dst_as_state->build_info.initialize(pInfo);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002786 if (!disabled[command_buffer_state]) {
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002787 cb_state->AddChild(dst_as_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002788 }
locke-lunargd556cc32019-09-17 01:21:23 -06002789 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002790 if (!disabled[command_buffer_state]) {
2791 auto *src_as_state = GetAccelerationStructureStateNV(src);
2792 if (src_as_state != nullptr) {
2793 cb_state->AddChild(src_as_state);
2794 }
locke-lunargd556cc32019-09-17 01:21:23 -06002795 }
2796 cb_state->hasBuildAccelerationStructureCmd = true;
2797}
2798
2799void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureNV(VkCommandBuffer commandBuffer,
2800 VkAccelerationStructureNV dst,
2801 VkAccelerationStructureNV src,
2802 VkCopyAccelerationStructureModeNV mode) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002803 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002804 if (cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002805 ACCELERATION_STRUCTURE_STATE *src_as_state = GetAccelerationStructureStateNV(src);
2806 ACCELERATION_STRUCTURE_STATE *dst_as_state = GetAccelerationStructureStateNV(dst);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002807 if (!disabled[command_buffer_state]) {
2808 cb_state->RecordTransferCmd(CMD_COPYACCELERATIONSTRUCTURENV, src_as_state, dst_as_state);
2809 }
locke-lunargd556cc32019-09-17 01:21:23 -06002810 if (dst_as_state != nullptr && src_as_state != nullptr) {
2811 dst_as_state->built = true;
2812 dst_as_state->build_info = src_as_state->build_info;
locke-lunargd556cc32019-09-17 01:21:23 -06002813 }
2814 }
2815}
2816
Jeff Bolz95176d02020-04-01 00:36:16 -05002817void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
2818 VkAccelerationStructureKHR accelerationStructure,
2819 const VkAllocationCallbacks *pAllocator) {
locke-lunargd556cc32019-09-17 01:21:23 -06002820 if (!accelerationStructure) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002821 auto *as_state = GetAccelerationStructureStateKHR(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002822 if (as_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002823 as_state->Destroy();
sourav parmarcd5fb182020-07-17 12:58:44 -07002824 accelerationStructureMap_khr.erase(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002825 }
2826}
2827
Jeff Bolz95176d02020-04-01 00:36:16 -05002828void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
2829 VkAccelerationStructureNV accelerationStructure,
2830 const VkAllocationCallbacks *pAllocator) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002831 if (!accelerationStructure) return;
2832 auto *as_state = GetAccelerationStructureStateNV(accelerationStructure);
2833 if (as_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002834 as_state->Destroy();
sourav parmarcd5fb182020-07-17 12:58:44 -07002835 accelerationStructureMap.erase(accelerationStructure);
2836 }
Jeff Bolz95176d02020-04-01 00:36:16 -05002837}
2838
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002839void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2840 uint32_t viewportCount,
2841 const VkViewportWScalingNV *pViewportWScalings) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002842 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002843 cb_state->RecordStateCmd(CMD_SETVIEWPORTWSCALINGNV, CBSTATUS_VIEWPORT_W_SCALING_SET);
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002844}
2845
locke-lunargd556cc32019-09-17 01:21:23 -06002846void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002847 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002848 cb_state->RecordStateCmd(CMD_SETLINEWIDTH, CBSTATUS_LINE_WIDTH_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002849}
2850
2851void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
2852 uint16_t lineStipplePattern) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002853 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002854 cb_state->RecordStateCmd(CMD_SETLINESTIPPLEEXT, CBSTATUS_LINE_STIPPLE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002855}
2856
2857void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
2858 float depthBiasClamp, float depthBiasSlopeFactor) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002859 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002860 cb_state->RecordStateCmd(CMD_SETDEPTHBIAS, CBSTATUS_DEPTH_BIAS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002861}
2862
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002863void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
2864 const VkRect2D *pScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002865 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002866 cb_state->RecordStateCmd(CMD_SETSCISSOR, CBSTATUS_SCISSOR_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002867 uint32_t bits = ((1u << scissorCount) - 1u) << firstScissor;
2868 cb_state->scissorMask |= bits;
2869 cb_state->trashedScissorMask &= ~bits;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002870}
2871
locke-lunargd556cc32019-09-17 01:21:23 -06002872void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002873 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002874 cb_state->RecordStateCmd(CMD_SETBLENDCONSTANTS, CBSTATUS_BLEND_CONSTANTS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002875}
2876
2877void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
2878 float maxDepthBounds) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002879 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002880 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDS, CBSTATUS_DEPTH_BOUNDS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002881}
2882
2883void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2884 uint32_t compareMask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002885 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002886 cb_state->RecordStateCmd(CMD_SETSTENCILCOMPAREMASK, CBSTATUS_STENCIL_READ_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002887}
2888
2889void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2890 uint32_t writeMask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002891 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002892 cb_state->RecordStateCmd(CMD_SETSTENCILWRITEMASK, CBSTATUS_STENCIL_WRITE_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002893}
2894
2895void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2896 uint32_t reference) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002897 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002898 cb_state->RecordStateCmd(CMD_SETSTENCILREFERENCE, CBSTATUS_STENCIL_REFERENCE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002899}
2900
locke-lunargd556cc32019-09-17 01:21:23 -06002901
2902// Update the bound state for the bind point, including the effects of incompatible pipeline layouts
2903void ValidationStateTracker::PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2904 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2905 uint32_t firstSet, uint32_t setCount,
2906 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2907 const uint32_t *pDynamicOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002908 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002909 cb_state->RecordCmd(CMD_BINDDESCRIPTORSETS);
locke-lunargd556cc32019-09-17 01:21:23 -06002910 auto pipeline_layout = GetPipelineLayout(layout);
2911
2912 // Resize binding arrays
2913 uint32_t last_set_index = firstSet + setCount - 1;
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002914 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
2915 if (last_set_index >= cb_state->lastBound[lv_bind_point].per_set.size()) {
2916 cb_state->lastBound[lv_bind_point].per_set.resize(last_set_index + 1);
locke-lunargd556cc32019-09-17 01:21:23 -06002917 }
2918
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002919 cb_state->UpdateLastBoundDescriptorSets(pipelineBindPoint, pipeline_layout, firstSet, setCount, pDescriptorSets, nullptr,
2920 dynamicOffsetCount, pDynamicOffsets);
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002921 cb_state->lastBound[lv_bind_point].pipeline_layout = layout;
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06002922 cb_state->lastBound[lv_bind_point].UpdateSamplerDescriptorsUsedByImage();
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002923}
2924
locke-lunargd556cc32019-09-17 01:21:23 -06002925void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
2926 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2927 uint32_t set, uint32_t descriptorWriteCount,
2928 const VkWriteDescriptorSet *pDescriptorWrites) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002929 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002930 auto pipeline_layout = GetPipelineLayout(layout);
2931 cb_state->PushDescriptorSetState(pipelineBindPoint, pipeline_layout, set, descriptorWriteCount, pDescriptorWrites);
locke-lunargd556cc32019-09-17 01:21:23 -06002932}
2933
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002934void ValidationStateTracker::PostCallRecordCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2935 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2936 const void *pValues) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002937 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002938 if (cb_state != nullptr) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002939 cb_state->RecordCmd(CMD_PUSHCONSTANTS);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002940 cb_state->ResetPushConstantDataIfIncompatible(GetPipelineLayout(layout));
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002941
2942 auto &push_constant_data = cb_state->push_constant_data;
2943 assert((offset + size) <= static_cast<uint32_t>(push_constant_data.size()));
2944 std::memcpy(push_constant_data.data() + offset, pValues, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002945 cb_state->push_constant_pipeline_layout_set = layout;
2946
2947 auto flags = stageFlags;
2948 uint32_t bit_shift = 0;
2949 while (flags) {
2950 if (flags & 1) {
2951 VkShaderStageFlagBits flag = static_cast<VkShaderStageFlagBits>(1 << bit_shift);
2952 const auto it = cb_state->push_constant_data_update.find(flag);
2953
2954 if (it != cb_state->push_constant_data_update.end()) {
locke-lunarg3d8b8f32020-10-26 17:04:16 -06002955 std::memset(it->second.data() + offset, PC_Byte_Updated, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002956 }
2957 }
2958 flags = flags >> 1;
2959 ++bit_shift;
2960 }
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002961 }
2962}
2963
locke-lunargd556cc32019-09-17 01:21:23 -06002964void ValidationStateTracker::PreCallRecordCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2965 VkIndexType indexType) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002966 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002967
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002968 cb_state->RecordStateCmd(CMD_BINDINDEXBUFFER, CBSTATUS_INDEX_BUFFER_BOUND);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002969 cb_state->index_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(buffer);
2970 cb_state->index_buffer_binding.size = cb_state->index_buffer_binding.buffer_state->createInfo.size;
locke-lunargd556cc32019-09-17 01:21:23 -06002971 cb_state->index_buffer_binding.offset = offset;
2972 cb_state->index_buffer_binding.index_type = indexType;
2973 // Add binding for this index buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002974 if (!disabled[command_buffer_state]) {
2975 cb_state->AddChild(cb_state->index_buffer_binding.buffer_state.get());
2976 }
locke-lunargd556cc32019-09-17 01:21:23 -06002977}
2978
2979void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2980 uint32_t bindingCount, const VkBuffer *pBuffers,
2981 const VkDeviceSize *pOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002982 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002983 cb_state->RecordCmd(CMD_BINDVERTEXBUFFERS);
locke-lunargd556cc32019-09-17 01:21:23 -06002984
2985 uint32_t end = firstBinding + bindingCount;
2986 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
2987 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
2988 }
2989
2990 for (uint32_t i = 0; i < bindingCount; ++i) {
2991 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
locke-lunarg1ae57d62020-11-18 10:49:19 -07002992 vertex_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(pBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002993 vertex_buffer_binding.offset = pOffsets[i];
Piers Daniell39842ee2020-07-10 16:42:33 -06002994 vertex_buffer_binding.size = VK_WHOLE_SIZE;
2995 vertex_buffer_binding.stride = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06002996 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002997 if (pBuffers[i] && !disabled[command_buffer_state]) {
2998 cb_state->AddChild(vertex_buffer_binding.buffer_state.get());
Jeff Bolz165818a2020-05-08 11:19:03 -05002999 }
locke-lunargd556cc32019-09-17 01:21:23 -06003000 }
3001}
3002
3003void ValidationStateTracker::PostCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
3004 VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003005 if (disabled[command_buffer_state]) return;
3006
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003007 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003008 cb_state->RecordTransferCmd(CMD_UPDATEBUFFER, GetBufferState(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -06003009}
3010
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003011void ValidationStateTracker::PreCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
3012 VkPipelineStageFlags stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003013 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3014 cb_state->RecordSetEvent(CMD_SETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003015}
3016
3017void ValidationStateTracker::PreCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
3018 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003019 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003020 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
3021
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003022 cb_state->RecordSetEvent(CMD_SETEVENT2KHR, event, stage_masks.src);
3023 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003024}
3025
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003026void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
3027 VkPipelineStageFlags stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003028 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3029 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003030}
3031
3032void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
3033 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003034 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3035 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003036}
3037
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003038void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
3039 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
3040 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3041 uint32_t bufferMemoryBarrierCount,
3042 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3043 uint32_t imageMemoryBarrierCount,
3044 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003045 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3046 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents);
3047 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
3048 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003049}
3050
3051void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
3052 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003053 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3054 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, eventCount, pEvents);
Jeremy Gebben79649152021-06-22 14:46:24 -06003055 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003056 cb_state->RecordBarriers(pDependencyInfos[i]);
Jeremy Gebben79649152021-06-22 14:46:24 -06003057 }
3058}
3059
3060void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
3061 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
3062 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3063 uint32_t bufferMemoryBarrierCount,
3064 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3065 uint32_t imageMemoryBarrierCount,
3066 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003067 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3068 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
3069 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
3070 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06003071}
3072
3073void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
3074 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003075 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3076 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
3077 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06003078}
3079
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02003080QueryState ValidationStateTracker::GetQueryState(const QueryMap *localQueryToStateMap, VkQueryPool queryPool, uint32_t queryIndex,
3081 uint32_t perfPass) const {
3082 QueryObject query = QueryObject(QueryObject(queryPool, queryIndex), perfPass);
locke-lunargd556cc32019-09-17 01:21:23 -06003083
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02003084 auto iter = localQueryToStateMap->find(query);
3085 if (iter != localQueryToStateMap->end()) return iter->second;
Jeff Bolz310775c2019-10-09 00:46:33 -05003086
Jeff Bolz310775c2019-10-09 00:46:33 -05003087 return QUERYSTATE_UNKNOWN;
locke-lunargd556cc32019-09-17 01:21:23 -06003088}
3089
locke-lunargd556cc32019-09-17 01:21:23 -06003090void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
3091 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06003092 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003093
locke-lunargd556cc32019-09-17 01:21:23 -06003094 QueryObject query = {queryPool, slot};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003095 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003096 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003097 if (!disabled[query_validation]) {
3098 cb_state->BeginQuery(query);
3099 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003100 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003101 auto pool_state = GetQueryPoolState(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003102 cb_state->AddChild(pool_state);
3103 }
locke-lunargd556cc32019-09-17 01:21:23 -06003104}
3105
3106void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06003107 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003108 QueryObject query_obj = {queryPool, slot};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003109 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003110 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003111 if (!disabled[query_validation]) {
3112 cb_state->EndQuery(query_obj);
3113 }
3114 if (!disabled[command_buffer_state]) {
3115 auto pool_state = GetQueryPoolState(query_obj.pool);
3116 cb_state->AddChild(pool_state);
3117 }
locke-lunargd556cc32019-09-17 01:21:23 -06003118}
3119
3120void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3121 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06003122 if (disabled[query_validation]) return;
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003123 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003124
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003125 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003126 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02003127
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003128 if (!disabled[command_buffer_state]) {
3129 auto pool_state = GetQueryPoolState(queryPool);
3130 cb_state->AddChild(pool_state);
3131 }
locke-lunargd556cc32019-09-17 01:21:23 -06003132}
3133
3134void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3135 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
3136 VkDeviceSize dstOffset, VkDeviceSize stride,
3137 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003138 if (disabled[query_validation] || disabled[command_buffer_state]) return;
3139
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003140 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003141 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
locke-lunargd556cc32019-09-17 01:21:23 -06003142 auto dst_buff_state = GetBufferState(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003143 cb_state->AddChild(dst_buff_state);
Jeff Bolzadbfa852019-10-04 13:53:30 -05003144 auto pool_state = GetQueryPoolState(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003145 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003146}
3147
3148void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
3149 VkQueryPool queryPool, uint32_t slot) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003150 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3151 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003152}
3153
3154void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
3155 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
3156 uint32_t slot) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003157 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3158 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06003159}
3160
Marijn Suijten6750fdc2020-12-30 22:06:42 +01003161void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
3162 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
3163 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
3164 if (disabled[query_validation]) return;
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003165 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003166 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003167 if (!disabled[command_buffer_state]) {
3168 auto pool_state = GetQueryPoolState(queryPool);
3169 cb_state->AddChild(pool_state);
3170 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003171 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01003172}
3173
locke-lunargd556cc32019-09-17 01:21:23 -06003174void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3175 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
3176 VkResult result) {
3177 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003178
Jeremy Gebben88f58142021-06-01 10:07:52 -06003179 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08003180 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06003181 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07003182
locke-lunargd556cc32019-09-17 01:21:23 -06003183 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06003184 views[i] = GetShared<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003185 }
3186 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06003187
3188 frameBufferMap[*pFramebuffer] = std::make_shared<FRAMEBUFFER_STATE>(
3189 *pFramebuffer, pCreateInfo, GetRenderPassShared(pCreateInfo->renderPass), std::move(views));
locke-lunargd556cc32019-09-17 01:21:23 -06003190}
3191
locke-lunargd556cc32019-09-17 01:21:23 -06003192void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3193 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
3194 VkResult result) {
3195 if (VK_SUCCESS != result) return;
Jeremy Gebben88f58142021-06-01 10:07:52 -06003196 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06003197}
3198
Mike Schuchardt2df08912020-12-15 16:28:09 -08003199void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07003200 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
3201 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06003202 if (VK_SUCCESS != result) return;
3203
3204 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
Tony-LunarG977448c2019-12-02 14:52:02 -07003205}
3206
Mike Schuchardt2df08912020-12-15 16:28:09 -08003207void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07003208 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
3209 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06003210 if (VK_SUCCESS != result) return;
3211
3212 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
Tony-LunarG977448c2019-12-02 14:52:02 -07003213}
3214
locke-lunargd556cc32019-09-17 01:21:23 -06003215void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
3216 const VkRenderPassBeginInfo *pRenderPassBegin,
3217 VkSubpassContents contents) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003218 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3219 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003220}
3221
3222void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
3223 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003224 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003225 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003226 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003227}
3228
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003229void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
3230 uint32_t counterBufferCount,
3231 const VkBuffer *pCounterBuffers,
3232 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003233 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003234
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003235 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003236 cb_state->transform_feedback_active = true;
3237}
3238
3239void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
3240 uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
3241 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003242 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003243
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003244 cb_state->RecordCmd(CMD_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003245 cb_state->transform_feedback_active = false;
3246}
3247
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003248void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
3249 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebbenc8b51a92021-08-16 15:19:00 -06003250 auto *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003251
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003252 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003253 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02003254 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
3255 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003256}
3257
3258void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenc8b51a92021-08-16 15:19:00 -06003259 auto *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003260
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003261 cb_state->RecordCmd(CMD_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003262 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02003263 cb_state->conditional_rendering_inside_render_pass = false;
3264 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003265}
3266
Tony-LunarG977448c2019-12-02 14:52:02 -07003267void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
3268 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003269 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003270 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3271 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07003272}
3273
locke-lunargd556cc32019-09-17 01:21:23 -06003274
3275void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003276 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3277 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003278}
3279
3280void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003281 const VkSubpassBeginInfo *pSubpassBeginInfo,
3282 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003283 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003284 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003285}
3286
Tony-LunarG977448c2019-12-02 14:52:02 -07003287void ValidationStateTracker::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003288 const VkSubpassBeginInfo *pSubpassBeginInfo,
3289 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003290 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003291 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003292}
3293
3294void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003295 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3296 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06003297}
3298
3299void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003300 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003301 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003302 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06003303}
3304
Tony-LunarG977448c2019-12-02 14:52:02 -07003305void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003306 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003307 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3308 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07003309}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003310
locke-lunargd556cc32019-09-17 01:21:23 -06003311void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
3312 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003313 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003314
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003315 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06003316}
3317
3318void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
3319 VkFlags flags, void **ppData, VkResult result) {
3320 if (VK_SUCCESS != result) return;
3321 RecordMappedMemory(mem, offset, size, ppData);
3322}
3323
3324void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
3325 auto mem_info = GetDevMemState(mem);
3326 if (mem_info) {
3327 mem_info->mapped_range = MemRange();
3328 mem_info->p_driver_data = nullptr;
3329 }
3330}
3331
3332void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben8ee02af2021-07-16 10:15:55 -06003333 auto image_state = GetShared<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06003334 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06003335 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
3336 // See: VUID-vkGetImageSubresourceLayout-image-01895
3337 image_state->fragment_encoder =
3338 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07003339 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003340 if (swapchain_info) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003341 auto swapchain = GetShared<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003342 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003343 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07003344
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003345 if (!swapchain_image.fake_base_address) {
3346 auto size = image_state->fragment_encoder->TotalSize();
3347 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06003348 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003349 // All images bound to this swapchain and index are aliases
3350 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003351 }
3352 } else {
3353 // Track bound memory range information
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003354 auto mem_info = GetDevMemShared(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06003355 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003356 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06003357 }
locke-lunargd556cc32019-09-17 01:21:23 -06003358 }
locke-lunargd556cc32019-09-17 01:21:23 -06003359 }
3360}
3361
3362void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
3363 VkDeviceSize memoryOffset, VkResult result) {
3364 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06003365 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003366 bind_info.image = image;
3367 bind_info.memory = mem;
3368 bind_info.memoryOffset = memoryOffset;
3369 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003370}
3371
3372void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003373 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003374 if (VK_SUCCESS != result) return;
3375 for (uint32_t i = 0; i < bindInfoCount; i++) {
3376 UpdateBindImageMemoryState(pBindInfos[i]);
3377 }
3378}
3379
3380void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003381 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003382 if (VK_SUCCESS != result) return;
3383 for (uint32_t i = 0; i < bindInfoCount; i++) {
3384 UpdateBindImageMemoryState(pBindInfos[i]);
3385 }
3386}
3387
3388void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
3389 auto event_state = GetEventState(event);
3390 if (event_state) {
3391 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
3392 }
locke-lunargd556cc32019-09-17 01:21:23 -06003393}
3394
3395void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
3396 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
3397 VkResult result) {
3398 if (VK_SUCCESS != result) return;
3399 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
3400 pImportSemaphoreFdInfo->flags);
3401}
3402
3403void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003404 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
locke-lunargd556cc32019-09-17 01:21:23 -06003405 SEMAPHORE_STATE *semaphore_state = GetSemaphoreState(semaphore);
Mike Schuchardt2df08912020-12-15 16:28:09 -08003406 if (semaphore_state && handle_type != VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06003407 // Cannot track semaphore state once it is exported, except for Sync FD handle types which have copy transference
3408 semaphore_state->scope = kSyncScopeExternalPermanent;
3409 }
3410}
3411
3412#ifdef VK_USE_PLATFORM_WIN32_KHR
3413void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
3414 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
3415 if (VK_SUCCESS != result) return;
3416 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
3417 pImportSemaphoreWin32HandleInfo->flags);
3418}
3419
3420void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
3421 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3422 HANDLE *pHandle, VkResult result) {
3423 if (VK_SUCCESS != result) return;
3424 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
3425}
3426
3427void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
3428 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
3429 if (VK_SUCCESS != result) return;
3430 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
3431 pImportFenceWin32HandleInfo->flags);
3432}
3433
3434void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
3435 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3436 HANDLE *pHandle, VkResult result) {
3437 if (VK_SUCCESS != result) return;
3438 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
3439}
3440#endif
3441
3442void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
3443 VkResult result) {
3444 if (VK_SUCCESS != result) return;
3445 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
3446}
3447
Mike Schuchardt2df08912020-12-15 16:28:09 -08003448void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
3449 VkFenceImportFlags flags) {
locke-lunargd556cc32019-09-17 01:21:23 -06003450 FENCE_STATE *fence_node = GetFenceState(fence);
3451 if (fence_node && fence_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08003452 if ((handle_type == VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_FENCE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06003453 fence_node->scope == kSyncScopeInternal) {
3454 fence_node->scope = kSyncScopeExternalTemporary;
3455 } else {
3456 fence_node->scope = kSyncScopeExternalPermanent;
3457 }
3458 }
3459}
3460
3461void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
3462 VkResult result) {
3463 if (VK_SUCCESS != result) return;
3464 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
3465}
3466
Mike Schuchardt2df08912020-12-15 16:28:09 -08003467void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
locke-lunargd556cc32019-09-17 01:21:23 -06003468 FENCE_STATE *fence_state = GetFenceState(fence);
3469 if (fence_state) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08003470 if (handle_type != VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06003471 // Export with reference transference becomes external
3472 fence_state->scope = kSyncScopeExternalPermanent;
3473 } else if (fence_state->scope == kSyncScopeInternal) {
3474 // Export with copy transference has a side effect of resetting the fence
3475 fence_state->state = FENCE_UNSIGNALED;
3476 }
3477 }
3478}
3479
3480void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3481 VkResult result) {
3482 if (VK_SUCCESS != result) return;
3483 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3484}
3485
3486void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3487 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3488 if (VK_SUCCESS != result) return;
John Zulaufd5115702021-01-18 12:34:33 -07003489 const auto event = *pEvent;
Jeremy Gebbencbf22862021-03-03 12:01:22 -07003490 eventMap.emplace(event, std::make_shared<EVENT_STATE>(event, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003491}
3492
3493void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003494 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003495 SWAPCHAIN_NODE *old_swapchain_state) {
3496 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003497 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003498 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003499 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003500 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3501 surface_state->AddParent(swapchain.get());
3502 surface_state->swapchain = swapchain.get();
3503 swapchain->surface = std::move(surface_state);
3504 swapchainMap[*pSwapchain] = std::move(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003505 } else {
3506 surface_state->swapchain = nullptr;
3507 }
3508 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003509 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003510 if (old_swapchain_state) {
3511 old_swapchain_state->retired = true;
3512 }
3513 return;
3514}
3515
3516void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3517 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3518 VkResult result) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003519 auto surface_state = GetShared<SURFACE_STATE>(pCreateInfo->surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003520 auto old_swapchain_state = GetSwapchainState(pCreateInfo->oldSwapchain);
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003521 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003522}
3523
3524void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3525 const VkAllocationCallbacks *pAllocator) {
3526 if (!swapchain) return;
3527 auto swapchain_data = GetSwapchainState(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003528 if (!swapchain_data) return;
John Zulauffaa7a522021-03-05 12:22:45 -07003529
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003530 swapchain_data->Destroy();
3531 swapchainMap.erase(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003532}
3533
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003534void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3535 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3536 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3537 VkResult result) {
3538 if (VK_SUCCESS != result) return;
3539 if (!pMode) return;
Jeremy Gebben5573a8c2021-06-04 08:55:10 -06003540 display_mode_map[*pMode] = std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice);
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003541}
3542
locke-lunargd556cc32019-09-17 01:21:23 -06003543void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
3544 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3545 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003546 auto semaphore_state = GetSemaphoreState(pPresentInfo->pWaitSemaphores[i]);
3547 if (semaphore_state) {
3548 semaphore_state->signaler.first = VK_NULL_HANDLE;
3549 semaphore_state->signaled = false;
locke-lunargd556cc32019-09-17 01:21:23 -06003550 }
3551 }
3552
Tony-LunarG6f887e52021-07-27 11:23:14 -06003553 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003554 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3555 // Note: this is imperfect, in that we can get confused about what did or didn't succeed-- but if the app does that, it's
3556 // confused itself just as much.
3557 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3558 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3559 // Mark the image as having been released to the WSI
3560 auto swapchain_data = GetSwapchainState(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003561 if (swapchain_data) {
3562 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003563 if (present_id_info) {
3564 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3565 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3566 }
3567 }
locke-lunargd556cc32019-09-17 01:21:23 -06003568 }
3569 }
3570 // Note: even though presentation is directed to a queue, there is no direct ordering between QP and subsequent work, so QP (and
3571 // its semaphore waits) /never/ participate in any completion proof.
3572}
3573
3574void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3575 const VkSwapchainCreateInfoKHR *pCreateInfos,
3576 const VkAllocationCallbacks *pAllocator,
3577 VkSwapchainKHR *pSwapchains, VkResult result) {
3578 if (pCreateInfos) {
3579 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003580 auto surface_state = GetShared<SURFACE_STATE>(pCreateInfos[i].surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003581 auto old_swapchain_state = GetSwapchainState(pCreateInfos[i].oldSwapchain);
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003582 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state), old_swapchain_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003583 }
3584 }
3585}
3586
3587void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3588 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003589 auto fence_state = GetFenceState(fence);
3590 if (fence_state && fence_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003591 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3592 // import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003593 fence_state->state = FENCE_INFLIGHT;
3594 fence_state->signaler.first = VK_NULL_HANDLE; // ANI isn't on a queue, so this can't participate in a completion proof.
locke-lunargd556cc32019-09-17 01:21:23 -06003595 }
3596
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003597 auto semaphore_state = GetSemaphoreState(semaphore);
3598 if (semaphore_state && semaphore_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003599 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3600 // temporary import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003601 semaphore_state->signaled = true;
3602 semaphore_state->signaler.first = VK_NULL_HANDLE;
locke-lunargd556cc32019-09-17 01:21:23 -06003603 }
3604
3605 // Mark the image as acquired.
3606 auto swapchain_data = GetSwapchainState(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003607 if (swapchain_data) {
3608 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003609 }
3610}
3611
3612void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3613 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3614 VkResult result) {
3615 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3616 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3617}
3618
3619void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3620 uint32_t *pImageIndex, VkResult result) {
3621 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3622 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3623 pAcquireInfo->fence, pImageIndex);
3624}
3625
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003626std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3627 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3628}
3629
locke-lunargd556cc32019-09-17 01:21:23 -06003630void ValidationStateTracker::PostCallRecordEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
3631 VkPhysicalDevice *pPhysicalDevices, VkResult result) {
3632 if ((NULL != pPhysicalDevices) && ((result == VK_SUCCESS || result == VK_INCOMPLETE))) {
3633 for (uint32_t i = 0; i < *pPhysicalDeviceCount; i++) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003634 physical_device_map.emplace(pPhysicalDevices[i], CreatePhysicalDeviceState(pPhysicalDevices[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06003635 }
3636 }
3637}
3638
3639// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003640static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003641 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003642}
3643
3644void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3645 uint32_t *pQueueFamilyPropertyCount,
3646 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003647 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3648 assert(pd_state);
3649 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003650}
3651
3652void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003653 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003654 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3655 assert(pd_state);
3656 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003657}
3658
3659void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003660 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003661 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3662 assert(pd_state);
3663 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003664}
3665void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3666 const VkAllocationCallbacks *pAllocator) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003667 if (!surface) return;
3668 auto surface_state = GetSurfaceState(surface);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003669 surface_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06003670 surface_map.erase(surface);
3671}
3672
3673void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003674 surface_map[*pSurface] = std::make_shared<SURFACE_STATE>(*pSurface);
locke-lunargd556cc32019-09-17 01:21:23 -06003675}
3676
3677void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3678 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3679 const VkAllocationCallbacks *pAllocator,
3680 VkSurfaceKHR *pSurface, VkResult result) {
3681 if (VK_SUCCESS != result) return;
3682 RecordVulkanSurface(pSurface);
3683}
3684
3685#ifdef VK_USE_PLATFORM_ANDROID_KHR
3686void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3687 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3688 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3689 VkResult result) {
3690 if (VK_SUCCESS != result) return;
3691 RecordVulkanSurface(pSurface);
3692}
3693#endif // VK_USE_PLATFORM_ANDROID_KHR
3694
3695#ifdef VK_USE_PLATFORM_IOS_MVK
3696void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3697 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3698 VkResult result) {
3699 if (VK_SUCCESS != result) return;
3700 RecordVulkanSurface(pSurface);
3701}
3702#endif // VK_USE_PLATFORM_IOS_MVK
3703
3704#ifdef VK_USE_PLATFORM_MACOS_MVK
3705void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3706 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3707 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3708 VkResult result) {
3709 if (VK_SUCCESS != result) return;
3710 RecordVulkanSurface(pSurface);
3711}
3712#endif // VK_USE_PLATFORM_MACOS_MVK
3713
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003714#ifdef VK_USE_PLATFORM_METAL_EXT
3715void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3716 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3717 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3718 VkResult result) {
3719 if (VK_SUCCESS != result) return;
3720 RecordVulkanSurface(pSurface);
3721}
3722#endif // VK_USE_PLATFORM_METAL_EXT
3723
locke-lunargd556cc32019-09-17 01:21:23 -06003724#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3725void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3726 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3727 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3728 VkResult result) {
3729 if (VK_SUCCESS != result) return;
3730 RecordVulkanSurface(pSurface);
3731}
3732#endif // VK_USE_PLATFORM_WAYLAND_KHR
3733
3734#ifdef VK_USE_PLATFORM_WIN32_KHR
3735void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3736 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
3737 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3738 VkResult result) {
3739 if (VK_SUCCESS != result) return;
3740 RecordVulkanSurface(pSurface);
3741}
3742#endif // VK_USE_PLATFORM_WIN32_KHR
3743
3744#ifdef VK_USE_PLATFORM_XCB_KHR
3745void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
3746 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3747 VkResult result) {
3748 if (VK_SUCCESS != result) return;
3749 RecordVulkanSurface(pSurface);
3750}
3751#endif // VK_USE_PLATFORM_XCB_KHR
3752
3753#ifdef VK_USE_PLATFORM_XLIB_KHR
3754void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
3755 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3756 VkResult result) {
3757 if (VK_SUCCESS != result) return;
3758 RecordVulkanSurface(pSurface);
3759}
3760#endif // VK_USE_PLATFORM_XLIB_KHR
3761
Niklas Haas8b84af12020-04-19 22:20:11 +02003762void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3763 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3764 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3765 VkResult result) {
3766 if (VK_SUCCESS != result) return;
3767 RecordVulkanSurface(pSurface);
3768}
3769
locke-lunargd556cc32019-09-17 01:21:23 -06003770void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3771 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3772 VkBool32 *pSupported, VkResult result) {
3773 if (VK_SUCCESS != result) return;
3774 auto surface_state = GetSurfaceState(surface);
3775 surface_state->gpu_queue_support[{physicalDevice, queueFamilyIndex}] = (*pSupported == VK_TRUE);
3776}
3777
locke-lunargd556cc32019-09-17 01:21:23 -06003778void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3779 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003780 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3781 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003782 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3783}
3784
3785void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003786 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3787 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003788 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3789}
3790
3791void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3792 const VkDebugUtilsLabelEXT *pLabelInfo) {
3793 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3794
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003795 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003796 cb_state->RecordCmd(CMD_INSERTDEBUGUTILSLABELEXT);
3797 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003798 cb_state->debug_label = LoggingLabel(pLabelInfo);
3799}
3800
3801void ValidationStateTracker::RecordEnumeratePhysicalDeviceGroupsState(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003802 uint32_t *pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties *pPhysicalDeviceGroupProperties) {
locke-lunargd556cc32019-09-17 01:21:23 -06003803 if (NULL != pPhysicalDeviceGroupProperties) {
3804 for (uint32_t i = 0; i < *pPhysicalDeviceGroupCount; i++) {
3805 for (uint32_t j = 0; j < pPhysicalDeviceGroupProperties[i].physicalDeviceCount; j++) {
3806 VkPhysicalDevice cur_phys_dev = pPhysicalDeviceGroupProperties[i].physicalDevices[j];
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003807
3808 physical_device_map.emplace(cur_phys_dev, CreatePhysicalDeviceState(cur_phys_dev));
locke-lunargd556cc32019-09-17 01:21:23 -06003809 }
3810 }
3811 }
3812}
3813
3814void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceGroups(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003815 VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties *pPhysicalDeviceGroupProperties,
locke-lunargd556cc32019-09-17 01:21:23 -06003816 VkResult result) {
3817 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3818 RecordEnumeratePhysicalDeviceGroupsState(pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
3819}
3820
3821void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceGroupsKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003822 VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties *pPhysicalDeviceGroupProperties,
locke-lunargd556cc32019-09-17 01:21:23 -06003823 VkResult result) {
3824 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3825 RecordEnumeratePhysicalDeviceGroupsState(pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
3826}
3827
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003828void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3829 uint32_t queueFamilyIndex,
3830 uint32_t *pCounterCount,
3831 VkPerformanceCounterKHR *pCounters) {
3832 if (NULL == pCounters) return;
3833
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003834 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3835 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003836
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003837 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3838 queue_family_counters->counters.resize(*pCounterCount);
3839 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003840
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003841 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003842}
3843
3844void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3845 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3846 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3847 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3848 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3849}
3850
3851void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3852 VkResult result) {
3853 if (result == VK_SUCCESS) performance_lock_acquired = true;
3854}
3855
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003856void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3857 performance_lock_acquired = false;
3858 for (auto &cmd_buffer : commandBufferMap) {
3859 cmd_buffer.second->performance_lock_released = true;
3860 }
3861}
3862
locke-lunargd556cc32019-09-17 01:21:23 -06003863void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003864 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003865 const VkAllocationCallbacks *pAllocator) {
3866 if (!descriptorUpdateTemplate) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003867 auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3868 template_state->destroyed = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003869 desc_template_map.erase(descriptorUpdateTemplate);
3870}
3871
3872void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003873 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003874 const VkAllocationCallbacks *pAllocator) {
3875 if (!descriptorUpdateTemplate) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003876 auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3877 template_state->destroyed = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003878 desc_template_map.erase(descriptorUpdateTemplate);
3879}
3880
Mike Schuchardt2df08912020-12-15 16:28:09 -08003881void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3882 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
locke-lunargd556cc32019-09-17 01:21:23 -06003883 safe_VkDescriptorUpdateTemplateCreateInfo local_create_info(pCreateInfo);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003884 auto template_state = std::make_shared<TEMPLATE_STATE>(*pDescriptorUpdateTemplate, &local_create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003885 desc_template_map[*pDescriptorUpdateTemplate] = std::move(template_state);
3886}
3887
Mike Schuchardt2df08912020-12-15 16:28:09 -08003888void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3889 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3890 const VkAllocationCallbacks *pAllocator,
3891 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3892 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003893 if (VK_SUCCESS != result) return;
3894 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3895}
3896
3897void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003898 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3899 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003900 if (VK_SUCCESS != result) return;
3901 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3902}
3903
3904void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003905 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003906 const void *pData) {
3907 auto const template_map_entry = desc_template_map.find(descriptorUpdateTemplate);
3908 if ((template_map_entry == desc_template_map.end()) || (template_map_entry->second.get() == nullptr)) {
3909 assert(0);
3910 } else {
3911 const TEMPLATE_STATE *template_state = template_map_entry->second.get();
3912 // TODO: Record template push descriptor updates
3913 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
3914 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state, pData);
3915 }
3916 }
3917}
3918
3919void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3920 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3921 const void *pData) {
3922 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3923}
3924
3925void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003926 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003927 const void *pData) {
3928 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3929}
3930
Mike Schuchardt2df08912020-12-15 16:28:09 -08003931void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3932 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3933 VkPipelineLayout layout, uint32_t set,
3934 const void *pData) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003935 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003936
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003937 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
locke-lunargd556cc32019-09-17 01:21:23 -06003938 const auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3939 if (template_state) {
3940 auto layout_data = GetPipelineLayout(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003941 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003942 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003943 // Decode the template into a set of write updates
3944 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state, pData,
3945 dsl->GetDescriptorSetLayout());
3946 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data, set,
3947 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3948 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003949 }
3950}
3951
3952void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3953 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003954 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003955 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003956 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003957 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003958 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003959 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003960 }
3961}
3962
3963void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3964 uint32_t *pPropertyCount,
3965 VkDisplayPlanePropertiesKHR *pProperties,
3966 VkResult result) {
3967 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3968 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3969}
3970
3971void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3972 uint32_t *pPropertyCount,
3973 VkDisplayPlaneProperties2KHR *pProperties,
3974 VkResult result) {
3975 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3976 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3977}
3978
3979void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3980 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3981 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003982 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003983 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003984 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003985}
3986
3987void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3988 uint32_t query, uint32_t index) {
3989 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003990 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003991 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003992 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003993}
3994
3995void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3996 VkSamplerYcbcrConversion ycbcr_conversion) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003997 VkFormatFeatureFlags format_features = 0;
3998
3999 if (create_info->format != VK_FORMAT_UNDEFINED) {
4000 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07004001 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06004002 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
4003 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06004004 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06004005
4006 samplerYcbcrConversionMap[ycbcr_conversion] =
4007 std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features);
locke-lunargd556cc32019-09-17 01:21:23 -06004008}
4009
4010void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
4011 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
4012 const VkAllocationCallbacks *pAllocator,
4013 VkSamplerYcbcrConversion *pYcbcrConversion,
4014 VkResult result) {
4015 if (VK_SUCCESS != result) return;
4016 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
4017}
4018
4019void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(VkDevice device,
4020 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
4021 const VkAllocationCallbacks *pAllocator,
4022 VkSamplerYcbcrConversion *pYcbcrConversion,
4023 VkResult result) {
4024 if (VK_SUCCESS != result) return;
4025 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
4026}
4027
sfricke-samsungbe3584f2020-04-22 14:58:06 -07004028void ValidationStateTracker::RecordDestroySamplerYcbcrConversionState(VkSamplerYcbcrConversion ycbcr_conversion) {
sfricke-samsungbe3584f2020-04-22 14:58:06 -07004029 auto ycbcr_state = GetSamplerYcbcrConversionState(ycbcr_conversion);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004030 ycbcr_state->Destroy();
sfricke-samsungbe3584f2020-04-22 14:58:06 -07004031 samplerYcbcrConversionMap.erase(ycbcr_conversion);
4032}
4033
locke-lunargd556cc32019-09-17 01:21:23 -06004034void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
4035 const VkAllocationCallbacks *pAllocator) {
4036 if (!ycbcrConversion) return;
sfricke-samsungbe3584f2020-04-22 14:58:06 -07004037 RecordDestroySamplerYcbcrConversionState(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06004038}
4039
4040void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
4041 VkSamplerYcbcrConversion ycbcrConversion,
4042 const VkAllocationCallbacks *pAllocator) {
4043 if (!ycbcrConversion) return;
sfricke-samsungbe3584f2020-04-22 14:58:06 -07004044 RecordDestroySamplerYcbcrConversionState(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06004045}
4046
Tony-LunarG977448c2019-12-02 14:52:02 -07004047void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
4048 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06004049 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07004050 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06004051
4052 // Do nothing if the query pool has been destroyed.
4053 auto query_pool_state = GetQueryPoolState(queryPool);
4054 if (!query_pool_state) return;
4055
4056 // Reset the state of existing entries.
4057 QueryObject query_obj{queryPool, 0};
4058 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
4059 for (uint32_t i = 0; i < max_query_count; ++i) {
4060 query_obj.query = firstQuery + i;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02004061 queryToStateMap[query_obj] = QUERYSTATE_RESET;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01004062 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07004063 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
4064 query_obj.perf_pass = pass_index;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02004065 queryToStateMap[query_obj] = QUERYSTATE_RESET;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01004066 }
4067 }
locke-lunargd556cc32019-09-17 01:21:23 -06004068 }
4069}
4070
Tony-LunarG977448c2019-12-02 14:52:02 -07004071void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
4072 uint32_t queryCount) {
4073 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
4074}
4075
4076void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
4077 uint32_t queryCount) {
4078 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
4079}
4080
locke-lunargd556cc32019-09-17 01:21:23 -06004081void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
4082 const TEMPLATE_STATE *template_state, const void *pData) {
4083 // Translate the templated update into a normal update for validation...
4084 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
4085 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
4086 decoded_update.desc_writes.data(), 0, NULL);
4087}
4088
4089// Update the common AllocateDescriptorSetsData
4090void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05004091 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06004092 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeff Bolz6ae39612019-10-11 20:57:36 -05004093 auto layout = GetDescriptorSetLayoutShared(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06004094 if (layout) {
4095 ds_data->layout_nodes[i] = layout;
4096 // Count total descriptors required per type
4097 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
4098 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07004099 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
4100 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06004101 }
4102 }
4103 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
4104 }
4105}
4106
4107// Decrement allocated sets from the pool and insert new sets into set_map
4108void ValidationStateTracker::PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *p_alloc_info,
4109 const VkDescriptorSet *descriptor_sets,
4110 const cvdescriptorset::AllocateDescriptorSetsData *ds_data) {
4111 auto pool_state = descriptorPoolMap[p_alloc_info->descriptorPool].get();
4112 // Account for sets and individual descriptors allocated from pool
4113 pool_state->availableSets -= p_alloc_info->descriptorSetCount;
4114 for (auto it = ds_data->required_descriptors_by_type.begin(); it != ds_data->required_descriptors_by_type.end(); ++it) {
4115 pool_state->availableDescriptorTypeCount[it->first] -= ds_data->required_descriptors_by_type.at(it->first);
4116 }
4117
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07004118 const auto *variable_count_info = LvlFindInChain<VkDescriptorSetVariableDescriptorCountAllocateInfo>(p_alloc_info->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06004119 bool variable_count_valid = variable_count_info && variable_count_info->descriptorSetCount == p_alloc_info->descriptorSetCount;
4120
4121 // Create tracking object for each descriptor set; insert into global map and the pool's set.
4122 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
4123 uint32_t variable_count = variable_count_valid ? variable_count_info->pDescriptorCounts[i] : 0;
4124
Jeff Bolz41a1ced2019-10-11 11:40:49 -05004125 auto new_ds = std::make_shared<cvdescriptorset::DescriptorSet>(descriptor_sets[i], pool_state, ds_data->layout_nodes[i],
John Zulaufd2c3dae2019-12-12 11:02:17 -07004126 variable_count, this);
locke-lunargd556cc32019-09-17 01:21:23 -06004127 pool_state->sets.insert(new_ds.get());
locke-lunargd556cc32019-09-17 01:21:23 -06004128 setMap[descriptor_sets[i]] = std::move(new_ds);
4129 }
4130}
4131
locke-lunargd556cc32019-09-17 01:21:23 -06004132void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4133 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004134 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004135 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004136}
4137
Tony-LunarG745150c2021-07-02 15:07:31 -06004138void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
4139 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
4140 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004141 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004142 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06004143}
4144
locke-lunargd556cc32019-09-17 01:21:23 -06004145void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
4146 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
4147 uint32_t firstInstance) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004148 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004149 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004150}
4151
Tony-LunarG745150c2021-07-02 15:07:31 -06004152void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
4153 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
4154 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
4155 const int32_t *pVertexOffset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004156 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004157 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06004158}
4159
locke-lunargd556cc32019-09-17 01:21:23 -06004160void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4161 uint32_t count, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004162 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06004163 BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004164 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004165 if (!disabled[command_buffer_state]) {
4166 cb_state->AddChild(buffer_state);
4167 }
locke-lunargd556cc32019-09-17 01:21:23 -06004168}
4169
4170void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
4171 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004172 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06004173 BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004174 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004175 if (!disabled[command_buffer_state]) {
4176 cb_state->AddChild(buffer_state);
4177 }
locke-lunargd556cc32019-09-17 01:21:23 -06004178}
4179
4180void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004181 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004182 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06004183}
4184
4185void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
4186 VkDeviceSize offset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004187 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004188 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004189 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004190 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004191 cb_state->AddChild(buffer_state);
4192 }
locke-lunargd556cc32019-09-17 01:21:23 -06004193}
4194
Tony-LunarG977448c2019-12-02 14:52:02 -07004195void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4196 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07004197 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004198 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004199 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004200 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004201 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4202 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004203 cb_state->AddChild(buffer_state);
4204 cb_state->AddChild(count_buffer_state);
4205 }
Tony-LunarG977448c2019-12-02 14:52:02 -07004206}
4207
locke-lunargd556cc32019-09-17 01:21:23 -06004208void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
4209 VkDeviceSize offset, VkBuffer countBuffer,
4210 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4211 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004212 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004213 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07004214}
4215
4216void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4217 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
4218 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004219 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004220 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07004221}
4222
4223void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4224 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07004225 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004226 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004227 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004228 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004229 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4230 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004231 cb_state->AddChild(buffer_state);
4232 cb_state->AddChild(count_buffer_state);
4233 }
locke-lunargd556cc32019-09-17 01:21:23 -06004234}
4235
4236void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
4237 VkDeviceSize offset, VkBuffer countBuffer,
4238 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4239 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004240 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004241 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07004242}
4243
4244void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
4245 VkDeviceSize offset, VkBuffer countBuffer,
4246 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4247 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004248 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004249 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06004250}
4251
4252void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
4253 uint32_t firstTask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004254 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004255 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004256}
4257
4258void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4259 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004260 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004261 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004262 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004263 if (!disabled[command_buffer_state] && buffer_state) {
4264 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06004265 }
4266}
4267
4268void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4269 VkDeviceSize offset, VkBuffer countBuffer,
4270 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4271 uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004272 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004273 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004274 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004275 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4276 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004277 if (buffer_state) {
4278 cb_state->AddChild(buffer_state);
4279 }
4280 if (count_buffer_state) {
4281 cb_state->AddChild(count_buffer_state);
4282 }
locke-lunargd556cc32019-09-17 01:21:23 -06004283 }
4284}
4285
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004286void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
4287 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
4288 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
4289 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
4290 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
4291 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
4292 uint32_t width, uint32_t height, uint32_t depth) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004293 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004294 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004295 cb_state->hasTraceRaysCmd = true;
4296}
4297
4298
4299void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
4300 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4301 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4302 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4303 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
4304 uint32_t height, uint32_t depth) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004305 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004306 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004307 cb_state->hasTraceRaysCmd = true;
4308}
4309
4310void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
4311 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4312 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4313 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4314 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
4315 VkDeviceAddress indirectDeviceAddress) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004316 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004317 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004318 cb_state->hasTraceRaysCmd = true;
4319}
4320
locke-lunargd556cc32019-09-17 01:21:23 -06004321void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
4322 const VkAllocationCallbacks *pAllocator,
4323 VkShaderModule *pShaderModule, VkResult result,
4324 void *csm_state_data) {
4325 if (VK_SUCCESS != result) return;
4326 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
4327
sfricke-samsung45996a42021-09-16 13:45:27 -07004328 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06004329 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05004330 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
4331 csm_state->unique_shader_id)
4332 : std::make_shared<SHADER_MODULE_STATE>();
sfricke-samsung962cad92021-04-13 00:46:29 -07004333 new_shader_module->SetPushConstantUsedInShader();
locke-lunargd556cc32019-09-17 01:21:23 -06004334 shaderModuleMap[*pShaderModule] = std::move(new_shader_module);
4335}
4336
John Zulauf22b0fbe2019-10-15 06:26:16 -06004337void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
4338 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
4339 VkResult result) {
4340 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004341 auto swapchain_state = GetShared<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004342
4343 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
4344
4345 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004346 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07004347 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07004348 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06004349
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004350 auto format_features =
4351 GetImageFormatFeatures(physical_device, device, pSwapchainImages[i], swapchain_state->image_create_info.format,
4352 swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004353
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06004354 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004355 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004356 if (!swapchain_image.fake_base_address) {
4357 auto size = image_state->fragment_encoder->TotalSize();
4358 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07004359 }
4360
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004361 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004362 swapchain_image.image_state = image_state.get();
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004363 imageMap[pSwapchainImages[i]] = std::move(image_state);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004364 }
4365 }
4366
4367 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004368 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
4369 }
4370}
sourav parmar35e7a002020-06-09 17:58:44 -07004371
sourav parmar35e7a002020-06-09 17:58:44 -07004372void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
4373 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004374 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07004375 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004376 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07004377 ACCELERATION_STRUCTURE_STATE_KHR *src_as_state = GetAccelerationStructureStateKHR(pInfo->src);
4378 ACCELERATION_STRUCTURE_STATE_KHR *dst_as_state = GetAccelerationStructureStateKHR(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07004379 if (dst_as_state != nullptr && src_as_state != nullptr) {
4380 dst_as_state->built = true;
4381 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004382 if (!disabled[command_buffer_state]) {
4383 cb_state->AddChild(dst_as_state);
4384 cb_state->AddChild(src_as_state);
4385 }
sourav parmar35e7a002020-06-09 17:58:44 -07004386 }
4387 }
4388}
Piers Daniell39842ee2020-07-10 16:42:33 -06004389
4390void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004391 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004392 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004393}
4394
4395void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004396 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004397 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004398}
4399
4400void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
4401 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004402 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004403 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004404 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06004405}
4406
4407void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4408 const VkViewport *pViewports) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004409 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004410 cb_state->RecordStateCmd(CMD_SETVIEWPORTWITHCOUNTEXT, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004411 uint32_t bits = (1u << viewportCount) - 1u;
4412 cb_state->viewportWithCountMask |= bits;
4413 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00004414 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004415 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004416
4417 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
4418 for (size_t i = 0; i < viewportCount; ++i) {
4419 cb_state->dynamicViewports[i] = pViewports[i];
4420 }
Piers Daniell39842ee2020-07-10 16:42:33 -06004421}
4422
4423void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4424 const VkRect2D *pScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004425 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004426 cb_state->RecordStateCmd(CMD_SETSCISSORWITHCOUNTEXT, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004427 uint32_t bits = (1u << scissorCount) - 1u;
4428 cb_state->scissorWithCountMask |= bits;
4429 cb_state->trashedScissorMask &= ~bits;
4430 cb_state->scissorWithCountCount = scissorCount;
4431 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06004432}
4433
4434void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4435 uint32_t bindingCount, const VkBuffer *pBuffers,
4436 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4437 const VkDeviceSize *pStrides) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004438 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004439 cb_state->RecordStateCmd(CMD_BINDVERTEXBUFFERS2EXT, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06004440
4441 uint32_t end = firstBinding + bindingCount;
4442 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
4443 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
4444 }
4445
4446 for (uint32_t i = 0; i < bindingCount; ++i) {
4447 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
locke-lunarg1ae57d62020-11-18 10:49:19 -07004448 vertex_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004449 vertex_buffer_binding.offset = pOffsets[i];
4450 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4451 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4452 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004453 if (!disabled[command_buffer_state] && pBuffers[i]) {
4454 cb_state->AddChild(vertex_buffer_binding.buffer_state.get());
Piers Daniell39842ee2020-07-10 16:42:33 -06004455 }
4456 }
4457}
4458
4459void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004460 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004461 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004462}
4463
4464void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004465 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004466 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004467}
4468
4469void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004470 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004471 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004472}
4473
4474void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4475 VkBool32 depthBoundsTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004476 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004477 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004478}
4479void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004480 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004481 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004482}
4483
4484void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4485 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4486 VkCompareOp compareOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004487 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004488 cb_state->RecordStateCmd(CMD_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004489}
locke-lunarg4189aa22020-10-21 00:23:48 -06004490
4491void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4492 uint32_t discardRectangleCount,
4493 const VkRect2D *pDiscardRectangles) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004494 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004495 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004496}
4497
4498void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4499 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004500 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004501 cb_state->RecordStateCmd(CMD_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004502}
4503
4504void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4505 VkCoarseSampleOrderTypeNV sampleOrderType,
4506 uint32_t customSampleOrderCount,
4507 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004508 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004509 cb_state->RecordStateCmd(CMD_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004510}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004511
4512void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004513 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004514 cb_state->RecordStateCmd(CMD_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004515}
4516
4517void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004518 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004519 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004520}
4521
4522void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4523 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004524 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004525 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004526}
4527
4528void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004529 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004530 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004531}
4532
4533void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4534 VkBool32 primitiveRestartEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004535 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004536 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004537}
Piers Daniell924cd832021-05-18 13:48:47 -06004538
4539void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4540 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4541 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4542 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004543 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004544 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4545
4546 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4547 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4548 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004549 if (pipeline_state->create_info.graphics.pDynamicState) {
4550 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4551 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004552 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4553 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4554 break;
4555 }
4556 }
4557 }
4558 }
4559 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004560}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004561
4562void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
4563 BUFFER_STATE *buffer_state = GetBufferState(pInfo->buffer);
4564 if (buffer_state) {
4565 // address is used for GPU-AV and ray tracing buffer validation
4566 buffer_state->deviceAddress = address;
4567 buffer_address_map_.emplace(address, buffer_state);
4568 }
4569}
4570
4571void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4572 VkDeviceAddress address) {
4573 RecordGetBufferDeviceAddress(pInfo, address);
4574}
4575
4576void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4577 VkDeviceAddress address) {
4578 RecordGetBufferDeviceAddress(pInfo, address);
4579}
4580
4581void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4582 VkDeviceAddress address) {
4583 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004584}
4585
4586std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4587 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004588 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004589}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004590
4591std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4592 const VkCommandBufferAllocateInfo *create_info,
4593 std::shared_ptr<COMMAND_POOL_STATE> &pool) {
4594 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4595}