blob: 1793638c00315c0fbc6f3ba92d8d182229d27118 [file] [log] [blame]
Yilong Lid23bc292022-01-02 22:06:12 -08001/* Copyright (c) 2015-2022 The Khronos Group Inc.
2 * Copyright (c) 2015-2022 Valve Corporation
3 * Copyright (c) 2015-2022 LunarG, Inc.
4 * Copyright (C) 2015-2022 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
Jeremy Gebben9f537102021-10-05 16:37:12 -060088std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> ValidationStateTracker::GetAttachmentViews(
John Zulauf64ffe552021-02-06 10:25:07 -070089 const VkRenderPassBeginInfo &rp_begin, const FRAMEBUFFER_STATE &fb_state) const {
Jeremy Gebben9f537102021-10-05 16:37:12 -060090 auto get_fn = [this](VkImageView handle) { return this->Get<IMAGE_VIEW_STATE>(handle); };
John Zulauf64ffe552021-02-06 10:25:07 -070091 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 Gebben082a9832021-10-28 13:40:11 -0600175 Add(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) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600179 Destroy<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -0600180}
181
182void ValidationStateTracker::PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
183 VkImageLayout imageLayout, const VkClearColorValue *pColor,
184 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600185 if (disabled[command_buffer_state]) return;
186
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600187 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600188 if (cb_node) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600189 cb_node->RecordTransferCmd(CMD_CLEARCOLORIMAGE, Get<IMAGE_STATE>(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600190 }
191}
192
193void ValidationStateTracker::PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image,
194 VkImageLayout imageLayout,
195 const VkClearDepthStencilValue *pDepthStencil,
196 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600197 if (disabled[command_buffer_state]) return;
198
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600199 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600200 if (cb_node) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600201 cb_node->RecordTransferCmd(CMD_CLEARDEPTHSTENCILIMAGE, Get<IMAGE_STATE>(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600202 }
203}
204
205void ValidationStateTracker::PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage,
206 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
207 uint32_t regionCount, const VkImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600208 if (disabled[command_buffer_state]) return;
209
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600210 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600211 cb_node->RecordTransferCmd(CMD_COPYIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600212}
213
Jeff Leger178b1e52020-10-05 12:22:23 -0400214void ValidationStateTracker::PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer,
215 const VkCopyImageInfo2KHR *pCopyImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600216 if (disabled[command_buffer_state]) return;
217
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600218 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600219 cb_node->RecordTransferCmd(CMD_COPYIMAGE2KHR, Get<IMAGE_STATE>(pCopyImageInfo->srcImage),
220 Get<IMAGE_STATE>(pCopyImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400221}
222
locke-lunargd556cc32019-09-17 01:21:23 -0600223void ValidationStateTracker::PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage,
224 VkImageLayout srcImageLayout, VkImage dstImage,
225 VkImageLayout dstImageLayout, uint32_t regionCount,
226 const VkImageResolve *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600227 if (disabled[command_buffer_state]) return;
228
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600229 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600230 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600231}
232
Jeff Leger178b1e52020-10-05 12:22:23 -0400233void ValidationStateTracker::PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer,
234 const VkResolveImageInfo2KHR *pResolveImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600235 if (disabled[command_buffer_state]) return;
236
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600237 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600238 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE2KHR, Get<IMAGE_STATE>(pResolveImageInfo->srcImage),
239 Get<IMAGE_STATE>(pResolveImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400240}
241
locke-lunargd556cc32019-09-17 01:21:23 -0600242void ValidationStateTracker::PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage,
243 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
244 uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600245 if (disabled[command_buffer_state]) return;
246
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600247 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600248 cb_node->RecordTransferCmd(CMD_BLITIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600249}
250
Jeff Leger178b1e52020-10-05 12:22:23 -0400251void ValidationStateTracker::PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer,
252 const VkBlitImageInfo2KHR *pBlitImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600253 if (disabled[command_buffer_state]) return;
254
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600255 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600256 cb_node->RecordTransferCmd(CMD_BLITIMAGE2KHR, Get<IMAGE_STATE>(pBlitImageInfo->srcImage),
257 Get<IMAGE_STATE>(pBlitImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400258}
259
locke-lunargd556cc32019-09-17 01:21:23 -0600260void ValidationStateTracker::PostCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
261 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer,
262 VkResult result) {
263 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600264
Jeremy Gebbenc8937b62021-09-24 15:50:56 -0600265 auto buffer_state = std::make_shared<BUFFER_STATE>(this, *pBuffer, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -0600266
James Rumble2f6e7bb2021-07-13 15:21:20 +0100267 if (pCreateInfo) {
268 const auto *opaque_capture_address = LvlFindInChain<VkBufferOpaqueCaptureAddressCreateInfo>(pCreateInfo->pNext);
269 if (opaque_capture_address) {
270 // address is used for GPU-AV and ray tracing buffer validation
271 buffer_state->deviceAddress = opaque_capture_address->opaqueCaptureAddress;
272 buffer_address_map_.emplace(opaque_capture_address->opaqueCaptureAddress, buffer_state.get());
273 }
274 }
Jeremy Gebben082a9832021-10-28 13:40:11 -0600275 Add(std::move(buffer_state));
locke-lunargd556cc32019-09-17 01:21:23 -0600276}
277
278void ValidationStateTracker::PostCallRecordCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
279 const VkAllocationCallbacks *pAllocator, VkBufferView *pView,
280 VkResult result) {
281 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600282
Jeremy Gebben9f537102021-10-05 16:37:12 -0600283 auto buffer_state = Get<BUFFER_STATE>(pCreateInfo->buffer);
locke-lunarg25b6c352020-08-06 17:44:18 -0600284
285 VkFormatProperties format_properties;
286 DispatchGetPhysicalDeviceFormatProperties(physical_device, pCreateInfo->format, &format_properties);
locke-lunarg25b6c352020-08-06 17:44:18 -0600287
Jeremy Gebben082a9832021-10-28 13:40:11 -0600288 Add(std::make_shared<BUFFER_VIEW_STATE>(buffer_state, *pView, pCreateInfo, format_properties.bufferFeatures));
locke-lunargd556cc32019-09-17 01:21:23 -0600289}
290
291void ValidationStateTracker::PostCallRecordCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
292 const VkAllocationCallbacks *pAllocator, VkImageView *pView,
293 VkResult result) {
294 if (result != VK_SUCCESS) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -0600295 auto image_state = Get<IMAGE_STATE>(pCreateInfo->image);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700296
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600297 VkFormatFeatureFlags format_features = 0;
298 if (image_state->HasAHBFormat() == true) {
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700299 // The ImageView uses same Image's format feature since they share same AHB
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600300 format_features = image_state->format_features;
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700301 } else {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600302 format_features = GetImageFormatFeatures(physical_device, device, image_state->image(), pCreateInfo->format,
303 image_state->createInfo.tiling);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700304 }
305
locke-lunarg9939d4b2020-10-26 20:11:08 -0600306 // 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 -0600307 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600308 if (IsExtEnabled(device_extensions.vk_ext_filter_cubic)) {
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700309 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600310 imageview_format_info.imageViewType = pCreateInfo->viewType;
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700311 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600312 image_format_info.type = image_state->createInfo.imageType;
313 image_format_info.format = image_state->createInfo.format;
314 image_format_info.tiling = image_state->createInfo.tiling;
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600315 auto usage_create_info = LvlFindInChain<VkImageViewUsageCreateInfo>(pCreateInfo->pNext);
316 image_format_info.usage = usage_create_info ? usage_create_info->usage : image_state->createInfo.usage;
locke-lunarg9939d4b2020-10-26 20:11:08 -0600317 image_format_info.flags = image_state->createInfo.flags;
318
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600319 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600320
321 DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_format_info, &image_format_properties);
322 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600323
Jeremy Gebben082a9832021-10-28 13:40:11 -0600324 Add(std::make_shared<IMAGE_VIEW_STATE>(image_state, *pView, pCreateInfo, format_features, filter_cubic_props));
locke-lunargd556cc32019-09-17 01:21:23 -0600325}
326
327void ValidationStateTracker::PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
328 uint32_t regionCount, const VkBufferCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600329 if (disabled[command_buffer_state]) return;
330
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600331 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600332 cb_node->RecordTransferCmd(CMD_COPYBUFFER, Get<BUFFER_STATE>(srcBuffer), Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600333}
334
Jeff Leger178b1e52020-10-05 12:22:23 -0400335void ValidationStateTracker::PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600336 const VkCopyBufferInfo2KHR *pCopyBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600337 if (disabled[command_buffer_state]) return;
338
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600339 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600340 cb_node->RecordTransferCmd(CMD_COPYBUFFER2KHR, Get<BUFFER_STATE>(pCopyBufferInfo->srcBuffer),
341 Get<BUFFER_STATE>(pCopyBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400342}
343
locke-lunargd556cc32019-09-17 01:21:23 -0600344void ValidationStateTracker::PreCallRecordDestroyImageView(VkDevice device, VkImageView imageView,
345 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600346 Destroy<IMAGE_VIEW_STATE>(imageView);
locke-lunargd556cc32019-09-17 01:21:23 -0600347}
348
349void ValidationStateTracker::PreCallRecordDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600350 Destroy<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600351}
352
353void ValidationStateTracker::PreCallRecordDestroyBufferView(VkDevice device, VkBufferView bufferView,
354 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600355 Destroy<BUFFER_VIEW_STATE>(bufferView);
locke-lunargd556cc32019-09-17 01:21:23 -0600356}
357
358void ValidationStateTracker::PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
359 VkDeviceSize size, uint32_t data) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600360 if (disabled[command_buffer_state]) return;
361
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600362 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600363 cb_node->RecordTransferCmd(CMD_FILLBUFFER, Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600364}
365
366void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
367 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
368 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600369 if (disabled[command_buffer_state]) return;
370
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600371 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600372
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600373 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER, Get<IMAGE_STATE>(srcImage), Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600374}
375
Jeff Leger178b1e52020-10-05 12:22:23 -0400376void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
377 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600378 if (disabled[command_buffer_state]) return;
379
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600380 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600381 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER2KHR, Get<IMAGE_STATE>(pCopyImageToBufferInfo->srcImage),
382 Get<BUFFER_STATE>(pCopyImageToBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400383}
384
locke-lunargd556cc32019-09-17 01:21:23 -0600385void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
386 VkImageLayout dstImageLayout, uint32_t regionCount,
387 const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600388 if (disabled[command_buffer_state]) return;
389
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600390 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600391 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE, Get<BUFFER_STATE>(srcBuffer), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600392}
393
Jeff Leger178b1e52020-10-05 12:22:23 -0400394void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
395 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600396 if (disabled[command_buffer_state]) return;
397
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600398 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600399 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE2KHR, Get<BUFFER_STATE>(pCopyBufferToImageInfo->srcBuffer),
400 Get<IMAGE_STATE>(pCopyBufferToImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400401}
402
sfricke-samsungbf1a2ed2020-06-14 23:31:00 -0700403// Gets union of all features defined by Potential Format Features
404// 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 -0700405VkFormatFeatureFlags ValidationStateTracker::GetPotentialFormatFeatures(VkFormat format) const {
406 VkFormatFeatureFlags format_features = 0;
407
408 if (format != VK_FORMAT_UNDEFINED) {
409 VkFormatProperties format_properties;
410 DispatchGetPhysicalDeviceFormatProperties(physical_device, format, &format_properties);
411 format_features |= format_properties.linearTilingFeatures;
412 format_features |= format_properties.optimalTilingFeatures;
sfricke-samsung45996a42021-09-16 13:45:27 -0700413 if (IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier)) {
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700414 // VK_KHR_get_physical_device_properties2 is required in this case
415 VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2};
416 VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
417 nullptr};
418 format_properties_2.pNext = (void *)&drm_properties_list;
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100419
420 // First call is to get the number of modifiers compatible with the queried format
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700421 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100422
423 std::vector<VkDrmFormatModifierPropertiesEXT> drm_properties;
424 drm_properties.resize(drm_properties_list.drmFormatModifierCount);
425 drm_properties_list.pDrmFormatModifierProperties = drm_properties.data();
426
427 // Second call, now with an allocated array in pDrmFormatModifierProperties, is to get the modifiers
428 // compatible with the queried format
429 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
430
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700431 for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
432 format_features |= drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
433 }
434 }
435 }
436
437 return format_features;
438}
439
locke-lunargd556cc32019-09-17 01:21:23 -0600440void ValidationStateTracker::PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
441 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice,
442 VkResult result) {
443 if (VK_SUCCESS != result) return;
444
Locke Linf3873542021-04-26 11:25:10 -0600445 ValidationObject *device_object = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
446 ValidationObject *validation_data = GetValidationObject(device_object->object_dispatch, this->container_type);
447 ValidationStateTracker *state_tracker = static_cast<ValidationStateTracker *>(validation_data);
448
locke-lunargd556cc32019-09-17 01:21:23 -0600449 const VkPhysicalDeviceFeatures *enabled_features_found = pCreateInfo->pEnabledFeatures;
450 if (nullptr == enabled_features_found) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700451 const auto *features2 = LvlFindInChain<VkPhysicalDeviceFeatures2>(pCreateInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -0600452 if (features2) {
453 enabled_features_found = &(features2->features);
454 }
455 }
456
locke-lunargd556cc32019-09-17 01:21:23 -0600457 if (nullptr == enabled_features_found) {
458 state_tracker->enabled_features.core = {};
459 } else {
460 state_tracker->enabled_features.core = *enabled_features_found;
461 }
462
locke-lunargd556cc32019-09-17 01:21:23 -0600463 // Save local link to this device's physical device state
Jeremy Gebben9f537102021-10-05 16:37:12 -0600464 state_tracker->physical_device_state = Get<PHYSICAL_DEVICE_STATE>(gpu).get();
locke-lunargd556cc32019-09-17 01:21:23 -0600465
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700466 const auto *vulkan_12_features = LvlFindInChain<VkPhysicalDeviceVulkan12Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700467 if (vulkan_12_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700468 state_tracker->enabled_features.core12 = *vulkan_12_features;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700469 } else {
sfricke-samsung27c70722020-05-02 08:42:39 -0700470 // Set Extension Feature Aliases to false as there is no struct to check
471 state_tracker->enabled_features.core12.drawIndirectCount = VK_FALSE;
472 state_tracker->enabled_features.core12.samplerMirrorClampToEdge = VK_FALSE;
473 state_tracker->enabled_features.core12.descriptorIndexing = VK_FALSE;
474 state_tracker->enabled_features.core12.samplerFilterMinmax = VK_FALSE;
475 state_tracker->enabled_features.core12.shaderOutputLayer = VK_FALSE;
476 state_tracker->enabled_features.core12.shaderOutputViewportIndex = VK_FALSE;
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800477 state_tracker->enabled_features.core12.subgroupBroadcastDynamicId = VK_FALSE;
sfricke-samsung27c70722020-05-02 08:42:39 -0700478
479 // These structs are only allowed in pNext chain if there is no VkPhysicalDeviceVulkan12Features
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700480
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700481 const auto *eight_bit_storage_features = LvlFindInChain<VkPhysicalDevice8BitStorageFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700482 if (eight_bit_storage_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700483 state_tracker->enabled_features.core12.storageBuffer8BitAccess = eight_bit_storage_features->storageBuffer8BitAccess;
484 state_tracker->enabled_features.core12.uniformAndStorageBuffer8BitAccess =
485 eight_bit_storage_features->uniformAndStorageBuffer8BitAccess;
486 state_tracker->enabled_features.core12.storagePushConstant8 = eight_bit_storage_features->storagePushConstant8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700487 }
488
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700489 const auto *float16_int8_features = LvlFindInChain<VkPhysicalDeviceShaderFloat16Int8Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700490 if (float16_int8_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700491 state_tracker->enabled_features.core12.shaderFloat16 = float16_int8_features->shaderFloat16;
492 state_tracker->enabled_features.core12.shaderInt8 = float16_int8_features->shaderInt8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700493 }
494
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700495 const auto *descriptor_indexing_features = LvlFindInChain<VkPhysicalDeviceDescriptorIndexingFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700496 if (descriptor_indexing_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700497 state_tracker->enabled_features.core12.shaderInputAttachmentArrayDynamicIndexing =
498 descriptor_indexing_features->shaderInputAttachmentArrayDynamicIndexing;
499 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayDynamicIndexing =
500 descriptor_indexing_features->shaderUniformTexelBufferArrayDynamicIndexing;
501 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayDynamicIndexing =
502 descriptor_indexing_features->shaderStorageTexelBufferArrayDynamicIndexing;
503 state_tracker->enabled_features.core12.shaderUniformBufferArrayNonUniformIndexing =
504 descriptor_indexing_features->shaderUniformBufferArrayNonUniformIndexing;
505 state_tracker->enabled_features.core12.shaderSampledImageArrayNonUniformIndexing =
506 descriptor_indexing_features->shaderSampledImageArrayNonUniformIndexing;
507 state_tracker->enabled_features.core12.shaderStorageBufferArrayNonUniformIndexing =
508 descriptor_indexing_features->shaderStorageBufferArrayNonUniformIndexing;
509 state_tracker->enabled_features.core12.shaderStorageImageArrayNonUniformIndexing =
510 descriptor_indexing_features->shaderStorageImageArrayNonUniformIndexing;
511 state_tracker->enabled_features.core12.shaderInputAttachmentArrayNonUniformIndexing =
512 descriptor_indexing_features->shaderInputAttachmentArrayNonUniformIndexing;
513 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayNonUniformIndexing =
514 descriptor_indexing_features->shaderUniformTexelBufferArrayNonUniformIndexing;
515 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayNonUniformIndexing =
516 descriptor_indexing_features->shaderStorageTexelBufferArrayNonUniformIndexing;
517 state_tracker->enabled_features.core12.descriptorBindingUniformBufferUpdateAfterBind =
518 descriptor_indexing_features->descriptorBindingUniformBufferUpdateAfterBind;
519 state_tracker->enabled_features.core12.descriptorBindingSampledImageUpdateAfterBind =
520 descriptor_indexing_features->descriptorBindingSampledImageUpdateAfterBind;
521 state_tracker->enabled_features.core12.descriptorBindingStorageImageUpdateAfterBind =
522 descriptor_indexing_features->descriptorBindingStorageImageUpdateAfterBind;
523 state_tracker->enabled_features.core12.descriptorBindingStorageBufferUpdateAfterBind =
524 descriptor_indexing_features->descriptorBindingStorageBufferUpdateAfterBind;
525 state_tracker->enabled_features.core12.descriptorBindingUniformTexelBufferUpdateAfterBind =
526 descriptor_indexing_features->descriptorBindingUniformTexelBufferUpdateAfterBind;
527 state_tracker->enabled_features.core12.descriptorBindingStorageTexelBufferUpdateAfterBind =
528 descriptor_indexing_features->descriptorBindingStorageTexelBufferUpdateAfterBind;
529 state_tracker->enabled_features.core12.descriptorBindingUpdateUnusedWhilePending =
530 descriptor_indexing_features->descriptorBindingUpdateUnusedWhilePending;
531 state_tracker->enabled_features.core12.descriptorBindingPartiallyBound =
532 descriptor_indexing_features->descriptorBindingPartiallyBound;
533 state_tracker->enabled_features.core12.descriptorBindingVariableDescriptorCount =
534 descriptor_indexing_features->descriptorBindingVariableDescriptorCount;
535 state_tracker->enabled_features.core12.runtimeDescriptorArray = descriptor_indexing_features->runtimeDescriptorArray;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700536 }
537
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700538 const auto *scalar_block_layout_features = LvlFindInChain<VkPhysicalDeviceScalarBlockLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700539 if (scalar_block_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700540 state_tracker->enabled_features.core12.scalarBlockLayout = scalar_block_layout_features->scalarBlockLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700541 }
542
543 const auto *imageless_framebuffer_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700544 LvlFindInChain<VkPhysicalDeviceImagelessFramebufferFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700545 if (imageless_framebuffer_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700546 state_tracker->enabled_features.core12.imagelessFramebuffer = imageless_framebuffer_features->imagelessFramebuffer;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700547 }
548
549 const auto *uniform_buffer_standard_layout_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700550 LvlFindInChain<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700551 if (uniform_buffer_standard_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700552 state_tracker->enabled_features.core12.uniformBufferStandardLayout =
553 uniform_buffer_standard_layout_features->uniformBufferStandardLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700554 }
555
556 const auto *subgroup_extended_types_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700557 LvlFindInChain<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700558 if (subgroup_extended_types_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700559 state_tracker->enabled_features.core12.shaderSubgroupExtendedTypes =
560 subgroup_extended_types_features->shaderSubgroupExtendedTypes;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700561 }
562
563 const auto *separate_depth_stencil_layouts_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700564 LvlFindInChain<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700565 if (separate_depth_stencil_layouts_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700566 state_tracker->enabled_features.core12.separateDepthStencilLayouts =
567 separate_depth_stencil_layouts_features->separateDepthStencilLayouts;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700568 }
569
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700570 const auto *host_query_reset_features = LvlFindInChain<VkPhysicalDeviceHostQueryResetFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700571 if (host_query_reset_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700572 state_tracker->enabled_features.core12.hostQueryReset = host_query_reset_features->hostQueryReset;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700573 }
574
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700575 const auto *timeline_semaphore_features = LvlFindInChain<VkPhysicalDeviceTimelineSemaphoreFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700576 if (timeline_semaphore_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700577 state_tracker->enabled_features.core12.timelineSemaphore = timeline_semaphore_features->timelineSemaphore;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700578 }
579
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700580 const auto *buffer_device_address = LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700581 if (buffer_device_address) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700582 state_tracker->enabled_features.core12.bufferDeviceAddress = buffer_device_address->bufferDeviceAddress;
583 state_tracker->enabled_features.core12.bufferDeviceAddressCaptureReplay =
584 buffer_device_address->bufferDeviceAddressCaptureReplay;
585 state_tracker->enabled_features.core12.bufferDeviceAddressMultiDevice =
586 buffer_device_address->bufferDeviceAddressMultiDevice;
587 }
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800588
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700589 const auto *atomic_int64_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicInt64Features>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800590 if (atomic_int64_features) {
591 state_tracker->enabled_features.core12.shaderBufferInt64Atomics = atomic_int64_features->shaderBufferInt64Atomics;
592 state_tracker->enabled_features.core12.shaderSharedInt64Atomics = atomic_int64_features->shaderSharedInt64Atomics;
593 }
594
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700595 const auto *memory_model_features = LvlFindInChain<VkPhysicalDeviceVulkanMemoryModelFeatures>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800596 if (memory_model_features) {
597 state_tracker->enabled_features.core12.vulkanMemoryModel = memory_model_features->vulkanMemoryModel;
598 state_tracker->enabled_features.core12.vulkanMemoryModelDeviceScope =
599 memory_model_features->vulkanMemoryModelDeviceScope;
600 state_tracker->enabled_features.core12.vulkanMemoryModelAvailabilityVisibilityChains =
601 memory_model_features->vulkanMemoryModelAvailabilityVisibilityChains;
602 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700603 }
604
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700605 const auto *vulkan_11_features = LvlFindInChain<VkPhysicalDeviceVulkan11Features>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700606 if (vulkan_11_features) {
607 state_tracker->enabled_features.core11 = *vulkan_11_features;
608 } else {
sfricke-samsung828e59d2021-08-22 23:20:49 -0700609 // These structs are only allowed in pNext chain if there is no vkPhysicalDeviceVulkan11Features
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700610
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700611 const auto *sixteen_bit_storage_features = LvlFindInChain<VkPhysicalDevice16BitStorageFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700612 if (sixteen_bit_storage_features) {
613 state_tracker->enabled_features.core11.storageBuffer16BitAccess =
614 sixteen_bit_storage_features->storageBuffer16BitAccess;
615 state_tracker->enabled_features.core11.uniformAndStorageBuffer16BitAccess =
616 sixteen_bit_storage_features->uniformAndStorageBuffer16BitAccess;
617 state_tracker->enabled_features.core11.storagePushConstant16 = sixteen_bit_storage_features->storagePushConstant16;
618 state_tracker->enabled_features.core11.storageInputOutput16 = sixteen_bit_storage_features->storageInputOutput16;
619 }
620
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700621 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700622 if (multiview_features) {
623 state_tracker->enabled_features.core11.multiview = multiview_features->multiview;
624 state_tracker->enabled_features.core11.multiviewGeometryShader = multiview_features->multiviewGeometryShader;
625 state_tracker->enabled_features.core11.multiviewTessellationShader = multiview_features->multiviewTessellationShader;
626 }
627
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700628 const auto *variable_pointers_features = LvlFindInChain<VkPhysicalDeviceVariablePointersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700629 if (variable_pointers_features) {
630 state_tracker->enabled_features.core11.variablePointersStorageBuffer =
631 variable_pointers_features->variablePointersStorageBuffer;
632 state_tracker->enabled_features.core11.variablePointers = variable_pointers_features->variablePointers;
633 }
634
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700635 const auto *protected_memory_features = LvlFindInChain<VkPhysicalDeviceProtectedMemoryFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700636 if (protected_memory_features) {
637 state_tracker->enabled_features.core11.protectedMemory = protected_memory_features->protectedMemory;
638 }
639
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700640 const auto *ycbcr_conversion_features = LvlFindInChain<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700641 if (ycbcr_conversion_features) {
642 state_tracker->enabled_features.core11.samplerYcbcrConversion = ycbcr_conversion_features->samplerYcbcrConversion;
643 }
644
645 const auto *shader_draw_parameters_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700646 LvlFindInChain<VkPhysicalDeviceShaderDrawParametersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700647 if (shader_draw_parameters_features) {
648 state_tracker->enabled_features.core11.shaderDrawParameters = shader_draw_parameters_features->shaderDrawParameters;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700649 }
650 }
651
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700652 const auto *device_group_ci = LvlFindInChain<VkDeviceGroupDeviceCreateInfo>(pCreateInfo->pNext);
Tony-LunarGca4891a2020-08-10 15:46:46 -0600653 if (device_group_ci) {
654 state_tracker->physical_device_count = device_group_ci->physicalDeviceCount;
655 state_tracker->device_group_create_info = *device_group_ci;
656 } else {
657 state_tracker->physical_device_count = 1;
658 }
locke-lunargd556cc32019-09-17 01:21:23 -0600659
sfricke-samsung828e59d2021-08-22 23:20:49 -0700660 // Features from other extensions passesd in create info
661 {
662 const auto *exclusive_scissor_features = LvlFindInChain<VkPhysicalDeviceExclusiveScissorFeaturesNV>(pCreateInfo->pNext);
663 if (exclusive_scissor_features) {
664 state_tracker->enabled_features.exclusive_scissor_features = *exclusive_scissor_features;
665 }
locke-lunargd556cc32019-09-17 01:21:23 -0600666
sfricke-samsung828e59d2021-08-22 23:20:49 -0700667 const auto *shading_rate_image_features = LvlFindInChain<VkPhysicalDeviceShadingRateImageFeaturesNV>(pCreateInfo->pNext);
668 if (shading_rate_image_features) {
669 state_tracker->enabled_features.shading_rate_image_features = *shading_rate_image_features;
670 }
locke-lunargd556cc32019-09-17 01:21:23 -0600671
sfricke-samsung828e59d2021-08-22 23:20:49 -0700672 const auto *mesh_shader_features = LvlFindInChain<VkPhysicalDeviceMeshShaderFeaturesNV>(pCreateInfo->pNext);
673 if (mesh_shader_features) {
674 state_tracker->enabled_features.mesh_shader_features = *mesh_shader_features;
675 }
locke-lunargd556cc32019-09-17 01:21:23 -0600676
sfricke-samsung828e59d2021-08-22 23:20:49 -0700677 const auto *inline_uniform_block_features =
678 LvlFindInChain<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(pCreateInfo->pNext);
679 if (inline_uniform_block_features) {
680 state_tracker->enabled_features.inline_uniform_block_features = *inline_uniform_block_features;
681 }
locke-lunargd556cc32019-09-17 01:21:23 -0600682
sfricke-samsung828e59d2021-08-22 23:20:49 -0700683 const auto *transform_feedback_features = LvlFindInChain<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(pCreateInfo->pNext);
684 if (transform_feedback_features) {
685 state_tracker->enabled_features.transform_feedback_features = *transform_feedback_features;
686 }
locke-lunargd556cc32019-09-17 01:21:23 -0600687
sfricke-samsung828e59d2021-08-22 23:20:49 -0700688 const auto *vtx_attrib_div_features = LvlFindInChain<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(pCreateInfo->pNext);
689 if (vtx_attrib_div_features) {
690 state_tracker->enabled_features.vtx_attrib_divisor_features = *vtx_attrib_div_features;
691 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700692
sfricke-samsung828e59d2021-08-22 23:20:49 -0700693 const auto *buffer_device_address_ext_features =
694 LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(pCreateInfo->pNext);
695 if (buffer_device_address_ext_features) {
696 state_tracker->enabled_features.buffer_device_address_ext_features = *buffer_device_address_ext_features;
697 }
locke-lunargd556cc32019-09-17 01:21:23 -0600698
sfricke-samsung828e59d2021-08-22 23:20:49 -0700699 const auto *cooperative_matrix_features = LvlFindInChain<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(pCreateInfo->pNext);
700 if (cooperative_matrix_features) {
701 state_tracker->enabled_features.cooperative_matrix_features = *cooperative_matrix_features;
702 }
locke-lunargd556cc32019-09-17 01:21:23 -0600703
sfricke-samsung828e59d2021-08-22 23:20:49 -0700704 const auto *compute_shader_derivatives_features =
705 LvlFindInChain<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(pCreateInfo->pNext);
706 if (compute_shader_derivatives_features) {
707 state_tracker->enabled_features.compute_shader_derivatives_features = *compute_shader_derivatives_features;
708 }
locke-lunargd556cc32019-09-17 01:21:23 -0600709
sfricke-samsung828e59d2021-08-22 23:20:49 -0700710 const auto *fragment_shader_barycentric_features =
711 LvlFindInChain<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(pCreateInfo->pNext);
712 if (fragment_shader_barycentric_features) {
713 state_tracker->enabled_features.fragment_shader_barycentric_features = *fragment_shader_barycentric_features;
714 }
locke-lunargd556cc32019-09-17 01:21:23 -0600715
sfricke-samsung828e59d2021-08-22 23:20:49 -0700716 const auto *shader_image_footprint_features =
717 LvlFindInChain<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(pCreateInfo->pNext);
718 if (shader_image_footprint_features) {
719 state_tracker->enabled_features.shader_image_footprint_features = *shader_image_footprint_features;
720 }
locke-lunargd556cc32019-09-17 01:21:23 -0600721
sfricke-samsung828e59d2021-08-22 23:20:49 -0700722 const auto *fragment_shader_interlock_features =
723 LvlFindInChain<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(pCreateInfo->pNext);
724 if (fragment_shader_interlock_features) {
725 state_tracker->enabled_features.fragment_shader_interlock_features = *fragment_shader_interlock_features;
726 }
locke-lunargd556cc32019-09-17 01:21:23 -0600727
sfricke-samsung828e59d2021-08-22 23:20:49 -0700728 const auto *demote_to_helper_invocation_features =
729 LvlFindInChain<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>(pCreateInfo->pNext);
730 if (demote_to_helper_invocation_features) {
731 state_tracker->enabled_features.demote_to_helper_invocation_features = *demote_to_helper_invocation_features;
732 }
locke-lunargd556cc32019-09-17 01:21:23 -0600733
sfricke-samsung828e59d2021-08-22 23:20:49 -0700734 const auto *texel_buffer_alignment_features =
735 LvlFindInChain<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(pCreateInfo->pNext);
736 if (texel_buffer_alignment_features) {
737 state_tracker->enabled_features.texel_buffer_alignment_features = *texel_buffer_alignment_features;
738 }
locke-lunargd556cc32019-09-17 01:21:23 -0600739
sfricke-samsung828e59d2021-08-22 23:20:49 -0700740 const auto *pipeline_exe_props_features =
741 LvlFindInChain<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(pCreateInfo->pNext);
742 if (pipeline_exe_props_features) {
743 state_tracker->enabled_features.pipeline_exe_props_features = *pipeline_exe_props_features;
744 }
locke-lunargd556cc32019-09-17 01:21:23 -0600745
sfricke-samsung828e59d2021-08-22 23:20:49 -0700746 const auto *dedicated_allocation_image_aliasing_features =
747 LvlFindInChain<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(pCreateInfo->pNext);
748 if (dedicated_allocation_image_aliasing_features) {
749 state_tracker->enabled_features.dedicated_allocation_image_aliasing_features =
750 *dedicated_allocation_image_aliasing_features;
751 }
Jeff Bolz82f854d2019-09-17 14:56:47 -0500752
sfricke-samsung828e59d2021-08-22 23:20:49 -0700753 const auto *performance_query_features = LvlFindInChain<VkPhysicalDevicePerformanceQueryFeaturesKHR>(pCreateInfo->pNext);
754 if (performance_query_features) {
755 state_tracker->enabled_features.performance_query_features = *performance_query_features;
756 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +0100757
sfricke-samsung828e59d2021-08-22 23:20:49 -0700758 const auto *device_coherent_memory_features = LvlFindInChain<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(pCreateInfo->pNext);
759 if (device_coherent_memory_features) {
760 state_tracker->enabled_features.device_coherent_memory_features = *device_coherent_memory_features;
761 }
Tobias Hector782bcde2019-11-28 16:19:42 +0000762
sfricke-samsung828e59d2021-08-22 23:20:49 -0700763 const auto *ycbcr_image_array_features = LvlFindInChain<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(pCreateInfo->pNext);
764 if (ycbcr_image_array_features) {
765 state_tracker->enabled_features.ycbcr_image_array_features = *ycbcr_image_array_features;
766 }
sfricke-samsungcead0802020-01-30 22:20:10 -0800767
sfricke-samsung828e59d2021-08-22 23:20:49 -0700768 const auto *ray_query_features = LvlFindInChain<VkPhysicalDeviceRayQueryFeaturesKHR>(pCreateInfo->pNext);
769 if (ray_query_features) {
770 state_tracker->enabled_features.ray_query_features = *ray_query_features;
771 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700772
sfricke-samsung828e59d2021-08-22 23:20:49 -0700773 const auto *ray_tracing_pipeline_features =
774 LvlFindInChain<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>(pCreateInfo->pNext);
775 if (ray_tracing_pipeline_features) {
776 state_tracker->enabled_features.ray_tracing_pipeline_features = *ray_tracing_pipeline_features;
777 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700778
sfricke-samsung828e59d2021-08-22 23:20:49 -0700779 const auto *ray_tracing_acceleration_structure_features =
780 LvlFindInChain<VkPhysicalDeviceAccelerationStructureFeaturesKHR>(pCreateInfo->pNext);
781 if (ray_tracing_acceleration_structure_features) {
782 state_tracker->enabled_features.ray_tracing_acceleration_structure_features =
783 *ray_tracing_acceleration_structure_features;
784 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500785
sfricke-samsung828e59d2021-08-22 23:20:49 -0700786 const auto *robustness2_features = LvlFindInChain<VkPhysicalDeviceRobustness2FeaturesEXT>(pCreateInfo->pNext);
787 if (robustness2_features) {
788 state_tracker->enabled_features.robustness2_features = *robustness2_features;
789 }
Jeff Bolz165818a2020-05-08 11:19:03 -0500790
sfricke-samsung828e59d2021-08-22 23:20:49 -0700791 const auto *fragment_density_map_features =
792 LvlFindInChain<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(pCreateInfo->pNext);
793 if (fragment_density_map_features) {
794 state_tracker->enabled_features.fragment_density_map_features = *fragment_density_map_features;
795 }
janharaldfredriksen-arm3b793772020-05-12 18:55:53 +0200796
sfricke-samsung828e59d2021-08-22 23:20:49 -0700797 const auto *fragment_density_map_features2 =
798 LvlFindInChain<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(pCreateInfo->pNext);
799 if (fragment_density_map_features2) {
800 state_tracker->enabled_features.fragment_density_map2_features = *fragment_density_map_features2;
801 }
janharaldfredriksen-arm36e17572020-07-07 13:59:28 +0200802
sfricke-samsung828e59d2021-08-22 23:20:49 -0700803 const auto *astc_decode_features = LvlFindInChain<VkPhysicalDeviceASTCDecodeFeaturesEXT>(pCreateInfo->pNext);
804 if (astc_decode_features) {
805 state_tracker->enabled_features.astc_decode_features = *astc_decode_features;
806 }
sfricke-samsung0c4a06f2020-06-27 01:24:32 -0700807
sfricke-samsung828e59d2021-08-22 23:20:49 -0700808 const auto *custom_border_color_features = LvlFindInChain<VkPhysicalDeviceCustomBorderColorFeaturesEXT>(pCreateInfo->pNext);
809 if (custom_border_color_features) {
810 state_tracker->enabled_features.custom_border_color_features = *custom_border_color_features;
811 }
Tony-LunarG7337b312020-04-15 16:40:25 -0600812
sfricke-samsung828e59d2021-08-22 23:20:49 -0700813 const auto *pipeline_creation_cache_control_features =
814 LvlFindInChain<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>(pCreateInfo->pNext);
815 if (pipeline_creation_cache_control_features) {
816 state_tracker->enabled_features.pipeline_creation_cache_control_features = *pipeline_creation_cache_control_features;
817 }
sfricke-samsungfd661d62020-05-16 00:57:27 -0700818
sfricke-samsung828e59d2021-08-22 23:20:49 -0700819 const auto *fragment_shading_rate_features =
820 LvlFindInChain<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(pCreateInfo->pNext);
821 if (fragment_shading_rate_features) {
822 state_tracker->enabled_features.fragment_shading_rate_features = *fragment_shading_rate_features;
823 }
Tobias Hector6663c9b2020-11-05 10:18:02 +0000824
sfricke-samsung828e59d2021-08-22 23:20:49 -0700825 const auto *extended_dynamic_state_features =
826 LvlFindInChain<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(pCreateInfo->pNext);
827 if (extended_dynamic_state_features) {
828 state_tracker->enabled_features.extended_dynamic_state_features = *extended_dynamic_state_features;
829 }
Piers Daniell39842ee2020-07-10 16:42:33 -0600830
sfricke-samsung828e59d2021-08-22 23:20:49 -0700831 const auto *extended_dynamic_state2_features =
832 LvlFindInChain<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>(pCreateInfo->pNext);
833 if (extended_dynamic_state2_features) {
834 state_tracker->enabled_features.extended_dynamic_state2_features = *extended_dynamic_state2_features;
835 }
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -0700836
sfricke-samsung828e59d2021-08-22 23:20:49 -0700837 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
838 if (multiview_features) {
839 state_tracker->enabled_features.multiview_features = *multiview_features;
840 }
locke-lunarg3fa463a2020-10-23 16:39:04 -0600841
sfricke-samsung828e59d2021-08-22 23:20:49 -0700842 const auto *portability_features = LvlFindInChain<VkPhysicalDevicePortabilitySubsetFeaturesKHR>(pCreateInfo->pNext);
843 if (portability_features) {
844 state_tracker->enabled_features.portability_subset_features = *portability_features;
845 }
Nathaniel Cesariob3f2d702020-11-09 09:20:49 -0700846
sfricke-samsung828e59d2021-08-22 23:20:49 -0700847 const auto *shader_integer_functions2_features =
848 LvlFindInChain<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(pCreateInfo->pNext);
849 if (shader_integer_functions2_features) {
850 state_tracker->enabled_features.shader_integer_functions2_features = *shader_integer_functions2_features;
851 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800852
sfricke-samsung828e59d2021-08-22 23:20:49 -0700853 const auto *shader_sm_builtins_features = LvlFindInChain<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>(pCreateInfo->pNext);
854 if (shader_sm_builtins_features) {
855 state_tracker->enabled_features.shader_sm_builtins_features = *shader_sm_builtins_features;
856 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800857
sfricke-samsung828e59d2021-08-22 23:20:49 -0700858 const auto *shader_atomic_float_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>(pCreateInfo->pNext);
859 if (shader_atomic_float_features) {
860 state_tracker->enabled_features.shader_atomic_float_features = *shader_atomic_float_features;
861 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800862
sfricke-samsung828e59d2021-08-22 23:20:49 -0700863 const auto *shader_image_atomic_int64_features =
864 LvlFindInChain<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>(pCreateInfo->pNext);
865 if (shader_image_atomic_int64_features) {
866 state_tracker->enabled_features.shader_image_atomic_int64_features = *shader_image_atomic_int64_features;
867 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800868
sfricke-samsung828e59d2021-08-22 23:20:49 -0700869 const auto *shader_clock_features = LvlFindInChain<VkPhysicalDeviceShaderClockFeaturesKHR>(pCreateInfo->pNext);
870 if (shader_clock_features) {
871 state_tracker->enabled_features.shader_clock_features = *shader_clock_features;
872 }
sfricke-samsung486a51e2021-01-02 00:10:15 -0800873
sfricke-samsung828e59d2021-08-22 23:20:49 -0700874 const auto *conditional_rendering_features =
875 LvlFindInChain<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(pCreateInfo->pNext);
876 if (conditional_rendering_features) {
877 state_tracker->enabled_features.conditional_rendering_features = *conditional_rendering_features;
878 }
Jeremy Gebben5f585ae2021-02-02 09:03:06 -0700879
sfricke-samsung828e59d2021-08-22 23:20:49 -0700880 const auto *workgroup_memory_explicit_layout_features =
881 LvlFindInChain<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>(pCreateInfo->pNext);
882 if (workgroup_memory_explicit_layout_features) {
883 state_tracker->enabled_features.workgroup_memory_explicit_layout_features = *workgroup_memory_explicit_layout_features;
884 }
Shannon McPhersondb287d42021-02-02 15:27:32 -0700885
sfricke-samsung828e59d2021-08-22 23:20:49 -0700886 const auto *synchronization2_features = LvlFindInChain<VkPhysicalDeviceSynchronization2FeaturesKHR>(pCreateInfo->pNext);
887 if (synchronization2_features) {
888 state_tracker->enabled_features.synchronization2_features = *synchronization2_features;
889 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -0700890
sfricke-samsung828e59d2021-08-22 23:20:49 -0700891 const auto *provoking_vertex_features = lvl_find_in_chain<VkPhysicalDeviceProvokingVertexFeaturesEXT>(pCreateInfo->pNext);
892 if (provoking_vertex_features) {
893 state_tracker->enabled_features.provoking_vertex_features = *provoking_vertex_features;
894 }
Locke Linf3873542021-04-26 11:25:10 -0600895
sfricke-samsung828e59d2021-08-22 23:20:49 -0700896 const auto *vertex_input_dynamic_state_features =
897 LvlFindInChain<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>(pCreateInfo->pNext);
898 if (vertex_input_dynamic_state_features) {
899 state_tracker->enabled_features.vertex_input_dynamic_state_features = *vertex_input_dynamic_state_features;
900 }
Piers Daniellcb6d8032021-04-19 18:51:26 -0600901
sfricke-samsung828e59d2021-08-22 23:20:49 -0700902 const auto *inherited_viewport_scissor_features =
903 LvlFindInChain<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(pCreateInfo->pNext);
904 if (inherited_viewport_scissor_features) {
905 state_tracker->enabled_features.inherited_viewport_scissor_features = *inherited_viewport_scissor_features;
906 }
David Zhao Akeley44139b12021-04-26 16:16:13 -0700907
sfricke-samsung828e59d2021-08-22 23:20:49 -0700908 const auto *multi_draw_features = LvlFindInChain<VkPhysicalDeviceMultiDrawFeaturesEXT>(pCreateInfo->pNext);
909 if (multi_draw_features) {
910 state_tracker->enabled_features.multi_draw_features = *multi_draw_features;
911 }
Tony-LunarG4490de42021-06-21 15:49:19 -0600912
sfricke-samsung828e59d2021-08-22 23:20:49 -0700913 const auto *color_write_features = LvlFindInChain<VkPhysicalDeviceColorWriteEnableFeaturesEXT>(pCreateInfo->pNext);
914 if (color_write_features) {
915 state_tracker->enabled_features.color_write_features = *color_write_features;
916 }
ziga-lunarg29ba2b92021-07-20 21:51:45 +0200917
sfricke-samsung828e59d2021-08-22 23:20:49 -0700918 const auto *shader_atomic_float2_features =
919 LvlFindInChain<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT>(pCreateInfo->pNext);
920 if (shader_atomic_float2_features) {
921 state_tracker->enabled_features.shader_atomic_float2_features = *shader_atomic_float2_features;
922 }
Mike Schuchardtb3870ea2021-07-20 18:56:51 -0700923
sfricke-samsung828e59d2021-08-22 23:20:49 -0700924 const auto *present_id_features = LvlFindInChain<VkPhysicalDevicePresentIdFeaturesKHR>(pCreateInfo->pNext);
925 if (present_id_features) {
926 state_tracker->enabled_features.present_id_features = *present_id_features;
927 }
Tony-LunarG6f887e52021-07-27 11:23:14 -0600928
sfricke-samsung828e59d2021-08-22 23:20:49 -0700929 const auto *present_wait_features = LvlFindInChain<VkPhysicalDevicePresentWaitFeaturesKHR>(pCreateInfo->pNext);
930 if (present_wait_features) {
931 state_tracker->enabled_features.present_wait_features = *present_wait_features;
932 }
Mike Schuchardt9f65d3f2021-08-25 15:11:39 -0700933
934 const auto *ray_tracing_motion_blur_features =
935 LvlFindInChain<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV>(pCreateInfo->pNext);
936 if (ray_tracing_motion_blur_features) {
937 state_tracker->enabled_features.ray_tracing_motion_blur_features = *ray_tracing_motion_blur_features;
938 }
Mike Schuchardtb4d90452021-08-30 09:24:51 -0700939
940 const auto *shader_integer_dot_product_features =
941 LvlFindInChain<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR>(pCreateInfo->pNext);
942 if (shader_integer_dot_product_features) {
943 state_tracker->enabled_features.shader_integer_dot_product_features = *shader_integer_dot_product_features;
944 }
Tony-LunarG0b0d8be2021-08-30 13:50:38 -0600945
946 const auto *primitive_topology_list_restart_features =
947 LvlFindInChain<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>(pCreateInfo->pNext);
948 if (primitive_topology_list_restart_features) {
949 state_tracker->enabled_features.primitive_topology_list_restart_features = *primitive_topology_list_restart_features;
950 }
sfricke-samsung10b35ce2021-09-29 08:50:20 -0700951
952 const auto *rgba10x6_formats_features = LvlFindInChain<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT>(pCreateInfo->pNext);
953 if (rgba10x6_formats_features) {
954 state_tracker->enabled_features.rgba10x6_formats_features = *rgba10x6_formats_features;
955 }
sfricke-samsungd3c917b2021-10-19 08:24:57 -0700956
957 const auto *maintenance4_features = LvlFindInChain<VkPhysicalDeviceMaintenance4FeaturesKHR>(pCreateInfo->pNext);
958 if (maintenance4_features) {
959 state_tracker->enabled_features.maintenance4_features = *maintenance4_features;
960 }
Jeremy Gebbence23dac2021-11-10 10:19:42 -0700961
962 const auto *dynamic_rendering_features = LvlFindInChain<VkPhysicalDeviceDynamicRenderingFeaturesKHR>(pCreateInfo->pNext);
963 if (dynamic_rendering_features) {
964 state_tracker->enabled_features.dynamic_rendering_features = *dynamic_rendering_features;
965 }
Tony-LunarG69604c42021-11-22 16:00:12 -0700966
967 const auto *image_view_min_lod_features = LvlFindInChain<VkPhysicalDeviceImageViewMinLodFeaturesEXT>(pCreateInfo->pNext);
968 if (image_view_min_lod_features) {
969 state_tracker->enabled_features.image_view_min_lod_features = *image_view_min_lod_features;
970 }
Tony-LunarG6f887e52021-07-27 11:23:14 -0600971 }
972
ziga-lunarg73163742021-08-25 13:15:29 +0200973 const auto *subgroup_size_control_features = LvlFindInChain<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>(pCreateInfo->pNext);
974 if (subgroup_size_control_features) {
975 state_tracker->enabled_features.subgroup_size_control_features = *subgroup_size_control_features;
976 }
977
locke-lunargd556cc32019-09-17 01:21:23 -0600978 // Store physical device properties and physical device mem limits into CoreChecks structs
979 DispatchGetPhysicalDeviceMemoryProperties(gpu, &state_tracker->phys_dev_mem_props);
980 DispatchGetPhysicalDeviceProperties(gpu, &state_tracker->phys_dev_props);
981
982 const auto &dev_ext = state_tracker->device_extensions;
983 auto *phys_dev_props = &state_tracker->phys_dev_ext_props;
984
sfricke-samsung828e59d2021-08-22 23:20:49 -0700985 // Vulkan 1.2 can get properties from single struct, otherwise need to add to it per extension
sfricke-samsung45996a42021-09-16 13:45:27 -0700986 if (dev_ext.vk_feature_version_1_2) {
987 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core11);
988 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core12);
sfricke-samsung828e59d2021-08-22 23:20:49 -0700989 } else {
990 // VkPhysicalDeviceVulkan11Properties
991 //
992 // Can ingnore VkPhysicalDeviceIDProperties as it has no validation purpose
993
994 if (dev_ext.vk_khr_multiview) {
995 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
996 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &multiview_props);
997 state_tracker->phys_dev_props_core11.maxMultiviewViewCount = multiview_props.maxMultiviewViewCount;
998 state_tracker->phys_dev_props_core11.maxMultiviewInstanceIndex = multiview_props.maxMultiviewInstanceIndex;
999 }
1000
1001 if (dev_ext.vk_khr_maintenance3) {
1002 auto maintenance3_props = LvlInitStruct<VkPhysicalDeviceMaintenance3Properties>();
1003 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_maintenance3, &maintenance3_props);
1004 state_tracker->phys_dev_props_core11.maxPerSetDescriptors = maintenance3_props.maxPerSetDescriptors;
1005 state_tracker->phys_dev_props_core11.maxMemoryAllocationSize = maintenance3_props.maxMemoryAllocationSize;
1006 }
1007
1008 // Some 1.1 properties were added to core without previous extensions
1009 if (state_tracker->api_version >= VK_API_VERSION_1_1) {
1010 auto subgroup_prop = LvlInitStruct<VkPhysicalDeviceSubgroupProperties>();
1011 auto protected_memory_prop = LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>(&subgroup_prop);
1012 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&protected_memory_prop);
1013 instance_dispatch_table.GetPhysicalDeviceProperties2(gpu, &prop2);
1014
1015 state_tracker->phys_dev_props_core11.subgroupSize = subgroup_prop.subgroupSize;
1016 state_tracker->phys_dev_props_core11.subgroupSupportedStages = subgroup_prop.supportedStages;
1017 state_tracker->phys_dev_props_core11.subgroupSupportedOperations = subgroup_prop.supportedOperations;
1018 state_tracker->phys_dev_props_core11.subgroupQuadOperationsInAllStages = subgroup_prop.quadOperationsInAllStages;
1019
1020 state_tracker->phys_dev_props_core11.protectedNoFault = protected_memory_prop.protectedNoFault;
1021 }
1022
1023 // VkPhysicalDeviceVulkan12Properties
1024 //
1025 // Can ingnore VkPhysicalDeviceDriverProperties as it has no validation purpose
1026
1027 if (dev_ext.vk_ext_descriptor_indexing) {
1028 auto descriptor_indexing_prop = LvlInitStruct<VkPhysicalDeviceDescriptorIndexingProperties>();
1029 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_descriptor_indexing, &descriptor_indexing_prop);
1030 state_tracker->phys_dev_props_core12.maxUpdateAfterBindDescriptorsInAllPools =
1031 descriptor_indexing_prop.maxUpdateAfterBindDescriptorsInAllPools;
1032 state_tracker->phys_dev_props_core12.shaderUniformBufferArrayNonUniformIndexingNative =
1033 descriptor_indexing_prop.shaderUniformBufferArrayNonUniformIndexingNative;
1034 state_tracker->phys_dev_props_core12.shaderSampledImageArrayNonUniformIndexingNative =
1035 descriptor_indexing_prop.shaderSampledImageArrayNonUniformIndexingNative;
1036 state_tracker->phys_dev_props_core12.shaderStorageBufferArrayNonUniformIndexingNative =
1037 descriptor_indexing_prop.shaderStorageBufferArrayNonUniformIndexingNative;
1038 state_tracker->phys_dev_props_core12.shaderStorageImageArrayNonUniformIndexingNative =
1039 descriptor_indexing_prop.shaderStorageImageArrayNonUniformIndexingNative;
1040 state_tracker->phys_dev_props_core12.shaderInputAttachmentArrayNonUniformIndexingNative =
1041 descriptor_indexing_prop.shaderInputAttachmentArrayNonUniformIndexingNative;
1042 state_tracker->phys_dev_props_core12.robustBufferAccessUpdateAfterBind =
1043 descriptor_indexing_prop.robustBufferAccessUpdateAfterBind;
1044 state_tracker->phys_dev_props_core12.quadDivergentImplicitLod = descriptor_indexing_prop.quadDivergentImplicitLod;
1045 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSamplers =
1046 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSamplers;
1047 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindUniformBuffers =
1048 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindUniformBuffers;
1049 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageBuffers =
1050 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageBuffers;
1051 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSampledImages =
1052 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSampledImages;
1053 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageImages =
1054 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageImages;
1055 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindInputAttachments =
1056 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindInputAttachments;
1057 state_tracker->phys_dev_props_core12.maxPerStageUpdateAfterBindResources =
1058 descriptor_indexing_prop.maxPerStageUpdateAfterBindResources;
1059 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSamplers =
1060 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSamplers;
1061 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffers =
1062 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffers;
1063 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic =
1064 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
1065 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffers =
1066 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffers;
1067 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic =
1068 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
1069 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSampledImages =
1070 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSampledImages;
1071 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageImages =
1072 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageImages;
1073 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindInputAttachments =
1074 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindInputAttachments;
1075 }
1076
1077 if (dev_ext.vk_khr_depth_stencil_resolve) {
1078 auto depth_stencil_resolve_props = LvlInitStruct<VkPhysicalDeviceDepthStencilResolveProperties>();
1079 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_depth_stencil_resolve, &depth_stencil_resolve_props);
1080 state_tracker->phys_dev_props_core12.supportedDepthResolveModes =
1081 depth_stencil_resolve_props.supportedDepthResolveModes;
1082 state_tracker->phys_dev_props_core12.supportedStencilResolveModes =
1083 depth_stencil_resolve_props.supportedStencilResolveModes;
1084 state_tracker->phys_dev_props_core12.independentResolveNone = depth_stencil_resolve_props.independentResolveNone;
1085 state_tracker->phys_dev_props_core12.independentResolve = depth_stencil_resolve_props.independentResolve;
1086 }
1087
1088 if (dev_ext.vk_khr_timeline_semaphore) {
1089 auto timeline_semaphore_props = LvlInitStruct<VkPhysicalDeviceTimelineSemaphoreProperties>();
1090 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_timeline_semaphore, &timeline_semaphore_props);
1091 state_tracker->phys_dev_props_core12.maxTimelineSemaphoreValueDifference =
1092 timeline_semaphore_props.maxTimelineSemaphoreValueDifference;
1093 }
1094
1095 if (dev_ext.vk_ext_sampler_filter_minmax) {
1096 auto sampler_filter_minmax_props = LvlInitStruct<VkPhysicalDeviceSamplerFilterMinmaxProperties>();
1097 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sampler_filter_minmax, &sampler_filter_minmax_props);
1098 state_tracker->phys_dev_props_core12.filterMinmaxSingleComponentFormats =
1099 sampler_filter_minmax_props.filterMinmaxSingleComponentFormats;
1100 state_tracker->phys_dev_props_core12.filterMinmaxImageComponentMapping =
1101 sampler_filter_minmax_props.filterMinmaxImageComponentMapping;
1102 }
1103
1104 if (dev_ext.vk_khr_shader_float_controls) {
1105 auto float_controls_props = LvlInitStruct<VkPhysicalDeviceFloatControlsProperties>();
1106 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_shader_float_controls, &float_controls_props);
1107 state_tracker->phys_dev_props_core12.denormBehaviorIndependence = float_controls_props.denormBehaviorIndependence;
1108 state_tracker->phys_dev_props_core12.roundingModeIndependence = float_controls_props.roundingModeIndependence;
1109 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat16 =
1110 float_controls_props.shaderSignedZeroInfNanPreserveFloat16;
1111 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat32 =
1112 float_controls_props.shaderSignedZeroInfNanPreserveFloat32;
1113 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat64 =
1114 float_controls_props.shaderSignedZeroInfNanPreserveFloat64;
1115 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat16 = float_controls_props.shaderDenormPreserveFloat16;
1116 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat32 = float_controls_props.shaderDenormPreserveFloat32;
1117 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat64 = float_controls_props.shaderDenormPreserveFloat64;
1118 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat16 =
1119 float_controls_props.shaderDenormFlushToZeroFloat16;
1120 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat32 =
1121 float_controls_props.shaderDenormFlushToZeroFloat32;
1122 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat64 =
1123 float_controls_props.shaderDenormFlushToZeroFloat64;
1124 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat16 = float_controls_props.shaderRoundingModeRTEFloat16;
1125 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat32 = float_controls_props.shaderRoundingModeRTEFloat32;
1126 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat64 = float_controls_props.shaderRoundingModeRTEFloat64;
1127 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat16 = float_controls_props.shaderRoundingModeRTZFloat16;
1128 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat32 = float_controls_props.shaderRoundingModeRTZFloat32;
1129 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat64 = float_controls_props.shaderRoundingModeRTZFloat64;
1130 }
locke-lunargd556cc32019-09-17 01:21:23 -06001131 }
1132
sfricke-samsung828e59d2021-08-22 23:20:49 -07001133 // Extensions with properties to extract to DeviceExtensionProperties
1134 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_push_descriptor, &phys_dev_props->push_descriptor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001135 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_shading_rate_image, &phys_dev_props->shading_rate_image_props);
1136 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_mesh_shader, &phys_dev_props->mesh_shader_props);
1137 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_inline_uniform_block, &phys_dev_props->inline_uniform_block_props);
1138 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_vertex_attribute_divisor, &phys_dev_props->vtx_attrib_divisor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001139 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_transform_feedback, &phys_dev_props->transform_feedback_props);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001140 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_ray_tracing, &phys_dev_props->ray_tracing_propsNV);
sourav parmarcd5fb182020-07-17 12:58:44 -07001141 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_ray_tracing_pipeline, &phys_dev_props->ray_tracing_propsKHR);
1142 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_acceleration_structure, &phys_dev_props->acc_structure_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001143 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_texel_buffer_alignment, &phys_dev_props->texel_buffer_alignment_props);
1144 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map, &phys_dev_props->fragment_density_map_props);
Mike Schuchardtc57de4a2021-07-20 17:26:32 -07001145 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map2, &phys_dev_props->fragment_density_map2_props);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001146 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_performance_query, &phys_dev_props->performance_query_props);
sfricke-samsung8f658d42020-05-03 20:12:24 -07001147 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sample_locations, &phys_dev_props->sample_locations_props);
Tony-LunarG7337b312020-04-15 16:40:25 -06001148 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_custom_border_color, &phys_dev_props->custom_border_color_props);
locke-lunarg3fa463a2020-10-23 16:39:04 -06001149 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &phys_dev_props->multiview_props);
Nathaniel Cesario3291c912020-11-17 16:54:41 -07001150 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_portability_subset, &phys_dev_props->portability_props);
sfricke-samsung828e59d2021-08-22 23:20:49 -07001151 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_fragment_shading_rate, &phys_dev_props->fragment_shading_rate_props);
Locke Lin016d8482021-05-27 12:11:31 -06001152 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_provoking_vertex, &phys_dev_props->provoking_vertex_props);
Tony-LunarG4490de42021-06-21 15:49:19 -06001153 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_multi_draw, &phys_dev_props->multi_draw_props);
ziga-lunarg128904a2021-07-30 13:49:01 +02001154 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_discard_rectangles, &phys_dev_props->discard_rectangle_props);
ziga-lunarg86492812021-08-05 23:58:16 +02001155 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_blend_operation_advanced, &phys_dev_props->blend_operation_advanced_props);
ziga-lunargbd8ded62021-09-20 18:24:39 +02001156 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_conservative_rasterization, &phys_dev_props->conservative_rasterization_props);
ziga-lunarg11fecb92021-09-20 16:48:06 +02001157 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_subgroup_size_control, &phys_dev_props->subgroup_size_control_props);
Piers Daniell41b8c5d2020-01-10 15:42:00 -07001158
sfricke-samsung45996a42021-09-16 13:45:27 -07001159 if (IsExtEnabled(dev_ext.vk_nv_cooperative_matrix)) {
locke-lunargd556cc32019-09-17 01:21:23 -06001160 // Get the needed cooperative_matrix properties
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001161 auto cooperative_matrix_props = LvlInitStruct<VkPhysicalDeviceCooperativeMatrixPropertiesNV>();
1162 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&cooperative_matrix_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001163 instance_dispatch_table.GetPhysicalDeviceProperties2KHR(gpu, &prop2);
1164 state_tracker->phys_dev_ext_props.cooperative_matrix_props = cooperative_matrix_props;
1165
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001166 uint32_t num_cooperative_matrix_properties = 0;
1167 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties, NULL);
1168 state_tracker->cooperative_matrix_properties.resize(num_cooperative_matrix_properties,
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001169 LvlInitStruct<VkCooperativeMatrixPropertiesNV>());
locke-lunargd556cc32019-09-17 01:21:23 -06001170
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001171 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties,
locke-lunargd556cc32019-09-17 01:21:23 -06001172 state_tracker->cooperative_matrix_properties.data());
1173 }
Tobias Hector6663c9b2020-11-05 10:18:02 +00001174
locke-lunargd556cc32019-09-17 01:21:23 -06001175 // Store queue family data
1176 if (pCreateInfo->pQueueCreateInfos != nullptr) {
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001177 uint32_t total_count = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001178 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
sfricke-samsung590ae1e2020-04-25 01:18:05 -07001179 const VkDeviceQueueCreateInfo &queue_create_info = pCreateInfo->pQueueCreateInfos[i];
sfricke-samsungb585ec12021-05-06 03:10:13 -07001180 state_tracker->queue_family_index_set.insert(queue_create_info.queueFamilyIndex);
1181 state_tracker->device_queue_info_list.push_back(
1182 {i, queue_create_info.queueFamilyIndex, queue_create_info.flags, queue_create_info.queueCount});
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001183 total_count += queue_create_info.queueCount;
1184 }
Jeremy Gebbend177d922021-10-28 13:42:10 -06001185 queue_map_.reserve(total_count);
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001186 for (const auto &queue_info : state_tracker->device_queue_info_list) {
1187 for (uint32_t i = 0; i < queue_info.queue_count; i++) {
1188 VkQueue queue = VK_NULL_HANDLE;
1189 // vkGetDeviceQueue2() was added in vulkan 1.1, and there was never a KHR version of it.
1190 if (api_version >= VK_API_VERSION_1_1 && queue_info.flags != 0) {
1191 auto get_info = LvlInitStruct<VkDeviceQueueInfo2>();
1192 get_info.flags = queue_info.flags;
1193 get_info.queueFamilyIndex = queue_info.queue_family_index;
1194 get_info.queueIndex = i;
1195 DispatchGetDeviceQueue2(*pDevice, &get_info, &queue);
1196 } else {
1197 DispatchGetDeviceQueue(*pDevice, queue_info.queue_family_index, i, &queue);
1198 }
1199 assert(queue != VK_NULL_HANDLE);
Mike Schuchardta9101d32021-11-12 12:24:08 -08001200 state_tracker->Add(std::make_shared<QUEUE_STATE>(queue, queue_info.queue_family_index, queue_info.flags));
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001201 }
locke-lunargd556cc32019-09-17 01:21:23 -06001202 }
1203 }
1204}
1205
1206void ValidationStateTracker::PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
1207 if (!device) return;
1208
Jeremy Gebbend177d922021-10-28 13:42:10 -06001209 command_pool_map_.clear();
1210 assert(command_buffer_map_.empty());
1211 pipeline_map_.clear();
1212 render_pass_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001213
1214 // This will also delete all sets in the pool & remove them from setMap
Jeremy Gebbend177d922021-10-28 13:42:10 -06001215 descriptor_pool_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001216 // All sets should be removed
Jeremy Gebbend177d922021-10-28 13:42:10 -06001217 assert(descriptor_set_map_.empty());
1218 desc_template_map_.clear();
1219 descriptor_set_layout_map_.clear();
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001220 // Because swapchains are associated with Surfaces, which are at instance level,
1221 // they need to be explicitly destroyed here to avoid continued references to
1222 // the device we're destroying.
Jeremy Gebbend177d922021-10-28 13:42:10 -06001223 for (auto &entry : swapchain_map_) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001224 entry.second->Destroy();
1225 }
Jeremy Gebbend177d922021-10-28 13:42:10 -06001226 swapchain_map_.clear();
1227 image_view_map_.clear();
1228 image_map_.clear();
1229 buffer_view_map_.clear();
1230 buffer_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001231 // Queues persist until device is destroyed
Jeremy Gebbend177d922021-10-28 13:42:10 -06001232 queue_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001233}
1234
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001235void ValidationStateTracker::PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1236 VkFence fence, VkResult result) {
1237 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001238 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001239
Jeremy Gebben57642982021-09-14 14:14:55 -06001240 uint64_t early_retire_seq = 0;
1241
1242 if (submitCount == 0) {
1243 CB_SUBMISSION submission;
Jeremy Gebben9f537102021-10-05 16:37:12 -06001244 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001245 early_retire_seq = queue_state->Submit(std::move(submission));
1246 }
locke-lunargd556cc32019-09-17 01:21:23 -06001247
1248 // Now process each individual submit
1249 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001250 CB_SUBMISSION submission;
locke-lunargd556cc32019-09-17 01:21:23 -06001251 const VkSubmitInfo *submit = &pSubmits[submit_idx];
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001252 auto *timeline_semaphore_submit = LvlFindInChain<VkTimelineSemaphoreSubmitInfo>(submit->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06001253 for (uint32_t i = 0; i < submit->waitSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001254 uint64_t value = 0;
1255 if (timeline_semaphore_submit && timeline_semaphore_submit->pWaitSemaphoreValues != nullptr &&
1256 (i < timeline_semaphore_submit->waitSemaphoreValueCount)) {
1257 value = timeline_semaphore_submit->pWaitSemaphoreValues[i];
1258 }
Jeremy Gebben9f537102021-10-05 16:37:12 -06001259 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(submit->pWaitSemaphores[i]), value);
locke-lunargd556cc32019-09-17 01:21:23 -06001260 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001261
locke-lunargd556cc32019-09-17 01:21:23 -06001262 for (uint32_t i = 0; i < submit->signalSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001263 uint64_t value = 0;
1264 if (timeline_semaphore_submit && timeline_semaphore_submit->pSignalSemaphoreValues != nullptr &&
1265 (i < timeline_semaphore_submit->signalSemaphoreValueCount)) {
1266 value = timeline_semaphore_submit->pSignalSemaphoreValues[i];
1267 }
Jeremy Gebben9f537102021-10-05 16:37:12 -06001268 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(submit->pSignalSemaphores[i]), value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001269 }
1270
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001271 const auto perf_submit = LvlFindInChain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001272 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02001273
locke-lunargd556cc32019-09-17 01:21:23 -06001274 for (uint32_t i = 0; i < submit->commandBufferCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001275 submission.AddCommandBuffer(Get<CMD_BUFFER_STATE>(submit->pCommandBuffers[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001276 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001277 if (submit_idx == (submitCount - 1) && fence != VK_NULL_HANDLE) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001278 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001279 }
1280 auto submit_seq = queue_state->Submit(std::move(submission));
1281 early_retire_seq = std::max(early_retire_seq, submit_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001282 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001283
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001284 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001285 queue_state->Retire(early_retire_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001286 }
1287}
1288
1289void ValidationStateTracker::PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1290 VkFence fence, VkResult result) {
1291 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001292 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001293 uint64_t early_retire_seq = 0;
1294 if (submitCount == 0) {
1295 CB_SUBMISSION submission;
Jeremy Gebben9f537102021-10-05 16:37:12 -06001296 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001297 early_retire_seq = queue_state->Submit(std::move(submission));
1298 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001299
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001300 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
1301 CB_SUBMISSION submission;
1302 const VkSubmitInfo2KHR *submit = &pSubmits[submit_idx];
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001303 for (uint32_t i = 0; i < submit->waitSemaphoreInfoCount; ++i) {
1304 const auto &sem_info = submit->pWaitSemaphoreInfos[i];
Jeremy Gebben9f537102021-10-05 16:37:12 -06001305 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001306 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001307 for (uint32_t i = 0; i < submit->signalSemaphoreInfoCount; ++i) {
1308 const auto &sem_info = submit->pSignalSemaphoreInfos[i];
Jeremy Gebben9f537102021-10-05 16:37:12 -06001309 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001310 }
1311 const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
1312 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
1313
1314 for (uint32_t i = 0; i < submit->commandBufferInfoCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001315 submission.AddCommandBuffer(Get<CMD_BUFFER_STATE>(submit->pCommandBufferInfos[i].commandBuffer));
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001316 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001317 if (submit_idx == (submitCount - 1)) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001318 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001319 }
1320 auto submit_seq = queue_state->Submit(std::move(submission));
1321 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001322 }
locke-lunargd556cc32019-09-17 01:21:23 -06001323 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001324 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001325 }
1326}
1327
1328void ValidationStateTracker::PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1329 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory,
1330 VkResult result) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001331 if (VK_SUCCESS != result) {
1332 return;
locke-lunargd556cc32019-09-17 01:21:23 -06001333 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001334 const auto &memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
1335 const auto &memory_heap = phys_dev_mem_props.memoryHeaps[memory_type.heapIndex];
1336 auto fake_address = fake_memory.Alloc(pAllocateInfo->allocationSize);
1337
1338 layer_data::optional<DedicatedBinding> dedicated_binding;
1339
1340 auto dedicated = LvlFindInChain<VkMemoryDedicatedAllocateInfo>(pAllocateInfo->pNext);
1341 if (dedicated) {
1342 if (dedicated->buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001343 const auto buffer_state = Get<BUFFER_STATE>(dedicated->buffer);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001344 assert(buffer_state);
1345 if (!buffer_state) {
1346 return;
1347 }
1348 dedicated_binding.emplace(dedicated->buffer, buffer_state->createInfo);
1349 } else if (dedicated->image) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001350 const auto image_state = Get<IMAGE_STATE>(dedicated->image);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001351 assert(image_state);
1352 if (!image_state) {
1353 return;
1354 }
1355 dedicated_binding.emplace(dedicated->image, image_state->createInfo);
1356 }
1357 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001358 Add(std::make_shared<DEVICE_MEMORY_STATE>(*pMemory, pAllocateInfo, fake_address, memory_type, memory_heap,
1359 std::move(dedicated_binding), physical_device_count));
locke-lunargd556cc32019-09-17 01:21:23 -06001360 return;
1361}
1362
1363void ValidationStateTracker::PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory mem, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001364 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001365 if (mem_info) {
1366 fake_memory.Free(mem_info->fake_base_address);
1367 }
1368 Destroy<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001369}
1370
1371void ValidationStateTracker::PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
1372 VkFence fence, VkResult result) {
1373 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001374 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06001375
Jeremy Gebben57642982021-09-14 14:14:55 -06001376 uint64_t early_retire_seq = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001377
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001378 for (uint32_t bind_idx = 0; bind_idx < bindInfoCount; ++bind_idx) {
1379 const VkBindSparseInfo &bind_info = pBindInfo[bind_idx];
locke-lunargd556cc32019-09-17 01:21:23 -06001380 // Track objects tied to memory
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001381 for (uint32_t j = 0; j < bind_info.bufferBindCount; j++) {
1382 for (uint32_t k = 0; k < bind_info.pBufferBinds[j].bindCount; k++) {
1383 auto sparse_binding = bind_info.pBufferBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001384 auto buffer_state = Get<BUFFER_STATE>(bind_info.pBufferBinds[j].buffer);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001385 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001386 if (buffer_state && mem_state) {
1387 buffer_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1388 }
locke-lunargd556cc32019-09-17 01:21:23 -06001389 }
1390 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001391 for (uint32_t j = 0; j < bind_info.imageOpaqueBindCount; j++) {
1392 for (uint32_t k = 0; k < bind_info.pImageOpaqueBinds[j].bindCount; k++) {
1393 auto sparse_binding = bind_info.pImageOpaqueBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001394 auto image_state = Get<IMAGE_STATE>(bind_info.pImageOpaqueBinds[j].image);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001395 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001396 if (image_state && mem_state) {
1397 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1398 }
locke-lunargd556cc32019-09-17 01:21:23 -06001399 }
1400 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001401 for (uint32_t j = 0; j < bind_info.imageBindCount; j++) {
1402 for (uint32_t k = 0; k < bind_info.pImageBinds[j].bindCount; k++) {
1403 auto sparse_binding = bind_info.pImageBinds[j].pBinds[k];
locke-lunargd556cc32019-09-17 01:21:23 -06001404 // TODO: This size is broken for non-opaque bindings, need to update to comprehend full sparse binding data
1405 VkDeviceSize size = sparse_binding.extent.depth * sparse_binding.extent.height * sparse_binding.extent.width * 4;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001406 auto image_state = Get<IMAGE_STATE>(bind_info.pImageBinds[j].image);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001407 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001408 if (image_state && mem_state) {
1409 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, size);
1410 }
locke-lunargd556cc32019-09-17 01:21:23 -06001411 }
1412 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001413 CB_SUBMISSION submission;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001414 for (uint32_t i = 0; i < bind_info.waitSemaphoreCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001415 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(bind_info.pWaitSemaphores[i]), 0);
locke-lunargd556cc32019-09-17 01:21:23 -06001416 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001417 for (uint32_t i = 0; i < bind_info.signalSemaphoreCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001418 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(bind_info.pSignalSemaphores[i]), 0);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001419 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001420 if (bind_idx == (bindInfoCount - 1)) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001421 submission.AddFence(Get<FENCE_STATE>(fence));
locke-lunargd556cc32019-09-17 01:21:23 -06001422 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001423 auto submit_seq = queue_state->Submit(std::move(submission));
1424 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001425 }
1426
1427 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001428 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001429 }
1430}
1431
1432void ValidationStateTracker::PostCallRecordCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
1433 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore,
1434 VkResult result) {
1435 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001436 Add(std::make_shared<SEMAPHORE_STATE>(*pSemaphore, LvlFindInChain<VkSemaphoreTypeCreateInfo>(pCreateInfo->pNext)));
locke-lunargd556cc32019-09-17 01:21:23 -06001437}
1438
Mike Schuchardt2df08912020-12-15 16:28:09 -08001439void ValidationStateTracker::RecordImportSemaphoreState(VkSemaphore semaphore, VkExternalSemaphoreHandleTypeFlagBits handle_type,
1440 VkSemaphoreImportFlags flags) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001441 auto sema_node = Get<SEMAPHORE_STATE>(semaphore);
locke-lunargd556cc32019-09-17 01:21:23 -06001442 if (sema_node && sema_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08001443 if ((handle_type == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06001444 sema_node->scope == kSyncScopeInternal) {
1445 sema_node->scope = kSyncScopeExternalTemporary;
1446 } else {
1447 sema_node->scope = kSyncScopeExternalPermanent;
1448 }
1449 }
1450}
1451
Mike Schuchardt2df08912020-12-15 16:28:09 -08001452void ValidationStateTracker::PostCallRecordSignalSemaphoreKHR(VkDevice device, const VkSemaphoreSignalInfo *pSignalInfo,
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001453 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001454 auto semaphore_state = Get<SEMAPHORE_STATE>(pSignalInfo->semaphore);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001455 semaphore_state->payload = pSignalInfo->value;
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001456}
1457
locke-lunargd556cc32019-09-17 01:21:23 -06001458void ValidationStateTracker::RecordMappedMemory(VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, void **ppData) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001459 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001460 if (mem_info) {
1461 mem_info->mapped_range.offset = offset;
1462 mem_info->mapped_range.size = size;
1463 mem_info->p_driver_data = *ppData;
1464 }
1465}
1466
locke-lunargd556cc32019-09-17 01:21:23 -06001467void ValidationStateTracker::PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1468 VkBool32 waitAll, uint64_t timeout, VkResult result) {
1469 if (VK_SUCCESS != result) return;
1470
1471 // When we know that all fences are complete we can clean/remove their CBs
1472 if ((VK_TRUE == waitAll) || (1 == fenceCount)) {
1473 for (uint32_t i = 0; i < fenceCount; i++) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001474 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Jeremy Gebben57642982021-09-14 14:14:55 -06001475 if (fence_state) {
1476 fence_state->Retire();
1477 }
locke-lunargd556cc32019-09-17 01:21:23 -06001478 }
1479 }
1480 // NOTE : Alternate case not handled here is when some fences have completed. In
1481 // this case for app to guarantee which fences completed it will have to call
1482 // vkGetFenceStatus() at which point we'll clean/remove their CBs if complete.
1483}
1484
John Zulauff89de662020-04-13 18:57:34 -06001485void ValidationStateTracker::RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1486 VkResult result) {
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001487 if (VK_SUCCESS != result) return;
1488
1489 for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001490 auto semaphore_state = Get<SEMAPHORE_STATE>(pWaitInfo->pSemaphores[i]);
Jeremy Gebben57642982021-09-14 14:14:55 -06001491 if (semaphore_state) {
1492 semaphore_state->Retire(pWaitInfo->pValues[i]);
1493 }
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001494 }
1495}
1496
John Zulauff89de662020-04-13 18:57:34 -06001497void ValidationStateTracker::PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1498 VkResult result) {
1499 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1500}
1501
1502void ValidationStateTracker::PostCallRecordWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo,
1503 uint64_t timeout, VkResult result) {
1504 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1505}
1506
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001507void ValidationStateTracker::RecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1508 VkResult result) {
1509 if (VK_SUCCESS != result) return;
1510
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001511 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben57642982021-09-14 14:14:55 -06001512 if (semaphore_state) {
1513 semaphore_state->Retire(*pValue);
1514 }
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001515}
1516
1517void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1518 VkResult result) {
1519 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1520}
1521void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValueKHR(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1522 VkResult result) {
1523 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1524}
1525
locke-lunargd556cc32019-09-17 01:21:23 -06001526void ValidationStateTracker::PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
1527 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001528 auto fence_state = Get<FENCE_STATE>(fence);
Jeremy Gebben57642982021-09-14 14:14:55 -06001529 if (fence_state) {
1530 fence_state->Retire();
1531 }
locke-lunargd556cc32019-09-17 01:21:23 -06001532}
1533
locke-lunargd556cc32019-09-17 01:21:23 -06001534void ValidationStateTracker::PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) {
1535 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001536 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001537 if (queue_state) {
1538 queue_state->Retire();
1539 }
locke-lunargd556cc32019-09-17 01:21:23 -06001540}
1541
1542void ValidationStateTracker::PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) {
1543 if (VK_SUCCESS != result) return;
Jeremy Gebbend177d922021-10-28 13:42:10 -06001544 for (auto &queue : queue_map_) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001545 queue.second->Retire();
locke-lunargd556cc32019-09-17 01:21:23 -06001546 }
1547}
1548
1549void ValidationStateTracker::PreCallRecordDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001550 Destroy<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06001551}
1552
1553void ValidationStateTracker::PreCallRecordDestroySemaphore(VkDevice device, VkSemaphore semaphore,
1554 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001555 Destroy<SEMAPHORE_STATE>(semaphore);
locke-lunargd556cc32019-09-17 01:21:23 -06001556}
1557
1558void ValidationStateTracker::PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001559 Destroy<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06001560}
1561
1562void ValidationStateTracker::PreCallRecordDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
1563 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001564 Destroy<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001565}
1566
locke-lunargd556cc32019-09-17 01:21:23 -06001567void ValidationStateTracker::UpdateBindBufferMemoryState(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001568 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001569 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001570 // Track objects tied to memory
Jeremy Gebben9f537102021-10-05 16:37:12 -06001571 auto mem_state = Get<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001572 if (mem_state) {
1573 buffer_state->SetMemBinding(mem_state, memoryOffset);
1574 }
locke-lunargd556cc32019-09-17 01:21:23 -06001575 }
1576}
1577
1578void ValidationStateTracker::PostCallRecordBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
1579 VkDeviceSize memoryOffset, VkResult result) {
1580 if (VK_SUCCESS != result) return;
1581 UpdateBindBufferMemoryState(buffer, mem, memoryOffset);
1582}
1583
1584void ValidationStateTracker::PostCallRecordBindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001585 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001586 for (uint32_t i = 0; i < bindInfoCount; i++) {
1587 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1588 }
1589}
1590
1591void ValidationStateTracker::PostCallRecordBindBufferMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001592 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001593 for (uint32_t i = 0; i < bindInfoCount; i++) {
1594 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1595 }
1596}
1597
Spencer Fricke6c127102020-04-16 06:25:20 -07001598void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001599 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001600 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001601 buffer_state->memory_requirements_checked = true;
1602 }
1603}
1604
1605void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1606 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001607 RecordGetBufferMemoryRequirementsState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001608}
1609
1610void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001611 const VkBufferMemoryRequirementsInfo2 *pInfo,
1612 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001613 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001614}
1615
1616void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2KHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001617 const VkBufferMemoryRequirementsInfo2 *pInfo,
1618 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001619 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001620}
1621
Spencer Fricke6c127102020-04-16 06:25:20 -07001622void ValidationStateTracker::RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2 *pInfo) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001623 const VkImagePlaneMemoryRequirementsInfo *plane_info =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001624 (pInfo == nullptr) ? nullptr : LvlFindInChain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001625 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001626 if (image_state) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001627 if (plane_info != nullptr) {
1628 // Multi-plane image
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001629 if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_0_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001630 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001631 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_1_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001632 image_state->memory_requirements_checked[1] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001633 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_2_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001634 image_state->memory_requirements_checked[2] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001635 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001636 } else if (!image_state->disjoint) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001637 // Single Plane image
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001638 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001639 }
locke-lunargd556cc32019-09-17 01:21:23 -06001640 }
1641}
1642
1643void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements(VkDevice device, VkImage image,
1644 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001645 RecordGetImageMemoryRequirementsState(image, nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06001646}
1647
1648void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
1649 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001650 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001651}
1652
1653void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2KHR(VkDevice device,
1654 const VkImageMemoryRequirementsInfo2 *pInfo,
1655 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001656 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001657}
1658
locke-lunargd556cc32019-09-17 01:21:23 -06001659void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements(
1660 VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1661 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001662 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001663 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001664}
1665
1666void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001667 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1668 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001669 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001670 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001671}
1672
1673void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001674 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1675 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001676 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001677 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001678}
1679
1680void ValidationStateTracker::PreCallRecordDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1681 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001682 Destroy<SHADER_MODULE_STATE>(shaderModule);
locke-lunargd556cc32019-09-17 01:21:23 -06001683}
1684
1685void ValidationStateTracker::PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline,
1686 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001687 Destroy<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06001688}
1689
1690void ValidationStateTracker::PreCallRecordDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1691 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001692 Destroy<PIPELINE_LAYOUT_STATE>(pipelineLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001693}
1694
1695void ValidationStateTracker::PreCallRecordDestroySampler(VkDevice device, VkSampler sampler,
1696 const VkAllocationCallbacks *pAllocator) {
1697 if (!sampler) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001698 auto sampler_state = Get<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001699 // Any bound cmd buffers are now invalid
1700 if (sampler_state) {
Yuly Novikov424cdd52020-05-26 16:45:12 -04001701 if (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
1702 sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
1703 custom_border_color_sampler_count--;
1704 }
locke-lunargd556cc32019-09-17 01:21:23 -06001705 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001706 Destroy<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001707}
1708
1709void ValidationStateTracker::PreCallRecordDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1710 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001711 Destroy<cvdescriptorset::DescriptorSetLayout>(descriptorSetLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001712}
1713
1714void ValidationStateTracker::PreCallRecordDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1715 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001716 Destroy<DESCRIPTOR_POOL_STATE>(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001717}
1718
locke-lunargd556cc32019-09-17 01:21:23 -06001719void ValidationStateTracker::PreCallRecordFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
1720 uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001721 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1722 if (pool) {
1723 pool->Free(commandBufferCount, pCommandBuffers);
1724 }
locke-lunargd556cc32019-09-17 01:21:23 -06001725}
1726
1727void ValidationStateTracker::PostCallRecordCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1728 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool,
1729 VkResult result) {
1730 if (VK_SUCCESS != result) return;
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001731 auto queue_flags = physical_device_state->queue_family_properties[pCreateInfo->queueFamilyIndex].queueFlags;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001732 Add(std::make_shared<COMMAND_POOL_STATE>(this, *pCommandPool, pCreateInfo, queue_flags));
locke-lunargd556cc32019-09-17 01:21:23 -06001733}
1734
1735void ValidationStateTracker::PostCallRecordCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1736 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool,
1737 VkResult result) {
1738 if (VK_SUCCESS != result) return;
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001739
1740 uint32_t index_count = 0, n_perf_pass = 0;
1741 bool has_cb = false, has_rb = false;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001742 if (pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001743 const auto *perf = LvlFindInChain<VkQueryPoolPerformanceCreateInfoKHR>(pCreateInfo->pNext);
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001744 index_count = perf->counterIndexCount;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001745
Mark Lobodzinski7e948e42020-09-09 10:23:36 -06001746 const QUEUE_FAMILY_PERF_COUNTERS &counters = *physical_device_state->perf_counters[perf->queueFamilyIndex];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001747 for (uint32_t i = 0; i < perf->counterIndexCount; i++) {
1748 const auto &counter = counters.counters[perf->pCounterIndices[i]];
1749 switch (counter.scope) {
1750 case VK_QUERY_SCOPE_COMMAND_BUFFER_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001751 has_cb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001752 break;
1753 case VK_QUERY_SCOPE_RENDER_PASS_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001754 has_rb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001755 break;
1756 default:
1757 break;
1758 }
1759 }
1760
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001761 DispatchGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physical_device_state->PhysDev(), perf, &n_perf_pass);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001762 }
1763
Jeremy Gebben082a9832021-10-28 13:40:11 -06001764 Add(std::make_shared<QUERY_POOL_STATE>(*pQueryPool, pCreateInfo, index_count, n_perf_pass, has_cb, has_rb));
locke-lunargd556cc32019-09-17 01:21:23 -06001765
locke-lunargd556cc32019-09-17 01:21:23 -06001766}
1767
1768void ValidationStateTracker::PreCallRecordDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
1769 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001770 Destroy<COMMAND_POOL_STATE>(commandPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001771}
1772
1773void ValidationStateTracker::PostCallRecordResetCommandPool(VkDevice device, VkCommandPool commandPool,
1774 VkCommandPoolResetFlags flags, VkResult result) {
1775 if (VK_SUCCESS != result) return;
1776 // Reset all of the CBs allocated from this pool
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001777 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1778 if (pool) {
1779 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001780 }
1781}
1782
1783void ValidationStateTracker::PostCallRecordResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1784 VkResult result) {
1785 for (uint32_t i = 0; i < fenceCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001786 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001787 if (fence_state) {
1788 if (fence_state->scope == kSyncScopeInternal) {
1789 fence_state->state = FENCE_UNSIGNALED;
1790 } else if (fence_state->scope == kSyncScopeExternalTemporary) {
1791 fence_state->scope = kSyncScopeInternal;
locke-lunargd556cc32019-09-17 01:21:23 -06001792 }
1793 }
1794 }
1795}
1796
locke-lunargd556cc32019-09-17 01:21:23 -06001797void ValidationStateTracker::PreCallRecordDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
1798 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001799 Destroy<FRAMEBUFFER_STATE>(framebuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001800}
1801
1802void ValidationStateTracker::PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
1803 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001804 Destroy<RENDER_PASS_STATE>(renderPass);
locke-lunargd556cc32019-09-17 01:21:23 -06001805}
1806
1807void ValidationStateTracker::PostCallRecordCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
1808 const VkAllocationCallbacks *pAllocator, VkFence *pFence, VkResult result) {
1809 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001810 Add(std::make_shared<FENCE_STATE>(*pFence, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06001811}
1812
1813bool ValidationStateTracker::PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1814 const VkGraphicsPipelineCreateInfo *pCreateInfos,
1815 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001816 void *cgpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001817 // Set up the state that CoreChecks, gpu_validation and later StateTracker Record will use.
1818 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
1819 cgpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
1820 cgpl_state->pipe_state.reserve(count);
1821 for (uint32_t i = 0; i < count; i++) {
Jeremy Gebbence23dac2021-11-10 10:19:42 -07001822 if (pCreateInfos[i].renderPass != VK_NULL_HANDLE) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001823 cgpl_state->pipe_state.push_back(std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i],
1824 Get<RENDER_PASS_STATE>(pCreateInfos[i].renderPass),
1825 Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
amhagana448ea52021-11-02 14:09:14 -04001826 } else if (enabled_features.dynamic_rendering_features.dynamicRendering) {
1827 auto dynamic_rendering = LvlFindInChain<VkPipelineRenderingCreateInfoKHR>(pCreateInfos[i].pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001828 cgpl_state->pipe_state.push_back(
1829 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], std::make_shared<RENDER_PASS_STATE>(dynamic_rendering),
Jeremy Gebben9f537102021-10-05 16:37:12 -06001830 Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeremy Gebbence23dac2021-11-10 10:19:42 -07001831 }
locke-lunargd556cc32019-09-17 01:21:23 -06001832 }
1833 return false;
1834}
1835
1836void ValidationStateTracker::PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1837 const VkGraphicsPipelineCreateInfo *pCreateInfos,
1838 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
1839 VkResult result, void *cgpl_state_data) {
1840 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
1841 // This API may create pipelines regardless of the return value
1842 for (uint32_t i = 0; i < count; i++) {
1843 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001844 (cgpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001845 Add(std::move((cgpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001846 }
1847 }
1848 cgpl_state->pipe_state.clear();
1849}
1850
1851bool ValidationStateTracker::PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1852 const VkComputePipelineCreateInfo *pCreateInfos,
1853 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001854 void *ccpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001855 auto *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
1856 ccpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
1857 ccpl_state->pipe_state.reserve(count);
1858 for (uint32_t i = 0; i < count; i++) {
1859 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06001860 ccpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06001861 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06001862 }
1863 return false;
1864}
1865
1866void ValidationStateTracker::PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1867 const VkComputePipelineCreateInfo *pCreateInfos,
1868 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
1869 VkResult result, void *ccpl_state_data) {
1870 create_compute_pipeline_api_state *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
1871
1872 // This API may create pipelines regardless of the return value
1873 for (uint32_t i = 0; i < count; i++) {
1874 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001875 (ccpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001876 Add(std::move((ccpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001877 }
1878 }
1879 ccpl_state->pipe_state.clear();
1880}
1881
1882bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache,
1883 uint32_t count,
1884 const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
1885 const VkAllocationCallbacks *pAllocator,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001886 VkPipeline *pPipelines, void *crtpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001887 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
1888 crtpl_state->pipe_state.reserve(count);
1889 for (uint32_t i = 0; i < count; i++) {
1890 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06001891 crtpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06001892 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06001893 }
1894 return false;
1895}
1896
1897void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesNV(
1898 VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
1899 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines, VkResult result, void *crtpl_state_data) {
1900 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
1901 // This API may create pipelines regardless of the return value
1902 for (uint32_t i = 0; i < count; i++) {
1903 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001904 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001905 Add(std::move((crtpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001906 }
1907 }
1908 crtpl_state->pipe_state.clear();
1909}
1910
sourav parmarcd5fb182020-07-17 12:58:44 -07001911bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
1912 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001913 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
1914 const VkAllocationCallbacks *pAllocator,
1915 VkPipeline *pPipelines, void *crtpl_state_data) const {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001916 auto crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001917 crtpl_state->pipe_state.reserve(count);
1918 for (uint32_t i = 0; i < count; i++) {
1919 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06001920 crtpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06001921 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001922 }
1923 return false;
1924}
1925
sourav parmarcd5fb182020-07-17 12:58:44 -07001926void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
1927 VkPipelineCache pipelineCache, uint32_t count,
1928 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
1929 const VkAllocationCallbacks *pAllocator,
1930 VkPipeline *pPipelines, VkResult result,
1931 void *crtpl_state_data) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001932 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
1933 // This API may create pipelines regardless of the return value
1934 for (uint32_t i = 0; i < count; i++) {
1935 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001936 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001937 Add(std::move((crtpl_state->pipe_state)[i]));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001938 }
1939 }
1940 crtpl_state->pipe_state.clear();
1941}
1942
locke-lunargd556cc32019-09-17 01:21:23 -06001943void ValidationStateTracker::PostCallRecordCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
1944 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler,
1945 VkResult result) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001946 Add(std::make_shared<SAMPLER_STATE>(pSampler, pCreateInfo));
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001947 if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
1948 pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
Tony-LunarG7337b312020-04-15 16:40:25 -06001949 custom_border_color_sampler_count++;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001950 }
locke-lunargd556cc32019-09-17 01:21:23 -06001951}
1952
1953void ValidationStateTracker::PostCallRecordCreateDescriptorSetLayout(VkDevice device,
1954 const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
1955 const VkAllocationCallbacks *pAllocator,
1956 VkDescriptorSetLayout *pSetLayout, VkResult result) {
1957 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001958 Add(std::make_shared<cvdescriptorset::DescriptorSetLayout>(pCreateInfo, *pSetLayout));
locke-lunargd556cc32019-09-17 01:21:23 -06001959}
1960
locke-lunargd556cc32019-09-17 01:21:23 -06001961void ValidationStateTracker::PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
1962 const VkAllocationCallbacks *pAllocator,
1963 VkPipelineLayout *pPipelineLayout, VkResult result) {
1964 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001965 Add(std::make_shared<PIPELINE_LAYOUT_STATE>(this, *pPipelineLayout, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06001966}
1967
1968void ValidationStateTracker::PostCallRecordCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
1969 const VkAllocationCallbacks *pAllocator,
1970 VkDescriptorPool *pDescriptorPool, VkResult result) {
1971 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001972 Add(std::make_shared<DESCRIPTOR_POOL_STATE>(this, *pDescriptorPool, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06001973}
1974
1975void ValidationStateTracker::PostCallRecordResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1976 VkDescriptorPoolResetFlags flags, VkResult result) {
1977 if (VK_SUCCESS != result) return;
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06001978 auto pool = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
1979 if (pool) {
1980 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001981 }
locke-lunargd556cc32019-09-17 01:21:23 -06001982}
1983
1984bool ValidationStateTracker::PreCallValidateAllocateDescriptorSets(VkDevice device,
1985 const VkDescriptorSetAllocateInfo *pAllocateInfo,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001986 VkDescriptorSet *pDescriptorSets, void *ads_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001987 // Always update common data
1988 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
1989 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
1990 UpdateAllocateDescriptorSetsData(pAllocateInfo, ads_state);
1991
1992 return false;
1993}
1994
1995// Allocation state was good and call down chain was made so update state based on allocating descriptor sets
1996void ValidationStateTracker::PostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
1997 VkDescriptorSet *pDescriptorSets, VkResult result,
1998 void *ads_state_data) {
1999 if (VK_SUCCESS != result) return;
2000 // All the updates are contained in a single cvdescriptorset function
2001 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2002 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002003 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(pAllocateInfo->descriptorPool);
2004 if (pool_state) {
2005 pool_state->Allocate(pAllocateInfo, pDescriptorSets, ads_state);
2006 }
locke-lunargd556cc32019-09-17 01:21:23 -06002007}
2008
2009void ValidationStateTracker::PreCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count,
2010 const VkDescriptorSet *pDescriptorSets) {
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002011 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
2012 if (pool_state) {
2013 pool_state->Free(count, pDescriptorSets);
locke-lunargd556cc32019-09-17 01:21:23 -06002014 }
2015}
2016
2017void ValidationStateTracker::PreCallRecordUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
2018 const VkWriteDescriptorSet *pDescriptorWrites,
2019 uint32_t descriptorCopyCount,
2020 const VkCopyDescriptorSet *pDescriptorCopies) {
2021 cvdescriptorset::PerformUpdateDescriptorSets(this, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
2022 pDescriptorCopies);
2023}
2024
2025void ValidationStateTracker::PostCallRecordAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002026 VkCommandBuffer *pCommandBuffers, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002027 if (VK_SUCCESS != result) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06002028 auto pool = Get<COMMAND_POOL_STATE>(pCreateInfo->commandPool);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002029 if (pool) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002030 pool->Allocate(pCreateInfo, pCommandBuffers);
locke-lunargfc78e932020-11-19 17:06:24 -07002031 }
2032}
2033
locke-lunargd556cc32019-09-17 01:21:23 -06002034void ValidationStateTracker::PreCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer,
2035 const VkCommandBufferBeginInfo *pBeginInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002036 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002037 if (!cb_state) return;
locke-lunargfc78e932020-11-19 17:06:24 -07002038
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002039 cb_state->Begin(pBeginInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002040}
2041
2042void ValidationStateTracker::PostCallRecordEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002043 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002044 if (!cb_state) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002045
2046 cb_state->End(result);
locke-lunargd556cc32019-09-17 01:21:23 -06002047}
2048
2049void ValidationStateTracker::PostCallRecordResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags,
2050 VkResult result) {
2051 if (VK_SUCCESS == result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002052 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002053 cb_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002054 }
2055}
2056
2057CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) {
2058 // initially assume everything is static state
2059 CBStatusFlags flags = CBSTATUS_ALL_STATE_SET;
2060
2061 if (ds) {
2062 for (uint32_t i = 0; i < ds->dynamicStateCount; i++) {
locke-lunarg4189aa22020-10-21 00:23:48 -06002063 flags &= ~ConvertToCBStatusFlagBits(ds->pDynamicStates[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002064 }
2065 }
locke-lunargd556cc32019-09-17 01:21:23 -06002066 return flags;
2067}
2068
2069// Validation cache:
2070// CV is the bottommost implementor of this extension. Don't pass calls down.
locke-lunargd556cc32019-09-17 01:21:23 -06002071
2072void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2073 VkPipeline pipeline) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002074 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002075 assert(cb_state);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002076 cb_state->RecordCmd(CMD_BINDPIPELINE);
locke-lunargd556cc32019-09-17 01:21:23 -06002077
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002078 auto pipe_state = Get<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06002079 if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002080 const auto &create_info = pipe_state->create_info.graphics;
2081 bool rasterization_enabled = VK_FALSE == create_info.pRasterizationState->rasterizerDiscardEnable;
2082 const auto *viewport_state = create_info.pViewportState;
2083 const auto *dynamic_state = create_info.pDynamicState;
locke-lunargd556cc32019-09-17 01:21:23 -06002084 cb_state->status &= ~cb_state->static_status;
Yilong Lid23bc292022-01-02 22:06:12 -08002085 cb_state->static_status = MakeStaticStateMask(dynamic_state ? dynamic_state->ptr() : nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06002086 cb_state->status |= cb_state->static_status;
locke-lunarg4189aa22020-10-21 00:23:48 -06002087 cb_state->dynamic_status = CBSTATUS_ALL_STATE_SET & (~cb_state->static_status);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002088
2089 // Used to calculate CMD_BUFFER_STATE::usedViewportScissorCount upon draw command with this graphics pipeline.
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002090 // If rasterization disabled (no viewport/scissors used), or the actual number of viewports/scissors is dynamic (unknown at
2091 // this time), then these are set to 0 to disable this checking.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002092 auto has_dynamic_viewport_count = cb_state->dynamic_status & CBSTATUS_VIEWPORT_WITH_COUNT_SET;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002093 auto has_dynamic_scissor_count = cb_state->dynamic_status & CBSTATUS_SCISSOR_WITH_COUNT_SET;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002094 cb_state->pipelineStaticViewportCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002095 has_dynamic_viewport_count || !rasterization_enabled ? 0 : viewport_state->viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002096 cb_state->pipelineStaticScissorCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002097 has_dynamic_scissor_count || !rasterization_enabled ? 0 : viewport_state->scissorCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002098
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002099 // Trash dynamic viewport/scissor state if pipeline defines static state and enabled rasterization.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002100 // akeley98 NOTE: There's a bit of an ambiguity in the spec, whether binding such a pipeline overwrites
2101 // the entire viewport (scissor) array, or only the subsection defined by the viewport (scissor) count.
2102 // I am taking the latter interpretation based on the implementation details of NVIDIA's Vulkan driver.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002103 if (!has_dynamic_viewport_count) {
2104 cb_state->trashedViewportCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002105 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_VIEWPORT_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002106 cb_state->trashedViewportMask |= (uint32_t(1) << viewport_state->viewportCount) - 1u;
2107 // should become = ~uint32_t(0) if the other interpretation is correct.
2108 }
2109 }
2110 if (!has_dynamic_scissor_count) {
2111 cb_state->trashedScissorCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002112 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_SCISSOR_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002113 cb_state->trashedScissorMask |= (uint32_t(1) << viewport_state->scissorCount) - 1u;
2114 // should become = ~uint32_t(0) if the other interpretation is correct.
2115 }
2116 }
locke-lunargd556cc32019-09-17 01:21:23 -06002117 }
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002118 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002119 cb_state->lastBound[lv_bind_point].pipeline_state = pipe_state.get();
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002120 if (!disabled[command_buffer_state]) {
2121 cb_state->AddChild(pipe_state);
2122 }
locke-lunargd556cc32019-09-17 01:21:23 -06002123}
2124
2125void ValidationStateTracker::PreCallRecordCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2126 uint32_t viewportCount, const VkViewport *pViewports) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002127 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002128 cb_state->RecordStateCmd(CMD_SETVIEWPORT, CBSTATUS_VIEWPORT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002129 uint32_t bits = ((1u << viewportCount) - 1u) << firstViewport;
2130 cb_state->viewportMask |= bits;
2131 cb_state->trashedViewportMask &= ~bits;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002132
2133 cb_state->dynamicViewports.resize(std::max(size_t(firstViewport + viewportCount), cb_state->dynamicViewports.size()));
2134 for (size_t i = 0; i < viewportCount; ++i) {
2135 cb_state->dynamicViewports[firstViewport + i] = pViewports[i];
2136 }
locke-lunargd556cc32019-09-17 01:21:23 -06002137}
2138
2139void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
2140 uint32_t exclusiveScissorCount,
2141 const VkRect2D *pExclusiveScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002142 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002143 cb_state->RecordStateCmd(CMD_SETEXCLUSIVESCISSORNV, CBSTATUS_EXCLUSIVE_SCISSOR_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002144 // TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
2145 // cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
locke-lunargd556cc32019-09-17 01:21:23 -06002146}
2147
2148void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
2149 VkImageLayout imageLayout) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002150 if (disabled[command_buffer_state]) return;
2151
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002152 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002153 cb_state->RecordCmd(CMD_BINDSHADINGRATEIMAGENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002154
2155 if (imageView != VK_NULL_HANDLE) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002156 auto view_state = Get<IMAGE_VIEW_STATE>(imageView);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002157 cb_state->AddChild(view_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002158 }
2159}
2160
2161void ValidationStateTracker::PreCallRecordCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2162 uint32_t viewportCount,
2163 const VkShadingRatePaletteNV *pShadingRatePalettes) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002164 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002165 cb_state->RecordStateCmd(CMD_SETVIEWPORTSHADINGRATEPALETTENV, CBSTATUS_SHADING_RATE_PALETTE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002166 // TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
2167 // cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
locke-lunargd556cc32019-09-17 01:21:23 -06002168}
2169
2170void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
2171 const VkAccelerationStructureCreateInfoNV *pCreateInfo,
2172 const VkAllocationCallbacks *pAllocator,
2173 VkAccelerationStructureNV *pAccelerationStructure,
2174 VkResult result) {
2175 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002176 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002177
2178 // Query the requirements in case the application doesn't (to avoid bind/validation time query)
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002179 auto as_memory_requirements_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002180 as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002181 as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002182 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &as_memory_requirements_info, &as_state->memory_requirements);
2183
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002184 auto scratch_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002185 scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002186 scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002187 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &scratch_memory_req_info,
2188 &as_state->build_scratch_memory_requirements);
2189
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002190 auto update_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002191 update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002192 update_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002193 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
2194 &as_state->update_scratch_memory_requirements);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002195 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002196 Add(std::move(as_state));
locke-lunargd556cc32019-09-17 01:21:23 -06002197}
2198
Jeff Bolz95176d02020-04-01 00:36:16 -05002199void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
2200 const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
2201 const VkAllocationCallbacks *pAllocator,
2202 VkAccelerationStructureKHR *pAccelerationStructure,
2203 VkResult result) {
2204 if (VK_SUCCESS != result) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002205 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE_KHR>(*pAccelerationStructure, pCreateInfo);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002206 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002207 Add(std::move(as_state));
Jeff Bolz95176d02020-04-01 00:36:16 -05002208}
2209
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002210void ValidationStateTracker::PostCallRecordBuildAccelerationStructuresKHR(
2211 VkDevice device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount,
2212 const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2213 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos, VkResult result) {
2214 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002215 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002216 if (dst_as_state != nullptr) {
2217 dst_as_state->Build(&pInfos[i]);
2218 }
2219 }
2220}
2221
sourav parmarcd5fb182020-07-17 12:58:44 -07002222void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresKHR(
2223 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2224 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002225 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002226 if (!cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002227 return;
2228 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002229 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002230 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002231 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002232 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002233 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002234 if (!disabled[command_buffer_state]) {
2235 cb_state->AddChild(dst_as_state);
2236 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002237 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002238 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002239 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002240 if (src_as_state != nullptr) {
2241 cb_state->AddChild(src_as_state);
2242 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002243 }
2244 }
2245 cb_state->hasBuildAccelerationStructureCmd = true;
2246}
2247
2248void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresIndirectKHR(
2249 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2250 const VkDeviceAddress *pIndirectDeviceAddresses, const uint32_t *pIndirectStrides,
2251 const uint32_t *const *ppMaxPrimitiveCounts) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002252 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002253 if (cb_state == nullptr) {
2254 return;
2255 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002256 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESINDIRECTKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002257 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002258 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002259 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002260 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002261 if (!disabled[command_buffer_state]) {
2262 cb_state->AddChild(dst_as_state);
2263 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002264 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002265 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002266 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002267 if (src_as_state != nullptr) {
2268 cb_state->AddChild(src_as_state);
2269 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002270 }
2271 }
2272 cb_state->hasBuildAccelerationStructureCmd = true;
2273}
locke-lunargd556cc32019-09-17 01:21:23 -06002274void ValidationStateTracker::PostCallRecordGetAccelerationStructureMemoryRequirementsNV(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002275 VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV *pInfo, VkMemoryRequirements2 *pMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002276 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(pInfo->accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002277 if (as_state != nullptr) {
2278 if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV) {
2279 as_state->memory_requirements = *pMemoryRequirements;
2280 as_state->memory_requirements_checked = true;
2281 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV) {
2282 as_state->build_scratch_memory_requirements = *pMemoryRequirements;
2283 as_state->build_scratch_memory_requirements_checked = true;
2284 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV) {
2285 as_state->update_scratch_memory_requirements = *pMemoryRequirements;
2286 as_state->update_scratch_memory_requirements_checked = true;
2287 }
2288 }
2289}
2290
sourav parmarcd5fb182020-07-17 12:58:44 -07002291void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
2292 VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002293 if (VK_SUCCESS != result) return;
2294 for (uint32_t i = 0; i < bindInfoCount; i++) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002295 const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
locke-lunargd556cc32019-09-17 01:21:23 -06002296
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002297 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(info.accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002298 if (as_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002299 // Track objects tied to memory
Jeremy Gebben9f537102021-10-05 16:37:12 -06002300 auto mem_state = Get<DEVICE_MEMORY_STATE>(info.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002301 if (mem_state) {
2302 as_state->SetMemBinding(mem_state, info.memoryOffset);
2303 }
locke-lunargd556cc32019-09-17 01:21:23 -06002304
2305 // GPU validation of top level acceleration structure building needs acceleration structure handles.
Jeff Bolz95176d02020-04-01 00:36:16 -05002306 // XXX TODO: Query device address for KHR extension
sourav parmarcd5fb182020-07-17 12:58:44 -07002307 if (enabled[gpu_validation]) {
locke-lunargd556cc32019-09-17 01:21:23 -06002308 DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
2309 }
2310 }
2311 }
2312}
2313
2314void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
2315 VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
2316 VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002317 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002318 if (cb_state == nullptr) {
2319 return;
2320 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002321 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002322
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002323 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
locke-lunargd556cc32019-09-17 01:21:23 -06002324 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002325 dst_as_state->Build(pInfo);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002326 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002327 cb_state->AddChild(dst_as_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002328 }
locke-lunargd556cc32019-09-17 01:21:23 -06002329 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002330 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002331 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002332 if (src_as_state != nullptr) {
2333 cb_state->AddChild(src_as_state);
2334 }
locke-lunargd556cc32019-09-17 01:21:23 -06002335 }
2336 cb_state->hasBuildAccelerationStructureCmd = true;
2337}
2338
2339void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureNV(VkCommandBuffer commandBuffer,
2340 VkAccelerationStructureNV dst,
2341 VkAccelerationStructureNV src,
2342 VkCopyAccelerationStructureModeNV mode) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002343 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002344 if (cb_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002345 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
2346 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002347 if (!disabled[command_buffer_state]) {
2348 cb_state->RecordTransferCmd(CMD_COPYACCELERATIONSTRUCTURENV, src_as_state, dst_as_state);
2349 }
locke-lunargd556cc32019-09-17 01:21:23 -06002350 if (dst_as_state != nullptr && src_as_state != nullptr) {
2351 dst_as_state->built = true;
2352 dst_as_state->build_info = src_as_state->build_info;
locke-lunargd556cc32019-09-17 01:21:23 -06002353 }
2354 }
2355}
2356
Jeff Bolz95176d02020-04-01 00:36:16 -05002357void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
2358 VkAccelerationStructureKHR accelerationStructure,
2359 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002360 Destroy<ACCELERATION_STRUCTURE_STATE_KHR>(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002361}
2362
Jeff Bolz95176d02020-04-01 00:36:16 -05002363void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
2364 VkAccelerationStructureNV accelerationStructure,
2365 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002366 Destroy<ACCELERATION_STRUCTURE_STATE>(accelerationStructure);
Jeff Bolz95176d02020-04-01 00:36:16 -05002367}
2368
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002369void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2370 uint32_t viewportCount,
2371 const VkViewportWScalingNV *pViewportWScalings) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002372 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002373 cb_state->RecordStateCmd(CMD_SETVIEWPORTWSCALINGNV, CBSTATUS_VIEWPORT_W_SCALING_SET);
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002374}
2375
locke-lunargd556cc32019-09-17 01:21:23 -06002376void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002377 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002378 cb_state->RecordStateCmd(CMD_SETLINEWIDTH, CBSTATUS_LINE_WIDTH_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002379}
2380
2381void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
2382 uint16_t lineStipplePattern) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002383 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002384 cb_state->RecordStateCmd(CMD_SETLINESTIPPLEEXT, CBSTATUS_LINE_STIPPLE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002385}
2386
2387void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
2388 float depthBiasClamp, float depthBiasSlopeFactor) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002389 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002390 cb_state->RecordStateCmd(CMD_SETDEPTHBIAS, CBSTATUS_DEPTH_BIAS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002391}
2392
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002393void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
2394 const VkRect2D *pScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002395 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002396 cb_state->RecordStateCmd(CMD_SETSCISSOR, CBSTATUS_SCISSOR_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002397 uint32_t bits = ((1u << scissorCount) - 1u) << firstScissor;
2398 cb_state->scissorMask |= bits;
2399 cb_state->trashedScissorMask &= ~bits;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002400}
2401
locke-lunargd556cc32019-09-17 01:21:23 -06002402void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002403 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002404 cb_state->RecordStateCmd(CMD_SETBLENDCONSTANTS, CBSTATUS_BLEND_CONSTANTS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002405}
2406
2407void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
2408 float maxDepthBounds) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002409 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002410 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDS, CBSTATUS_DEPTH_BOUNDS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002411}
2412
2413void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2414 uint32_t compareMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002415 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002416 cb_state->RecordStateCmd(CMD_SETSTENCILCOMPAREMASK, CBSTATUS_STENCIL_READ_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002417}
2418
2419void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2420 uint32_t writeMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002421 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002422 cb_state->RecordStateCmd(CMD_SETSTENCILWRITEMASK, CBSTATUS_STENCIL_WRITE_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002423}
2424
2425void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2426 uint32_t reference) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002427 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002428 cb_state->RecordStateCmd(CMD_SETSTENCILREFERENCE, CBSTATUS_STENCIL_REFERENCE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002429}
2430
locke-lunargd556cc32019-09-17 01:21:23 -06002431// Update the bound state for the bind point, including the effects of incompatible pipeline layouts
2432void ValidationStateTracker::PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2433 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2434 uint32_t firstSet, uint32_t setCount,
2435 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2436 const uint32_t *pDynamicOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002437 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002438 cb_state->RecordCmd(CMD_BINDDESCRIPTORSETS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002439 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
locke-lunargd556cc32019-09-17 01:21:23 -06002440
Jeremy Gebben9f537102021-10-05 16:37:12 -06002441 cb_state->UpdateLastBoundDescriptorSets(pipelineBindPoint, pipeline_layout.get(), firstSet, setCount, pDescriptorSets, nullptr,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002442 dynamicOffsetCount, pDynamicOffsets);
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002443}
2444
locke-lunargd556cc32019-09-17 01:21:23 -06002445void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
2446 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2447 uint32_t set, uint32_t descriptorWriteCount,
2448 const VkWriteDescriptorSet *pDescriptorWrites) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002449 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2450 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002451 cb_state->PushDescriptorSetState(pipelineBindPoint, pipeline_layout.get(), set, descriptorWriteCount, pDescriptorWrites);
locke-lunargd556cc32019-09-17 01:21:23 -06002452}
2453
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002454void ValidationStateTracker::PostCallRecordCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2455 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2456 const void *pValues) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002457 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002458 if (cb_state != nullptr) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002459 cb_state->RecordCmd(CMD_PUSHCONSTANTS);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002460 auto layout_state = Get<PIPELINE_LAYOUT_STATE>(layout);
2461 cb_state->ResetPushConstantDataIfIncompatible(layout_state.get());
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002462
2463 auto &push_constant_data = cb_state->push_constant_data;
2464 assert((offset + size) <= static_cast<uint32_t>(push_constant_data.size()));
2465 std::memcpy(push_constant_data.data() + offset, pValues, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002466 cb_state->push_constant_pipeline_layout_set = layout;
2467
2468 auto flags = stageFlags;
2469 uint32_t bit_shift = 0;
2470 while (flags) {
2471 if (flags & 1) {
2472 VkShaderStageFlagBits flag = static_cast<VkShaderStageFlagBits>(1 << bit_shift);
2473 const auto it = cb_state->push_constant_data_update.find(flag);
2474
2475 if (it != cb_state->push_constant_data_update.end()) {
locke-lunarg3d8b8f32020-10-26 17:04:16 -06002476 std::memset(it->second.data() + offset, PC_Byte_Updated, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002477 }
2478 }
2479 flags = flags >> 1;
2480 ++bit_shift;
2481 }
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002482 }
2483}
2484
locke-lunargd556cc32019-09-17 01:21:23 -06002485void ValidationStateTracker::PreCallRecordCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2486 VkIndexType indexType) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002487 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002488
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002489 cb_state->RecordStateCmd(CMD_BINDINDEXBUFFER, CBSTATUS_INDEX_BUFFER_BOUND);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002490 cb_state->index_buffer_binding.buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002491 cb_state->index_buffer_binding.size = cb_state->index_buffer_binding.buffer_state->createInfo.size;
locke-lunargd556cc32019-09-17 01:21:23 -06002492 cb_state->index_buffer_binding.offset = offset;
2493 cb_state->index_buffer_binding.index_type = indexType;
2494 // Add binding for this index buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002495 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002496 cb_state->AddChild(cb_state->index_buffer_binding.buffer_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002497 }
locke-lunargd556cc32019-09-17 01:21:23 -06002498}
2499
2500void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2501 uint32_t bindingCount, const VkBuffer *pBuffers,
2502 const VkDeviceSize *pOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002503 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002504 cb_state->RecordCmd(CMD_BINDVERTEXBUFFERS);
locke-lunargd556cc32019-09-17 01:21:23 -06002505
2506 uint32_t end = firstBinding + bindingCount;
2507 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
2508 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
2509 }
2510
2511 for (uint32_t i = 0; i < bindingCount; ++i) {
2512 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06002513 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002514 vertex_buffer_binding.offset = pOffsets[i];
Piers Daniell39842ee2020-07-10 16:42:33 -06002515 vertex_buffer_binding.size = VK_WHOLE_SIZE;
2516 vertex_buffer_binding.stride = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06002517 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002518 if (pBuffers[i] && !disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002519 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Jeff Bolz165818a2020-05-08 11:19:03 -05002520 }
locke-lunargd556cc32019-09-17 01:21:23 -06002521 }
2522}
2523
2524void ValidationStateTracker::PostCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
2525 VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002526 if (disabled[command_buffer_state]) return;
2527
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002528 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002529 cb_state->RecordTransferCmd(CMD_UPDATEBUFFER, Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -06002530}
2531
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002532void ValidationStateTracker::PreCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2533 VkPipelineStageFlags stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002534 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002535 cb_state->RecordSetEvent(CMD_SETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002536}
2537
2538void ValidationStateTracker::PreCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2539 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002540 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002541 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
2542
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002543 cb_state->RecordSetEvent(CMD_SETEVENT2KHR, event, stage_masks.src);
2544 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002545}
2546
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002547void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2548 VkPipelineStageFlags stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002549 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002550 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002551}
2552
2553void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2554 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002555 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002556 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002557}
2558
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002559void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2560 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
2561 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2562 uint32_t bufferMemoryBarrierCount,
2563 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2564 uint32_t imageMemoryBarrierCount,
2565 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002566 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002567 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents);
2568 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2569 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002570}
2571
2572void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
2573 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002574 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002575 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, eventCount, pEvents);
Jeremy Gebben79649152021-06-22 14:46:24 -06002576 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002577 cb_state->RecordBarriers(pDependencyInfos[i]);
Jeremy Gebben79649152021-06-22 14:46:24 -06002578 }
2579}
2580
2581void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2582 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2583 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2584 uint32_t bufferMemoryBarrierCount,
2585 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2586 uint32_t imageMemoryBarrierCount,
2587 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002588 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2589 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
2590 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2591 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06002592}
2593
2594void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
2595 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002596 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2597 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
2598 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06002599}
2600
locke-lunargd556cc32019-09-17 01:21:23 -06002601void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
2602 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002603 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002604
locke-lunargd556cc32019-09-17 01:21:23 -06002605 QueryObject query = {queryPool, slot};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002606 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002607 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002608 if (!disabled[query_validation]) {
2609 cb_state->BeginQuery(query);
2610 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002611 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002612 auto pool_state = Get<QUERY_POOL_STATE>(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002613 cb_state->AddChild(pool_state);
2614 }
locke-lunargd556cc32019-09-17 01:21:23 -06002615}
2616
2617void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002618 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002619 QueryObject query_obj = {queryPool, slot};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002620 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002621 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002622 if (!disabled[query_validation]) {
2623 cb_state->EndQuery(query_obj);
2624 }
2625 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002626 auto pool_state = Get<QUERY_POOL_STATE>(query_obj.pool);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002627 cb_state->AddChild(pool_state);
2628 }
locke-lunargd556cc32019-09-17 01:21:23 -06002629}
2630
2631void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2632 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002633 if (disabled[query_validation]) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002634 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002635
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002636 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002637 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02002638
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002639 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002640 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002641 cb_state->AddChild(pool_state);
2642 }
locke-lunargd556cc32019-09-17 01:21:23 -06002643}
2644
2645void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2646 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
2647 VkDeviceSize dstOffset, VkDeviceSize stride,
2648 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002649 if (disabled[query_validation] || disabled[command_buffer_state]) return;
2650
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002651 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002652 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002653 auto dst_buff_state = Get<BUFFER_STATE>(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002654 cb_state->AddChild(dst_buff_state);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002655 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002656 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002657}
2658
2659void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2660 VkQueryPool queryPool, uint32_t slot) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002661 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002662 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002663}
2664
2665void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
2666 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
2667 uint32_t slot) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002668 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002669 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06002670}
2671
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002672void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
2673 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
2674 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
2675 if (disabled[query_validation]) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002676 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002677 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002678 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002679 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002680 cb_state->AddChild(pool_state);
2681 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002682 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002683}
2684
locke-lunargd556cc32019-09-17 01:21:23 -06002685void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2686 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
2687 VkResult result) {
2688 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002689
Jeremy Gebben88f58142021-06-01 10:07:52 -06002690 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08002691 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002692 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002693
locke-lunargd556cc32019-09-17 01:21:23 -06002694 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002695 views[i] = Get<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002696 }
2697 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06002698
Jeremy Gebben9f537102021-10-05 16:37:12 -06002699 Add(std::make_shared<FRAMEBUFFER_STATE>(*pFramebuffer, pCreateInfo, Get<RENDER_PASS_STATE>(pCreateInfo->renderPass),
Jeremy Gebben082a9832021-10-28 13:40:11 -06002700 std::move(views)));
locke-lunargd556cc32019-09-17 01:21:23 -06002701}
2702
locke-lunargd556cc32019-09-17 01:21:23 -06002703void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2704 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2705 VkResult result) {
2706 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002707 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002708}
2709
Mike Schuchardt2df08912020-12-15 16:28:09 -08002710void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002711 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2712 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002713 if (VK_SUCCESS != result) return;
2714
Jeremy Gebben082a9832021-10-28 13:40:11 -06002715 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002716}
2717
Mike Schuchardt2df08912020-12-15 16:28:09 -08002718void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002719 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2720 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002721 if (VK_SUCCESS != result) return;
2722
Jeremy Gebben082a9832021-10-28 13:40:11 -06002723 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002724}
2725
locke-lunargd556cc32019-09-17 01:21:23 -06002726void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
2727 const VkRenderPassBeginInfo *pRenderPassBegin,
2728 VkSubpassContents contents) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002729 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002730 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002731}
2732
2733void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
2734 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002735 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002736 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002737 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002738}
2739
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002740void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2741 uint32_t counterBufferCount,
2742 const VkBuffer *pCounterBuffers,
2743 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002744 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002745
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002746 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002747 cb_state->transform_feedback_active = true;
2748}
2749
2750void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2751 uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
2752 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002753 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002754
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002755 cb_state->RecordCmd(CMD_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002756 cb_state->transform_feedback_active = false;
2757}
2758
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002759void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
2760 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002761 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002762
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002763 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002764 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002765 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
2766 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002767}
2768
2769void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002770 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002771
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002772 cb_state->RecordCmd(CMD_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002773 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002774 cb_state->conditional_rendering_inside_render_pass = false;
2775 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002776}
2777
amhagana448ea52021-11-02 14:09:14 -04002778void ValidationStateTracker::RecordCmdEndRenderingRenderPassState(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002779 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002780 cb_state->activeRenderPass = nullptr;
2781}
2782
2783void ValidationStateTracker::PreCallRecordCmdBeginRenderingKHR(VkCommandBuffer commandBuffer,
2784 const VkRenderingInfoKHR *pRenderingInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002785 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002786 cb_state->BeginRendering(CMD_BEGINRENDERINGKHR, pRenderingInfo);
2787}
2788
2789void ValidationStateTracker::PreCallRecordCmdEndRenderingKHR(VkCommandBuffer commandBuffer) {
2790 RecordCmdEndRenderingRenderPassState(commandBuffer);
2791}
2792
Tony-LunarG977448c2019-12-02 14:52:02 -07002793void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
2794 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002795 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002796 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002797 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07002798}
2799
locke-lunargd556cc32019-09-17 01:21:23 -06002800void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002801 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002802 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002803}
2804
2805void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002806 const VkSubpassBeginInfo *pSubpassBeginInfo,
2807 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002808 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002809 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002810}
2811
Tony-LunarG977448c2019-12-02 14:52:02 -07002812void ValidationStateTracker::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002813 const VkSubpassBeginInfo *pSubpassBeginInfo,
2814 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002815 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002816 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002817}
2818
2819void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002820 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002821 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06002822}
2823
2824void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002825 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002826 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002827 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06002828}
2829
Tony-LunarG977448c2019-12-02 14:52:02 -07002830void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002831 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002832 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002833 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07002834}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002835
locke-lunargd556cc32019-09-17 01:21:23 -06002836void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
2837 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002838 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002839
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002840 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06002841}
2842
2843void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
2844 VkFlags flags, void **ppData, VkResult result) {
2845 if (VK_SUCCESS != result) return;
2846 RecordMappedMemory(mem, offset, size, ppData);
2847}
2848
2849void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002850 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06002851 if (mem_info) {
2852 mem_info->mapped_range = MemRange();
2853 mem_info->p_driver_data = nullptr;
2854 }
2855}
2856
2857void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002858 auto image_state = Get<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06002859 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06002860 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
2861 // See: VUID-vkGetImageSubresourceLayout-image-01895
2862 image_state->fragment_encoder =
2863 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07002864 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06002865 if (swapchain_info) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002866 auto swapchain = Get<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06002867 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002868 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07002869
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002870 if (!swapchain_image.fake_base_address) {
2871 auto size = image_state->fragment_encoder->TotalSize();
2872 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002873 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002874 // All images bound to this swapchain and index are aliases
2875 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06002876 }
2877 } else {
2878 // Track bound memory range information
Jeremy Gebben9f537102021-10-05 16:37:12 -06002879 auto mem_info = Get<DEVICE_MEMORY_STATE>(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06002880 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002881 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06002882 }
locke-lunargd556cc32019-09-17 01:21:23 -06002883 }
locke-lunargd556cc32019-09-17 01:21:23 -06002884 }
2885}
2886
2887void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
2888 VkDeviceSize memoryOffset, VkResult result) {
2889 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002890 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002891 bind_info.image = image;
2892 bind_info.memory = mem;
2893 bind_info.memoryOffset = memoryOffset;
2894 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06002895}
2896
2897void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002898 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002899 if (VK_SUCCESS != result) return;
2900 for (uint32_t i = 0; i < bindInfoCount; i++) {
2901 UpdateBindImageMemoryState(pBindInfos[i]);
2902 }
2903}
2904
2905void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002906 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002907 if (VK_SUCCESS != result) return;
2908 for (uint32_t i = 0; i < bindInfoCount; i++) {
2909 UpdateBindImageMemoryState(pBindInfos[i]);
2910 }
2911}
2912
2913void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002914 auto event_state = Get<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06002915 if (event_state) {
2916 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
2917 }
locke-lunargd556cc32019-09-17 01:21:23 -06002918}
2919
2920void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
2921 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
2922 VkResult result) {
2923 if (VK_SUCCESS != result) return;
2924 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
2925 pImportSemaphoreFdInfo->flags);
2926}
2927
2928void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002929 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002930 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Mike Schuchardt2df08912020-12-15 16:28:09 -08002931 if (semaphore_state && handle_type != VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06002932 // Cannot track semaphore state once it is exported, except for Sync FD handle types which have copy transference
2933 semaphore_state->scope = kSyncScopeExternalPermanent;
2934 }
2935}
2936
2937#ifdef VK_USE_PLATFORM_WIN32_KHR
2938void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
2939 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
2940 if (VK_SUCCESS != result) return;
2941 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
2942 pImportSemaphoreWin32HandleInfo->flags);
2943}
2944
2945void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
2946 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
2947 HANDLE *pHandle, VkResult result) {
2948 if (VK_SUCCESS != result) return;
2949 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
2950}
2951
2952void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
2953 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
2954 if (VK_SUCCESS != result) return;
2955 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
2956 pImportFenceWin32HandleInfo->flags);
2957}
2958
2959void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
2960 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
2961 HANDLE *pHandle, VkResult result) {
2962 if (VK_SUCCESS != result) return;
2963 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
2964}
2965#endif
2966
2967void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
2968 VkResult result) {
2969 if (VK_SUCCESS != result) return;
2970 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
2971}
2972
Mike Schuchardt2df08912020-12-15 16:28:09 -08002973void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
2974 VkFenceImportFlags flags) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002975 auto fence_node = Get<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06002976 if (fence_node && fence_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08002977 if ((handle_type == VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_FENCE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06002978 fence_node->scope == kSyncScopeInternal) {
2979 fence_node->scope = kSyncScopeExternalTemporary;
2980 } else {
2981 fence_node->scope = kSyncScopeExternalPermanent;
2982 }
2983 }
2984}
2985
2986void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
2987 VkResult result) {
2988 if (VK_SUCCESS != result) return;
2989 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
2990}
2991
Mike Schuchardt2df08912020-12-15 16:28:09 -08002992void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002993 auto fence_state = Get<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06002994 if (fence_state) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08002995 if (handle_type != VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06002996 // Export with reference transference becomes external
2997 fence_state->scope = kSyncScopeExternalPermanent;
2998 } else if (fence_state->scope == kSyncScopeInternal) {
2999 // Export with copy transference has a side effect of resetting the fence
3000 fence_state->state = FENCE_UNSIGNALED;
3001 }
3002 }
3003}
3004
3005void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3006 VkResult result) {
3007 if (VK_SUCCESS != result) return;
3008 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3009}
3010
3011void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3012 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3013 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003014 Add(std::make_shared<EVENT_STATE>(*pEvent, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003015}
3016
3017void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003018 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003019 SWAPCHAIN_NODE *old_swapchain_state) {
3020 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003021 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003022 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003023 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003024 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3025 surface_state->AddParent(swapchain.get());
3026 surface_state->swapchain = swapchain.get();
3027 swapchain->surface = std::move(surface_state);
Jeremy Gebben082a9832021-10-28 13:40:11 -06003028 Add(std::move(swapchain));
locke-lunargd556cc32019-09-17 01:21:23 -06003029 } else {
3030 surface_state->swapchain = nullptr;
3031 }
3032 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003033 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003034 if (old_swapchain_state) {
3035 old_swapchain_state->retired = true;
3036 }
3037 return;
3038}
3039
3040void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3041 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3042 VkResult result) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003043 auto surface_state = Get<SURFACE_STATE>(pCreateInfo->surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003044 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfo->oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003045 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003046}
3047
3048void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3049 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003050 Destroy<SWAPCHAIN_NODE>(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003051}
3052
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003053void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3054 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3055 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3056 VkResult result) {
3057 if (VK_SUCCESS != result) return;
3058 if (!pMode) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003059 Add(std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice));
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003060}
3061
locke-lunargd556cc32019-09-17 01:21:23 -06003062void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
3063 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3064 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003065 auto semaphore_state = Get<SEMAPHORE_STATE>(pPresentInfo->pWaitSemaphores[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003066 if (semaphore_state) {
Jeremy Gebben57642982021-09-14 14:14:55 -06003067 semaphore_state->signaler.queue = nullptr;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003068 semaphore_state->signaled = false;
locke-lunargd556cc32019-09-17 01:21:23 -06003069 }
3070 }
3071
Tony-LunarG6f887e52021-07-27 11:23:14 -06003072 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003073 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3074 // 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
3075 // confused itself just as much.
3076 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3077 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3078 // Mark the image as having been released to the WSI
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003079 auto swapchain_data = Get<SWAPCHAIN_NODE>(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003080 if (swapchain_data) {
3081 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003082 if (present_id_info) {
3083 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3084 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3085 }
3086 }
locke-lunargd556cc32019-09-17 01:21:23 -06003087 }
3088 }
3089 // Note: even though presentation is directed to a queue, there is no direct ordering between QP and subsequent work, so QP (and
3090 // its semaphore waits) /never/ participate in any completion proof.
3091}
3092
3093void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3094 const VkSwapchainCreateInfoKHR *pCreateInfos,
3095 const VkAllocationCallbacks *pAllocator,
3096 VkSwapchainKHR *pSwapchains, VkResult result) {
3097 if (pCreateInfos) {
3098 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003099 auto surface_state = Get<SURFACE_STATE>(pCreateInfos[i].surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003100 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfos[i].oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003101 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state),
3102 old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003103 }
3104 }
3105}
3106
3107void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3108 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003109 auto fence_state = Get<FENCE_STATE>(fence);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003110 if (fence_state && fence_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003111 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3112 // import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003113 fence_state->state = FENCE_INFLIGHT;
Jeremy Gebben57642982021-09-14 14:14:55 -06003114 fence_state->signaler.queue = nullptr; // ANI isn't on a queue, so this can't participate in a completion proof.
locke-lunargd556cc32019-09-17 01:21:23 -06003115 }
3116
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003117 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003118 if (semaphore_state && semaphore_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003119 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3120 // temporary import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003121 semaphore_state->signaled = true;
Jeremy Gebben57642982021-09-14 14:14:55 -06003122 semaphore_state->signaler.queue = nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003123 }
3124
3125 // Mark the image as acquired.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003126 auto swapchain_data = Get<SWAPCHAIN_NODE>(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003127 if (swapchain_data) {
3128 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003129 }
3130}
3131
3132void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3133 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3134 VkResult result) {
3135 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3136 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3137}
3138
3139void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3140 uint32_t *pImageIndex, VkResult result) {
3141 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3142 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3143 pAcquireInfo->fence, pImageIndex);
3144}
3145
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003146std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3147 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3148}
3149
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003150void ValidationStateTracker::PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
3151 const VkAllocationCallbacks *pAllocator, VkInstance *pInstance,
3152 VkResult result) {
3153 if (result != VK_SUCCESS) {
3154 return;
3155 }
Jeremy Gebben404f6ac2021-10-28 12:33:28 -06003156 instance_state = this;
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003157 uint32_t count = 0;
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003158 // this can fail if the allocator fails
3159 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, nullptr);
3160 if (result != VK_SUCCESS) {
3161 return;
3162 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003163 std::vector<VkPhysicalDevice> physdev_handles(count);
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003164 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, physdev_handles.data());
3165 if (result != VK_SUCCESS) {
3166 return;
3167 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003168
Jeremy Gebbend177d922021-10-28 13:42:10 -06003169 physical_device_map_.reserve(count);
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003170 for (auto physdev : physdev_handles) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003171 Add(CreatePhysicalDeviceState(physdev));
locke-lunargd556cc32019-09-17 01:21:23 -06003172 }
3173}
3174
3175// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003176static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003177 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003178}
3179
3180void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3181 uint32_t *pQueueFamilyPropertyCount,
3182 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003183 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3184 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003185 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003186}
3187
3188void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003189 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003190 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3191 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003192 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003193}
3194
3195void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003196 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003197 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3198 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003199 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003200}
3201void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3202 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003203 Destroy<SURFACE_STATE>(surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003204}
3205
Jeremy Gebben082a9832021-10-28 13:40:11 -06003206void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) { Add(std::make_shared<SURFACE_STATE>(*pSurface)); }
locke-lunargd556cc32019-09-17 01:21:23 -06003207
3208void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3209 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3210 const VkAllocationCallbacks *pAllocator,
3211 VkSurfaceKHR *pSurface, VkResult result) {
3212 if (VK_SUCCESS != result) return;
3213 RecordVulkanSurface(pSurface);
3214}
3215
3216#ifdef VK_USE_PLATFORM_ANDROID_KHR
3217void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3218 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3219 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3220 VkResult result) {
3221 if (VK_SUCCESS != result) return;
3222 RecordVulkanSurface(pSurface);
3223}
3224#endif // VK_USE_PLATFORM_ANDROID_KHR
3225
3226#ifdef VK_USE_PLATFORM_IOS_MVK
3227void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3228 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3229 VkResult result) {
3230 if (VK_SUCCESS != result) return;
3231 RecordVulkanSurface(pSurface);
3232}
3233#endif // VK_USE_PLATFORM_IOS_MVK
3234
3235#ifdef VK_USE_PLATFORM_MACOS_MVK
3236void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3237 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3238 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3239 VkResult result) {
3240 if (VK_SUCCESS != result) return;
3241 RecordVulkanSurface(pSurface);
3242}
3243#endif // VK_USE_PLATFORM_MACOS_MVK
3244
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003245#ifdef VK_USE_PLATFORM_METAL_EXT
3246void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3247 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3248 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3249 VkResult result) {
3250 if (VK_SUCCESS != result) return;
3251 RecordVulkanSurface(pSurface);
3252}
3253#endif // VK_USE_PLATFORM_METAL_EXT
3254
locke-lunargd556cc32019-09-17 01:21:23 -06003255#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3256void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3257 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3258 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3259 VkResult result) {
3260 if (VK_SUCCESS != result) return;
3261 RecordVulkanSurface(pSurface);
3262}
3263#endif // VK_USE_PLATFORM_WAYLAND_KHR
3264
3265#ifdef VK_USE_PLATFORM_WIN32_KHR
3266void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3267 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
3268 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3269 VkResult result) {
3270 if (VK_SUCCESS != result) return;
3271 RecordVulkanSurface(pSurface);
3272}
3273#endif // VK_USE_PLATFORM_WIN32_KHR
3274
3275#ifdef VK_USE_PLATFORM_XCB_KHR
3276void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
3277 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3278 VkResult result) {
3279 if (VK_SUCCESS != result) return;
3280 RecordVulkanSurface(pSurface);
3281}
3282#endif // VK_USE_PLATFORM_XCB_KHR
3283
3284#ifdef VK_USE_PLATFORM_XLIB_KHR
3285void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
3286 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3287 VkResult result) {
3288 if (VK_SUCCESS != result) return;
3289 RecordVulkanSurface(pSurface);
3290}
3291#endif // VK_USE_PLATFORM_XLIB_KHR
3292
Niklas Haas8b84af12020-04-19 22:20:11 +02003293void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3294 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3295 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3296 VkResult result) {
3297 if (VK_SUCCESS != result) return;
3298 RecordVulkanSurface(pSurface);
3299}
3300
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003301void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
3302 VkSurfaceKHR surface,
3303 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities,
3304 VkResult result) {
3305 if (VK_SUCCESS != result) return;
3306 auto surface_state = Get<SURFACE_STATE>(surface);
3307 surface_state->SetCapabilities(physicalDevice, *pSurfaceCapabilities);
3308}
3309
3310void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
3311 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3312 VkSurfaceCapabilities2KHR *pSurfaceCapabilities, VkResult result) {
3313 if (VK_SUCCESS != result) return;
3314 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3315 surface_state->SetCapabilities(physicalDevice, pSurfaceCapabilities->surfaceCapabilities);
3316}
3317
3318void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice,
3319 VkSurfaceKHR surface,
3320 VkSurfaceCapabilities2EXT *pSurfaceCapabilities,
3321 VkResult result) {
3322 auto surface_state = Get<SURFACE_STATE>(surface);
3323 VkSurfaceCapabilitiesKHR caps{
3324 pSurfaceCapabilities->minImageCount, pSurfaceCapabilities->maxImageCount,
3325 pSurfaceCapabilities->currentExtent, pSurfaceCapabilities->minImageExtent,
3326 pSurfaceCapabilities->maxImageExtent, pSurfaceCapabilities->maxImageArrayLayers,
3327 pSurfaceCapabilities->supportedTransforms, pSurfaceCapabilities->currentTransform,
3328 pSurfaceCapabilities->supportedCompositeAlpha, pSurfaceCapabilities->supportedUsageFlags,
3329 };
3330 surface_state->SetCapabilities(physicalDevice, caps);
3331}
3332
locke-lunargd556cc32019-09-17 01:21:23 -06003333void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3334 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3335 VkBool32 *pSupported, VkResult result) {
3336 if (VK_SUCCESS != result) return;
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003337 auto surface_state = Get<SURFACE_STATE>(surface);
3338 surface_state->SetQueueSupport(physicalDevice, queueFamilyIndex, (*pSupported == VK_TRUE));
3339}
3340
3341void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
3342 VkSurfaceKHR surface,
3343 uint32_t *pPresentModeCount,
3344 VkPresentModeKHR *pPresentModes,
3345 VkResult result) {
3346 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3347
3348 if (pPresentModes) {
3349 auto surface_state = Get<SURFACE_STATE>(surface);
3350 surface_state->SetPresentModes(physicalDevice,
3351 std::vector<VkPresentModeKHR>(pPresentModes, pPresentModes + *pPresentModeCount));
3352 }
3353}
3354
3355void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
3356 uint32_t *pSurfaceFormatCount,
3357 VkSurfaceFormatKHR *pSurfaceFormats,
3358 VkResult result) {
3359 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3360
3361 if (pSurfaceFormats) {
3362 auto surface_state = Get<SURFACE_STATE>(surface);
3363 surface_state->SetFormats(physicalDevice,
3364 std::vector<VkSurfaceFormatKHR>(pSurfaceFormats, pSurfaceFormats + *pSurfaceFormatCount));
3365 }
3366}
3367
3368void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
3369 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3370 uint32_t *pSurfaceFormatCount,
3371 VkSurfaceFormat2KHR *pSurfaceFormats,
3372 VkResult result) {
3373 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3374
3375 if (pSurfaceFormats) {
3376 std::vector<VkSurfaceFormatKHR> fmts(*pSurfaceFormatCount);
3377 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3378 for (uint32_t i = 0; i < *pSurfaceFormatCount; i++) {
3379 fmts[i] = pSurfaceFormats[i].surfaceFormat;
3380 }
3381 surface_state->SetFormats(physicalDevice, std::move(fmts));
3382 }
locke-lunargd556cc32019-09-17 01:21:23 -06003383}
3384
locke-lunargd556cc32019-09-17 01:21:23 -06003385void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3386 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003387 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003388 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003389 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3390}
3391
3392void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003393 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003394 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003395 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3396}
3397
3398void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3399 const VkDebugUtilsLabelEXT *pLabelInfo) {
3400 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3401
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003402 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003403 cb_state->RecordCmd(CMD_INSERTDEBUGUTILSLABELEXT);
3404 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003405 cb_state->debug_label = LoggingLabel(pLabelInfo);
3406}
3407
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003408void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3409 uint32_t queueFamilyIndex,
3410 uint32_t *pCounterCount,
3411 VkPerformanceCounterKHR *pCounters) {
3412 if (NULL == pCounters) return;
3413
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003414 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3415 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003416
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003417 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3418 queue_family_counters->counters.resize(*pCounterCount);
3419 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003420
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003421 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003422}
3423
3424void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3425 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3426 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3427 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3428 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3429}
3430
3431void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3432 VkResult result) {
3433 if (result == VK_SUCCESS) performance_lock_acquired = true;
3434}
3435
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003436void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3437 performance_lock_acquired = false;
Jeremy Gebbend177d922021-10-28 13:42:10 -06003438 for (auto &cmd_buffer : command_buffer_map_) {
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003439 cmd_buffer.second->performance_lock_released = true;
3440 }
3441}
3442
locke-lunargd556cc32019-09-17 01:21:23 -06003443void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003444 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003445 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003446 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003447}
3448
3449void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003450 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003451 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003452 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003453}
3454
Mike Schuchardt2df08912020-12-15 16:28:09 -08003455void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3456 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003457 Add(std::make_shared<UPDATE_TEMPLATE_STATE>(*pDescriptorUpdateTemplate, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06003458}
3459
Mike Schuchardt2df08912020-12-15 16:28:09 -08003460void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3461 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3462 const VkAllocationCallbacks *pAllocator,
3463 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3464 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003465 if (VK_SUCCESS != result) return;
3466 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3467}
3468
3469void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003470 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3471 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003472 if (VK_SUCCESS != result) return;
3473 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3474}
3475
3476void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003477 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003478 const void *pData) {
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003479 auto const template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
3480 assert(template_state);
3481 if (template_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003482 // TODO: Record template push descriptor updates
3483 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003484 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state.get(), pData);
locke-lunargd556cc32019-09-17 01:21:23 -06003485 }
3486 }
3487}
3488
3489void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3490 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3491 const void *pData) {
3492 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3493}
3494
3495void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003496 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003497 const void *pData) {
3498 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3499}
3500
Mike Schuchardt2df08912020-12-15 16:28:09 -08003501void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3502 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3503 VkPipelineLayout layout, uint32_t set,
3504 const void *pData) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003505 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003506
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003507 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003508 const auto template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003509 if (template_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003510 auto layout_data = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003511 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003512 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003513 // Decode the template into a set of write updates
Jeremy Gebben9f537102021-10-05 16:37:12 -06003514 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state.get(), pData,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003515 dsl->GetDescriptorSetLayout());
Jeremy Gebben9f537102021-10-05 16:37:12 -06003516 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data.get(), set,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003517 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3518 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003519 }
3520}
3521
3522void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3523 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003524 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003525 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003526 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003527 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003528 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003529 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003530 }
3531}
3532
3533void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3534 uint32_t *pPropertyCount,
3535 VkDisplayPlanePropertiesKHR *pProperties,
3536 VkResult result) {
3537 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3538 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3539}
3540
3541void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3542 uint32_t *pPropertyCount,
3543 VkDisplayPlaneProperties2KHR *pProperties,
3544 VkResult result) {
3545 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3546 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3547}
3548
3549void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3550 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3551 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003552 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003553 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003554 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003555}
3556
3557void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3558 uint32_t query, uint32_t index) {
3559 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003560 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003561 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003562 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003563}
3564
3565void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3566 VkSamplerYcbcrConversion ycbcr_conversion) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003567 VkFormatFeatureFlags format_features = 0;
3568
3569 if (create_info->format != VK_FORMAT_UNDEFINED) {
3570 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07003571 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003572 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
3573 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003574 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003575
Jeremy Gebben082a9832021-10-28 13:40:11 -06003576 Add(std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features));
locke-lunargd556cc32019-09-17 01:21:23 -06003577}
3578
3579void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
3580 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3581 const VkAllocationCallbacks *pAllocator,
3582 VkSamplerYcbcrConversion *pYcbcrConversion,
3583 VkResult result) {
3584 if (VK_SUCCESS != result) return;
3585 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3586}
3587
3588void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(VkDevice device,
3589 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3590 const VkAllocationCallbacks *pAllocator,
3591 VkSamplerYcbcrConversion *pYcbcrConversion,
3592 VkResult result) {
3593 if (VK_SUCCESS != result) return;
3594 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3595}
3596
3597void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
3598 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003599 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003600}
3601
3602void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
3603 VkSamplerYcbcrConversion ycbcrConversion,
3604 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003605 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003606}
3607
Tony-LunarG977448c2019-12-02 14:52:02 -07003608void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3609 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06003610 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07003611 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003612
3613 // Do nothing if the query pool has been destroyed.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003614 auto query_pool_state = Get<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06003615 if (!query_pool_state) return;
3616
3617 // Reset the state of existing entries.
locke-lunargd556cc32019-09-17 01:21:23 -06003618 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
3619 for (uint32_t i = 0; i < max_query_count; ++i) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003620 auto query_index = firstQuery + i;
3621 query_pool_state->SetQueryState(query_index, 0, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003622 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003623 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003624 query_pool_state->SetQueryState(query_index, pass_index, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003625 }
3626 }
locke-lunargd556cc32019-09-17 01:21:23 -06003627 }
3628}
3629
Tony-LunarG977448c2019-12-02 14:52:02 -07003630void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3631 uint32_t queryCount) {
3632 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3633}
3634
3635void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3636 uint32_t queryCount) {
3637 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3638}
3639
locke-lunargd556cc32019-09-17 01:21:23 -06003640void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003641 const UPDATE_TEMPLATE_STATE *template_state,
3642 const void *pData) {
locke-lunargd556cc32019-09-17 01:21:23 -06003643 // Translate the templated update into a normal update for validation...
3644 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
3645 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
3646 decoded_update.desc_writes.data(), 0, NULL);
3647}
3648
3649// Update the common AllocateDescriptorSetsData
3650void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05003651 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06003652 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003653 auto layout = Get<cvdescriptorset::DescriptorSetLayout>(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003654 if (layout) {
3655 ds_data->layout_nodes[i] = layout;
3656 // Count total descriptors required per type
3657 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
3658 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003659 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
3660 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003661 }
3662 }
3663 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
3664 }
3665}
3666
locke-lunargd556cc32019-09-17 01:21:23 -06003667void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3668 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003669 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003670 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003671}
3672
Tony-LunarG745150c2021-07-02 15:07:31 -06003673void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3674 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
3675 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003676 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003677 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003678}
3679
locke-lunargd556cc32019-09-17 01:21:23 -06003680void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3681 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3682 uint32_t firstInstance) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003683 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003684 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003685}
3686
Tony-LunarG745150c2021-07-02 15:07:31 -06003687void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3688 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
3689 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
3690 const int32_t *pVertexOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003691 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003692 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003693}
3694
locke-lunargd556cc32019-09-17 01:21:23 -06003695void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3696 uint32_t count, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003697 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3698 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003699 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003700 if (!disabled[command_buffer_state]) {
3701 cb_state->AddChild(buffer_state);
3702 }
locke-lunargd556cc32019-09-17 01:21:23 -06003703}
3704
3705void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3706 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003707 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3708 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003709 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003710 if (!disabled[command_buffer_state]) {
3711 cb_state->AddChild(buffer_state);
3712 }
locke-lunargd556cc32019-09-17 01:21:23 -06003713}
3714
3715void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003716 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003717 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06003718}
3719
3720void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3721 VkDeviceSize offset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003722 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003723 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003724 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003725 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003726 cb_state->AddChild(buffer_state);
3727 }
locke-lunargd556cc32019-09-17 01:21:23 -06003728}
3729
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003730void ValidationStateTracker::PostCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3731 uint32_t, uint32_t) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003732 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003733 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3734}
3735
3736void ValidationStateTracker::PostCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3737 uint32_t, uint32_t) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003738 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003739 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3740}
3741
Tony-LunarG977448c2019-12-02 14:52:02 -07003742void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3743 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07003744 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003745 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003746 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003747 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003748 auto buffer_state = Get<BUFFER_STATE>(buffer);
3749 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003750 cb_state->AddChild(buffer_state);
3751 cb_state->AddChild(count_buffer_state);
3752 }
Tony-LunarG977448c2019-12-02 14:52:02 -07003753}
3754
locke-lunargd556cc32019-09-17 01:21:23 -06003755void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3756 VkDeviceSize offset, VkBuffer countBuffer,
3757 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3758 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003759 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003760 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003761}
3762
3763void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3764 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3765 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003766 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003767 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07003768}
3769
3770void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3771 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07003772 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003773 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003774 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003775 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003776 auto buffer_state = Get<BUFFER_STATE>(buffer);
3777 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003778 cb_state->AddChild(buffer_state);
3779 cb_state->AddChild(count_buffer_state);
3780 }
locke-lunargd556cc32019-09-17 01:21:23 -06003781}
3782
3783void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3784 VkDeviceSize offset, VkBuffer countBuffer,
3785 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3786 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003787 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003788 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003789}
3790
3791void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
3792 VkDeviceSize offset, VkBuffer countBuffer,
3793 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3794 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003795 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003796 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06003797}
3798
3799void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
3800 uint32_t firstTask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003801 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003802 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003803}
3804
3805void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
3806 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003807 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003808 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003809 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003810 if (!disabled[command_buffer_state] && buffer_state) {
3811 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003812 }
3813}
3814
3815void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
3816 VkDeviceSize offset, VkBuffer countBuffer,
3817 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3818 uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003819 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003820 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003821 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003822 auto buffer_state = Get<BUFFER_STATE>(buffer);
3823 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003824 if (buffer_state) {
3825 cb_state->AddChild(buffer_state);
3826 }
3827 if (count_buffer_state) {
3828 cb_state->AddChild(count_buffer_state);
3829 }
locke-lunargd556cc32019-09-17 01:21:23 -06003830 }
3831}
3832
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003833void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
3834 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
3835 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
3836 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
3837 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
3838 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
3839 uint32_t width, uint32_t height, uint32_t depth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003840 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003841 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003842 cb_state->hasTraceRaysCmd = true;
3843}
3844
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003845void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
3846 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
3847 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
3848 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
3849 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
3850 uint32_t height, uint32_t depth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003851 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003852 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003853 cb_state->hasTraceRaysCmd = true;
3854}
3855
3856void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
3857 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
3858 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
3859 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
3860 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
3861 VkDeviceAddress indirectDeviceAddress) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003862 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003863 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003864 cb_state->hasTraceRaysCmd = true;
3865}
3866
locke-lunargd556cc32019-09-17 01:21:23 -06003867void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
3868 const VkAllocationCallbacks *pAllocator,
3869 VkShaderModule *pShaderModule, VkResult result,
3870 void *csm_state_data) {
3871 if (VK_SUCCESS != result) return;
3872 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
3873
sfricke-samsung45996a42021-09-16 13:45:27 -07003874 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06003875 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003876 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
3877 csm_state->unique_shader_id)
3878 : std::make_shared<SHADER_MODULE_STATE>();
Jeremy Gebben082a9832021-10-28 13:40:11 -06003879 Add(std::move(new_shader_module));
locke-lunargd556cc32019-09-17 01:21:23 -06003880}
3881
John Zulauf22b0fbe2019-10-15 06:26:16 -06003882void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
3883 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
3884 VkResult result) {
3885 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06003886 auto swapchain_state = Get<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06003887
3888 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
3889
3890 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06003891 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07003892 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07003893 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06003894
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003895 auto format_features =
3896 GetImageFormatFeatures(physical_device, device, pSwapchainImages[i], swapchain_state->image_create_info.format,
3897 swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06003898
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06003899 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003900 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003901 if (!swapchain_image.fake_base_address) {
3902 auto size = image_state->fragment_encoder->TotalSize();
3903 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07003904 }
3905
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003906 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003907 swapchain_image.image_state = image_state.get();
Jeremy Gebben082a9832021-10-28 13:40:11 -06003908 Add(std::move(image_state));
John Zulauf22b0fbe2019-10-15 06:26:16 -06003909 }
3910 }
3911
3912 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06003913 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
3914 }
3915}
sourav parmar35e7a002020-06-09 17:58:44 -07003916
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02003917void ValidationStateTracker::PostCallRecordCopyAccelerationStructureKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
3918 const VkCopyAccelerationStructureInfoKHR *pInfo,
3919 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003920 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
3921 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02003922 if (dst_as_state != nullptr && src_as_state != nullptr) {
3923 dst_as_state->built = true;
3924 dst_as_state->build_info_khr = src_as_state->build_info_khr;
3925 }
3926}
3927
sourav parmar35e7a002020-06-09 17:58:44 -07003928void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
3929 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003930 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07003931 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003932 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003933 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
3934 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07003935 if (dst_as_state != nullptr && src_as_state != nullptr) {
3936 dst_as_state->built = true;
3937 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003938 if (!disabled[command_buffer_state]) {
3939 cb_state->AddChild(dst_as_state);
3940 cb_state->AddChild(src_as_state);
3941 }
sourav parmar35e7a002020-06-09 17:58:44 -07003942 }
3943 }
3944}
Piers Daniell39842ee2020-07-10 16:42:33 -06003945
3946void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003947 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003948 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06003949}
3950
3951void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003952 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003953 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06003954}
3955
3956void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
3957 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003958 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003959 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06003960 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06003961}
3962
3963void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
3964 const VkViewport *pViewports) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003965 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003966 cb_state->RecordStateCmd(CMD_SETVIEWPORTWITHCOUNTEXT, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07003967 uint32_t bits = (1u << viewportCount) - 1u;
3968 cb_state->viewportWithCountMask |= bits;
3969 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00003970 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07003971 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07003972
3973 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
3974 for (size_t i = 0; i < viewportCount; ++i) {
3975 cb_state->dynamicViewports[i] = pViewports[i];
3976 }
Piers Daniell39842ee2020-07-10 16:42:33 -06003977}
3978
3979void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
3980 const VkRect2D *pScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003981 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003982 cb_state->RecordStateCmd(CMD_SETSCISSORWITHCOUNTEXT, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07003983 uint32_t bits = (1u << scissorCount) - 1u;
3984 cb_state->scissorWithCountMask |= bits;
3985 cb_state->trashedScissorMask &= ~bits;
3986 cb_state->scissorWithCountCount = scissorCount;
3987 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06003988}
3989
3990void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3991 uint32_t bindingCount, const VkBuffer *pBuffers,
3992 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
3993 const VkDeviceSize *pStrides) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003994 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003995 cb_state->RecordStateCmd(CMD_BINDVERTEXBUFFERS2EXT, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06003996
3997 uint32_t end = firstBinding + bindingCount;
3998 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
3999 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
4000 }
4001
4002 for (uint32_t i = 0; i < bindingCount; ++i) {
4003 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06004004 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004005 vertex_buffer_binding.offset = pOffsets[i];
4006 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4007 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4008 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004009 if (!disabled[command_buffer_state] && pBuffers[i]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06004010 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Piers Daniell39842ee2020-07-10 16:42:33 -06004011 }
4012 }
4013}
4014
4015void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004016 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004017 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004018}
4019
4020void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004021 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004022 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004023}
4024
4025void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004026 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004027 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004028}
4029
4030void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4031 VkBool32 depthBoundsTestEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004032 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004033 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004034}
4035void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004036 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004037 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004038}
4039
4040void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4041 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4042 VkCompareOp compareOp) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004043 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004044 cb_state->RecordStateCmd(CMD_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004045}
locke-lunarg4189aa22020-10-21 00:23:48 -06004046
4047void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4048 uint32_t discardRectangleCount,
4049 const VkRect2D *pDiscardRectangles) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004050 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004051 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004052}
4053
4054void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4055 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004056 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004057 cb_state->RecordStateCmd(CMD_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004058}
4059
4060void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4061 VkCoarseSampleOrderTypeNV sampleOrderType,
4062 uint32_t customSampleOrderCount,
4063 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004064 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004065 cb_state->RecordStateCmd(CMD_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004066}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004067
4068void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004069 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004070 cb_state->RecordStateCmd(CMD_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004071}
4072
4073void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004074 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004075 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004076}
4077
4078void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4079 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004080 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004081 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004082}
4083
4084void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004085 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004086 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004087}
4088
4089void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4090 VkBool32 primitiveRestartEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004091 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004092 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004093}
Piers Daniell924cd832021-05-18 13:48:47 -06004094
4095void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4096 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4097 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4098 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004099 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004100 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4101
4102 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4103 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4104 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004105 if (pipeline_state->create_info.graphics.pDynamicState) {
4106 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4107 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004108 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4109 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4110 break;
4111 }
4112 }
4113 }
4114 }
4115 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004116}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004117
4118void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004119 auto buffer_state = Get<BUFFER_STATE>(pInfo->buffer);
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004120 if (buffer_state) {
4121 // address is used for GPU-AV and ray tracing buffer validation
4122 buffer_state->deviceAddress = address;
Jeremy Gebben9f537102021-10-05 16:37:12 -06004123 buffer_address_map_.emplace(address, buffer_state.get());
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004124 }
4125}
4126
4127void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4128 VkDeviceAddress address) {
4129 RecordGetBufferDeviceAddress(pInfo, address);
4130}
4131
4132void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4133 VkDeviceAddress address) {
4134 RecordGetBufferDeviceAddress(pInfo, address);
4135}
4136
4137void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4138 VkDeviceAddress address) {
4139 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004140}
4141
4142std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4143 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004144 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004145}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004146
4147std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4148 const VkCommandBufferAllocateInfo *create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06004149 const COMMAND_POOL_STATE *pool) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004150 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4151}