blob: cee6b1e62b618954dc1205e3a64051fad112040d [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) {
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001317 uint32_t total_count = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001318 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
sfricke-samsung590ae1e2020-04-25 01:18:05 -07001319 const VkDeviceQueueCreateInfo &queue_create_info = pCreateInfo->pQueueCreateInfos[i];
sfricke-samsungb585ec12021-05-06 03:10:13 -07001320 state_tracker->queue_family_index_set.insert(queue_create_info.queueFamilyIndex);
1321 state_tracker->device_queue_info_list.push_back(
1322 {i, queue_create_info.queueFamilyIndex, queue_create_info.flags, queue_create_info.queueCount});
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001323 total_count += queue_create_info.queueCount;
1324 }
1325 queueMap.reserve(total_count);
1326 for (const auto &queue_info : state_tracker->device_queue_info_list) {
1327 for (uint32_t i = 0; i < queue_info.queue_count; i++) {
1328 VkQueue queue = VK_NULL_HANDLE;
1329 // vkGetDeviceQueue2() was added in vulkan 1.1, and there was never a KHR version of it.
1330 if (api_version >= VK_API_VERSION_1_1 && queue_info.flags != 0) {
1331 auto get_info = LvlInitStruct<VkDeviceQueueInfo2>();
1332 get_info.flags = queue_info.flags;
1333 get_info.queueFamilyIndex = queue_info.queue_family_index;
1334 get_info.queueIndex = i;
1335 DispatchGetDeviceQueue2(*pDevice, &get_info, &queue);
1336 } else {
1337 DispatchGetDeviceQueue(*pDevice, queue_info.queue_family_index, i, &queue);
1338 }
1339 assert(queue != VK_NULL_HANDLE);
1340 state_tracker->queueMap.emplace(queue, std::make_shared<QUEUE_STATE>(queue, queue_info.queue_family_index));
1341 }
locke-lunargd556cc32019-09-17 01:21:23 -06001342 }
1343 }
1344}
1345
1346void ValidationStateTracker::PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
1347 if (!device) return;
1348
locke-lunargd556cc32019-09-17 01:21:23 -06001349 // Reset all command buffers before destroying them, to unlink object_bindings.
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001350 for (auto &command_buffer : commandBufferMap) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06001351 command_buffer.second->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001352 }
Jeff Bolzadbfa852019-10-04 13:53:30 -05001353 pipelineMap.clear();
1354 renderPassMap.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001355 commandBufferMap.clear();
1356
1357 // This will also delete all sets in the pool & remove them from setMap
1358 DeleteDescriptorSetPools();
1359 // All sets should be removed
1360 assert(setMap.empty());
1361 descriptorSetLayoutMap.clear();
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001362 // Because swapchains are associated with Surfaces, which are at instance level,
1363 // they need to be explicitly destroyed here to avoid continued references to
1364 // the device we're destroying.
1365 for (auto &entry : swapchainMap) {
1366 entry.second->Destroy();
1367 }
1368 swapchainMap.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001369 imageViewMap.clear();
1370 imageMap.clear();
1371 bufferViewMap.clear();
1372 bufferMap.clear();
1373 // Queues persist until device is destroyed
1374 queueMap.clear();
1375}
1376
Jeff Bolz8041c5b2019-10-20 22:14:20 -05001377void ValidationStateTracker::RetireWorkOnQueue(QUEUE_STATE *pQueue, uint64_t seq) {
Jeremy Gebbencbf22862021-03-03 12:01:22 -07001378 layer_data::unordered_map<VkQueue, uint64_t> other_queue_seqs;
1379 layer_data::unordered_map<VkSemaphore, uint64_t> timeline_semaphore_counters;
locke-lunargd556cc32019-09-17 01:21:23 -06001380
1381 // Roll this queue forward, one submission at a time.
1382 while (pQueue->seq < seq) {
1383 auto &submission = pQueue->submissions.front();
1384
1385 for (auto &wait : submission.waitSemaphores) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001386 auto semaphore_state = GetSemaphoreState(wait.semaphore);
1387 if (semaphore_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001388 semaphore_state->EndUse();
locke-lunargd556cc32019-09-17 01:21:23 -06001389 }
Mike Schuchardt2df08912020-12-15 16:28:09 -08001390 if (wait.type == VK_SEMAPHORE_TYPE_TIMELINE) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001391 auto &last_counter = timeline_semaphore_counters[wait.semaphore];
1392 last_counter = std::max(last_counter, wait.payload);
Marshall Drew-Brook03847582020-11-06 15:10:45 -08001393 } else {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001394 auto &last_seq = other_queue_seqs[wait.queue];
1395 last_seq = std::max(last_seq, wait.seq);
Marshall Drew-Brook03847582020-11-06 15:10:45 -08001396 }
locke-lunargd556cc32019-09-17 01:21:23 -06001397 }
1398
Juan A. Suarez Romero9cef8852020-03-10 12:19:42 +01001399 for (auto &signal : submission.signalSemaphores) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001400 auto semaphore_state = GetSemaphoreState(signal.semaphore);
1401 if (semaphore_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001402 semaphore_state->EndUse();
Mike Schuchardt2df08912020-12-15 16:28:09 -08001403 if (semaphore_state->type == VK_SEMAPHORE_TYPE_TIMELINE && semaphore_state->payload < signal.payload) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001404 semaphore_state->payload = signal.payload;
Juan A. Suarez Romero9cef8852020-03-10 12:19:42 +01001405 }
locke-lunargd556cc32019-09-17 01:21:23 -06001406 }
1407 }
1408
1409 for (auto &semaphore : submission.externalSemaphores) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001410 auto semaphore_state = GetSemaphoreState(semaphore);
1411 if (semaphore_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001412 semaphore_state->EndUse();
locke-lunargd556cc32019-09-17 01:21:23 -06001413 }
1414 }
1415
1416 for (auto cb : submission.cbs) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06001417 auto cb_node = Get<CMD_BUFFER_STATE>(cb);
locke-lunargd556cc32019-09-17 01:21:23 -06001418 if (!cb_node) {
1419 continue;
1420 }
1421 // First perform decrement on general case bound objects
locke-lunargd556cc32019-09-17 01:21:23 -06001422 for (auto event : cb_node->writeEventsBeforeWait) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001423 auto event_node = eventMap.find(event);
1424 if (event_node != eventMap.end()) {
John Zulauf48057322020-12-02 11:59:31 -07001425 event_node->second->write_in_use--;
locke-lunargd556cc32019-09-17 01:21:23 -06001426 }
1427 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001428 QueryMap local_query_to_state_map;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02001429 VkQueryPool first_pool = VK_NULL_HANDLE;
Jeff Bolz310775c2019-10-09 00:46:33 -05001430 for (auto &function : cb_node->queryUpdates) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001431 function(nullptr, /*do_validate*/ false, first_pool, submission.perf_submit_pass, &local_query_to_state_map);
Jeff Bolz310775c2019-10-09 00:46:33 -05001432 }
1433
John Zulauf79f06582021-02-27 18:38:39 -07001434 for (const auto &query_state_pair : local_query_to_state_map) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001435 if (query_state_pair.second == QUERYSTATE_ENDED) {
1436 queryToStateMap[query_state_pair.first] = QUERYSTATE_AVAILABLE;
Jeff Bolz8041c5b2019-10-20 22:14:20 -05001437 }
locke-lunargd556cc32019-09-17 01:21:23 -06001438 }
Jeremy Gebben5570abe2021-05-16 18:35:13 -06001439 if (cb_node->createInfo.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
1440 cb_node->EndUse();
1441 }
locke-lunargd556cc32019-09-17 01:21:23 -06001442 }
1443
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001444 auto fence_state = GetFenceState(submission.fence);
1445 if (fence_state && fence_state->scope == kSyncScopeInternal) {
1446 fence_state->state = FENCE_RETIRED;
locke-lunargd556cc32019-09-17 01:21:23 -06001447 }
1448
1449 pQueue->submissions.pop_front();
1450 pQueue->seq++;
1451 }
1452
1453 // Roll other queues forward to the highest seq we saw a wait for
John Zulauf79f06582021-02-27 18:38:39 -07001454 for (const auto &qs : other_queue_seqs) {
Jeff Bolz8041c5b2019-10-20 22:14:20 -05001455 RetireWorkOnQueue(GetQueueState(qs.first), qs.second);
locke-lunargd556cc32019-09-17 01:21:23 -06001456 }
John Zulauf79f06582021-02-27 18:38:39 -07001457 for (const auto &sc : timeline_semaphore_counters) {
Marshall Drew-Brook03847582020-11-06 15:10:45 -08001458 RetireTimelineSemaphore(sc.first, sc.second);
1459 }
locke-lunargd556cc32019-09-17 01:21:23 -06001460}
1461
1462// Submit a fence to a queue, delimiting previous fences and previous untracked
1463// work by it.
1464static void SubmitFence(QUEUE_STATE *pQueue, FENCE_STATE *pFence, uint64_t submitCount) {
1465 pFence->state = FENCE_INFLIGHT;
Jeremy Gebben63f3cb02021-09-07 15:16:32 -06001466 pFence->signaler.first = pQueue->Queue();
locke-lunargd556cc32019-09-17 01:21:23 -06001467 pFence->signaler.second = pQueue->seq + pQueue->submissions.size() + submitCount;
1468}
1469
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001470uint64_t ValidationStateTracker::RecordSubmitFence(QUEUE_STATE *queue_state, VkFence fence, uint32_t submit_count) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001471 auto fence_state = GetFenceState(fence);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001472 uint64_t early_retire_seq = 0;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001473 if (fence_state) {
1474 if (fence_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06001475 // Mark fence in use
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001476 SubmitFence(queue_state, fence_state, std::max(1u, submit_count));
1477 if (!submit_count) {
locke-lunargd556cc32019-09-17 01:21:23 -06001478 // If no submissions, but just dropping a fence on the end of the queue,
1479 // record an empty submission with just the fence, so we can determine
1480 // its completion.
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001481 CB_SUBMISSION submission;
1482 submission.fence = fence;
1483 queue_state->submissions.emplace_back(std::move(submission));
locke-lunargd556cc32019-09-17 01:21:23 -06001484 }
1485 } else {
1486 // 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 -07001487 early_retire_seq = queue_state->seq + queue_state->submissions.size();
locke-lunargd556cc32019-09-17 01:21:23 -06001488 }
1489 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001490 return early_retire_seq;
1491}
1492
1493void ValidationStateTracker::RecordSubmitCommandBuffer(CB_SUBMISSION &submission, VkCommandBuffer command_buffer) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06001494 auto cb_node = Get<CMD_BUFFER_STATE>(command_buffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001495 if (cb_node) {
1496 submission.cbs.push_back(command_buffer);
John Zulauf79f06582021-02-27 18:38:39 -07001497 for (auto *secondary_cmd_buffer : cb_node->linkedCommandBuffers) {
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06001498 submission.cbs.push_back(secondary_cmd_buffer->commandBuffer());
Jeremy Gebben1ec89332021-08-05 13:51:49 -06001499 secondary_cmd_buffer->IncrementResources();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001500 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06001501 cb_node->IncrementResources();
Jeremy Gebben5570abe2021-05-16 18:35:13 -06001502 // increment use count for all bound objects including secondary cbs
1503 cb_node->BeginUse();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001504
1505 VkQueryPool first_pool = VK_NULL_HANDLE;
1506 EventToStageMap local_event_to_stage_map;
1507 QueryMap local_query_to_state_map;
1508 for (auto &function : cb_node->queryUpdates) {
1509 function(nullptr, /*do_validate*/ false, first_pool, submission.perf_submit_pass, &local_query_to_state_map);
1510 }
1511
John Zulauf79f06582021-02-27 18:38:39 -07001512 for (const auto &query_state_pair : local_query_to_state_map) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001513 queryToStateMap[query_state_pair.first] = query_state_pair.second;
1514 }
1515
John Zulauf79f06582021-02-27 18:38:39 -07001516 for (const auto &function : cb_node->eventUpdates) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001517 function(nullptr, /*do_validate*/ false, &local_event_to_stage_map);
1518 }
1519
John Zulauf79f06582021-02-27 18:38:39 -07001520 for (const auto &eventStagePair : local_event_to_stage_map) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001521 eventMap[eventStagePair.first]->stageMask = eventStagePair.second;
1522 }
1523 }
1524}
1525
1526void ValidationStateTracker::RecordSubmitWaitSemaphore(CB_SUBMISSION &submission, VkQueue queue, VkSemaphore semaphore,
1527 uint64_t value, uint64_t next_seq) {
1528 auto semaphore_state = GetSemaphoreState(semaphore);
1529 if (semaphore_state) {
1530 if (semaphore_state->scope == kSyncScopeInternal) {
1531 SEMAPHORE_WAIT wait;
1532 wait.semaphore = semaphore;
1533 wait.type = semaphore_state->type;
1534 if (semaphore_state->type == VK_SEMAPHORE_TYPE_BINARY) {
1535 if (semaphore_state->signaler.first != VK_NULL_HANDLE) {
1536 wait.queue = semaphore_state->signaler.first;
1537 wait.seq = semaphore_state->signaler.second;
1538 submission.waitSemaphores.emplace_back(std::move(wait));
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001539 semaphore_state->BeginUse();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001540 }
1541 semaphore_state->signaler.first = VK_NULL_HANDLE;
1542 semaphore_state->signaled = false;
1543 } else if (semaphore_state->payload < value) {
1544 wait.queue = queue;
1545 wait.seq = next_seq;
1546 wait.payload = value;
1547 submission.waitSemaphores.emplace_back(std::move(wait));
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001548 semaphore_state->BeginUse();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001549 }
1550 } else {
1551 submission.externalSemaphores.push_back(semaphore);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001552 semaphore_state->BeginUse();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001553 if (semaphore_state->scope == kSyncScopeExternalTemporary) {
1554 semaphore_state->scope = kSyncScopeInternal;
1555 }
1556 }
1557 }
1558}
1559
1560bool ValidationStateTracker::RecordSubmitSignalSemaphore(CB_SUBMISSION &submission, VkQueue queue, VkSemaphore semaphore,
1561 uint64_t value, uint64_t next_seq) {
1562 bool retire_early = false;
1563 auto semaphore_state = GetSemaphoreState(semaphore);
1564 if (semaphore_state) {
1565 if (semaphore_state->scope == kSyncScopeInternal) {
1566 SEMAPHORE_SIGNAL signal;
1567 signal.semaphore = semaphore;
1568 signal.seq = next_seq;
1569 if (semaphore_state->type == VK_SEMAPHORE_TYPE_BINARY) {
1570 semaphore_state->signaler.first = queue;
1571 semaphore_state->signaler.second = next_seq;
1572 semaphore_state->signaled = true;
1573 } else {
1574 signal.payload = value;
1575 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001576 semaphore_state->BeginUse();
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001577 submission.signalSemaphores.emplace_back(std::move(signal));
1578 } else {
1579 // Retire work up until this submit early, we will not see the wait that corresponds to this signal
1580 retire_early = true;
1581 }
1582 }
1583 return retire_early;
1584}
1585
1586void ValidationStateTracker::PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1587 VkFence fence, VkResult result) {
1588 if (result != VK_SUCCESS) return;
1589 auto queue_state = GetQueueState(queue);
1590
1591 uint64_t early_retire_seq = RecordSubmitFence(queue_state, fence, submitCount);
locke-lunargd556cc32019-09-17 01:21:23 -06001592
1593 // Now process each individual submit
1594 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001595 CB_SUBMISSION submission;
locke-lunargd556cc32019-09-17 01:21:23 -06001596 const VkSubmitInfo *submit = &pSubmits[submit_idx];
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001597 const uint64_t next_seq = queue_state->seq + queue_state->submissions.size() + 1;
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001598 auto *timeline_semaphore_submit = LvlFindInChain<VkTimelineSemaphoreSubmitInfo>(submit->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06001599 for (uint32_t i = 0; i < submit->waitSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001600 uint64_t value = 0;
1601 if (timeline_semaphore_submit && timeline_semaphore_submit->pWaitSemaphoreValues != nullptr &&
1602 (i < timeline_semaphore_submit->waitSemaphoreValueCount)) {
1603 value = timeline_semaphore_submit->pWaitSemaphoreValues[i];
1604 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001605 RecordSubmitWaitSemaphore(submission, queue, submit->pWaitSemaphores[i], value, next_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001606 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001607
1608 bool retire_early = false;
locke-lunargd556cc32019-09-17 01:21:23 -06001609 for (uint32_t i = 0; i < submit->signalSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001610 uint64_t value = 0;
1611 if (timeline_semaphore_submit && timeline_semaphore_submit->pSignalSemaphoreValues != nullptr &&
1612 (i < timeline_semaphore_submit->signalSemaphoreValueCount)) {
1613 value = timeline_semaphore_submit->pSignalSemaphoreValues[i];
1614 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001615 retire_early |= RecordSubmitSignalSemaphore(submission, queue, submit->pSignalSemaphores[i], value, next_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001616 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001617 if (retire_early) {
1618 early_retire_seq = std::max(early_retire_seq, next_seq);
1619 }
1620
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001621 const auto perf_submit = LvlFindInChain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001622 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02001623
locke-lunargd556cc32019-09-17 01:21:23 -06001624 for (uint32_t i = 0; i < submit->commandBufferCount; i++) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001625 RecordSubmitCommandBuffer(submission, submit->pCommandBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06001626 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001627 submission.fence = submit_idx == (submitCount - 1) ? fence : VK_NULL_HANDLE;
1628 queue_state->submissions.emplace_back(std::move(submission));
1629 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001630
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001631 if (early_retire_seq) {
1632 RetireWorkOnQueue(queue_state, early_retire_seq);
1633 }
1634}
1635
1636void ValidationStateTracker::PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1637 VkFence fence, VkResult result) {
1638 if (result != VK_SUCCESS) return;
1639 auto queue_state = GetQueueState(queue);
1640
1641 uint64_t early_retire_seq = RecordSubmitFence(queue_state, fence, submitCount);
1642
1643 // Now process each individual submit
1644 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
1645 CB_SUBMISSION submission;
1646 const VkSubmitInfo2KHR *submit = &pSubmits[submit_idx];
1647 const uint64_t next_seq = queue_state->seq + queue_state->submissions.size() + 1;
1648 for (uint32_t i = 0; i < submit->waitSemaphoreInfoCount; ++i) {
1649 const auto &sem_info = submit->pWaitSemaphoreInfos[i];
1650 RecordSubmitWaitSemaphore(submission, queue, sem_info.semaphore, sem_info.value, next_seq);
1651 }
1652 bool retire_early = false;
1653 for (uint32_t i = 0; i < submit->signalSemaphoreInfoCount; ++i) {
1654 const auto &sem_info = submit->pSignalSemaphoreInfos[i];
1655 retire_early |= RecordSubmitSignalSemaphore(submission, queue, sem_info.semaphore, sem_info.value, next_seq);
1656 }
1657 if (retire_early) {
1658 early_retire_seq = std::max(early_retire_seq, next_seq);
1659 }
1660 const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
1661 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
1662
1663 for (uint32_t i = 0; i < submit->commandBufferInfoCount; i++) {
1664 RecordSubmitCommandBuffer(submission, submit->pCommandBufferInfos[i].commandBuffer);
1665 }
1666 submission.fence = submit_idx == (submitCount - 1) ? fence : VK_NULL_HANDLE;
1667 queue_state->submissions.emplace_back(std::move(submission));
locke-lunargd556cc32019-09-17 01:21:23 -06001668 }
1669
1670 if (early_retire_seq) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001671 RetireWorkOnQueue(queue_state, early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001672 }
1673}
1674
1675void ValidationStateTracker::PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1676 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory,
1677 VkResult result) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001678 if (VK_SUCCESS != result) {
1679 return;
locke-lunargd556cc32019-09-17 01:21:23 -06001680 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001681 const auto &memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
1682 const auto &memory_heap = phys_dev_mem_props.memoryHeaps[memory_type.heapIndex];
1683 auto fake_address = fake_memory.Alloc(pAllocateInfo->allocationSize);
1684
1685 layer_data::optional<DedicatedBinding> dedicated_binding;
1686
1687 auto dedicated = LvlFindInChain<VkMemoryDedicatedAllocateInfo>(pAllocateInfo->pNext);
1688 if (dedicated) {
1689 if (dedicated->buffer) {
1690 const auto *buffer_state = GetBufferState(dedicated->buffer);
1691 assert(buffer_state);
1692 if (!buffer_state) {
1693 return;
1694 }
1695 dedicated_binding.emplace(dedicated->buffer, buffer_state->createInfo);
1696 } else if (dedicated->image) {
1697 const auto *image_state = GetImageState(dedicated->image);
1698 assert(image_state);
1699 if (!image_state) {
1700 return;
1701 }
1702 dedicated_binding.emplace(dedicated->image, image_state->createInfo);
1703 }
1704 }
1705 memObjMap[*pMemory] = std::make_shared<DEVICE_MEMORY_STATE>(*pMemory, pAllocateInfo, fake_address, memory_type, memory_heap,
ziga-lunarg9663f4f2021-09-30 17:24:01 +02001706 std::move(dedicated_binding), physical_device_count);
locke-lunargd556cc32019-09-17 01:21:23 -06001707 return;
1708}
1709
1710void ValidationStateTracker::PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory mem, const VkAllocationCallbacks *pAllocator) {
1711 if (!mem) return;
1712 DEVICE_MEMORY_STATE *mem_info = GetDevMemState(mem);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001713 if (!mem_info) return;
locke-lunargd556cc32019-09-17 01:21:23 -06001714 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001715 mem_info->Destroy();
John Zulauf79952712020-04-07 11:25:54 -06001716 fake_memory.Free(mem_info->fake_base_address);
locke-lunargd556cc32019-09-17 01:21:23 -06001717 memObjMap.erase(mem);
1718}
1719
1720void ValidationStateTracker::PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
1721 VkFence fence, VkResult result) {
1722 if (result != VK_SUCCESS) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001723 auto queue_state = GetQueueState(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06001724
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001725 uint64_t early_retire_seq = RecordSubmitFence(queue_state, fence, bindInfoCount);
locke-lunargd556cc32019-09-17 01:21:23 -06001726
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001727 for (uint32_t bind_idx = 0; bind_idx < bindInfoCount; ++bind_idx) {
1728 const VkBindSparseInfo &bind_info = pBindInfo[bind_idx];
locke-lunargd556cc32019-09-17 01:21:23 -06001729 // Track objects tied to memory
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001730 for (uint32_t j = 0; j < bind_info.bufferBindCount; j++) {
1731 for (uint32_t k = 0; k < bind_info.pBufferBinds[j].bindCount; k++) {
1732 auto sparse_binding = bind_info.pBufferBinds[j].pBinds[k];
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001733 auto buffer_state = GetBufferState(bind_info.pBufferBinds[j].buffer);
1734 auto mem_state = GetDevMemShared(sparse_binding.memory);
1735 if (buffer_state && mem_state) {
1736 buffer_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1737 }
locke-lunargd556cc32019-09-17 01:21:23 -06001738 }
1739 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001740 for (uint32_t j = 0; j < bind_info.imageOpaqueBindCount; j++) {
1741 for (uint32_t k = 0; k < bind_info.pImageOpaqueBinds[j].bindCount; k++) {
1742 auto sparse_binding = bind_info.pImageOpaqueBinds[j].pBinds[k];
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001743 auto image_state = GetImageState(bind_info.pImageOpaqueBinds[j].image);
1744 auto mem_state = GetDevMemShared(sparse_binding.memory);
1745 if (image_state && mem_state) {
1746 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1747 }
locke-lunargd556cc32019-09-17 01:21:23 -06001748 }
1749 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001750 for (uint32_t j = 0; j < bind_info.imageBindCount; j++) {
1751 for (uint32_t k = 0; k < bind_info.pImageBinds[j].bindCount; k++) {
1752 auto sparse_binding = bind_info.pImageBinds[j].pBinds[k];
locke-lunargd556cc32019-09-17 01:21:23 -06001753 // TODO: This size is broken for non-opaque bindings, need to update to comprehend full sparse binding data
1754 VkDeviceSize size = sparse_binding.extent.depth * sparse_binding.extent.height * sparse_binding.extent.width * 4;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001755 auto image_state = GetImageState(bind_info.pImageBinds[j].image);
1756 auto mem_state = GetDevMemShared(sparse_binding.memory);
1757 if (image_state && mem_state) {
1758 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, size);
1759 }
locke-lunargd556cc32019-09-17 01:21:23 -06001760 }
1761 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001762 CB_SUBMISSION submission;
1763 const uint64_t next_seq = queue_state->seq + queue_state->submissions.size() + 1;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001764 for (uint32_t i = 0; i < bind_info.waitSemaphoreCount; ++i) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001765 RecordSubmitWaitSemaphore(submission, queue, bind_info.pWaitSemaphores[i], 0, next_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001766 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001767 bool retire_early = false;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001768 for (uint32_t i = 0; i < bind_info.signalSemaphoreCount; ++i) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001769 retire_early |= RecordSubmitSignalSemaphore(submission, queue, bind_info.pSignalSemaphores[i], 0, next_seq);
1770 }
1771 // Retire work up until this submit early, we will not see the wait that corresponds to this signal
1772 if (retire_early) {
1773 early_retire_seq = std::max(early_retire_seq, queue_state->seq + queue_state->submissions.size() + 1);
locke-lunargd556cc32019-09-17 01:21:23 -06001774 }
1775
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001776 submission.fence = bind_idx == (bindInfoCount - 1) ? fence : VK_NULL_HANDLE;
1777 queue_state->submissions.emplace_back(std::move(submission));
locke-lunargd556cc32019-09-17 01:21:23 -06001778 }
1779
1780 if (early_retire_seq) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001781 RetireWorkOnQueue(queue_state, early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001782 }
1783}
1784
1785void ValidationStateTracker::PostCallRecordCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
1786 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore,
1787 VkResult result) {
1788 if (VK_SUCCESS != result) return;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001789 semaphoreMap[*pSemaphore] = std::make_shared<SEMAPHORE_STATE>(*pSemaphore, LvlFindInChain<VkSemaphoreTypeCreateInfo>(pCreateInfo->pNext));
locke-lunargd556cc32019-09-17 01:21:23 -06001790}
1791
Mike Schuchardt2df08912020-12-15 16:28:09 -08001792void ValidationStateTracker::RecordImportSemaphoreState(VkSemaphore semaphore, VkExternalSemaphoreHandleTypeFlagBits handle_type,
1793 VkSemaphoreImportFlags flags) {
locke-lunargd556cc32019-09-17 01:21:23 -06001794 SEMAPHORE_STATE *sema_node = GetSemaphoreState(semaphore);
1795 if (sema_node && sema_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08001796 if ((handle_type == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06001797 sema_node->scope == kSyncScopeInternal) {
1798 sema_node->scope = kSyncScopeExternalTemporary;
1799 } else {
1800 sema_node->scope = kSyncScopeExternalPermanent;
1801 }
1802 }
1803}
1804
Mike Schuchardt2df08912020-12-15 16:28:09 -08001805void ValidationStateTracker::PostCallRecordSignalSemaphoreKHR(VkDevice device, const VkSemaphoreSignalInfo *pSignalInfo,
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001806 VkResult result) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001807 auto *semaphore_state = GetSemaphoreState(pSignalInfo->semaphore);
1808 semaphore_state->payload = pSignalInfo->value;
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001809}
1810
locke-lunargd556cc32019-09-17 01:21:23 -06001811void ValidationStateTracker::RecordMappedMemory(VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, void **ppData) {
1812 auto mem_info = GetDevMemState(mem);
1813 if (mem_info) {
1814 mem_info->mapped_range.offset = offset;
1815 mem_info->mapped_range.size = size;
1816 mem_info->p_driver_data = *ppData;
1817 }
1818}
1819
1820void ValidationStateTracker::RetireFence(VkFence fence) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001821 auto fence_state = GetFenceState(fence);
1822 if (fence_state && fence_state->scope == kSyncScopeInternal) {
1823 if (fence_state->signaler.first != VK_NULL_HANDLE) {
locke-lunargd556cc32019-09-17 01:21:23 -06001824 // Fence signaller is a queue -- use this as proof that prior operations on that queue have completed.
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001825 RetireWorkOnQueue(GetQueueState(fence_state->signaler.first), fence_state->signaler.second);
locke-lunargd556cc32019-09-17 01:21:23 -06001826 } else {
1827 // Fence signaller is the WSI. We're not tracking what the WSI op actually /was/ in CV yet, but we need to mark
1828 // the fence as retired.
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001829 fence_state->state = FENCE_RETIRED;
locke-lunargd556cc32019-09-17 01:21:23 -06001830 }
1831 }
1832}
1833
1834void ValidationStateTracker::PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1835 VkBool32 waitAll, uint64_t timeout, VkResult result) {
1836 if (VK_SUCCESS != result) return;
1837
1838 // When we know that all fences are complete we can clean/remove their CBs
1839 if ((VK_TRUE == waitAll) || (1 == fenceCount)) {
1840 for (uint32_t i = 0; i < fenceCount; i++) {
1841 RetireFence(pFences[i]);
1842 }
1843 }
1844 // NOTE : Alternate case not handled here is when some fences have completed. In
1845 // this case for app to guarantee which fences completed it will have to call
1846 // vkGetFenceStatus() at which point we'll clean/remove their CBs if complete.
1847}
1848
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001849void ValidationStateTracker::RetireTimelineSemaphore(VkSemaphore semaphore, uint64_t until_payload) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001850 auto semaphore_state = GetSemaphoreState(semaphore);
1851 if (semaphore_state) {
Jeremy Gebben63f3cb02021-09-07 15:16:32 -06001852 for (const auto &pair : queueMap) {
1853 const auto &queue_state = pair.second;
Tony-LunarG47d5e272020-04-07 15:35:55 -06001854 uint64_t max_seq = 0;
Jeremy Gebben63f3cb02021-09-07 15:16:32 -06001855 for (const auto &submission : queue_state->submissions) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001856 for (const auto &signal_semaphore : submission.signalSemaphores) {
1857 if (signal_semaphore.semaphore == semaphore && signal_semaphore.payload <= until_payload) {
1858 if (signal_semaphore.seq > max_seq) {
1859 max_seq = signal_semaphore.seq;
Tony-LunarG47d5e272020-04-07 15:35:55 -06001860 }
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001861 }
1862 }
1863 }
Tony-LunarG47d5e272020-04-07 15:35:55 -06001864 if (max_seq) {
Jeremy Gebben63f3cb02021-09-07 15:16:32 -06001865 RetireWorkOnQueue(queue_state.get(), max_seq);
Tony-LunarG47d5e272020-04-07 15:35:55 -06001866 }
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001867 }
1868 }
1869}
1870
John Zulauff89de662020-04-13 18:57:34 -06001871void ValidationStateTracker::RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1872 VkResult result) {
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001873 if (VK_SUCCESS != result) return;
1874
1875 for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
1876 RetireTimelineSemaphore(pWaitInfo->pSemaphores[i], pWaitInfo->pValues[i]);
1877 }
1878}
1879
John Zulauff89de662020-04-13 18:57:34 -06001880void ValidationStateTracker::PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1881 VkResult result) {
1882 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1883}
1884
1885void ValidationStateTracker::PostCallRecordWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo,
1886 uint64_t timeout, VkResult result) {
1887 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1888}
1889
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001890void ValidationStateTracker::RecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1891 VkResult result) {
1892 if (VK_SUCCESS != result) return;
1893
1894 RetireTimelineSemaphore(semaphore, *pValue);
1895}
1896
1897void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1898 VkResult result) {
1899 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1900}
1901void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValueKHR(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1902 VkResult result) {
1903 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1904}
1905
locke-lunargd556cc32019-09-17 01:21:23 -06001906void ValidationStateTracker::PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
1907 if (VK_SUCCESS != result) return;
1908 RetireFence(fence);
1909}
1910
locke-lunargd556cc32019-09-17 01:21:23 -06001911void ValidationStateTracker::PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) {
1912 if (VK_SUCCESS != result) return;
1913 QUEUE_STATE *queue_state = GetQueueState(queue);
Jeff Bolz8041c5b2019-10-20 22:14:20 -05001914 RetireWorkOnQueue(queue_state, queue_state->seq + queue_state->submissions.size());
locke-lunargd556cc32019-09-17 01:21:23 -06001915}
1916
1917void ValidationStateTracker::PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) {
1918 if (VK_SUCCESS != result) return;
1919 for (auto &queue : queueMap) {
Jeremy Gebben63f3cb02021-09-07 15:16:32 -06001920 RetireWorkOnQueue(queue.second.get(), queue.second->seq + queue.second->submissions.size());
locke-lunargd556cc32019-09-17 01:21:23 -06001921 }
1922}
1923
1924void ValidationStateTracker::PreCallRecordDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
1925 if (!fence) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001926 auto fence_state = GetFenceState(fence);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001927 fence_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001928 fenceMap.erase(fence);
1929}
1930
1931void ValidationStateTracker::PreCallRecordDestroySemaphore(VkDevice device, VkSemaphore semaphore,
1932 const VkAllocationCallbacks *pAllocator) {
1933 if (!semaphore) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001934 auto semaphore_state = GetSemaphoreState(semaphore);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001935 semaphore_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001936 semaphoreMap.erase(semaphore);
1937}
1938
1939void ValidationStateTracker::PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
1940 if (!event) return;
John Zulauf48057322020-12-02 11:59:31 -07001941 EVENT_STATE *event_state = Get<EVENT_STATE>(event);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001942 event_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001943 eventMap.erase(event);
1944}
1945
1946void ValidationStateTracker::PreCallRecordDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
1947 const VkAllocationCallbacks *pAllocator) {
1948 if (!queryPool) return;
1949 QUERY_POOL_STATE *qp_state = GetQueryPoolState(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001950 qp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001951 queryPoolMap.erase(queryPool);
1952}
1953
locke-lunargd556cc32019-09-17 01:21:23 -06001954void ValidationStateTracker::UpdateBindBufferMemoryState(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
1955 BUFFER_STATE *buffer_state = GetBufferState(buffer);
1956 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001957 // Track objects tied to memory
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001958 auto mem_state = GetDevMemShared(mem);
1959 if (mem_state) {
1960 buffer_state->SetMemBinding(mem_state, memoryOffset);
1961 }
locke-lunargd556cc32019-09-17 01:21:23 -06001962 }
1963}
1964
1965void ValidationStateTracker::PostCallRecordBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
1966 VkDeviceSize memoryOffset, VkResult result) {
1967 if (VK_SUCCESS != result) return;
1968 UpdateBindBufferMemoryState(buffer, mem, memoryOffset);
1969}
1970
1971void ValidationStateTracker::PostCallRecordBindBufferMemory2(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
1978void ValidationStateTracker::PostCallRecordBindBufferMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001979 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001980 for (uint32_t i = 0; i < bindInfoCount; i++) {
1981 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1982 }
1983}
1984
Spencer Fricke6c127102020-04-16 06:25:20 -07001985void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer) {
locke-lunargd556cc32019-09-17 01:21:23 -06001986 BUFFER_STATE *buffer_state = GetBufferState(buffer);
1987 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001988 buffer_state->memory_requirements_checked = true;
1989 }
1990}
1991
1992void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1993 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001994 RecordGetBufferMemoryRequirementsState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001995}
1996
1997void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001998 const VkBufferMemoryRequirementsInfo2 *pInfo,
1999 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07002000 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002001}
2002
2003void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2KHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002004 const VkBufferMemoryRequirementsInfo2 *pInfo,
2005 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07002006 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002007}
2008
Spencer Fricke6c127102020-04-16 06:25:20 -07002009void ValidationStateTracker::RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2 *pInfo) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002010 const VkImagePlaneMemoryRequirementsInfo *plane_info =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07002011 (pInfo == nullptr) ? nullptr : LvlFindInChain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06002012 IMAGE_STATE *image_state = GetImageState(image);
2013 if (image_state) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002014 if (plane_info != nullptr) {
2015 // Multi-plane image
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002016 if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_0_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002017 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002018 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_1_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002019 image_state->memory_requirements_checked[1] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002020 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_2_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002021 image_state->memory_requirements_checked[2] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002022 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002023 } else if (!image_state->disjoint) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002024 // Single Plane image
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002025 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07002026 }
locke-lunargd556cc32019-09-17 01:21:23 -06002027 }
2028}
2029
2030void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements(VkDevice device, VkImage image,
2031 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07002032 RecordGetImageMemoryRequirementsState(image, nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06002033}
2034
2035void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
2036 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07002037 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002038}
2039
2040void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2KHR(VkDevice device,
2041 const VkImageMemoryRequirementsInfo2 *pInfo,
2042 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07002043 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002044}
2045
locke-lunargd556cc32019-09-17 01:21:23 -06002046void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements(
2047 VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
2048 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
2049 auto image_state = GetImageState(image);
2050 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06002051}
2052
2053void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2(
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::PostCallRecordGetImageSparseMemoryRequirements2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002061 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
2062 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
locke-lunargd556cc32019-09-17 01:21:23 -06002063 auto image_state = GetImageState(pInfo->image);
2064 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06002065}
2066
2067void ValidationStateTracker::PreCallRecordDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
2068 const VkAllocationCallbacks *pAllocator) {
2069 if (!shaderModule) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002070 auto shader_module_state = GetShaderModuleState(shaderModule);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002071 shader_module_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002072 shaderModuleMap.erase(shaderModule);
2073}
2074
2075void ValidationStateTracker::PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline,
2076 const VkAllocationCallbacks *pAllocator) {
2077 if (!pipeline) return;
2078 PIPELINE_STATE *pipeline_state = GetPipelineState(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06002079 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002080 pipeline_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002081 pipelineMap.erase(pipeline);
2082}
2083
2084void ValidationStateTracker::PreCallRecordDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
2085 const VkAllocationCallbacks *pAllocator) {
2086 if (!pipelineLayout) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002087 auto pipeline_layout_state = GetPipelineLayout(pipelineLayout);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002088 pipeline_layout_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002089 pipelineLayoutMap.erase(pipelineLayout);
2090}
2091
2092void ValidationStateTracker::PreCallRecordDestroySampler(VkDevice device, VkSampler sampler,
2093 const VkAllocationCallbacks *pAllocator) {
2094 if (!sampler) return;
2095 SAMPLER_STATE *sampler_state = GetSamplerState(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06002096 // Any bound cmd buffers are now invalid
2097 if (sampler_state) {
Yuly Novikov424cdd52020-05-26 16:45:12 -04002098 if (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
2099 sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
2100 custom_border_color_sampler_count--;
2101 }
2102
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002103 sampler_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002104 }
2105 samplerMap.erase(sampler);
2106}
2107
2108void ValidationStateTracker::PreCallRecordDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
2109 const VkAllocationCallbacks *pAllocator) {
2110 if (!descriptorSetLayout) return;
2111 auto layout_it = descriptorSetLayoutMap.find(descriptorSetLayout);
2112 if (layout_it != descriptorSetLayoutMap.end()) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002113 layout_it->second.get()->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002114 descriptorSetLayoutMap.erase(layout_it);
2115 }
2116}
2117
2118void ValidationStateTracker::PreCallRecordDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
2119 const VkAllocationCallbacks *pAllocator) {
2120 if (!descriptorPool) return;
2121 DESCRIPTOR_POOL_STATE *desc_pool_state = GetDescriptorPoolState(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06002122 if (desc_pool_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002123 // Free sets that were in this pool
John Zulauf79f06582021-02-27 18:38:39 -07002124 for (auto *ds : desc_pool_state->sets) {
locke-lunargd556cc32019-09-17 01:21:23 -06002125 FreeDescriptorSet(ds);
2126 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002127 desc_pool_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002128 descriptorPoolMap.erase(descriptorPool);
2129 }
2130}
2131
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002132// 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 -06002133void ValidationStateTracker::FreeCommandBufferStates(COMMAND_POOL_STATE *pool_state, const uint32_t command_buffer_count,
2134 const VkCommandBuffer *command_buffers) {
2135 for (uint32_t i = 0; i < command_buffer_count; i++) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002136 auto cb_state = Get<CMD_BUFFER_STATE>(command_buffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002137 // Remove references to command buffer's state and delete
2138 if (cb_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002139 cb_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002140 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002141 // Remove CBState from CB map
2142 pool_state->commandBuffers.erase(command_buffers[i]);
2143 commandBufferMap.erase(command_buffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002144 }
2145}
2146
2147void ValidationStateTracker::PreCallRecordFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
2148 uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002149 auto pool = GetCommandPoolState(commandPool);
2150 FreeCommandBufferStates(pool, commandBufferCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06002151}
2152
2153void ValidationStateTracker::PostCallRecordCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
2154 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool,
2155 VkResult result) {
2156 if (VK_SUCCESS != result) return;
Jeremy Gebben383b9a32021-09-08 16:31:33 -06002157 auto queue_flags = physical_device_state->queue_family_properties[pCreateInfo->queueFamilyIndex].queueFlags;
Jeremy Gebben159b3cc2021-06-03 09:09:03 -06002158 commandPoolMap[*pCommandPool] = std::make_shared<COMMAND_POOL_STATE>(*pCommandPool, pCreateInfo, queue_flags);
locke-lunargd556cc32019-09-17 01:21:23 -06002159}
2160
2161void ValidationStateTracker::PostCallRecordCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
2162 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool,
2163 VkResult result) {
2164 if (VK_SUCCESS != result) return;
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06002165
2166 uint32_t index_count = 0, n_perf_pass = 0;
2167 bool has_cb = false, has_rb = false;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002168 if (pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07002169 const auto *perf = LvlFindInChain<VkQueryPoolPerformanceCreateInfoKHR>(pCreateInfo->pNext);
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06002170 index_count = perf->counterIndexCount;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002171
Mark Lobodzinski7e948e42020-09-09 10:23:36 -06002172 const QUEUE_FAMILY_PERF_COUNTERS &counters = *physical_device_state->perf_counters[perf->queueFamilyIndex];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002173 for (uint32_t i = 0; i < perf->counterIndexCount; i++) {
2174 const auto &counter = counters.counters[perf->pCounterIndices[i]];
2175 switch (counter.scope) {
2176 case VK_QUERY_SCOPE_COMMAND_BUFFER_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06002177 has_cb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002178 break;
2179 case VK_QUERY_SCOPE_RENDER_PASS_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06002180 has_rb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002181 break;
2182 default:
2183 break;
2184 }
2185 }
2186
Jeremy Gebben383b9a32021-09-08 16:31:33 -06002187 DispatchGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physical_device_state->PhysDev(), perf, &n_perf_pass);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002188 }
2189
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06002190 queryPoolMap[*pQueryPool] =
2191 std::make_shared<QUERY_POOL_STATE>(*pQueryPool, pCreateInfo, index_count, n_perf_pass, has_cb, has_rb);
locke-lunargd556cc32019-09-17 01:21:23 -06002192
2193 QueryObject query_obj{*pQueryPool, 0u};
2194 for (uint32_t i = 0; i < pCreateInfo->queryCount; ++i) {
2195 query_obj.query = i;
2196 queryToStateMap[query_obj] = QUERYSTATE_UNKNOWN;
2197 }
2198}
2199
2200void ValidationStateTracker::PreCallRecordDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
2201 const VkAllocationCallbacks *pAllocator) {
2202 if (!commandPool) return;
2203 COMMAND_POOL_STATE *cp_state = GetCommandPoolState(commandPool);
2204 // Remove cmdpool from cmdpoolmap, after freeing layer data for the command buffers
2205 // "When a pool is destroyed, all command buffers allocated from the pool are freed."
2206 if (cp_state) {
2207 // Create a vector, as FreeCommandBufferStates deletes from cp_state->commandBuffers during iteration.
2208 std::vector<VkCommandBuffer> cb_vec{cp_state->commandBuffers.begin(), cp_state->commandBuffers.end()};
2209 FreeCommandBufferStates(cp_state, static_cast<uint32_t>(cb_vec.size()), cb_vec.data());
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002210 cp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002211 commandPoolMap.erase(commandPool);
2212 }
2213}
2214
2215void ValidationStateTracker::PostCallRecordResetCommandPool(VkDevice device, VkCommandPool commandPool,
2216 VkCommandPoolResetFlags flags, VkResult result) {
2217 if (VK_SUCCESS != result) return;
2218 // Reset all of the CBs allocated from this pool
2219 auto command_pool_state = GetCommandPoolState(commandPool);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002220 for (auto cmd_buffer : command_pool_state->commandBuffers) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002221 auto cb_state = Get<CMD_BUFFER_STATE>(cmd_buffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002222 cb_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002223 }
2224}
2225
2226void ValidationStateTracker::PostCallRecordResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
2227 VkResult result) {
2228 for (uint32_t i = 0; i < fenceCount; ++i) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002229 auto fence_state = GetFenceState(pFences[i]);
2230 if (fence_state) {
2231 if (fence_state->scope == kSyncScopeInternal) {
2232 fence_state->state = FENCE_UNSIGNALED;
2233 } else if (fence_state->scope == kSyncScopeExternalTemporary) {
2234 fence_state->scope = kSyncScopeInternal;
locke-lunargd556cc32019-09-17 01:21:23 -06002235 }
2236 }
2237 }
2238}
2239
locke-lunargd556cc32019-09-17 01:21:23 -06002240void ValidationStateTracker::PreCallRecordDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
2241 const VkAllocationCallbacks *pAllocator) {
2242 if (!framebuffer) return;
2243 FRAMEBUFFER_STATE *framebuffer_state = GetFramebufferState(framebuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002244 framebuffer_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002245 frameBufferMap.erase(framebuffer);
2246}
2247
2248void ValidationStateTracker::PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
2249 const VkAllocationCallbacks *pAllocator) {
2250 if (!renderPass) return;
2251 RENDER_PASS_STATE *rp_state = GetRenderPassState(renderPass);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002252 rp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002253 renderPassMap.erase(renderPass);
2254}
2255
2256void ValidationStateTracker::PostCallRecordCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2257 const VkAllocationCallbacks *pAllocator, VkFence *pFence, VkResult result) {
2258 if (VK_SUCCESS != result) return;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002259 fenceMap[*pFence] = std::make_shared<FENCE_STATE>(*pFence, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002260}
2261
2262bool ValidationStateTracker::PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2263 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2264 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002265 void *cgpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002266 // Set up the state that CoreChecks, gpu_validation and later StateTracker Record will use.
2267 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2268 cgpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2269 cgpl_state->pipe_state.reserve(count);
2270 for (uint32_t i = 0; i < count; i++) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002271 cgpl_state->pipe_state.push_back(std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i],
2272 GetRenderPassShared(pCreateInfos[i].renderPass),
2273 GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002274 }
2275 return false;
2276}
2277
2278void ValidationStateTracker::PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2279 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2280 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2281 VkResult result, void *cgpl_state_data) {
2282 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2283 // This API may create pipelines regardless of the return value
2284 for (uint32_t i = 0; i < count; i++) {
2285 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002286 (cgpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002287 pipelineMap[pPipelines[i]] = std::move((cgpl_state->pipe_state)[i]);
2288 }
2289 }
2290 cgpl_state->pipe_state.clear();
2291}
2292
2293bool ValidationStateTracker::PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2294 const VkComputePipelineCreateInfo *pCreateInfos,
2295 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002296 void *ccpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002297 auto *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2298 ccpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2299 ccpl_state->pipe_state.reserve(count);
2300 for (uint32_t i = 0; i < count; i++) {
2301 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002302 ccpl_state->pipe_state.push_back(
2303 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002304 }
2305 return false;
2306}
2307
2308void ValidationStateTracker::PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2309 const VkComputePipelineCreateInfo *pCreateInfos,
2310 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2311 VkResult result, void *ccpl_state_data) {
2312 create_compute_pipeline_api_state *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2313
2314 // This API may create pipelines regardless of the return value
2315 for (uint32_t i = 0; i < count; i++) {
2316 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002317 (ccpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002318 pipelineMap[pPipelines[i]] = std::move((ccpl_state->pipe_state)[i]);
2319 }
2320 }
2321 ccpl_state->pipe_state.clear();
2322}
2323
2324bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache,
2325 uint32_t count,
2326 const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2327 const VkAllocationCallbacks *pAllocator,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002328 VkPipeline *pPipelines, void *crtpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002329 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2330 crtpl_state->pipe_state.reserve(count);
2331 for (uint32_t i = 0; i < count; i++) {
2332 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002333 crtpl_state->pipe_state.push_back(
2334 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002335 }
2336 return false;
2337}
2338
2339void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesNV(
2340 VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2341 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines, VkResult result, void *crtpl_state_data) {
2342 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2343 // This API may create pipelines regardless of the return value
2344 for (uint32_t i = 0; i < count; i++) {
2345 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002346 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002347 pipelineMap[pPipelines[i]] = std::move((crtpl_state->pipe_state)[i]);
2348 }
2349 }
2350 crtpl_state->pipe_state.clear();
2351}
2352
sourav parmarcd5fb182020-07-17 12:58:44 -07002353bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2354 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002355 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2356 const VkAllocationCallbacks *pAllocator,
2357 VkPipeline *pPipelines, void *crtpl_state_data) const {
2358 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
2359 crtpl_state->pipe_state.reserve(count);
2360 for (uint32_t i = 0; i < count; i++) {
2361 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002362 crtpl_state->pipe_state.push_back(
2363 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002364 }
2365 return false;
2366}
2367
sourav parmarcd5fb182020-07-17 12:58:44 -07002368void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2369 VkPipelineCache pipelineCache, uint32_t count,
2370 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2371 const VkAllocationCallbacks *pAllocator,
2372 VkPipeline *pPipelines, VkResult result,
2373 void *crtpl_state_data) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002374 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
2375 // This API may create pipelines regardless of the return value
2376 for (uint32_t i = 0; i < count; i++) {
2377 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002378 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002379 pipelineMap[pPipelines[i]] = std::move((crtpl_state->pipe_state)[i]);
2380 }
2381 }
2382 crtpl_state->pipe_state.clear();
2383}
2384
locke-lunargd556cc32019-09-17 01:21:23 -06002385void ValidationStateTracker::PostCallRecordCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2386 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler,
2387 VkResult result) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002388 samplerMap[*pSampler] = std::make_shared<SAMPLER_STATE>(pSampler, pCreateInfo);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002389 if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
2390 pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
Tony-LunarG7337b312020-04-15 16:40:25 -06002391 custom_border_color_sampler_count++;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002392 }
locke-lunargd556cc32019-09-17 01:21:23 -06002393}
2394
2395void ValidationStateTracker::PostCallRecordCreateDescriptorSetLayout(VkDevice device,
2396 const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2397 const VkAllocationCallbacks *pAllocator,
2398 VkDescriptorSetLayout *pSetLayout, VkResult result) {
2399 if (VK_SUCCESS != result) return;
2400 descriptorSetLayoutMap[*pSetLayout] = std::make_shared<cvdescriptorset::DescriptorSetLayout>(pCreateInfo, *pSetLayout);
2401}
2402
locke-lunargd556cc32019-09-17 01:21:23 -06002403void ValidationStateTracker::PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
2404 const VkAllocationCallbacks *pAllocator,
2405 VkPipelineLayout *pPipelineLayout, VkResult result) {
2406 if (VK_SUCCESS != result) return;
2407
Jeremy Gebbene6e45542021-08-05 16:39:49 -06002408 pipelineLayoutMap[*pPipelineLayout] = std::make_shared<PIPELINE_LAYOUT_STATE>(this, *pPipelineLayout, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002409}
2410
2411void ValidationStateTracker::PostCallRecordCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
2412 const VkAllocationCallbacks *pAllocator,
2413 VkDescriptorPool *pDescriptorPool, VkResult result) {
2414 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002415 descriptorPoolMap[*pDescriptorPool] = std::make_shared<DESCRIPTOR_POOL_STATE>(*pDescriptorPool, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002416}
2417
2418void ValidationStateTracker::PostCallRecordResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
2419 VkDescriptorPoolResetFlags flags, VkResult result) {
2420 if (VK_SUCCESS != result) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002421 DESCRIPTOR_POOL_STATE *pool = GetDescriptorPoolState(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06002422 // TODO: validate flags
2423 // For every set off of this pool, clear it, remove from setMap, and free cvdescriptorset::DescriptorSet
John Zulauf79f06582021-02-27 18:38:39 -07002424 for (auto *ds : pool->sets) {
locke-lunargd556cc32019-09-17 01:21:23 -06002425 FreeDescriptorSet(ds);
2426 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002427 pool->sets.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06002428 // Reset available count for each type and available sets for this pool
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002429 for (auto it = pool->availableDescriptorTypeCount.begin(); it != pool->availableDescriptorTypeCount.end(); ++it) {
2430 pool->availableDescriptorTypeCount[it->first] = pool->maxDescriptorTypeCount[it->first];
locke-lunargd556cc32019-09-17 01:21:23 -06002431 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002432 pool->availableSets = pool->maxSets;
locke-lunargd556cc32019-09-17 01:21:23 -06002433}
2434
2435bool ValidationStateTracker::PreCallValidateAllocateDescriptorSets(VkDevice device,
2436 const VkDescriptorSetAllocateInfo *pAllocateInfo,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002437 VkDescriptorSet *pDescriptorSets, void *ads_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002438 // Always update common data
2439 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2440 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2441 UpdateAllocateDescriptorSetsData(pAllocateInfo, ads_state);
2442
2443 return false;
2444}
2445
2446// Allocation state was good and call down chain was made so update state based on allocating descriptor sets
2447void ValidationStateTracker::PostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
2448 VkDescriptorSet *pDescriptorSets, VkResult result,
2449 void *ads_state_data) {
2450 if (VK_SUCCESS != result) return;
2451 // All the updates are contained in a single cvdescriptorset function
2452 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2453 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2454 PerformAllocateDescriptorSets(pAllocateInfo, pDescriptorSets, ads_state);
2455}
2456
2457void ValidationStateTracker::PreCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count,
2458 const VkDescriptorSet *pDescriptorSets) {
2459 DESCRIPTOR_POOL_STATE *pool_state = GetDescriptorPoolState(descriptorPool);
2460 // Update available descriptor sets in pool
2461 pool_state->availableSets += count;
2462
2463 // For each freed descriptor add its resources back into the pool as available and remove from pool and setMap
2464 for (uint32_t i = 0; i < count; ++i) {
2465 if (pDescriptorSets[i] != VK_NULL_HANDLE) {
2466 auto descriptor_set = setMap[pDescriptorSets[i]].get();
2467 uint32_t type_index = 0, descriptor_count = 0;
2468 for (uint32_t j = 0; j < descriptor_set->GetBindingCount(); ++j) {
2469 type_index = static_cast<uint32_t>(descriptor_set->GetTypeFromIndex(j));
2470 descriptor_count = descriptor_set->GetDescriptorCountFromIndex(j);
2471 pool_state->availableDescriptorTypeCount[type_index] += descriptor_count;
2472 }
2473 FreeDescriptorSet(descriptor_set);
2474 pool_state->sets.erase(descriptor_set);
2475 }
2476 }
2477}
2478
2479void ValidationStateTracker::PreCallRecordUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
2480 const VkWriteDescriptorSet *pDescriptorWrites,
2481 uint32_t descriptorCopyCount,
2482 const VkCopyDescriptorSet *pDescriptorCopies) {
2483 cvdescriptorset::PerformUpdateDescriptorSets(this, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
2484 pDescriptorCopies);
2485}
2486
2487void ValidationStateTracker::PostCallRecordAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo,
2488 VkCommandBuffer *pCommandBuffer, VkResult result) {
2489 if (VK_SUCCESS != result) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002490 auto pool = GetCommandPoolShared(pCreateInfo->commandPool);
2491 if (pool) {
locke-lunargd556cc32019-09-17 01:21:23 -06002492 for (uint32_t i = 0; i < pCreateInfo->commandBufferCount; i++) {
2493 // Add command buffer to its commandPool map
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002494 pool->commandBuffers.insert(pCommandBuffer[i]);
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002495 commandBufferMap[pCommandBuffer[i]] = CreateCmdBufferState(pCommandBuffer[i], pCreateInfo, pool);
locke-lunargfc78e932020-11-19 17:06:24 -07002496 }
2497 }
2498}
2499
locke-lunargd556cc32019-09-17 01:21:23 -06002500void ValidationStateTracker::PreCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer,
2501 const VkCommandBufferBeginInfo *pBeginInfo) {
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;
locke-lunargfc78e932020-11-19 17:06:24 -07002504
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002505 cb_state->Begin(pBeginInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002506}
2507
2508void ValidationStateTracker::PostCallRecordEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002509 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002510 if (!cb_state) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002511
2512 cb_state->End(result);
locke-lunargd556cc32019-09-17 01:21:23 -06002513}
2514
2515void ValidationStateTracker::PostCallRecordResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags,
2516 VkResult result) {
2517 if (VK_SUCCESS == result) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002518 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002519 cb_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002520 }
2521}
2522
2523CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) {
2524 // initially assume everything is static state
2525 CBStatusFlags flags = CBSTATUS_ALL_STATE_SET;
2526
2527 if (ds) {
2528 for (uint32_t i = 0; i < ds->dynamicStateCount; i++) {
locke-lunarg4189aa22020-10-21 00:23:48 -06002529 flags &= ~ConvertToCBStatusFlagBits(ds->pDynamicStates[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002530 }
2531 }
locke-lunargd556cc32019-09-17 01:21:23 -06002532 return flags;
2533}
2534
2535// Validation cache:
2536// CV is the bottommost implementor of this extension. Don't pass calls down.
locke-lunargd556cc32019-09-17 01:21:23 -06002537
2538void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2539 VkPipeline pipeline) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002540 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002541 assert(cb_state);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002542 cb_state->RecordCmd(CMD_BINDPIPELINE);
locke-lunargd556cc32019-09-17 01:21:23 -06002543
2544 auto pipe_state = GetPipelineState(pipeline);
2545 if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002546 const auto &create_info = pipe_state->create_info.graphics;
2547 bool rasterization_enabled = VK_FALSE == create_info.pRasterizationState->rasterizerDiscardEnable;
2548 const auto *viewport_state = create_info.pViewportState;
2549 const auto *dynamic_state = create_info.pDynamicState;
locke-lunargd556cc32019-09-17 01:21:23 -06002550 cb_state->status &= ~cb_state->static_status;
Jeremy Gebben11af9792021-08-20 10:20:09 -06002551 cb_state->static_status = MakeStaticStateMask(dynamic_state->ptr());
locke-lunargd556cc32019-09-17 01:21:23 -06002552 cb_state->status |= cb_state->static_status;
locke-lunarg4189aa22020-10-21 00:23:48 -06002553 cb_state->dynamic_status = CBSTATUS_ALL_STATE_SET & (~cb_state->static_status);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002554
2555 // Used to calculate CMD_BUFFER_STATE::usedViewportScissorCount upon draw command with this graphics pipeline.
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002556 // If rasterization disabled (no viewport/scissors used), or the actual number of viewports/scissors is dynamic (unknown at
2557 // this time), then these are set to 0 to disable this checking.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002558 auto has_dynamic_viewport_count = cb_state->dynamic_status & CBSTATUS_VIEWPORT_WITH_COUNT_SET;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002559 auto has_dynamic_scissor_count = cb_state->dynamic_status & CBSTATUS_SCISSOR_WITH_COUNT_SET;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002560 cb_state->pipelineStaticViewportCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002561 has_dynamic_viewport_count || !rasterization_enabled ? 0 : viewport_state->viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002562 cb_state->pipelineStaticScissorCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002563 has_dynamic_scissor_count || !rasterization_enabled ? 0 : viewport_state->scissorCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002564
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002565 // Trash dynamic viewport/scissor state if pipeline defines static state and enabled rasterization.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002566 // akeley98 NOTE: There's a bit of an ambiguity in the spec, whether binding such a pipeline overwrites
2567 // the entire viewport (scissor) array, or only the subsection defined by the viewport (scissor) count.
2568 // I am taking the latter interpretation based on the implementation details of NVIDIA's Vulkan driver.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002569 if (!has_dynamic_viewport_count) {
2570 cb_state->trashedViewportCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002571 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_VIEWPORT_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002572 cb_state->trashedViewportMask |= (uint32_t(1) << viewport_state->viewportCount) - 1u;
2573 // should become = ~uint32_t(0) if the other interpretation is correct.
2574 }
2575 }
2576 if (!has_dynamic_scissor_count) {
2577 cb_state->trashedScissorCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002578 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_SCISSOR_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002579 cb_state->trashedScissorMask |= (uint32_t(1) << viewport_state->scissorCount) - 1u;
2580 // should become = ~uint32_t(0) if the other interpretation is correct.
2581 }
2582 }
locke-lunargd556cc32019-09-17 01:21:23 -06002583 }
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002584 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
2585 cb_state->lastBound[lv_bind_point].pipeline_state = pipe_state;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002586 if (!disabled[command_buffer_state]) {
2587 cb_state->AddChild(pipe_state);
2588 }
locke-lunargb8be8222020-10-20 00:34:37 -06002589 for (auto &slot : pipe_state->active_slots) {
2590 for (auto &req : slot.second) {
2591 for (auto &sampler : req.second.samplers_used_by_image) {
2592 for (auto &des : sampler) {
2593 des.second = nullptr;
2594 }
2595 }
2596 }
2597 }
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06002598 cb_state->lastBound[lv_bind_point].UpdateSamplerDescriptorsUsedByImage();
locke-lunargd556cc32019-09-17 01:21:23 -06002599}
2600
2601void ValidationStateTracker::PreCallRecordCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2602 uint32_t viewportCount, const VkViewport *pViewports) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002603 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002604 cb_state->RecordStateCmd(CMD_SETVIEWPORT, CBSTATUS_VIEWPORT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002605 uint32_t bits = ((1u << viewportCount) - 1u) << firstViewport;
2606 cb_state->viewportMask |= bits;
2607 cb_state->trashedViewportMask &= ~bits;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002608
2609 cb_state->dynamicViewports.resize(std::max(size_t(firstViewport + viewportCount), cb_state->dynamicViewports.size()));
2610 for (size_t i = 0; i < viewportCount; ++i) {
2611 cb_state->dynamicViewports[firstViewport + i] = pViewports[i];
2612 }
locke-lunargd556cc32019-09-17 01:21:23 -06002613}
2614
2615void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
2616 uint32_t exclusiveScissorCount,
2617 const VkRect2D *pExclusiveScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002618 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002619 cb_state->RecordStateCmd(CMD_SETEXCLUSIVESCISSORNV, CBSTATUS_EXCLUSIVE_SCISSOR_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002620 // TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
2621 // cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
locke-lunargd556cc32019-09-17 01:21:23 -06002622}
2623
2624void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
2625 VkImageLayout imageLayout) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002626 if (disabled[command_buffer_state]) return;
2627
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002628 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002629 cb_state->RecordCmd(CMD_BINDSHADINGRATEIMAGENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002630
2631 if (imageView != VK_NULL_HANDLE) {
2632 auto view_state = GetImageViewState(imageView);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002633 cb_state->AddChild(view_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002634 }
2635}
2636
2637void ValidationStateTracker::PreCallRecordCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2638 uint32_t viewportCount,
2639 const VkShadingRatePaletteNV *pShadingRatePalettes) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002640 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002641 cb_state->RecordStateCmd(CMD_SETVIEWPORTSHADINGRATEPALETTENV, CBSTATUS_SHADING_RATE_PALETTE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002642 // TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
2643 // cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
locke-lunargd556cc32019-09-17 01:21:23 -06002644}
2645
2646void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
2647 const VkAccelerationStructureCreateInfoNV *pCreateInfo,
2648 const VkAllocationCallbacks *pAllocator,
2649 VkAccelerationStructureNV *pAccelerationStructure,
2650 VkResult result) {
2651 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002652 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002653
2654 // Query the requirements in case the application doesn't (to avoid bind/validation time query)
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002655 auto as_memory_requirements_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002656 as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002657 as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002658 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &as_memory_requirements_info, &as_state->memory_requirements);
2659
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002660 auto scratch_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002661 scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002662 scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002663 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &scratch_memory_req_info,
2664 &as_state->build_scratch_memory_requirements);
2665
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002666 auto update_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002667 update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002668 update_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002669 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
2670 &as_state->update_scratch_memory_requirements);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002671 as_state->allocator = pAllocator;
locke-lunargd556cc32019-09-17 01:21:23 -06002672 accelerationStructureMap[*pAccelerationStructure] = std::move(as_state);
2673}
2674
Jeff Bolz95176d02020-04-01 00:36:16 -05002675void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
2676 const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
2677 const VkAllocationCallbacks *pAllocator,
2678 VkAccelerationStructureKHR *pAccelerationStructure,
2679 VkResult result) {
2680 if (VK_SUCCESS != result) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002681 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE_KHR>(*pAccelerationStructure, pCreateInfo);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002682 as_state->allocator = pAllocator;
sourav parmarcd5fb182020-07-17 12:58:44 -07002683 accelerationStructureMap_khr[*pAccelerationStructure] = std::move(as_state);
Jeff Bolz95176d02020-04-01 00:36:16 -05002684}
2685
sourav parmarcd5fb182020-07-17 12:58:44 -07002686void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresKHR(
2687 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2688 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002689 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002690 if (cb_state == nullptr) {
2691 return;
2692 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002693 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002694 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002695 auto *dst_as_state = GetAccelerationStructureStateKHR(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002696 if (dst_as_state != nullptr) {
2697 dst_as_state->built = true;
2698 dst_as_state->build_info_khr.initialize(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002699 if (!disabled[command_buffer_state]) {
2700 cb_state->AddChild(dst_as_state);
2701 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002702 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002703 if (!disabled[command_buffer_state]) {
2704 auto *src_as_state = GetAccelerationStructureStateKHR(pInfos[i].srcAccelerationStructure);
2705 if (src_as_state != nullptr) {
2706 cb_state->AddChild(src_as_state);
2707 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002708 }
2709 }
2710 cb_state->hasBuildAccelerationStructureCmd = true;
2711}
2712
2713void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresIndirectKHR(
2714 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2715 const VkDeviceAddress *pIndirectDeviceAddresses, const uint32_t *pIndirectStrides,
2716 const uint32_t *const *ppMaxPrimitiveCounts) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002717 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002718 if (cb_state == nullptr) {
2719 return;
2720 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002721 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESINDIRECTKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002722 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002723 auto *dst_as_state = GetAccelerationStructureStateKHR(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002724 if (dst_as_state != nullptr) {
2725 dst_as_state->built = true;
2726 dst_as_state->build_info_khr.initialize(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002727 if (!disabled[command_buffer_state]) {
2728 cb_state->AddChild(dst_as_state);
2729 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002730 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002731 if (!disabled[command_buffer_state]) {
2732 auto *src_as_state = GetAccelerationStructureStateKHR(pInfos[i].srcAccelerationStructure);
2733 if (src_as_state != nullptr) {
2734 cb_state->AddChild(src_as_state);
2735 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002736 }
2737 }
2738 cb_state->hasBuildAccelerationStructureCmd = true;
2739}
locke-lunargd556cc32019-09-17 01:21:23 -06002740void ValidationStateTracker::PostCallRecordGetAccelerationStructureMemoryRequirementsNV(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002741 VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV *pInfo, VkMemoryRequirements2 *pMemoryRequirements) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002742 ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureStateNV(pInfo->accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002743 if (as_state != nullptr) {
2744 if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV) {
2745 as_state->memory_requirements = *pMemoryRequirements;
2746 as_state->memory_requirements_checked = true;
2747 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV) {
2748 as_state->build_scratch_memory_requirements = *pMemoryRequirements;
2749 as_state->build_scratch_memory_requirements_checked = true;
2750 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV) {
2751 as_state->update_scratch_memory_requirements = *pMemoryRequirements;
2752 as_state->update_scratch_memory_requirements_checked = true;
2753 }
2754 }
2755}
2756
sourav parmarcd5fb182020-07-17 12:58:44 -07002757void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
2758 VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002759 if (VK_SUCCESS != result) return;
2760 for (uint32_t i = 0; i < bindInfoCount; i++) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002761 const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
locke-lunargd556cc32019-09-17 01:21:23 -06002762
sourav parmarcd5fb182020-07-17 12:58:44 -07002763 ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureStateNV(info.accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002764 if (as_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002765 // Track objects tied to memory
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002766 auto mem_state = GetDevMemShared(info.memory);
2767 if (mem_state) {
2768 as_state->SetMemBinding(mem_state, info.memoryOffset);
2769 }
locke-lunargd556cc32019-09-17 01:21:23 -06002770
2771 // GPU validation of top level acceleration structure building needs acceleration structure handles.
Jeff Bolz95176d02020-04-01 00:36:16 -05002772 // XXX TODO: Query device address for KHR extension
sourav parmarcd5fb182020-07-17 12:58:44 -07002773 if (enabled[gpu_validation]) {
locke-lunargd556cc32019-09-17 01:21:23 -06002774 DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
2775 }
2776 }
2777 }
2778}
2779
2780void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
2781 VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
2782 VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002783 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002784 if (cb_state == nullptr) {
2785 return;
2786 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002787 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002788
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002789 auto *dst_as_state = GetAccelerationStructureStateNV(dst);
locke-lunargd556cc32019-09-17 01:21:23 -06002790 if (dst_as_state != nullptr) {
2791 dst_as_state->built = true;
2792 dst_as_state->build_info.initialize(pInfo);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002793 if (!disabled[command_buffer_state]) {
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002794 cb_state->AddChild(dst_as_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002795 }
locke-lunargd556cc32019-09-17 01:21:23 -06002796 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002797 if (!disabled[command_buffer_state]) {
2798 auto *src_as_state = GetAccelerationStructureStateNV(src);
2799 if (src_as_state != nullptr) {
2800 cb_state->AddChild(src_as_state);
2801 }
locke-lunargd556cc32019-09-17 01:21:23 -06002802 }
2803 cb_state->hasBuildAccelerationStructureCmd = true;
2804}
2805
2806void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureNV(VkCommandBuffer commandBuffer,
2807 VkAccelerationStructureNV dst,
2808 VkAccelerationStructureNV src,
2809 VkCopyAccelerationStructureModeNV mode) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002810 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002811 if (cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002812 ACCELERATION_STRUCTURE_STATE *src_as_state = GetAccelerationStructureStateNV(src);
2813 ACCELERATION_STRUCTURE_STATE *dst_as_state = GetAccelerationStructureStateNV(dst);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002814 if (!disabled[command_buffer_state]) {
2815 cb_state->RecordTransferCmd(CMD_COPYACCELERATIONSTRUCTURENV, src_as_state, dst_as_state);
2816 }
locke-lunargd556cc32019-09-17 01:21:23 -06002817 if (dst_as_state != nullptr && src_as_state != nullptr) {
2818 dst_as_state->built = true;
2819 dst_as_state->build_info = src_as_state->build_info;
locke-lunargd556cc32019-09-17 01:21:23 -06002820 }
2821 }
2822}
2823
Jeff Bolz95176d02020-04-01 00:36:16 -05002824void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
2825 VkAccelerationStructureKHR accelerationStructure,
2826 const VkAllocationCallbacks *pAllocator) {
locke-lunargd556cc32019-09-17 01:21:23 -06002827 if (!accelerationStructure) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002828 auto *as_state = GetAccelerationStructureStateKHR(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002829 if (as_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002830 as_state->Destroy();
sourav parmarcd5fb182020-07-17 12:58:44 -07002831 accelerationStructureMap_khr.erase(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002832 }
2833}
2834
Jeff Bolz95176d02020-04-01 00:36:16 -05002835void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
2836 VkAccelerationStructureNV accelerationStructure,
2837 const VkAllocationCallbacks *pAllocator) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002838 if (!accelerationStructure) return;
2839 auto *as_state = GetAccelerationStructureStateNV(accelerationStructure);
2840 if (as_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002841 as_state->Destroy();
sourav parmarcd5fb182020-07-17 12:58:44 -07002842 accelerationStructureMap.erase(accelerationStructure);
2843 }
Jeff Bolz95176d02020-04-01 00:36:16 -05002844}
2845
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002846void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2847 uint32_t viewportCount,
2848 const VkViewportWScalingNV *pViewportWScalings) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002849 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002850 cb_state->RecordStateCmd(CMD_SETVIEWPORTWSCALINGNV, CBSTATUS_VIEWPORT_W_SCALING_SET);
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002851}
2852
locke-lunargd556cc32019-09-17 01:21:23 -06002853void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002854 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002855 cb_state->RecordStateCmd(CMD_SETLINEWIDTH, CBSTATUS_LINE_WIDTH_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002856}
2857
2858void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
2859 uint16_t lineStipplePattern) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002860 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002861 cb_state->RecordStateCmd(CMD_SETLINESTIPPLEEXT, CBSTATUS_LINE_STIPPLE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002862}
2863
2864void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
2865 float depthBiasClamp, float depthBiasSlopeFactor) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002866 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002867 cb_state->RecordStateCmd(CMD_SETDEPTHBIAS, CBSTATUS_DEPTH_BIAS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002868}
2869
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002870void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
2871 const VkRect2D *pScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002872 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002873 cb_state->RecordStateCmd(CMD_SETSCISSOR, CBSTATUS_SCISSOR_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002874 uint32_t bits = ((1u << scissorCount) - 1u) << firstScissor;
2875 cb_state->scissorMask |= bits;
2876 cb_state->trashedScissorMask &= ~bits;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002877}
2878
locke-lunargd556cc32019-09-17 01:21:23 -06002879void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002880 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002881 cb_state->RecordStateCmd(CMD_SETBLENDCONSTANTS, CBSTATUS_BLEND_CONSTANTS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002882}
2883
2884void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
2885 float maxDepthBounds) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002886 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002887 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDS, CBSTATUS_DEPTH_BOUNDS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002888}
2889
2890void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2891 uint32_t compareMask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002892 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002893 cb_state->RecordStateCmd(CMD_SETSTENCILCOMPAREMASK, CBSTATUS_STENCIL_READ_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002894}
2895
2896void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2897 uint32_t writeMask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002898 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002899 cb_state->RecordStateCmd(CMD_SETSTENCILWRITEMASK, CBSTATUS_STENCIL_WRITE_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002900}
2901
2902void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2903 uint32_t reference) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002904 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002905 cb_state->RecordStateCmd(CMD_SETSTENCILREFERENCE, CBSTATUS_STENCIL_REFERENCE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002906}
2907
locke-lunargd556cc32019-09-17 01:21:23 -06002908
2909// Update the bound state for the bind point, including the effects of incompatible pipeline layouts
2910void ValidationStateTracker::PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2911 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2912 uint32_t firstSet, uint32_t setCount,
2913 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2914 const uint32_t *pDynamicOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002915 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002916 cb_state->RecordCmd(CMD_BINDDESCRIPTORSETS);
locke-lunargd556cc32019-09-17 01:21:23 -06002917 auto pipeline_layout = GetPipelineLayout(layout);
2918
2919 // Resize binding arrays
2920 uint32_t last_set_index = firstSet + setCount - 1;
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002921 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
2922 if (last_set_index >= cb_state->lastBound[lv_bind_point].per_set.size()) {
2923 cb_state->lastBound[lv_bind_point].per_set.resize(last_set_index + 1);
locke-lunargd556cc32019-09-17 01:21:23 -06002924 }
2925
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002926 cb_state->UpdateLastBoundDescriptorSets(pipelineBindPoint, pipeline_layout, firstSet, setCount, pDescriptorSets, nullptr,
2927 dynamicOffsetCount, pDynamicOffsets);
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002928 cb_state->lastBound[lv_bind_point].pipeline_layout = layout;
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06002929 cb_state->lastBound[lv_bind_point].UpdateSamplerDescriptorsUsedByImage();
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002930}
2931
locke-lunargd556cc32019-09-17 01:21:23 -06002932void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
2933 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2934 uint32_t set, uint32_t descriptorWriteCount,
2935 const VkWriteDescriptorSet *pDescriptorWrites) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002936 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002937 auto pipeline_layout = GetPipelineLayout(layout);
2938 cb_state->PushDescriptorSetState(pipelineBindPoint, pipeline_layout, set, descriptorWriteCount, pDescriptorWrites);
locke-lunargd556cc32019-09-17 01:21:23 -06002939}
2940
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002941void ValidationStateTracker::PostCallRecordCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2942 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2943 const void *pValues) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002944 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002945 if (cb_state != nullptr) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002946 cb_state->RecordCmd(CMD_PUSHCONSTANTS);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002947 cb_state->ResetPushConstantDataIfIncompatible(GetPipelineLayout(layout));
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002948
2949 auto &push_constant_data = cb_state->push_constant_data;
2950 assert((offset + size) <= static_cast<uint32_t>(push_constant_data.size()));
2951 std::memcpy(push_constant_data.data() + offset, pValues, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002952 cb_state->push_constant_pipeline_layout_set = layout;
2953
2954 auto flags = stageFlags;
2955 uint32_t bit_shift = 0;
2956 while (flags) {
2957 if (flags & 1) {
2958 VkShaderStageFlagBits flag = static_cast<VkShaderStageFlagBits>(1 << bit_shift);
2959 const auto it = cb_state->push_constant_data_update.find(flag);
2960
2961 if (it != cb_state->push_constant_data_update.end()) {
locke-lunarg3d8b8f32020-10-26 17:04:16 -06002962 std::memset(it->second.data() + offset, PC_Byte_Updated, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002963 }
2964 }
2965 flags = flags >> 1;
2966 ++bit_shift;
2967 }
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002968 }
2969}
2970
locke-lunargd556cc32019-09-17 01:21:23 -06002971void ValidationStateTracker::PreCallRecordCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2972 VkIndexType indexType) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002973 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002974
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002975 cb_state->RecordStateCmd(CMD_BINDINDEXBUFFER, CBSTATUS_INDEX_BUFFER_BOUND);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002976 cb_state->index_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(buffer);
2977 cb_state->index_buffer_binding.size = cb_state->index_buffer_binding.buffer_state->createInfo.size;
locke-lunargd556cc32019-09-17 01:21:23 -06002978 cb_state->index_buffer_binding.offset = offset;
2979 cb_state->index_buffer_binding.index_type = indexType;
2980 // Add binding for this index buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002981 if (!disabled[command_buffer_state]) {
2982 cb_state->AddChild(cb_state->index_buffer_binding.buffer_state.get());
2983 }
locke-lunargd556cc32019-09-17 01:21:23 -06002984}
2985
2986void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2987 uint32_t bindingCount, const VkBuffer *pBuffers,
2988 const VkDeviceSize *pOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002989 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002990 cb_state->RecordCmd(CMD_BINDVERTEXBUFFERS);
locke-lunargd556cc32019-09-17 01:21:23 -06002991
2992 uint32_t end = firstBinding + bindingCount;
2993 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
2994 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
2995 }
2996
2997 for (uint32_t i = 0; i < bindingCount; ++i) {
2998 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
locke-lunarg1ae57d62020-11-18 10:49:19 -07002999 vertex_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(pBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003000 vertex_buffer_binding.offset = pOffsets[i];
Piers Daniell39842ee2020-07-10 16:42:33 -06003001 vertex_buffer_binding.size = VK_WHOLE_SIZE;
3002 vertex_buffer_binding.stride = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06003003 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003004 if (pBuffers[i] && !disabled[command_buffer_state]) {
3005 cb_state->AddChild(vertex_buffer_binding.buffer_state.get());
Jeff Bolz165818a2020-05-08 11:19:03 -05003006 }
locke-lunargd556cc32019-09-17 01:21:23 -06003007 }
3008}
3009
3010void ValidationStateTracker::PostCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
3011 VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003012 if (disabled[command_buffer_state]) return;
3013
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003014 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003015 cb_state->RecordTransferCmd(CMD_UPDATEBUFFER, GetBufferState(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -06003016}
3017
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003018void ValidationStateTracker::PreCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
3019 VkPipelineStageFlags stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003020 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3021 cb_state->RecordSetEvent(CMD_SETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003022}
3023
3024void ValidationStateTracker::PreCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
3025 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003026 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003027 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
3028
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003029 cb_state->RecordSetEvent(CMD_SETEVENT2KHR, event, stage_masks.src);
3030 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003031}
3032
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003033void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
3034 VkPipelineStageFlags stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003035 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3036 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003037}
3038
3039void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
3040 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003041 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3042 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003043}
3044
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003045void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
3046 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
3047 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3048 uint32_t bufferMemoryBarrierCount,
3049 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3050 uint32_t imageMemoryBarrierCount,
3051 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003052 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3053 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents);
3054 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
3055 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003056}
3057
3058void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
3059 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003060 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3061 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, eventCount, pEvents);
Jeremy Gebben79649152021-06-22 14:46:24 -06003062 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003063 cb_state->RecordBarriers(pDependencyInfos[i]);
Jeremy Gebben79649152021-06-22 14:46:24 -06003064 }
3065}
3066
3067void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
3068 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
3069 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
3070 uint32_t bufferMemoryBarrierCount,
3071 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
3072 uint32_t imageMemoryBarrierCount,
3073 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003074 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3075 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
3076 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
3077 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06003078}
3079
3080void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
3081 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003082 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3083 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
3084 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06003085}
3086
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02003087QueryState ValidationStateTracker::GetQueryState(const QueryMap *localQueryToStateMap, VkQueryPool queryPool, uint32_t queryIndex,
3088 uint32_t perfPass) const {
3089 QueryObject query = QueryObject(QueryObject(queryPool, queryIndex), perfPass);
locke-lunargd556cc32019-09-17 01:21:23 -06003090
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02003091 auto iter = localQueryToStateMap->find(query);
3092 if (iter != localQueryToStateMap->end()) return iter->second;
Jeff Bolz310775c2019-10-09 00:46:33 -05003093
Jeff Bolz310775c2019-10-09 00:46:33 -05003094 return QUERYSTATE_UNKNOWN;
locke-lunargd556cc32019-09-17 01:21:23 -06003095}
3096
locke-lunargd556cc32019-09-17 01:21:23 -06003097void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
3098 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06003099 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003100
locke-lunargd556cc32019-09-17 01:21:23 -06003101 QueryObject query = {queryPool, slot};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003102 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003103 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003104 if (!disabled[query_validation]) {
3105 cb_state->BeginQuery(query);
3106 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003107 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003108 auto pool_state = GetQueryPoolState(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003109 cb_state->AddChild(pool_state);
3110 }
locke-lunargd556cc32019-09-17 01:21:23 -06003111}
3112
3113void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06003114 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003115 QueryObject query_obj = {queryPool, slot};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003116 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003117 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003118 if (!disabled[query_validation]) {
3119 cb_state->EndQuery(query_obj);
3120 }
3121 if (!disabled[command_buffer_state]) {
3122 auto pool_state = GetQueryPoolState(query_obj.pool);
3123 cb_state->AddChild(pool_state);
3124 }
locke-lunargd556cc32019-09-17 01:21:23 -06003125}
3126
3127void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3128 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06003129 if (disabled[query_validation]) return;
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003130 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003131
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003132 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003133 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02003134
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003135 if (!disabled[command_buffer_state]) {
3136 auto pool_state = GetQueryPoolState(queryPool);
3137 cb_state->AddChild(pool_state);
3138 }
locke-lunargd556cc32019-09-17 01:21:23 -06003139}
3140
3141void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3142 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
3143 VkDeviceSize dstOffset, VkDeviceSize stride,
3144 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003145 if (disabled[query_validation] || disabled[command_buffer_state]) return;
3146
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003147 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003148 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
locke-lunargd556cc32019-09-17 01:21:23 -06003149 auto dst_buff_state = GetBufferState(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003150 cb_state->AddChild(dst_buff_state);
Jeff Bolzadbfa852019-10-04 13:53:30 -05003151 auto pool_state = GetQueryPoolState(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003152 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003153}
3154
3155void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
3156 VkQueryPool queryPool, 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_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07003159}
3160
3161void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
3162 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
3163 uint32_t slot) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06003164 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3165 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06003166}
3167
Marijn Suijten6750fdc2020-12-30 22:06:42 +01003168void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
3169 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
3170 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
3171 if (disabled[query_validation]) return;
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003172 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003173 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003174 if (!disabled[command_buffer_state]) {
3175 auto pool_state = GetQueryPoolState(queryPool);
3176 cb_state->AddChild(pool_state);
3177 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003178 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01003179}
3180
locke-lunargd556cc32019-09-17 01:21:23 -06003181void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
3182 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
3183 VkResult result) {
3184 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003185
Jeremy Gebben88f58142021-06-01 10:07:52 -06003186 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08003187 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06003188 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07003189
locke-lunargd556cc32019-09-17 01:21:23 -06003190 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06003191 views[i] = GetShared<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003192 }
3193 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06003194
3195 frameBufferMap[*pFramebuffer] = std::make_shared<FRAMEBUFFER_STATE>(
3196 *pFramebuffer, pCreateInfo, GetRenderPassShared(pCreateInfo->renderPass), std::move(views));
locke-lunargd556cc32019-09-17 01:21:23 -06003197}
3198
locke-lunargd556cc32019-09-17 01:21:23 -06003199void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
3200 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
3201 VkResult result) {
3202 if (VK_SUCCESS != result) return;
Jeremy Gebben88f58142021-06-01 10:07:52 -06003203 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06003204}
3205
Mike Schuchardt2df08912020-12-15 16:28:09 -08003206void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07003207 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
3208 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06003209 if (VK_SUCCESS != result) return;
3210
3211 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
Tony-LunarG977448c2019-12-02 14:52:02 -07003212}
3213
Mike Schuchardt2df08912020-12-15 16:28:09 -08003214void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07003215 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
3216 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06003217 if (VK_SUCCESS != result) return;
3218
3219 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
Tony-LunarG977448c2019-12-02 14:52:02 -07003220}
3221
locke-lunargd556cc32019-09-17 01:21:23 -06003222void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
3223 const VkRenderPassBeginInfo *pRenderPassBegin,
3224 VkSubpassContents contents) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003225 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3226 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003227}
3228
3229void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
3230 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003231 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003232 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003233 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003234}
3235
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003236void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
3237 uint32_t counterBufferCount,
3238 const VkBuffer *pCounterBuffers,
3239 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003240 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003241
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003242 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003243 cb_state->transform_feedback_active = true;
3244}
3245
3246void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
3247 uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
3248 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003249 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003250
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003251 cb_state->RecordCmd(CMD_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003252 cb_state->transform_feedback_active = false;
3253}
3254
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003255void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
3256 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebbenc8b51a92021-08-16 15:19:00 -06003257 auto *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003258
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003259 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003260 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02003261 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
3262 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003263}
3264
3265void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenc8b51a92021-08-16 15:19:00 -06003266 auto *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003267
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003268 cb_state->RecordCmd(CMD_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003269 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02003270 cb_state->conditional_rendering_inside_render_pass = false;
3271 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003272}
3273
Tony-LunarG977448c2019-12-02 14:52:02 -07003274void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
3275 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003276 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003277 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3278 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07003279}
3280
locke-lunargd556cc32019-09-17 01:21:23 -06003281
3282void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003283 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3284 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003285}
3286
3287void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003288 const VkSubpassBeginInfo *pSubpassBeginInfo,
3289 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003290 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003291 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003292}
3293
Tony-LunarG977448c2019-12-02 14:52:02 -07003294void ValidationStateTracker::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003295 const VkSubpassBeginInfo *pSubpassBeginInfo,
3296 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003297 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003298 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003299}
3300
3301void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003302 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3303 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06003304}
3305
3306void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003307 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003308 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003309 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06003310}
3311
Tony-LunarG977448c2019-12-02 14:52:02 -07003312void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003313 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003314 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3315 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07003316}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003317
locke-lunargd556cc32019-09-17 01:21:23 -06003318void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
3319 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003320 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003321
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003322 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06003323}
3324
3325void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
3326 VkFlags flags, void **ppData, VkResult result) {
3327 if (VK_SUCCESS != result) return;
3328 RecordMappedMemory(mem, offset, size, ppData);
3329}
3330
3331void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
3332 auto mem_info = GetDevMemState(mem);
3333 if (mem_info) {
3334 mem_info->mapped_range = MemRange();
3335 mem_info->p_driver_data = nullptr;
3336 }
3337}
3338
3339void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben8ee02af2021-07-16 10:15:55 -06003340 auto image_state = GetShared<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06003341 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06003342 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
3343 // See: VUID-vkGetImageSubresourceLayout-image-01895
3344 image_state->fragment_encoder =
3345 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07003346 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003347 if (swapchain_info) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003348 auto swapchain = GetShared<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003349 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003350 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07003351
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003352 if (!swapchain_image.fake_base_address) {
3353 auto size = image_state->fragment_encoder->TotalSize();
3354 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06003355 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003356 // All images bound to this swapchain and index are aliases
3357 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003358 }
3359 } else {
3360 // Track bound memory range information
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003361 auto mem_info = GetDevMemShared(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06003362 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003363 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06003364 }
locke-lunargd556cc32019-09-17 01:21:23 -06003365 }
locke-lunargd556cc32019-09-17 01:21:23 -06003366 }
3367}
3368
3369void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
3370 VkDeviceSize memoryOffset, VkResult result) {
3371 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06003372 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003373 bind_info.image = image;
3374 bind_info.memory = mem;
3375 bind_info.memoryOffset = memoryOffset;
3376 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003377}
3378
3379void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003380 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003381 if (VK_SUCCESS != result) return;
3382 for (uint32_t i = 0; i < bindInfoCount; i++) {
3383 UpdateBindImageMemoryState(pBindInfos[i]);
3384 }
3385}
3386
3387void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003388 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003389 if (VK_SUCCESS != result) return;
3390 for (uint32_t i = 0; i < bindInfoCount; i++) {
3391 UpdateBindImageMemoryState(pBindInfos[i]);
3392 }
3393}
3394
3395void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
3396 auto event_state = GetEventState(event);
3397 if (event_state) {
3398 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
3399 }
locke-lunargd556cc32019-09-17 01:21:23 -06003400}
3401
3402void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
3403 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
3404 VkResult result) {
3405 if (VK_SUCCESS != result) return;
3406 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
3407 pImportSemaphoreFdInfo->flags);
3408}
3409
3410void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003411 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
locke-lunargd556cc32019-09-17 01:21:23 -06003412 SEMAPHORE_STATE *semaphore_state = GetSemaphoreState(semaphore);
Mike Schuchardt2df08912020-12-15 16:28:09 -08003413 if (semaphore_state && handle_type != VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06003414 // Cannot track semaphore state once it is exported, except for Sync FD handle types which have copy transference
3415 semaphore_state->scope = kSyncScopeExternalPermanent;
3416 }
3417}
3418
3419#ifdef VK_USE_PLATFORM_WIN32_KHR
3420void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
3421 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
3422 if (VK_SUCCESS != result) return;
3423 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
3424 pImportSemaphoreWin32HandleInfo->flags);
3425}
3426
3427void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
3428 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3429 HANDLE *pHandle, VkResult result) {
3430 if (VK_SUCCESS != result) return;
3431 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
3432}
3433
3434void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
3435 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
3436 if (VK_SUCCESS != result) return;
3437 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
3438 pImportFenceWin32HandleInfo->flags);
3439}
3440
3441void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
3442 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3443 HANDLE *pHandle, VkResult result) {
3444 if (VK_SUCCESS != result) return;
3445 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
3446}
3447#endif
3448
3449void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
3450 VkResult result) {
3451 if (VK_SUCCESS != result) return;
3452 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
3453}
3454
Mike Schuchardt2df08912020-12-15 16:28:09 -08003455void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
3456 VkFenceImportFlags flags) {
locke-lunargd556cc32019-09-17 01:21:23 -06003457 FENCE_STATE *fence_node = GetFenceState(fence);
3458 if (fence_node && fence_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08003459 if ((handle_type == VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_FENCE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06003460 fence_node->scope == kSyncScopeInternal) {
3461 fence_node->scope = kSyncScopeExternalTemporary;
3462 } else {
3463 fence_node->scope = kSyncScopeExternalPermanent;
3464 }
3465 }
3466}
3467
3468void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
3469 VkResult result) {
3470 if (VK_SUCCESS != result) return;
3471 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
3472}
3473
Mike Schuchardt2df08912020-12-15 16:28:09 -08003474void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
locke-lunargd556cc32019-09-17 01:21:23 -06003475 FENCE_STATE *fence_state = GetFenceState(fence);
3476 if (fence_state) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08003477 if (handle_type != VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06003478 // Export with reference transference becomes external
3479 fence_state->scope = kSyncScopeExternalPermanent;
3480 } else if (fence_state->scope == kSyncScopeInternal) {
3481 // Export with copy transference has a side effect of resetting the fence
3482 fence_state->state = FENCE_UNSIGNALED;
3483 }
3484 }
3485}
3486
3487void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3488 VkResult result) {
3489 if (VK_SUCCESS != result) return;
3490 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3491}
3492
3493void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3494 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3495 if (VK_SUCCESS != result) return;
John Zulaufd5115702021-01-18 12:34:33 -07003496 const auto event = *pEvent;
Jeremy Gebbencbf22862021-03-03 12:01:22 -07003497 eventMap.emplace(event, std::make_shared<EVENT_STATE>(event, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003498}
3499
3500void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003501 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003502 SWAPCHAIN_NODE *old_swapchain_state) {
3503 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003504 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003505 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003506 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003507 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3508 surface_state->AddParent(swapchain.get());
3509 surface_state->swapchain = swapchain.get();
3510 swapchain->surface = std::move(surface_state);
3511 swapchainMap[*pSwapchain] = std::move(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003512 } else {
3513 surface_state->swapchain = nullptr;
3514 }
3515 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003516 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003517 if (old_swapchain_state) {
3518 old_swapchain_state->retired = true;
3519 }
3520 return;
3521}
3522
3523void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3524 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3525 VkResult result) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003526 auto surface_state = GetShared<SURFACE_STATE>(pCreateInfo->surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003527 auto old_swapchain_state = GetSwapchainState(pCreateInfo->oldSwapchain);
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003528 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003529}
3530
3531void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3532 const VkAllocationCallbacks *pAllocator) {
3533 if (!swapchain) return;
3534 auto swapchain_data = GetSwapchainState(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003535 if (!swapchain_data) return;
John Zulauffaa7a522021-03-05 12:22:45 -07003536
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003537 swapchain_data->Destroy();
3538 swapchainMap.erase(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003539}
3540
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003541void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3542 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3543 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3544 VkResult result) {
3545 if (VK_SUCCESS != result) return;
3546 if (!pMode) return;
Jeremy Gebben5573a8c2021-06-04 08:55:10 -06003547 display_mode_map[*pMode] = std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice);
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003548}
3549
locke-lunargd556cc32019-09-17 01:21:23 -06003550void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
3551 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3552 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003553 auto semaphore_state = GetSemaphoreState(pPresentInfo->pWaitSemaphores[i]);
3554 if (semaphore_state) {
3555 semaphore_state->signaler.first = VK_NULL_HANDLE;
3556 semaphore_state->signaled = false;
locke-lunargd556cc32019-09-17 01:21:23 -06003557 }
3558 }
3559
Tony-LunarG6f887e52021-07-27 11:23:14 -06003560 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003561 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3562 // 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
3563 // confused itself just as much.
3564 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3565 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3566 // Mark the image as having been released to the WSI
3567 auto swapchain_data = GetSwapchainState(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003568 if (swapchain_data) {
3569 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003570 if (present_id_info) {
3571 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3572 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3573 }
3574 }
locke-lunargd556cc32019-09-17 01:21:23 -06003575 }
3576 }
3577 // Note: even though presentation is directed to a queue, there is no direct ordering between QP and subsequent work, so QP (and
3578 // its semaphore waits) /never/ participate in any completion proof.
3579}
3580
3581void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3582 const VkSwapchainCreateInfoKHR *pCreateInfos,
3583 const VkAllocationCallbacks *pAllocator,
3584 VkSwapchainKHR *pSwapchains, VkResult result) {
3585 if (pCreateInfos) {
3586 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003587 auto surface_state = GetShared<SURFACE_STATE>(pCreateInfos[i].surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003588 auto old_swapchain_state = GetSwapchainState(pCreateInfos[i].oldSwapchain);
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003589 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state), old_swapchain_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003590 }
3591 }
3592}
3593
3594void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3595 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003596 auto fence_state = GetFenceState(fence);
3597 if (fence_state && fence_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003598 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3599 // import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003600 fence_state->state = FENCE_INFLIGHT;
3601 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 -06003602 }
3603
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003604 auto semaphore_state = GetSemaphoreState(semaphore);
3605 if (semaphore_state && semaphore_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003606 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3607 // temporary import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003608 semaphore_state->signaled = true;
3609 semaphore_state->signaler.first = VK_NULL_HANDLE;
locke-lunargd556cc32019-09-17 01:21:23 -06003610 }
3611
3612 // Mark the image as acquired.
3613 auto swapchain_data = GetSwapchainState(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003614 if (swapchain_data) {
3615 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003616 }
3617}
3618
3619void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3620 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3621 VkResult result) {
3622 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3623 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3624}
3625
3626void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3627 uint32_t *pImageIndex, VkResult result) {
3628 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3629 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3630 pAcquireInfo->fence, pImageIndex);
3631}
3632
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003633std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3634 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3635}
3636
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003637void ValidationStateTracker::PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
3638 const VkAllocationCallbacks *pAllocator, VkInstance *pInstance,
3639 VkResult result) {
3640 if (result != VK_SUCCESS) {
3641 return;
3642 }
3643 uint32_t count = 0;
3644 DispatchEnumeratePhysicalDevices(*pInstance, &count, nullptr);
3645 std::vector<VkPhysicalDevice> physdev_handles(count);
3646 DispatchEnumeratePhysicalDevices(*pInstance, &count, physdev_handles.data());
3647
3648 physical_device_map.reserve(count);
3649 for (auto physdev : physdev_handles) {
3650 physical_device_map.emplace(physdev, CreatePhysicalDeviceState(physdev));
locke-lunargd556cc32019-09-17 01:21:23 -06003651 }
3652}
3653
3654// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003655static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003656 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003657}
3658
3659void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3660 uint32_t *pQueueFamilyPropertyCount,
3661 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003662 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3663 assert(pd_state);
3664 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003665}
3666
3667void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003668 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003669 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3670 assert(pd_state);
3671 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003672}
3673
3674void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003675 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003676 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3677 assert(pd_state);
3678 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003679}
3680void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3681 const VkAllocationCallbacks *pAllocator) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003682 if (!surface) return;
3683 auto surface_state = GetSurfaceState(surface);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003684 surface_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06003685 surface_map.erase(surface);
3686}
3687
3688void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003689 surface_map[*pSurface] = std::make_shared<SURFACE_STATE>(*pSurface);
locke-lunargd556cc32019-09-17 01:21:23 -06003690}
3691
3692void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3693 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3694 const VkAllocationCallbacks *pAllocator,
3695 VkSurfaceKHR *pSurface, VkResult result) {
3696 if (VK_SUCCESS != result) return;
3697 RecordVulkanSurface(pSurface);
3698}
3699
3700#ifdef VK_USE_PLATFORM_ANDROID_KHR
3701void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3702 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3703 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3704 VkResult result) {
3705 if (VK_SUCCESS != result) return;
3706 RecordVulkanSurface(pSurface);
3707}
3708#endif // VK_USE_PLATFORM_ANDROID_KHR
3709
3710#ifdef VK_USE_PLATFORM_IOS_MVK
3711void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3712 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3713 VkResult result) {
3714 if (VK_SUCCESS != result) return;
3715 RecordVulkanSurface(pSurface);
3716}
3717#endif // VK_USE_PLATFORM_IOS_MVK
3718
3719#ifdef VK_USE_PLATFORM_MACOS_MVK
3720void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3721 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3722 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3723 VkResult result) {
3724 if (VK_SUCCESS != result) return;
3725 RecordVulkanSurface(pSurface);
3726}
3727#endif // VK_USE_PLATFORM_MACOS_MVK
3728
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003729#ifdef VK_USE_PLATFORM_METAL_EXT
3730void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3731 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3732 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3733 VkResult result) {
3734 if (VK_SUCCESS != result) return;
3735 RecordVulkanSurface(pSurface);
3736}
3737#endif // VK_USE_PLATFORM_METAL_EXT
3738
locke-lunargd556cc32019-09-17 01:21:23 -06003739#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3740void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3741 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3742 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3743 VkResult result) {
3744 if (VK_SUCCESS != result) return;
3745 RecordVulkanSurface(pSurface);
3746}
3747#endif // VK_USE_PLATFORM_WAYLAND_KHR
3748
3749#ifdef VK_USE_PLATFORM_WIN32_KHR
3750void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3751 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
3752 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3753 VkResult result) {
3754 if (VK_SUCCESS != result) return;
3755 RecordVulkanSurface(pSurface);
3756}
3757#endif // VK_USE_PLATFORM_WIN32_KHR
3758
3759#ifdef VK_USE_PLATFORM_XCB_KHR
3760void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
3761 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3762 VkResult result) {
3763 if (VK_SUCCESS != result) return;
3764 RecordVulkanSurface(pSurface);
3765}
3766#endif // VK_USE_PLATFORM_XCB_KHR
3767
3768#ifdef VK_USE_PLATFORM_XLIB_KHR
3769void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
3770 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3771 VkResult result) {
3772 if (VK_SUCCESS != result) return;
3773 RecordVulkanSurface(pSurface);
3774}
3775#endif // VK_USE_PLATFORM_XLIB_KHR
3776
Niklas Haas8b84af12020-04-19 22:20:11 +02003777void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3778 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3779 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3780 VkResult result) {
3781 if (VK_SUCCESS != result) return;
3782 RecordVulkanSurface(pSurface);
3783}
3784
locke-lunargd556cc32019-09-17 01:21:23 -06003785void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3786 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3787 VkBool32 *pSupported, VkResult result) {
3788 if (VK_SUCCESS != result) return;
3789 auto surface_state = GetSurfaceState(surface);
3790 surface_state->gpu_queue_support[{physicalDevice, queueFamilyIndex}] = (*pSupported == VK_TRUE);
3791}
3792
locke-lunargd556cc32019-09-17 01:21:23 -06003793void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3794 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003795 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3796 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003797 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3798}
3799
3800void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003801 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3802 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003803 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3804}
3805
3806void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3807 const VkDebugUtilsLabelEXT *pLabelInfo) {
3808 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3809
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003810 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003811 cb_state->RecordCmd(CMD_INSERTDEBUGUTILSLABELEXT);
3812 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003813 cb_state->debug_label = LoggingLabel(pLabelInfo);
3814}
3815
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003816void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3817 uint32_t queueFamilyIndex,
3818 uint32_t *pCounterCount,
3819 VkPerformanceCounterKHR *pCounters) {
3820 if (NULL == pCounters) return;
3821
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003822 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3823 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003824
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003825 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3826 queue_family_counters->counters.resize(*pCounterCount);
3827 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003828
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003829 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003830}
3831
3832void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3833 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3834 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3835 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3836 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3837}
3838
3839void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3840 VkResult result) {
3841 if (result == VK_SUCCESS) performance_lock_acquired = true;
3842}
3843
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003844void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3845 performance_lock_acquired = false;
3846 for (auto &cmd_buffer : commandBufferMap) {
3847 cmd_buffer.second->performance_lock_released = true;
3848 }
3849}
3850
locke-lunargd556cc32019-09-17 01:21:23 -06003851void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003852 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003853 const VkAllocationCallbacks *pAllocator) {
3854 if (!descriptorUpdateTemplate) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003855 auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3856 template_state->destroyed = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003857 desc_template_map.erase(descriptorUpdateTemplate);
3858}
3859
3860void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003861 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003862 const VkAllocationCallbacks *pAllocator) {
3863 if (!descriptorUpdateTemplate) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003864 auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3865 template_state->destroyed = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003866 desc_template_map.erase(descriptorUpdateTemplate);
3867}
3868
Mike Schuchardt2df08912020-12-15 16:28:09 -08003869void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3870 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
locke-lunargd556cc32019-09-17 01:21:23 -06003871 safe_VkDescriptorUpdateTemplateCreateInfo local_create_info(pCreateInfo);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003872 auto template_state = std::make_shared<TEMPLATE_STATE>(*pDescriptorUpdateTemplate, &local_create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003873 desc_template_map[*pDescriptorUpdateTemplate] = std::move(template_state);
3874}
3875
Mike Schuchardt2df08912020-12-15 16:28:09 -08003876void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3877 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3878 const VkAllocationCallbacks *pAllocator,
3879 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3880 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003881 if (VK_SUCCESS != result) return;
3882 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3883}
3884
3885void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003886 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3887 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003888 if (VK_SUCCESS != result) return;
3889 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3890}
3891
3892void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003893 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003894 const void *pData) {
3895 auto const template_map_entry = desc_template_map.find(descriptorUpdateTemplate);
3896 if ((template_map_entry == desc_template_map.end()) || (template_map_entry->second.get() == nullptr)) {
3897 assert(0);
3898 } else {
3899 const TEMPLATE_STATE *template_state = template_map_entry->second.get();
3900 // TODO: Record template push descriptor updates
3901 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
3902 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state, pData);
3903 }
3904 }
3905}
3906
3907void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3908 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3909 const void *pData) {
3910 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3911}
3912
3913void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003914 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003915 const void *pData) {
3916 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3917}
3918
Mike Schuchardt2df08912020-12-15 16:28:09 -08003919void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3920 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3921 VkPipelineLayout layout, uint32_t set,
3922 const void *pData) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003923 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003924
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003925 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
locke-lunargd556cc32019-09-17 01:21:23 -06003926 const auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3927 if (template_state) {
3928 auto layout_data = GetPipelineLayout(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003929 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003930 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003931 // Decode the template into a set of write updates
3932 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state, pData,
3933 dsl->GetDescriptorSetLayout());
3934 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data, set,
3935 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3936 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003937 }
3938}
3939
3940void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3941 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003942 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003943 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003944 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003945 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003946 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003947 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003948 }
3949}
3950
3951void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3952 uint32_t *pPropertyCount,
3953 VkDisplayPlanePropertiesKHR *pProperties,
3954 VkResult result) {
3955 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3956 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3957}
3958
3959void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3960 uint32_t *pPropertyCount,
3961 VkDisplayPlaneProperties2KHR *pProperties,
3962 VkResult result) {
3963 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3964 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3965}
3966
3967void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3968 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3969 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003970 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003971 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003972 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003973}
3974
3975void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3976 uint32_t query, uint32_t index) {
3977 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003978 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003979 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003980 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003981}
3982
3983void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3984 VkSamplerYcbcrConversion ycbcr_conversion) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003985 VkFormatFeatureFlags format_features = 0;
3986
3987 if (create_info->format != VK_FORMAT_UNDEFINED) {
3988 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07003989 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003990 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
3991 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003992 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003993
3994 samplerYcbcrConversionMap[ycbcr_conversion] =
3995 std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features);
locke-lunargd556cc32019-09-17 01:21:23 -06003996}
3997
3998void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
3999 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
4000 const VkAllocationCallbacks *pAllocator,
4001 VkSamplerYcbcrConversion *pYcbcrConversion,
4002 VkResult result) {
4003 if (VK_SUCCESS != result) return;
4004 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
4005}
4006
4007void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(VkDevice device,
4008 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
4009 const VkAllocationCallbacks *pAllocator,
4010 VkSamplerYcbcrConversion *pYcbcrConversion,
4011 VkResult result) {
4012 if (VK_SUCCESS != result) return;
4013 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
4014}
4015
sfricke-samsungbe3584f2020-04-22 14:58:06 -07004016void ValidationStateTracker::RecordDestroySamplerYcbcrConversionState(VkSamplerYcbcrConversion ycbcr_conversion) {
sfricke-samsungbe3584f2020-04-22 14:58:06 -07004017 auto ycbcr_state = GetSamplerYcbcrConversionState(ycbcr_conversion);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004018 ycbcr_state->Destroy();
sfricke-samsungbe3584f2020-04-22 14:58:06 -07004019 samplerYcbcrConversionMap.erase(ycbcr_conversion);
4020}
4021
locke-lunargd556cc32019-09-17 01:21:23 -06004022void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
4023 const VkAllocationCallbacks *pAllocator) {
4024 if (!ycbcrConversion) return;
sfricke-samsungbe3584f2020-04-22 14:58:06 -07004025 RecordDestroySamplerYcbcrConversionState(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06004026}
4027
4028void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
4029 VkSamplerYcbcrConversion ycbcrConversion,
4030 const VkAllocationCallbacks *pAllocator) {
4031 if (!ycbcrConversion) return;
sfricke-samsungbe3584f2020-04-22 14:58:06 -07004032 RecordDestroySamplerYcbcrConversionState(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06004033}
4034
Tony-LunarG977448c2019-12-02 14:52:02 -07004035void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
4036 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06004037 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07004038 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06004039
4040 // Do nothing if the query pool has been destroyed.
4041 auto query_pool_state = GetQueryPoolState(queryPool);
4042 if (!query_pool_state) return;
4043
4044 // Reset the state of existing entries.
4045 QueryObject query_obj{queryPool, 0};
4046 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
4047 for (uint32_t i = 0; i < max_query_count; ++i) {
4048 query_obj.query = firstQuery + i;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02004049 queryToStateMap[query_obj] = QUERYSTATE_RESET;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01004050 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07004051 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
4052 query_obj.perf_pass = pass_index;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02004053 queryToStateMap[query_obj] = QUERYSTATE_RESET;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01004054 }
4055 }
locke-lunargd556cc32019-09-17 01:21:23 -06004056 }
4057}
4058
Tony-LunarG977448c2019-12-02 14:52:02 -07004059void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
4060 uint32_t queryCount) {
4061 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
4062}
4063
4064void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
4065 uint32_t queryCount) {
4066 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
4067}
4068
locke-lunargd556cc32019-09-17 01:21:23 -06004069void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
4070 const TEMPLATE_STATE *template_state, const void *pData) {
4071 // Translate the templated update into a normal update for validation...
4072 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
4073 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
4074 decoded_update.desc_writes.data(), 0, NULL);
4075}
4076
4077// Update the common AllocateDescriptorSetsData
4078void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05004079 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06004080 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeff Bolz6ae39612019-10-11 20:57:36 -05004081 auto layout = GetDescriptorSetLayoutShared(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06004082 if (layout) {
4083 ds_data->layout_nodes[i] = layout;
4084 // Count total descriptors required per type
4085 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
4086 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07004087 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
4088 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06004089 }
4090 }
4091 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
4092 }
4093}
4094
4095// Decrement allocated sets from the pool and insert new sets into set_map
4096void ValidationStateTracker::PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *p_alloc_info,
4097 const VkDescriptorSet *descriptor_sets,
4098 const cvdescriptorset::AllocateDescriptorSetsData *ds_data) {
4099 auto pool_state = descriptorPoolMap[p_alloc_info->descriptorPool].get();
4100 // Account for sets and individual descriptors allocated from pool
4101 pool_state->availableSets -= p_alloc_info->descriptorSetCount;
4102 for (auto it = ds_data->required_descriptors_by_type.begin(); it != ds_data->required_descriptors_by_type.end(); ++it) {
4103 pool_state->availableDescriptorTypeCount[it->first] -= ds_data->required_descriptors_by_type.at(it->first);
4104 }
4105
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07004106 const auto *variable_count_info = LvlFindInChain<VkDescriptorSetVariableDescriptorCountAllocateInfo>(p_alloc_info->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06004107 bool variable_count_valid = variable_count_info && variable_count_info->descriptorSetCount == p_alloc_info->descriptorSetCount;
4108
4109 // Create tracking object for each descriptor set; insert into global map and the pool's set.
4110 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
4111 uint32_t variable_count = variable_count_valid ? variable_count_info->pDescriptorCounts[i] : 0;
4112
Jeff Bolz41a1ced2019-10-11 11:40:49 -05004113 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 -07004114 variable_count, this);
locke-lunargd556cc32019-09-17 01:21:23 -06004115 pool_state->sets.insert(new_ds.get());
locke-lunargd556cc32019-09-17 01:21:23 -06004116 setMap[descriptor_sets[i]] = std::move(new_ds);
4117 }
4118}
4119
locke-lunargd556cc32019-09-17 01:21:23 -06004120void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
4121 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004122 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004123 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004124}
4125
Tony-LunarG745150c2021-07-02 15:07:31 -06004126void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
4127 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
4128 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004129 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004130 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06004131}
4132
locke-lunargd556cc32019-09-17 01:21:23 -06004133void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
4134 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
4135 uint32_t firstInstance) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004136 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004137 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004138}
4139
Tony-LunarG745150c2021-07-02 15:07:31 -06004140void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
4141 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
4142 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
4143 const int32_t *pVertexOffset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004144 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004145 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06004146}
4147
locke-lunargd556cc32019-09-17 01:21:23 -06004148void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4149 uint32_t count, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004150 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06004151 BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004152 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004153 if (!disabled[command_buffer_state]) {
4154 cb_state->AddChild(buffer_state);
4155 }
locke-lunargd556cc32019-09-17 01:21:23 -06004156}
4157
4158void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
4159 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004160 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06004161 BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004162 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004163 if (!disabled[command_buffer_state]) {
4164 cb_state->AddChild(buffer_state);
4165 }
locke-lunargd556cc32019-09-17 01:21:23 -06004166}
4167
4168void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004169 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004170 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06004171}
4172
4173void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
4174 VkDeviceSize offset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004175 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004176 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004177 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004178 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004179 cb_state->AddChild(buffer_state);
4180 }
locke-lunargd556cc32019-09-17 01:21:23 -06004181}
4182
Tony-LunarG977448c2019-12-02 14:52:02 -07004183void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4184 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07004185 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004186 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004187 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004188 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004189 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4190 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004191 cb_state->AddChild(buffer_state);
4192 cb_state->AddChild(count_buffer_state);
4193 }
Tony-LunarG977448c2019-12-02 14:52:02 -07004194}
4195
locke-lunargd556cc32019-09-17 01:21:23 -06004196void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
4197 VkDeviceSize offset, VkBuffer countBuffer,
4198 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4199 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004200 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004201 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07004202}
4203
4204void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4205 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
4206 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004207 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004208 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07004209}
4210
4211void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4212 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07004213 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004214 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004215 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004216 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004217 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4218 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004219 cb_state->AddChild(buffer_state);
4220 cb_state->AddChild(count_buffer_state);
4221 }
locke-lunargd556cc32019-09-17 01:21:23 -06004222}
4223
4224void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
4225 VkDeviceSize offset, VkBuffer countBuffer,
4226 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4227 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004228 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004229 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07004230}
4231
4232void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
4233 VkDeviceSize offset, VkBuffer countBuffer,
4234 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4235 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004236 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004237 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06004238}
4239
4240void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
4241 uint32_t firstTask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004242 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004243 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004244}
4245
4246void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4247 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004248 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004249 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004250 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004251 if (!disabled[command_buffer_state] && buffer_state) {
4252 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06004253 }
4254}
4255
4256void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4257 VkDeviceSize offset, VkBuffer countBuffer,
4258 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4259 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_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004262 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004263 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4264 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004265 if (buffer_state) {
4266 cb_state->AddChild(buffer_state);
4267 }
4268 if (count_buffer_state) {
4269 cb_state->AddChild(count_buffer_state);
4270 }
locke-lunargd556cc32019-09-17 01:21:23 -06004271 }
4272}
4273
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004274void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
4275 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
4276 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
4277 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
4278 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
4279 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
4280 uint32_t width, uint32_t height, uint32_t depth) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004281 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004282 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004283 cb_state->hasTraceRaysCmd = true;
4284}
4285
4286
4287void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
4288 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4289 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4290 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4291 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
4292 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_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004295 cb_state->hasTraceRaysCmd = true;
4296}
4297
4298void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
4299 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4300 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4301 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4302 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
4303 VkDeviceAddress indirectDeviceAddress) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004304 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004305 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004306 cb_state->hasTraceRaysCmd = true;
4307}
4308
locke-lunargd556cc32019-09-17 01:21:23 -06004309void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
4310 const VkAllocationCallbacks *pAllocator,
4311 VkShaderModule *pShaderModule, VkResult result,
4312 void *csm_state_data) {
4313 if (VK_SUCCESS != result) return;
4314 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
4315
sfricke-samsung45996a42021-09-16 13:45:27 -07004316 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06004317 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05004318 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
4319 csm_state->unique_shader_id)
4320 : std::make_shared<SHADER_MODULE_STATE>();
locke-lunargd556cc32019-09-17 01:21:23 -06004321 shaderModuleMap[*pShaderModule] = std::move(new_shader_module);
4322}
4323
John Zulauf22b0fbe2019-10-15 06:26:16 -06004324void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
4325 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
4326 VkResult result) {
4327 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004328 auto swapchain_state = GetShared<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004329
4330 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
4331
4332 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004333 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07004334 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07004335 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06004336
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004337 auto format_features =
4338 GetImageFormatFeatures(physical_device, device, pSwapchainImages[i], swapchain_state->image_create_info.format,
4339 swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004340
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06004341 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004342 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004343 if (!swapchain_image.fake_base_address) {
4344 auto size = image_state->fragment_encoder->TotalSize();
4345 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07004346 }
4347
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004348 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004349 swapchain_image.image_state = image_state.get();
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004350 imageMap[pSwapchainImages[i]] = std::move(image_state);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004351 }
4352 }
4353
4354 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004355 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
4356 }
4357}
sourav parmar35e7a002020-06-09 17:58:44 -07004358
sourav parmar35e7a002020-06-09 17:58:44 -07004359void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
4360 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004361 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07004362 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004363 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07004364 ACCELERATION_STRUCTURE_STATE_KHR *src_as_state = GetAccelerationStructureStateKHR(pInfo->src);
4365 ACCELERATION_STRUCTURE_STATE_KHR *dst_as_state = GetAccelerationStructureStateKHR(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07004366 if (dst_as_state != nullptr && src_as_state != nullptr) {
4367 dst_as_state->built = true;
4368 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004369 if (!disabled[command_buffer_state]) {
4370 cb_state->AddChild(dst_as_state);
4371 cb_state->AddChild(src_as_state);
4372 }
sourav parmar35e7a002020-06-09 17:58:44 -07004373 }
4374 }
4375}
Piers Daniell39842ee2020-07-10 16:42:33 -06004376
4377void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004378 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004379 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004380}
4381
4382void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004383 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004384 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004385}
4386
4387void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
4388 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004389 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004390 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004391 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06004392}
4393
4394void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4395 const VkViewport *pViewports) {
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_SETVIEWPORTWITHCOUNTEXT, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004398 uint32_t bits = (1u << viewportCount) - 1u;
4399 cb_state->viewportWithCountMask |= bits;
4400 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00004401 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004402 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004403
4404 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
4405 for (size_t i = 0; i < viewportCount; ++i) {
4406 cb_state->dynamicViewports[i] = pViewports[i];
4407 }
Piers Daniell39842ee2020-07-10 16:42:33 -06004408}
4409
4410void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4411 const VkRect2D *pScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004412 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004413 cb_state->RecordStateCmd(CMD_SETSCISSORWITHCOUNTEXT, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004414 uint32_t bits = (1u << scissorCount) - 1u;
4415 cb_state->scissorWithCountMask |= bits;
4416 cb_state->trashedScissorMask &= ~bits;
4417 cb_state->scissorWithCountCount = scissorCount;
4418 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06004419}
4420
4421void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4422 uint32_t bindingCount, const VkBuffer *pBuffers,
4423 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4424 const VkDeviceSize *pStrides) {
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_BINDVERTEXBUFFERS2EXT, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06004427
4428 uint32_t end = firstBinding + bindingCount;
4429 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
4430 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
4431 }
4432
4433 for (uint32_t i = 0; i < bindingCount; ++i) {
4434 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
locke-lunarg1ae57d62020-11-18 10:49:19 -07004435 vertex_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004436 vertex_buffer_binding.offset = pOffsets[i];
4437 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4438 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4439 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004440 if (!disabled[command_buffer_state] && pBuffers[i]) {
4441 cb_state->AddChild(vertex_buffer_binding.buffer_state.get());
Piers Daniell39842ee2020-07-10 16:42:33 -06004442 }
4443 }
4444}
4445
4446void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004447 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004448 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004449}
4450
4451void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004452 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004453 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004454}
4455
4456void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004457 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004458 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004459}
4460
4461void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4462 VkBool32 depthBoundsTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004463 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004464 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004465}
4466void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004467 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004468 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004469}
4470
4471void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4472 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4473 VkCompareOp compareOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004474 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004475 cb_state->RecordStateCmd(CMD_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004476}
locke-lunarg4189aa22020-10-21 00:23:48 -06004477
4478void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4479 uint32_t discardRectangleCount,
4480 const VkRect2D *pDiscardRectangles) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004481 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004482 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004483}
4484
4485void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4486 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
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_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004489}
4490
4491void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4492 VkCoarseSampleOrderTypeNV sampleOrderType,
4493 uint32_t customSampleOrderCount,
4494 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004495 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004496 cb_state->RecordStateCmd(CMD_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004497}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004498
4499void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
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_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004502}
4503
4504void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004505 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004506 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004507}
4508
4509void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4510 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004511 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004512 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004513}
4514
4515void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004516 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004517 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004518}
4519
4520void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4521 VkBool32 primitiveRestartEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004522 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004523 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004524}
Piers Daniell924cd832021-05-18 13:48:47 -06004525
4526void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4527 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4528 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4529 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004530 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004531 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4532
4533 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4534 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4535 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004536 if (pipeline_state->create_info.graphics.pDynamicState) {
4537 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4538 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004539 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4540 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4541 break;
4542 }
4543 }
4544 }
4545 }
4546 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004547}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004548
4549void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
4550 BUFFER_STATE *buffer_state = GetBufferState(pInfo->buffer);
4551 if (buffer_state) {
4552 // address is used for GPU-AV and ray tracing buffer validation
4553 buffer_state->deviceAddress = address;
4554 buffer_address_map_.emplace(address, buffer_state);
4555 }
4556}
4557
4558void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4559 VkDeviceAddress address) {
4560 RecordGetBufferDeviceAddress(pInfo, address);
4561}
4562
4563void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4564 VkDeviceAddress address) {
4565 RecordGetBufferDeviceAddress(pInfo, address);
4566}
4567
4568void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4569 VkDeviceAddress address) {
4570 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004571}
4572
4573std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4574 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004575 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004576}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004577
4578std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4579 const VkCommandBufferAllocateInfo *create_info,
4580 std::shared_ptr<COMMAND_POOL_STATE> &pool) {
4581 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4582}