blob: d7af098b24bda2143b0c4657cc909bb3346af803 [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>
Lionel Landwerlin21719f62021-12-09 11:40:09 +020099VkFormatFeatureFlags2KHR ValidationStateTracker::GetExternalFormatFeaturesANDROID(const CreateInfo *create_info) const {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -0600100 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;
Lionel Landwerlin21719f62021-12-09 11:40:09 +0200115 auto ahb_format_props2 = LvlFindInChain<VkAndroidHardwareBufferFormatProperties2ANDROID>(pProperties->pNext);
116 if (ahb_format_props2) {
117 ahb_ext_formats_map.insert(ahb_format_props2->externalFormat, ahb_format_props2->formatFeatures);
118 } else {
119 auto ahb_format_props = LvlFindInChain<VkAndroidHardwareBufferFormatPropertiesANDROID>(pProperties->pNext);
120 if (ahb_format_props) {
121 ahb_ext_formats_map.insert(ahb_format_props->externalFormat,
122 static_cast<VkFormatFeatureFlags2KHR>(ahb_format_props->formatFeatures));
123 }
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700124 }
125}
126
locke-lunargd556cc32019-09-17 01:21:23 -0600127#else
128
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -0600129template <typename CreateInfo>
Lionel Landwerlin21719f62021-12-09 11:40:09 +0200130VkFormatFeatureFlags2KHR ValidationStateTracker::GetExternalFormatFeaturesANDROID(const CreateInfo *create_info) const {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -0600131 return 0;
132}
locke-lunargd556cc32019-09-17 01:21:23 -0600133
134#endif // VK_USE_PLATFORM_ANDROID_KHR
135
Lionel Landwerlin15ed1f62022-01-12 16:54:05 +0200136VkFormatFeatureFlags2KHR GetImageFormatFeatures(VkPhysicalDevice physical_device, bool has_format_feature2, bool has_drm_modifiers,
137 VkDevice device, VkImage image, VkFormat format, VkImageTiling tiling) {
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200138 VkFormatFeatureFlags2KHR format_features = 0;
139
Petr Kraus44f1c482020-04-25 20:09:25 +0200140 // Add feature support according to Image Format Features (vkspec.html#resources-image-format-features)
141 // if format is AHB external format then the features are already set
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200142 if (has_format_feature2) {
143 auto fmt_drm_props = LvlInitStruct<VkDrmFormatModifierPropertiesList2EXT>();
Lionel Landwerlin15ed1f62022-01-12 16:54:05 +0200144 auto fmt_props_3 = LvlInitStruct<VkFormatProperties3KHR>(has_drm_modifiers ? &fmt_drm_props : nullptr);
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200145 auto fmt_props_2 = LvlInitStruct<VkFormatProperties2>(&fmt_props_3);
146
147 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &fmt_props_2);
148
149 if (tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
150 VkImageDrmFormatModifierPropertiesEXT drm_format_props = {
151 VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
152 nullptr,
153 };
154
155 // Find the image modifier
156 DispatchGetImageDrmFormatModifierPropertiesEXT(device, image, &drm_format_props);
157
158 std::vector<VkDrmFormatModifierProperties2EXT> drm_mod_props;
159 drm_mod_props.resize(fmt_drm_props.drmFormatModifierCount);
160 fmt_drm_props.pDrmFormatModifierProperties = &drm_mod_props[0];
161
162 // Second query to have all the modifiers filled
163 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &fmt_props_2);
164
165 // Look for the image modifier in the list
166 for (uint32_t i = 0; i < fmt_drm_props.drmFormatModifierCount; i++) {
167 if (fmt_drm_props.pDrmFormatModifierProperties[i].drmFormatModifier == drm_format_props.drmFormatModifier) {
168 format_features = fmt_drm_props.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
169 break;
170 }
171 }
172 } else {
173 format_features =
174 (tiling == VK_IMAGE_TILING_LINEAR) ? fmt_props_3.linearTilingFeatures : fmt_props_3.optimalTilingFeatures;
175 }
176 } else if (tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600177 VkImageDrmFormatModifierPropertiesEXT drm_format_properties = {VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
178 nullptr};
179 DispatchGetImageDrmFormatModifierPropertiesEXT(device, image, &drm_format_properties);
Petr Kraus44f1c482020-04-25 20:09:25 +0200180
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600181 VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, nullptr};
182 VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
183 nullptr};
184 format_properties_2.pNext = (void *)&drm_properties_list;
185 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
186 std::vector<VkDrmFormatModifierPropertiesEXT> drm_properties;
187 drm_properties.resize(drm_properties_list.drmFormatModifierCount);
188 drm_properties_list.pDrmFormatModifierProperties = &drm_properties[0];
189 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
Petr Kraus44f1c482020-04-25 20:09:25 +0200190
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600191 for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
192 if (drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifier == drm_format_properties.drmFormatModifier) {
193 format_features = drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
194 break;
Petr Kraus44f1c482020-04-25 20:09:25 +0200195 }
Petr Kraus44f1c482020-04-25 20:09:25 +0200196 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600197 } else {
198 VkFormatProperties format_properties;
199 DispatchGetPhysicalDeviceFormatProperties(physical_device, format, &format_properties);
200 format_features =
201 (tiling == VK_IMAGE_TILING_LINEAR) ? format_properties.linearTilingFeatures : format_properties.optimalTilingFeatures;
Petr Kraus44f1c482020-04-25 20:09:25 +0200202 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600203 return format_features;
Petr Kraus44f1c482020-04-25 20:09:25 +0200204}
205
locke-lunargd556cc32019-09-17 01:21:23 -0600206void ValidationStateTracker::PostCallRecordCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
207 const VkAllocationCallbacks *pAllocator, VkImage *pImage, VkResult result) {
208 if (VK_SUCCESS != result) return;
Lionel Landwerlin21719f62021-12-09 11:40:09 +0200209 VkFormatFeatureFlags2KHR format_features = 0;
sfricke-samsung45996a42021-09-16 13:45:27 -0700210 if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600211 format_features = GetExternalFormatFeaturesANDROID(pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -0600212 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600213 if (format_features == 0) {
Lionel Landwerlin15ed1f62022-01-12 16:54:05 +0200214 format_features = GetImageFormatFeatures(physical_device, has_format_feature2,
215 IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier), device, *pImage,
216 pCreateInfo->format, pCreateInfo->tiling);
locke-lunargd556cc32019-09-17 01:21:23 -0600217 }
Jeremy Gebben082a9832021-10-28 13:40:11 -0600218 Add(std::make_shared<IMAGE_STATE>(this, *pImage, pCreateInfo, format_features));
locke-lunargd556cc32019-09-17 01:21:23 -0600219}
220
221void ValidationStateTracker::PreCallRecordDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600222 Destroy<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -0600223}
224
225void ValidationStateTracker::PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
226 VkImageLayout imageLayout, const VkClearColorValue *pColor,
227 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600228 if (disabled[command_buffer_state]) return;
229
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700230 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600231 if (cb_node) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600232 cb_node->RecordTransferCmd(CMD_CLEARCOLORIMAGE, Get<IMAGE_STATE>(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600233 }
234}
235
236void ValidationStateTracker::PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image,
237 VkImageLayout imageLayout,
238 const VkClearDepthStencilValue *pDepthStencil,
239 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600240 if (disabled[command_buffer_state]) return;
241
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700242 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600243 if (cb_node) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600244 cb_node->RecordTransferCmd(CMD_CLEARDEPTHSTENCILIMAGE, Get<IMAGE_STATE>(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600245 }
246}
247
248void ValidationStateTracker::PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage,
249 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
250 uint32_t regionCount, const VkImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600251 if (disabled[command_buffer_state]) return;
252
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700253 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600254 cb_node->RecordTransferCmd(CMD_COPYIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600255}
256
Jeff Leger178b1e52020-10-05 12:22:23 -0400257void ValidationStateTracker::PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer,
258 const VkCopyImageInfo2KHR *pCopyImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600259 if (disabled[command_buffer_state]) return;
260
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700261 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600262 cb_node->RecordTransferCmd(CMD_COPYIMAGE2KHR, Get<IMAGE_STATE>(pCopyImageInfo->srcImage),
263 Get<IMAGE_STATE>(pCopyImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400264}
265
Tony-LunarGb61514a2021-11-02 12:36:51 -0600266void ValidationStateTracker::PreCallRecordCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) {
267 if (disabled[command_buffer_state]) return;
268
269 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
270 cb_node->RecordTransferCmd(CMD_COPYIMAGE2, Get<IMAGE_STATE>(pCopyImageInfo->srcImage),
271 Get<IMAGE_STATE>(pCopyImageInfo->dstImage));
272}
273
locke-lunargd556cc32019-09-17 01:21:23 -0600274void ValidationStateTracker::PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage,
275 VkImageLayout srcImageLayout, VkImage dstImage,
276 VkImageLayout dstImageLayout, uint32_t regionCount,
277 const VkImageResolve *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600278 if (disabled[command_buffer_state]) return;
279
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700280 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600281 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600282}
283
Jeff Leger178b1e52020-10-05 12:22:23 -0400284void ValidationStateTracker::PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer,
285 const VkResolveImageInfo2KHR *pResolveImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600286 if (disabled[command_buffer_state]) return;
287
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700288 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600289 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE2KHR, Get<IMAGE_STATE>(pResolveImageInfo->srcImage),
290 Get<IMAGE_STATE>(pResolveImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400291}
292
Tony-LunarG562fc102021-11-12 13:58:35 -0700293void ValidationStateTracker::PreCallRecordCmdResolveImage2(VkCommandBuffer commandBuffer,
294 const VkResolveImageInfo2 *pResolveImageInfo) {
295 if (disabled[command_buffer_state]) return;
296
297 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
298 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE2, Get<IMAGE_STATE>(pResolveImageInfo->srcImage),
299 Get<IMAGE_STATE>(pResolveImageInfo->dstImage));
300}
301
locke-lunargd556cc32019-09-17 01:21:23 -0600302void ValidationStateTracker::PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage,
303 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
304 uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600305 if (disabled[command_buffer_state]) return;
306
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700307 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600308 cb_node->RecordTransferCmd(CMD_BLITIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600309}
310
Jeff Leger178b1e52020-10-05 12:22:23 -0400311void ValidationStateTracker::PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer,
312 const VkBlitImageInfo2KHR *pBlitImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600313 if (disabled[command_buffer_state]) return;
314
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700315 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600316 cb_node->RecordTransferCmd(CMD_BLITIMAGE2KHR, Get<IMAGE_STATE>(pBlitImageInfo->srcImage),
317 Get<IMAGE_STATE>(pBlitImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400318}
319
Tony-LunarG542ae912021-11-04 16:06:44 -0600320void ValidationStateTracker::PreCallRecordCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) {
321 if (disabled[command_buffer_state]) return;
322
323 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
324 cb_node->RecordTransferCmd(CMD_BLITIMAGE2, Get<IMAGE_STATE>(pBlitImageInfo->srcImage),
325 Get<IMAGE_STATE>(pBlitImageInfo->dstImage));
326}
327
locke-lunargd556cc32019-09-17 01:21:23 -0600328void ValidationStateTracker::PostCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
329 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer,
330 VkResult result) {
331 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600332
Jeremy Gebbenc8937b62021-09-24 15:50:56 -0600333 auto buffer_state = std::make_shared<BUFFER_STATE>(this, *pBuffer, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -0600334
James Rumble2f6e7bb2021-07-13 15:21:20 +0100335 if (pCreateInfo) {
336 const auto *opaque_capture_address = LvlFindInChain<VkBufferOpaqueCaptureAddressCreateInfo>(pCreateInfo->pNext);
337 if (opaque_capture_address) {
338 // address is used for GPU-AV and ray tracing buffer validation
339 buffer_state->deviceAddress = opaque_capture_address->opaqueCaptureAddress;
Jeremy Gebben65975ed2021-10-29 11:16:10 -0600340 buffer_address_map_.insert(opaque_capture_address->opaqueCaptureAddress, buffer_state.get());
James Rumble2f6e7bb2021-07-13 15:21:20 +0100341 }
342 }
Jeremy Gebben082a9832021-10-28 13:40:11 -0600343 Add(std::move(buffer_state));
locke-lunargd556cc32019-09-17 01:21:23 -0600344}
345
346void ValidationStateTracker::PostCallRecordCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
347 const VkAllocationCallbacks *pAllocator, VkBufferView *pView,
348 VkResult result) {
349 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600350
Jeremy Gebben9f537102021-10-05 16:37:12 -0600351 auto buffer_state = Get<BUFFER_STATE>(pCreateInfo->buffer);
locke-lunarg25b6c352020-08-06 17:44:18 -0600352
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200353 VkFormatFeatureFlags2KHR buffer_features;
354 if (has_format_feature2) {
355 auto fmt_props_3 = LvlInitStruct<VkFormatProperties3KHR>();
356 auto fmt_props_2 = LvlInitStruct<VkFormatProperties2>(&fmt_props_3);
357 DispatchGetPhysicalDeviceFormatProperties2(physical_device, pCreateInfo->format, &fmt_props_2);
358 buffer_features = fmt_props_3.bufferFeatures;
359 } else {
360 VkFormatProperties format_properties;
361 DispatchGetPhysicalDeviceFormatProperties(physical_device, pCreateInfo->format, &format_properties);
362 buffer_features = format_properties.bufferFeatures;
363 }
locke-lunarg25b6c352020-08-06 17:44:18 -0600364
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200365 Add(std::make_shared<BUFFER_VIEW_STATE>(buffer_state, *pView, pCreateInfo, buffer_features));
locke-lunargd556cc32019-09-17 01:21:23 -0600366}
367
368void ValidationStateTracker::PostCallRecordCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
369 const VkAllocationCallbacks *pAllocator, VkImageView *pView,
370 VkResult result) {
371 if (result != VK_SUCCESS) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -0600372 auto image_state = Get<IMAGE_STATE>(pCreateInfo->image);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700373
Lionel Landwerlin21719f62021-12-09 11:40:09 +0200374 VkFormatFeatureFlags2KHR format_features = 0;
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600375 if (image_state->HasAHBFormat() == true) {
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700376 // The ImageView uses same Image's format feature since they share same AHB
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600377 format_features = image_state->format_features;
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700378 } else {
Lionel Landwerlin15ed1f62022-01-12 16:54:05 +0200379 format_features = GetImageFormatFeatures(physical_device, has_format_feature2,
380 IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier), device,
381 image_state->image(), pCreateInfo->format, image_state->createInfo.tiling);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700382 }
383
locke-lunarg9939d4b2020-10-26 20:11:08 -0600384 // 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 -0600385 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600386 if (IsExtEnabled(device_extensions.vk_ext_filter_cubic)) {
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700387 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600388 imageview_format_info.imageViewType = pCreateInfo->viewType;
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700389 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600390 image_format_info.type = image_state->createInfo.imageType;
391 image_format_info.format = image_state->createInfo.format;
392 image_format_info.tiling = image_state->createInfo.tiling;
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600393 auto usage_create_info = LvlFindInChain<VkImageViewUsageCreateInfo>(pCreateInfo->pNext);
394 image_format_info.usage = usage_create_info ? usage_create_info->usage : image_state->createInfo.usage;
locke-lunarg9939d4b2020-10-26 20:11:08 -0600395 image_format_info.flags = image_state->createInfo.flags;
396
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600397 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600398
399 DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_format_info, &image_format_properties);
400 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600401
Jeremy Gebben082a9832021-10-28 13:40:11 -0600402 Add(std::make_shared<IMAGE_VIEW_STATE>(image_state, *pView, pCreateInfo, format_features, filter_cubic_props));
locke-lunargd556cc32019-09-17 01:21:23 -0600403}
404
405void ValidationStateTracker::PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
406 uint32_t regionCount, const VkBufferCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600407 if (disabled[command_buffer_state]) return;
408
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700409 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600410 cb_node->RecordTransferCmd(CMD_COPYBUFFER, Get<BUFFER_STATE>(srcBuffer), Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600411}
412
Jeff Leger178b1e52020-10-05 12:22:23 -0400413void ValidationStateTracker::PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600414 const VkCopyBufferInfo2KHR *pCopyBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600415 if (disabled[command_buffer_state]) return;
416
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700417 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600418 cb_node->RecordTransferCmd(CMD_COPYBUFFER2KHR, Get<BUFFER_STATE>(pCopyBufferInfo->srcBuffer),
419 Get<BUFFER_STATE>(pCopyBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400420}
421
Tony-LunarGef035472021-11-02 10:23:33 -0600422void ValidationStateTracker::PreCallRecordCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfo) {
423 if (disabled[command_buffer_state]) return;
424
425 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
426 cb_node->RecordTransferCmd(CMD_COPYBUFFER2, Get<BUFFER_STATE>(pCopyBufferInfo->srcBuffer),
427 Get<BUFFER_STATE>(pCopyBufferInfo->dstBuffer));
428}
429
locke-lunargd556cc32019-09-17 01:21:23 -0600430void ValidationStateTracker::PreCallRecordDestroyImageView(VkDevice device, VkImageView imageView,
431 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600432 Destroy<IMAGE_VIEW_STATE>(imageView);
locke-lunargd556cc32019-09-17 01:21:23 -0600433}
434
435void ValidationStateTracker::PreCallRecordDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600436 Destroy<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600437}
438
439void ValidationStateTracker::PreCallRecordDestroyBufferView(VkDevice device, VkBufferView bufferView,
440 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600441 Destroy<BUFFER_VIEW_STATE>(bufferView);
locke-lunargd556cc32019-09-17 01:21:23 -0600442}
443
444void ValidationStateTracker::PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
445 VkDeviceSize size, uint32_t data) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600446 if (disabled[command_buffer_state]) return;
447
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700448 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600449 cb_node->RecordTransferCmd(CMD_FILLBUFFER, Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600450}
451
452void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
453 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
454 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600455 if (disabled[command_buffer_state]) return;
456
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700457 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600458
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600459 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER, Get<IMAGE_STATE>(srcImage), Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600460}
461
Jeff Leger178b1e52020-10-05 12:22:23 -0400462void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
463 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600464 if (disabled[command_buffer_state]) return;
465
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700466 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600467 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER2KHR, Get<IMAGE_STATE>(pCopyImageToBufferInfo->srcImage),
468 Get<BUFFER_STATE>(pCopyImageToBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400469}
470
Tony-LunarGaf3632a2021-11-10 15:51:57 -0700471void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
472 const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) {
473 if (disabled[command_buffer_state]) return;
474
475 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
476 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER2, Get<IMAGE_STATE>(pCopyImageToBufferInfo->srcImage),
477 Get<BUFFER_STATE>(pCopyImageToBufferInfo->dstBuffer));
478}
479
locke-lunargd556cc32019-09-17 01:21:23 -0600480void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
481 VkImageLayout dstImageLayout, uint32_t regionCount,
482 const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600483 if (disabled[command_buffer_state]) return;
484
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700485 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600486 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE, Get<BUFFER_STATE>(srcBuffer), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600487}
488
Jeff Leger178b1e52020-10-05 12:22:23 -0400489void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
490 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600491 if (disabled[command_buffer_state]) return;
492
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700493 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600494 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE2KHR, Get<BUFFER_STATE>(pCopyBufferToImageInfo->srcBuffer),
495 Get<IMAGE_STATE>(pCopyBufferToImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400496}
497
Tony Barbour845d29b2021-11-09 11:43:14 -0700498void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
499 const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) {
500 if (disabled[command_buffer_state]) return;
501
502 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
503 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE2, Get<BUFFER_STATE>(pCopyBufferToImageInfo->srcBuffer),
504 Get<IMAGE_STATE>(pCopyBufferToImageInfo->dstImage));
505}
506
sfricke-samsungbf1a2ed2020-06-14 23:31:00 -0700507// Gets union of all features defined by Potential Format Features
508// except, does not handle the external format case for AHB as that only can be used for sampled images
Lionel Landwerlin21719f62021-12-09 11:40:09 +0200509VkFormatFeatureFlags2KHR ValidationStateTracker::GetPotentialFormatFeatures(VkFormat format) const {
510 VkFormatFeatureFlags2KHR format_features = 0;
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700511
512 if (format != VK_FORMAT_UNDEFINED) {
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200513 if (has_format_feature2) {
514 auto fmt_drm_props = LvlInitStruct<VkDrmFormatModifierPropertiesList2EXT>();
Lionel Landwerlin15ed1f62022-01-12 16:54:05 +0200515 auto fmt_props_3 = LvlInitStruct<VkFormatProperties3KHR>(
516 IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier) ? &fmt_drm_props : nullptr);
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200517 auto fmt_props_2 = LvlInitStruct<VkFormatProperties2>(&fmt_props_3);
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100518
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200519 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &fmt_props_2);
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100520
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200521 format_features |= fmt_props_3.linearTilingFeatures;
522 format_features |= fmt_props_3.optimalTilingFeatures;
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100523
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200524 if (IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier)) {
525 std::vector<VkDrmFormatModifierProperties2EXT> drm_properties;
526 drm_properties.resize(fmt_drm_props.drmFormatModifierCount);
527 fmt_drm_props.pDrmFormatModifierProperties = drm_properties.data();
528 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &fmt_props_2);
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100529
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200530 for (uint32_t i = 0; i < fmt_drm_props.drmFormatModifierCount; i++) {
531 format_features |= fmt_drm_props.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
532 }
533 }
534 } else {
535 VkFormatProperties format_properties;
536 DispatchGetPhysicalDeviceFormatProperties(physical_device, format, &format_properties);
537 format_features |= format_properties.linearTilingFeatures;
538 format_features |= format_properties.optimalTilingFeatures;
539
540 if (IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier)) {
541 auto fmt_drm_props = LvlInitStruct<VkDrmFormatModifierPropertiesListEXT>();
542 auto fmt_props_2 = LvlInitStruct<VkFormatProperties2>(&fmt_drm_props);
543
544 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &fmt_props_2);
545
546 std::vector<VkDrmFormatModifierPropertiesEXT> drm_properties;
547 drm_properties.resize(fmt_drm_props.drmFormatModifierCount);
548 fmt_drm_props.pDrmFormatModifierProperties = drm_properties.data();
549 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &fmt_props_2);
550
551 for (uint32_t i = 0; i < fmt_drm_props.drmFormatModifierCount; i++) {
552 format_features |= fmt_drm_props.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
553 }
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700554 }
555 }
556 }
557
558 return format_features;
559}
560
locke-lunargd556cc32019-09-17 01:21:23 -0600561void ValidationStateTracker::PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
562 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice,
563 VkResult result) {
564 if (VK_SUCCESS != result) return;
565
Locke Linf3873542021-04-26 11:25:10 -0600566 ValidationObject *device_object = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
567 ValidationObject *validation_data = GetValidationObject(device_object->object_dispatch, this->container_type);
568 ValidationStateTracker *state_tracker = static_cast<ValidationStateTracker *>(validation_data);
569
locke-lunargd556cc32019-09-17 01:21:23 -0600570 const VkPhysicalDeviceFeatures *enabled_features_found = pCreateInfo->pEnabledFeatures;
571 if (nullptr == enabled_features_found) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700572 const auto *features2 = LvlFindInChain<VkPhysicalDeviceFeatures2>(pCreateInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -0600573 if (features2) {
574 enabled_features_found = &(features2->features);
575 }
576 }
577
locke-lunargd556cc32019-09-17 01:21:23 -0600578 if (nullptr == enabled_features_found) {
579 state_tracker->enabled_features.core = {};
580 } else {
581 state_tracker->enabled_features.core = *enabled_features_found;
582 }
583
locke-lunargd556cc32019-09-17 01:21:23 -0600584 // Save local link to this device's physical device state
Jeremy Gebben9f537102021-10-05 16:37:12 -0600585 state_tracker->physical_device_state = Get<PHYSICAL_DEVICE_STATE>(gpu).get();
locke-lunargd556cc32019-09-17 01:21:23 -0600586
Tony-LunarG273f32f2021-09-28 08:56:30 -0600587 const auto *vulkan_13_features = LvlFindInChain<VkPhysicalDeviceVulkan13Features>(pCreateInfo->pNext);
588 if (vulkan_13_features) {
589 state_tracker->enabled_features.core13 = *vulkan_13_features;
590 } else {
591 state_tracker->enabled_features.core13 = {};
592 const auto *image_robustness_features = LvlFindInChain<VkPhysicalDeviceImageRobustnessFeatures>(pCreateInfo->pNext);
593 if (image_robustness_features) {
594 state_tracker->enabled_features.core13.robustImageAccess = image_robustness_features->robustImageAccess;
595 }
596
597 const auto *inline_uniform_block_features = LvlFindInChain<VkPhysicalDeviceInlineUniformBlockFeatures>(pCreateInfo->pNext);
598 if (inline_uniform_block_features) {
599 state_tracker->enabled_features.core13.inlineUniformBlock = inline_uniform_block_features->inlineUniformBlock;
600 state_tracker->enabled_features.core13.descriptorBindingInlineUniformBlockUpdateAfterBind =
601 inline_uniform_block_features->descriptorBindingInlineUniformBlockUpdateAfterBind;
602 }
603
604 const auto *pipeline_creation_cache_control_features =
605 LvlFindInChain<VkPhysicalDevicePipelineCreationCacheControlFeatures>(pCreateInfo->pNext);
606 if (pipeline_creation_cache_control_features) {
607 state_tracker->enabled_features.core13.pipelineCreationCacheControl =
608 pipeline_creation_cache_control_features->pipelineCreationCacheControl;
609 }
610
611 const auto *private_data_features = LvlFindInChain<VkPhysicalDevicePrivateDataFeatures>(pCreateInfo->pNext);
612 if (private_data_features) {
613 state_tracker->enabled_features.core13.privateData = private_data_features->privateData;
614 }
615
616 const auto *demote_to_helper_invocation_features =
617 LvlFindInChain<VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures>(pCreateInfo->pNext);
618 if (demote_to_helper_invocation_features) {
619 state_tracker->enabled_features.core13.shaderDemoteToHelperInvocation =
620 demote_to_helper_invocation_features->shaderDemoteToHelperInvocation;
621 }
622
623 const auto *terminate_invocation_features =
624 LvlFindInChain<VkPhysicalDeviceShaderTerminateInvocationFeatures>(pCreateInfo->pNext);
625 if (terminate_invocation_features) {
626 state_tracker->enabled_features.core13.shaderTerminateInvocation =
627 terminate_invocation_features->shaderTerminateInvocation;
628 }
629
630 const auto *subgroup_size_control_features =
631 LvlFindInChain<VkPhysicalDeviceSubgroupSizeControlFeatures>(pCreateInfo->pNext);
632 if (subgroup_size_control_features) {
633 state_tracker->enabled_features.core13.subgroupSizeControl = subgroup_size_control_features->subgroupSizeControl;
634 state_tracker->enabled_features.core13.computeFullSubgroups = subgroup_size_control_features->computeFullSubgroups;
635 }
636
637 const auto *synchronization2_features = LvlFindInChain<VkPhysicalDeviceSynchronization2Features>(pCreateInfo->pNext);
638 if (synchronization2_features) {
639 state_tracker->enabled_features.core13.synchronization2 = synchronization2_features->synchronization2;
640 }
641
642 const auto *texture_compression_astchdr_features =
643 LvlFindInChain<VkPhysicalDeviceTextureCompressionASTCHDRFeatures>(pCreateInfo->pNext);
644 if (texture_compression_astchdr_features) {
645 state_tracker->enabled_features.core13.textureCompressionASTC_HDR =
646 texture_compression_astchdr_features->textureCompressionASTC_HDR;
647 }
648
649 const auto *initialize_workgroup_memory_features =
650 LvlFindInChain<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures>(pCreateInfo->pNext);
651 if (initialize_workgroup_memory_features) {
652 state_tracker->enabled_features.core13.shaderZeroInitializeWorkgroupMemory =
653 initialize_workgroup_memory_features->shaderZeroInitializeWorkgroupMemory;
654 }
655
656 const auto *dynamic_rendering_features = LvlFindInChain<VkPhysicalDeviceDynamicRenderingFeatures>(pCreateInfo->pNext);
657 if (dynamic_rendering_features) {
658 state_tracker->enabled_features.core13.dynamicRendering = dynamic_rendering_features->dynamicRendering;
659 }
660
661 const auto *shader_integer_dot_product_features =
662 LvlFindInChain<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR>(pCreateInfo->pNext);
663 if (shader_integer_dot_product_features) {
664 state_tracker->enabled_features.core13.shaderIntegerDotProduct =
665 shader_integer_dot_product_features->shaderIntegerDotProduct;
666 }
667
668 const auto *maintenance4_features = LvlFindInChain<VkPhysicalDeviceMaintenance4FeaturesKHR>(pCreateInfo->pNext);
669 if (maintenance4_features) {
670 state_tracker->enabled_features.core13.maintenance4 = maintenance4_features->maintenance4;
671 }
672 }
673
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700674 const auto *vulkan_12_features = LvlFindInChain<VkPhysicalDeviceVulkan12Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700675 if (vulkan_12_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700676 state_tracker->enabled_features.core12 = *vulkan_12_features;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700677 } else {
sfricke-samsung27c70722020-05-02 08:42:39 -0700678 // Set Extension Feature Aliases to false as there is no struct to check
679 state_tracker->enabled_features.core12.drawIndirectCount = VK_FALSE;
680 state_tracker->enabled_features.core12.samplerMirrorClampToEdge = VK_FALSE;
681 state_tracker->enabled_features.core12.descriptorIndexing = VK_FALSE;
682 state_tracker->enabled_features.core12.samplerFilterMinmax = VK_FALSE;
683 state_tracker->enabled_features.core12.shaderOutputLayer = VK_FALSE;
684 state_tracker->enabled_features.core12.shaderOutputViewportIndex = VK_FALSE;
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800685 state_tracker->enabled_features.core12.subgroupBroadcastDynamicId = VK_FALSE;
sfricke-samsung27c70722020-05-02 08:42:39 -0700686
687 // These structs are only allowed in pNext chain if there is no VkPhysicalDeviceVulkan12Features
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700688
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700689 const auto *eight_bit_storage_features = LvlFindInChain<VkPhysicalDevice8BitStorageFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700690 if (eight_bit_storage_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700691 state_tracker->enabled_features.core12.storageBuffer8BitAccess = eight_bit_storage_features->storageBuffer8BitAccess;
692 state_tracker->enabled_features.core12.uniformAndStorageBuffer8BitAccess =
693 eight_bit_storage_features->uniformAndStorageBuffer8BitAccess;
694 state_tracker->enabled_features.core12.storagePushConstant8 = eight_bit_storage_features->storagePushConstant8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700695 }
696
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700697 const auto *float16_int8_features = LvlFindInChain<VkPhysicalDeviceShaderFloat16Int8Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700698 if (float16_int8_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700699 state_tracker->enabled_features.core12.shaderFloat16 = float16_int8_features->shaderFloat16;
700 state_tracker->enabled_features.core12.shaderInt8 = float16_int8_features->shaderInt8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700701 }
702
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700703 const auto *descriptor_indexing_features = LvlFindInChain<VkPhysicalDeviceDescriptorIndexingFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700704 if (descriptor_indexing_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700705 state_tracker->enabled_features.core12.shaderInputAttachmentArrayDynamicIndexing =
706 descriptor_indexing_features->shaderInputAttachmentArrayDynamicIndexing;
707 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayDynamicIndexing =
708 descriptor_indexing_features->shaderUniformTexelBufferArrayDynamicIndexing;
709 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayDynamicIndexing =
710 descriptor_indexing_features->shaderStorageTexelBufferArrayDynamicIndexing;
711 state_tracker->enabled_features.core12.shaderUniformBufferArrayNonUniformIndexing =
712 descriptor_indexing_features->shaderUniformBufferArrayNonUniformIndexing;
713 state_tracker->enabled_features.core12.shaderSampledImageArrayNonUniformIndexing =
714 descriptor_indexing_features->shaderSampledImageArrayNonUniformIndexing;
715 state_tracker->enabled_features.core12.shaderStorageBufferArrayNonUniformIndexing =
716 descriptor_indexing_features->shaderStorageBufferArrayNonUniformIndexing;
717 state_tracker->enabled_features.core12.shaderStorageImageArrayNonUniformIndexing =
718 descriptor_indexing_features->shaderStorageImageArrayNonUniformIndexing;
719 state_tracker->enabled_features.core12.shaderInputAttachmentArrayNonUniformIndexing =
720 descriptor_indexing_features->shaderInputAttachmentArrayNonUniformIndexing;
721 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayNonUniformIndexing =
722 descriptor_indexing_features->shaderUniformTexelBufferArrayNonUniformIndexing;
723 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayNonUniformIndexing =
724 descriptor_indexing_features->shaderStorageTexelBufferArrayNonUniformIndexing;
725 state_tracker->enabled_features.core12.descriptorBindingUniformBufferUpdateAfterBind =
726 descriptor_indexing_features->descriptorBindingUniformBufferUpdateAfterBind;
727 state_tracker->enabled_features.core12.descriptorBindingSampledImageUpdateAfterBind =
728 descriptor_indexing_features->descriptorBindingSampledImageUpdateAfterBind;
729 state_tracker->enabled_features.core12.descriptorBindingStorageImageUpdateAfterBind =
730 descriptor_indexing_features->descriptorBindingStorageImageUpdateAfterBind;
731 state_tracker->enabled_features.core12.descriptorBindingStorageBufferUpdateAfterBind =
732 descriptor_indexing_features->descriptorBindingStorageBufferUpdateAfterBind;
733 state_tracker->enabled_features.core12.descriptorBindingUniformTexelBufferUpdateAfterBind =
734 descriptor_indexing_features->descriptorBindingUniformTexelBufferUpdateAfterBind;
735 state_tracker->enabled_features.core12.descriptorBindingStorageTexelBufferUpdateAfterBind =
736 descriptor_indexing_features->descriptorBindingStorageTexelBufferUpdateAfterBind;
737 state_tracker->enabled_features.core12.descriptorBindingUpdateUnusedWhilePending =
738 descriptor_indexing_features->descriptorBindingUpdateUnusedWhilePending;
739 state_tracker->enabled_features.core12.descriptorBindingPartiallyBound =
740 descriptor_indexing_features->descriptorBindingPartiallyBound;
741 state_tracker->enabled_features.core12.descriptorBindingVariableDescriptorCount =
742 descriptor_indexing_features->descriptorBindingVariableDescriptorCount;
743 state_tracker->enabled_features.core12.runtimeDescriptorArray = descriptor_indexing_features->runtimeDescriptorArray;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700744 }
745
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700746 const auto *scalar_block_layout_features = LvlFindInChain<VkPhysicalDeviceScalarBlockLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700747 if (scalar_block_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700748 state_tracker->enabled_features.core12.scalarBlockLayout = scalar_block_layout_features->scalarBlockLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700749 }
750
751 const auto *imageless_framebuffer_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700752 LvlFindInChain<VkPhysicalDeviceImagelessFramebufferFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700753 if (imageless_framebuffer_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700754 state_tracker->enabled_features.core12.imagelessFramebuffer = imageless_framebuffer_features->imagelessFramebuffer;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700755 }
756
757 const auto *uniform_buffer_standard_layout_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700758 LvlFindInChain<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700759 if (uniform_buffer_standard_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700760 state_tracker->enabled_features.core12.uniformBufferStandardLayout =
761 uniform_buffer_standard_layout_features->uniformBufferStandardLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700762 }
763
764 const auto *subgroup_extended_types_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700765 LvlFindInChain<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700766 if (subgroup_extended_types_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700767 state_tracker->enabled_features.core12.shaderSubgroupExtendedTypes =
768 subgroup_extended_types_features->shaderSubgroupExtendedTypes;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700769 }
770
771 const auto *separate_depth_stencil_layouts_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700772 LvlFindInChain<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700773 if (separate_depth_stencil_layouts_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700774 state_tracker->enabled_features.core12.separateDepthStencilLayouts =
775 separate_depth_stencil_layouts_features->separateDepthStencilLayouts;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700776 }
777
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700778 const auto *host_query_reset_features = LvlFindInChain<VkPhysicalDeviceHostQueryResetFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700779 if (host_query_reset_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700780 state_tracker->enabled_features.core12.hostQueryReset = host_query_reset_features->hostQueryReset;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700781 }
782
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700783 const auto *timeline_semaphore_features = LvlFindInChain<VkPhysicalDeviceTimelineSemaphoreFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700784 if (timeline_semaphore_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700785 state_tracker->enabled_features.core12.timelineSemaphore = timeline_semaphore_features->timelineSemaphore;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700786 }
787
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700788 const auto *buffer_device_address = LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700789 if (buffer_device_address) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700790 state_tracker->enabled_features.core12.bufferDeviceAddress = buffer_device_address->bufferDeviceAddress;
791 state_tracker->enabled_features.core12.bufferDeviceAddressCaptureReplay =
792 buffer_device_address->bufferDeviceAddressCaptureReplay;
793 state_tracker->enabled_features.core12.bufferDeviceAddressMultiDevice =
794 buffer_device_address->bufferDeviceAddressMultiDevice;
795 }
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800796
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700797 const auto *atomic_int64_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicInt64Features>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800798 if (atomic_int64_features) {
799 state_tracker->enabled_features.core12.shaderBufferInt64Atomics = atomic_int64_features->shaderBufferInt64Atomics;
800 state_tracker->enabled_features.core12.shaderSharedInt64Atomics = atomic_int64_features->shaderSharedInt64Atomics;
801 }
802
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700803 const auto *memory_model_features = LvlFindInChain<VkPhysicalDeviceVulkanMemoryModelFeatures>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800804 if (memory_model_features) {
805 state_tracker->enabled_features.core12.vulkanMemoryModel = memory_model_features->vulkanMemoryModel;
806 state_tracker->enabled_features.core12.vulkanMemoryModelDeviceScope =
807 memory_model_features->vulkanMemoryModelDeviceScope;
808 state_tracker->enabled_features.core12.vulkanMemoryModelAvailabilityVisibilityChains =
809 memory_model_features->vulkanMemoryModelAvailabilityVisibilityChains;
810 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700811 }
812
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700813 const auto *vulkan_11_features = LvlFindInChain<VkPhysicalDeviceVulkan11Features>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700814 if (vulkan_11_features) {
815 state_tracker->enabled_features.core11 = *vulkan_11_features;
816 } else {
sfricke-samsung828e59d2021-08-22 23:20:49 -0700817 // These structs are only allowed in pNext chain if there is no vkPhysicalDeviceVulkan11Features
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700818
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700819 const auto *sixteen_bit_storage_features = LvlFindInChain<VkPhysicalDevice16BitStorageFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700820 if (sixteen_bit_storage_features) {
821 state_tracker->enabled_features.core11.storageBuffer16BitAccess =
822 sixteen_bit_storage_features->storageBuffer16BitAccess;
823 state_tracker->enabled_features.core11.uniformAndStorageBuffer16BitAccess =
824 sixteen_bit_storage_features->uniformAndStorageBuffer16BitAccess;
825 state_tracker->enabled_features.core11.storagePushConstant16 = sixteen_bit_storage_features->storagePushConstant16;
826 state_tracker->enabled_features.core11.storageInputOutput16 = sixteen_bit_storage_features->storageInputOutput16;
827 }
828
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700829 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700830 if (multiview_features) {
831 state_tracker->enabled_features.core11.multiview = multiview_features->multiview;
832 state_tracker->enabled_features.core11.multiviewGeometryShader = multiview_features->multiviewGeometryShader;
833 state_tracker->enabled_features.core11.multiviewTessellationShader = multiview_features->multiviewTessellationShader;
834 }
835
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700836 const auto *variable_pointers_features = LvlFindInChain<VkPhysicalDeviceVariablePointersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700837 if (variable_pointers_features) {
838 state_tracker->enabled_features.core11.variablePointersStorageBuffer =
839 variable_pointers_features->variablePointersStorageBuffer;
840 state_tracker->enabled_features.core11.variablePointers = variable_pointers_features->variablePointers;
841 }
842
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700843 const auto *protected_memory_features = LvlFindInChain<VkPhysicalDeviceProtectedMemoryFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700844 if (protected_memory_features) {
845 state_tracker->enabled_features.core11.protectedMemory = protected_memory_features->protectedMemory;
846 }
847
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700848 const auto *ycbcr_conversion_features = LvlFindInChain<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700849 if (ycbcr_conversion_features) {
850 state_tracker->enabled_features.core11.samplerYcbcrConversion = ycbcr_conversion_features->samplerYcbcrConversion;
851 }
852
853 const auto *shader_draw_parameters_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700854 LvlFindInChain<VkPhysicalDeviceShaderDrawParametersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700855 if (shader_draw_parameters_features) {
856 state_tracker->enabled_features.core11.shaderDrawParameters = shader_draw_parameters_features->shaderDrawParameters;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700857 }
858 }
859
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700860 const auto *device_group_ci = LvlFindInChain<VkDeviceGroupDeviceCreateInfo>(pCreateInfo->pNext);
Tony-LunarGca4891a2020-08-10 15:46:46 -0600861 if (device_group_ci) {
862 state_tracker->physical_device_count = device_group_ci->physicalDeviceCount;
863 state_tracker->device_group_create_info = *device_group_ci;
864 } else {
865 state_tracker->physical_device_count = 1;
866 }
locke-lunargd556cc32019-09-17 01:21:23 -0600867
sfricke-samsung828e59d2021-08-22 23:20:49 -0700868 // Features from other extensions passesd in create info
869 {
870 const auto *exclusive_scissor_features = LvlFindInChain<VkPhysicalDeviceExclusiveScissorFeaturesNV>(pCreateInfo->pNext);
871 if (exclusive_scissor_features) {
872 state_tracker->enabled_features.exclusive_scissor_features = *exclusive_scissor_features;
873 }
locke-lunargd556cc32019-09-17 01:21:23 -0600874
sfricke-samsung828e59d2021-08-22 23:20:49 -0700875 const auto *shading_rate_image_features = LvlFindInChain<VkPhysicalDeviceShadingRateImageFeaturesNV>(pCreateInfo->pNext);
876 if (shading_rate_image_features) {
877 state_tracker->enabled_features.shading_rate_image_features = *shading_rate_image_features;
878 }
locke-lunargd556cc32019-09-17 01:21:23 -0600879
sfricke-samsung828e59d2021-08-22 23:20:49 -0700880 const auto *mesh_shader_features = LvlFindInChain<VkPhysicalDeviceMeshShaderFeaturesNV>(pCreateInfo->pNext);
881 if (mesh_shader_features) {
882 state_tracker->enabled_features.mesh_shader_features = *mesh_shader_features;
883 }
locke-lunargd556cc32019-09-17 01:21:23 -0600884
sfricke-samsung828e59d2021-08-22 23:20:49 -0700885 const auto *transform_feedback_features = LvlFindInChain<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(pCreateInfo->pNext);
886 if (transform_feedback_features) {
887 state_tracker->enabled_features.transform_feedback_features = *transform_feedback_features;
888 }
locke-lunargd556cc32019-09-17 01:21:23 -0600889
sfricke-samsung828e59d2021-08-22 23:20:49 -0700890 const auto *vtx_attrib_div_features = LvlFindInChain<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(pCreateInfo->pNext);
891 if (vtx_attrib_div_features) {
892 state_tracker->enabled_features.vtx_attrib_divisor_features = *vtx_attrib_div_features;
893 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700894
sfricke-samsung828e59d2021-08-22 23:20:49 -0700895 const auto *buffer_device_address_ext_features =
896 LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(pCreateInfo->pNext);
897 if (buffer_device_address_ext_features) {
898 state_tracker->enabled_features.buffer_device_address_ext_features = *buffer_device_address_ext_features;
899 }
locke-lunargd556cc32019-09-17 01:21:23 -0600900
sfricke-samsung828e59d2021-08-22 23:20:49 -0700901 const auto *cooperative_matrix_features = LvlFindInChain<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(pCreateInfo->pNext);
902 if (cooperative_matrix_features) {
903 state_tracker->enabled_features.cooperative_matrix_features = *cooperative_matrix_features;
904 }
locke-lunargd556cc32019-09-17 01:21:23 -0600905
sfricke-samsung828e59d2021-08-22 23:20:49 -0700906 const auto *compute_shader_derivatives_features =
907 LvlFindInChain<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(pCreateInfo->pNext);
908 if (compute_shader_derivatives_features) {
909 state_tracker->enabled_features.compute_shader_derivatives_features = *compute_shader_derivatives_features;
910 }
locke-lunargd556cc32019-09-17 01:21:23 -0600911
sfricke-samsung828e59d2021-08-22 23:20:49 -0700912 const auto *fragment_shader_barycentric_features =
913 LvlFindInChain<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(pCreateInfo->pNext);
914 if (fragment_shader_barycentric_features) {
915 state_tracker->enabled_features.fragment_shader_barycentric_features = *fragment_shader_barycentric_features;
916 }
locke-lunargd556cc32019-09-17 01:21:23 -0600917
sfricke-samsung828e59d2021-08-22 23:20:49 -0700918 const auto *shader_image_footprint_features =
919 LvlFindInChain<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(pCreateInfo->pNext);
920 if (shader_image_footprint_features) {
921 state_tracker->enabled_features.shader_image_footprint_features = *shader_image_footprint_features;
922 }
locke-lunargd556cc32019-09-17 01:21:23 -0600923
sfricke-samsung828e59d2021-08-22 23:20:49 -0700924 const auto *fragment_shader_interlock_features =
925 LvlFindInChain<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(pCreateInfo->pNext);
926 if (fragment_shader_interlock_features) {
927 state_tracker->enabled_features.fragment_shader_interlock_features = *fragment_shader_interlock_features;
928 }
locke-lunargd556cc32019-09-17 01:21:23 -0600929
sfricke-samsung828e59d2021-08-22 23:20:49 -0700930 const auto *texel_buffer_alignment_features =
931 LvlFindInChain<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(pCreateInfo->pNext);
932 if (texel_buffer_alignment_features) {
933 state_tracker->enabled_features.texel_buffer_alignment_features = *texel_buffer_alignment_features;
934 }
locke-lunargd556cc32019-09-17 01:21:23 -0600935
sfricke-samsung828e59d2021-08-22 23:20:49 -0700936 const auto *pipeline_exe_props_features =
937 LvlFindInChain<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(pCreateInfo->pNext);
938 if (pipeline_exe_props_features) {
939 state_tracker->enabled_features.pipeline_exe_props_features = *pipeline_exe_props_features;
940 }
locke-lunargd556cc32019-09-17 01:21:23 -0600941
sfricke-samsung828e59d2021-08-22 23:20:49 -0700942 const auto *dedicated_allocation_image_aliasing_features =
943 LvlFindInChain<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(pCreateInfo->pNext);
944 if (dedicated_allocation_image_aliasing_features) {
945 state_tracker->enabled_features.dedicated_allocation_image_aliasing_features =
946 *dedicated_allocation_image_aliasing_features;
947 }
Jeff Bolz82f854d2019-09-17 14:56:47 -0500948
sfricke-samsung828e59d2021-08-22 23:20:49 -0700949 const auto *performance_query_features = LvlFindInChain<VkPhysicalDevicePerformanceQueryFeaturesKHR>(pCreateInfo->pNext);
950 if (performance_query_features) {
951 state_tracker->enabled_features.performance_query_features = *performance_query_features;
952 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +0100953
sfricke-samsung828e59d2021-08-22 23:20:49 -0700954 const auto *device_coherent_memory_features = LvlFindInChain<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(pCreateInfo->pNext);
955 if (device_coherent_memory_features) {
956 state_tracker->enabled_features.device_coherent_memory_features = *device_coherent_memory_features;
957 }
Tobias Hector782bcde2019-11-28 16:19:42 +0000958
sfricke-samsung828e59d2021-08-22 23:20:49 -0700959 const auto *ycbcr_image_array_features = LvlFindInChain<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(pCreateInfo->pNext);
960 if (ycbcr_image_array_features) {
961 state_tracker->enabled_features.ycbcr_image_array_features = *ycbcr_image_array_features;
962 }
sfricke-samsungcead0802020-01-30 22:20:10 -0800963
sfricke-samsung828e59d2021-08-22 23:20:49 -0700964 const auto *ray_query_features = LvlFindInChain<VkPhysicalDeviceRayQueryFeaturesKHR>(pCreateInfo->pNext);
965 if (ray_query_features) {
966 state_tracker->enabled_features.ray_query_features = *ray_query_features;
967 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700968
sfricke-samsung828e59d2021-08-22 23:20:49 -0700969 const auto *ray_tracing_pipeline_features =
970 LvlFindInChain<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>(pCreateInfo->pNext);
971 if (ray_tracing_pipeline_features) {
972 state_tracker->enabled_features.ray_tracing_pipeline_features = *ray_tracing_pipeline_features;
973 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700974
sfricke-samsung828e59d2021-08-22 23:20:49 -0700975 const auto *ray_tracing_acceleration_structure_features =
976 LvlFindInChain<VkPhysicalDeviceAccelerationStructureFeaturesKHR>(pCreateInfo->pNext);
977 if (ray_tracing_acceleration_structure_features) {
978 state_tracker->enabled_features.ray_tracing_acceleration_structure_features =
979 *ray_tracing_acceleration_structure_features;
980 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500981
sfricke-samsung828e59d2021-08-22 23:20:49 -0700982 const auto *robustness2_features = LvlFindInChain<VkPhysicalDeviceRobustness2FeaturesEXT>(pCreateInfo->pNext);
983 if (robustness2_features) {
984 state_tracker->enabled_features.robustness2_features = *robustness2_features;
985 }
Jeff Bolz165818a2020-05-08 11:19:03 -0500986
sfricke-samsung828e59d2021-08-22 23:20:49 -0700987 const auto *fragment_density_map_features =
988 LvlFindInChain<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(pCreateInfo->pNext);
989 if (fragment_density_map_features) {
990 state_tracker->enabled_features.fragment_density_map_features = *fragment_density_map_features;
991 }
janharaldfredriksen-arm3b793772020-05-12 18:55:53 +0200992
sfricke-samsung828e59d2021-08-22 23:20:49 -0700993 const auto *fragment_density_map_features2 =
994 LvlFindInChain<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(pCreateInfo->pNext);
995 if (fragment_density_map_features2) {
996 state_tracker->enabled_features.fragment_density_map2_features = *fragment_density_map_features2;
997 }
janharaldfredriksen-arm36e17572020-07-07 13:59:28 +0200998
sfricke-samsung828e59d2021-08-22 23:20:49 -0700999 const auto *astc_decode_features = LvlFindInChain<VkPhysicalDeviceASTCDecodeFeaturesEXT>(pCreateInfo->pNext);
1000 if (astc_decode_features) {
1001 state_tracker->enabled_features.astc_decode_features = *astc_decode_features;
1002 }
sfricke-samsung0c4a06f2020-06-27 01:24:32 -07001003
sfricke-samsung828e59d2021-08-22 23:20:49 -07001004 const auto *custom_border_color_features = LvlFindInChain<VkPhysicalDeviceCustomBorderColorFeaturesEXT>(pCreateInfo->pNext);
1005 if (custom_border_color_features) {
1006 state_tracker->enabled_features.custom_border_color_features = *custom_border_color_features;
1007 }
Tony-LunarG7337b312020-04-15 16:40:25 -06001008
sfricke-samsung828e59d2021-08-22 23:20:49 -07001009 const auto *fragment_shading_rate_features =
1010 LvlFindInChain<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(pCreateInfo->pNext);
1011 if (fragment_shading_rate_features) {
1012 state_tracker->enabled_features.fragment_shading_rate_features = *fragment_shading_rate_features;
1013 }
Tobias Hector6663c9b2020-11-05 10:18:02 +00001014
sfricke-samsung828e59d2021-08-22 23:20:49 -07001015 const auto *extended_dynamic_state_features =
1016 LvlFindInChain<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(pCreateInfo->pNext);
1017 if (extended_dynamic_state_features) {
1018 state_tracker->enabled_features.extended_dynamic_state_features = *extended_dynamic_state_features;
1019 }
Piers Daniell39842ee2020-07-10 16:42:33 -06001020
sfricke-samsung828e59d2021-08-22 23:20:49 -07001021 const auto *extended_dynamic_state2_features =
1022 LvlFindInChain<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>(pCreateInfo->pNext);
1023 if (extended_dynamic_state2_features) {
1024 state_tracker->enabled_features.extended_dynamic_state2_features = *extended_dynamic_state2_features;
1025 }
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07001026
sfricke-samsung828e59d2021-08-22 23:20:49 -07001027 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
1028 if (multiview_features) {
1029 state_tracker->enabled_features.multiview_features = *multiview_features;
1030 }
locke-lunarg3fa463a2020-10-23 16:39:04 -06001031
sfricke-samsung828e59d2021-08-22 23:20:49 -07001032 const auto *portability_features = LvlFindInChain<VkPhysicalDevicePortabilitySubsetFeaturesKHR>(pCreateInfo->pNext);
1033 if (portability_features) {
1034 state_tracker->enabled_features.portability_subset_features = *portability_features;
1035 }
Nathaniel Cesariob3f2d702020-11-09 09:20:49 -07001036
sfricke-samsung828e59d2021-08-22 23:20:49 -07001037 const auto *shader_integer_functions2_features =
1038 LvlFindInChain<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(pCreateInfo->pNext);
1039 if (shader_integer_functions2_features) {
1040 state_tracker->enabled_features.shader_integer_functions2_features = *shader_integer_functions2_features;
1041 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001042
sfricke-samsung828e59d2021-08-22 23:20:49 -07001043 const auto *shader_sm_builtins_features = LvlFindInChain<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>(pCreateInfo->pNext);
1044 if (shader_sm_builtins_features) {
1045 state_tracker->enabled_features.shader_sm_builtins_features = *shader_sm_builtins_features;
1046 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001047
sfricke-samsung828e59d2021-08-22 23:20:49 -07001048 const auto *shader_atomic_float_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>(pCreateInfo->pNext);
1049 if (shader_atomic_float_features) {
1050 state_tracker->enabled_features.shader_atomic_float_features = *shader_atomic_float_features;
1051 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001052
sfricke-samsung828e59d2021-08-22 23:20:49 -07001053 const auto *shader_image_atomic_int64_features =
1054 LvlFindInChain<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>(pCreateInfo->pNext);
1055 if (shader_image_atomic_int64_features) {
1056 state_tracker->enabled_features.shader_image_atomic_int64_features = *shader_image_atomic_int64_features;
1057 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001058
sfricke-samsung828e59d2021-08-22 23:20:49 -07001059 const auto *shader_clock_features = LvlFindInChain<VkPhysicalDeviceShaderClockFeaturesKHR>(pCreateInfo->pNext);
1060 if (shader_clock_features) {
1061 state_tracker->enabled_features.shader_clock_features = *shader_clock_features;
1062 }
sfricke-samsung486a51e2021-01-02 00:10:15 -08001063
sfricke-samsung828e59d2021-08-22 23:20:49 -07001064 const auto *conditional_rendering_features =
1065 LvlFindInChain<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(pCreateInfo->pNext);
1066 if (conditional_rendering_features) {
1067 state_tracker->enabled_features.conditional_rendering_features = *conditional_rendering_features;
1068 }
Jeremy Gebben5f585ae2021-02-02 09:03:06 -07001069
sfricke-samsung828e59d2021-08-22 23:20:49 -07001070 const auto *workgroup_memory_explicit_layout_features =
1071 LvlFindInChain<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>(pCreateInfo->pNext);
1072 if (workgroup_memory_explicit_layout_features) {
1073 state_tracker->enabled_features.workgroup_memory_explicit_layout_features = *workgroup_memory_explicit_layout_features;
1074 }
Shannon McPhersondb287d42021-02-02 15:27:32 -07001075
sfricke-samsung828e59d2021-08-22 23:20:49 -07001076 const auto *provoking_vertex_features = lvl_find_in_chain<VkPhysicalDeviceProvokingVertexFeaturesEXT>(pCreateInfo->pNext);
1077 if (provoking_vertex_features) {
1078 state_tracker->enabled_features.provoking_vertex_features = *provoking_vertex_features;
1079 }
Locke Linf3873542021-04-26 11:25:10 -06001080
sfricke-samsung828e59d2021-08-22 23:20:49 -07001081 const auto *vertex_input_dynamic_state_features =
1082 LvlFindInChain<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>(pCreateInfo->pNext);
1083 if (vertex_input_dynamic_state_features) {
1084 state_tracker->enabled_features.vertex_input_dynamic_state_features = *vertex_input_dynamic_state_features;
1085 }
Piers Daniellcb6d8032021-04-19 18:51:26 -06001086
sfricke-samsung828e59d2021-08-22 23:20:49 -07001087 const auto *inherited_viewport_scissor_features =
1088 LvlFindInChain<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(pCreateInfo->pNext);
1089 if (inherited_viewport_scissor_features) {
1090 state_tracker->enabled_features.inherited_viewport_scissor_features = *inherited_viewport_scissor_features;
1091 }
David Zhao Akeley44139b12021-04-26 16:16:13 -07001092
sfricke-samsung828e59d2021-08-22 23:20:49 -07001093 const auto *multi_draw_features = LvlFindInChain<VkPhysicalDeviceMultiDrawFeaturesEXT>(pCreateInfo->pNext);
1094 if (multi_draw_features) {
1095 state_tracker->enabled_features.multi_draw_features = *multi_draw_features;
1096 }
Tony-LunarG4490de42021-06-21 15:49:19 -06001097
sfricke-samsung828e59d2021-08-22 23:20:49 -07001098 const auto *color_write_features = LvlFindInChain<VkPhysicalDeviceColorWriteEnableFeaturesEXT>(pCreateInfo->pNext);
1099 if (color_write_features) {
1100 state_tracker->enabled_features.color_write_features = *color_write_features;
1101 }
ziga-lunarg29ba2b92021-07-20 21:51:45 +02001102
sfricke-samsung828e59d2021-08-22 23:20:49 -07001103 const auto *shader_atomic_float2_features =
1104 LvlFindInChain<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT>(pCreateInfo->pNext);
1105 if (shader_atomic_float2_features) {
1106 state_tracker->enabled_features.shader_atomic_float2_features = *shader_atomic_float2_features;
1107 }
Mike Schuchardtb3870ea2021-07-20 18:56:51 -07001108
sfricke-samsung828e59d2021-08-22 23:20:49 -07001109 const auto *present_id_features = LvlFindInChain<VkPhysicalDevicePresentIdFeaturesKHR>(pCreateInfo->pNext);
1110 if (present_id_features) {
1111 state_tracker->enabled_features.present_id_features = *present_id_features;
1112 }
Tony-LunarG6f887e52021-07-27 11:23:14 -06001113
sfricke-samsung828e59d2021-08-22 23:20:49 -07001114 const auto *present_wait_features = LvlFindInChain<VkPhysicalDevicePresentWaitFeaturesKHR>(pCreateInfo->pNext);
1115 if (present_wait_features) {
1116 state_tracker->enabled_features.present_wait_features = *present_wait_features;
1117 }
Mike Schuchardt9f65d3f2021-08-25 15:11:39 -07001118
1119 const auto *ray_tracing_motion_blur_features =
1120 LvlFindInChain<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV>(pCreateInfo->pNext);
1121 if (ray_tracing_motion_blur_features) {
1122 state_tracker->enabled_features.ray_tracing_motion_blur_features = *ray_tracing_motion_blur_features;
1123 }
Mike Schuchardtb4d90452021-08-30 09:24:51 -07001124
Tony-LunarG0b0d8be2021-08-30 13:50:38 -06001125 const auto *primitive_topology_list_restart_features =
1126 LvlFindInChain<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>(pCreateInfo->pNext);
1127 if (primitive_topology_list_restart_features) {
1128 state_tracker->enabled_features.primitive_topology_list_restart_features = *primitive_topology_list_restart_features;
1129 }
sfricke-samsung10b35ce2021-09-29 08:50:20 -07001130
1131 const auto *rgba10x6_formats_features = LvlFindInChain<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT>(pCreateInfo->pNext);
1132 if (rgba10x6_formats_features) {
1133 state_tracker->enabled_features.rgba10x6_formats_features = *rgba10x6_formats_features;
1134 }
sfricke-samsungd3c917b2021-10-19 08:24:57 -07001135
Tony-LunarG69604c42021-11-22 16:00:12 -07001136 const auto *image_view_min_lod_features = LvlFindInChain<VkPhysicalDeviceImageViewMinLodFeaturesEXT>(pCreateInfo->pNext);
1137 if (image_view_min_lod_features) {
1138 state_tracker->enabled_features.image_view_min_lod_features = *image_view_min_lod_features;
1139 }
Tony-LunarG6f887e52021-07-27 11:23:14 -06001140 }
1141
locke-lunargd556cc32019-09-17 01:21:23 -06001142 // Store physical device properties and physical device mem limits into CoreChecks structs
1143 DispatchGetPhysicalDeviceMemoryProperties(gpu, &state_tracker->phys_dev_mem_props);
1144 DispatchGetPhysicalDeviceProperties(gpu, &state_tracker->phys_dev_props);
1145
Lionel Landwerlind0f84e42021-12-07 15:46:09 +02001146 {
1147 uint32_t n_props = 0;
1148 std::vector<VkExtensionProperties> props;
1149 instance_dispatch_table.EnumerateDeviceExtensionProperties(gpu, NULL, &n_props, NULL);
1150 props.resize(n_props);
Tony-LunarG8c380b92022-01-12 13:44:04 -07001151 instance_dispatch_table.EnumerateDeviceExtensionProperties(gpu, NULL, &n_props, props.data());
Lionel Landwerlind0f84e42021-12-07 15:46:09 +02001152
1153 for (const auto &ext_prop : props) {
1154 state_tracker->phys_dev_extensions.insert(ext_prop.extensionName);
1155 }
1156
1157 // Even if VK_KHR_format_feature_flags2 is available, we need to have
1158 // a path to grab that information from the physical device. This
1159 // requires to have VK_KHR_get_physical_device_properties2 enabled or
1160 // Vulkan 1.1 (which made this core).
1161 state_tracker->has_format_feature2 =
1162 (state_tracker->api_version >= VK_API_VERSION_1_1 ||
1163 IsExtEnabled(state_tracker->instance_extensions.vk_khr_get_physical_device_properties2)) &&
1164 state_tracker->phys_dev_extensions.find(VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME) !=
1165 state_tracker->phys_dev_extensions.end();
1166 }
1167
locke-lunargd556cc32019-09-17 01:21:23 -06001168 const auto &dev_ext = state_tracker->device_extensions;
1169 auto *phys_dev_props = &state_tracker->phys_dev_ext_props;
1170
Tony-LunarG273f32f2021-09-28 08:56:30 -06001171 // Vulkan 1.2 / 1.3 can get properties from single struct, otherwise need to add to it per extension
1172 if (dev_ext.vk_feature_version_1_2 || dev_ext.vk_feature_version_1_3) {
sfricke-samsung45996a42021-09-16 13:45:27 -07001173 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core11);
1174 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core12);
Tony-LunarG273f32f2021-09-28 08:56:30 -06001175 if (dev_ext.vk_feature_version_1_3)
1176 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_3, &state_tracker->phys_dev_props_core13);
sfricke-samsung828e59d2021-08-22 23:20:49 -07001177 } else {
1178 // VkPhysicalDeviceVulkan11Properties
1179 //
1180 // Can ingnore VkPhysicalDeviceIDProperties as it has no validation purpose
1181
1182 if (dev_ext.vk_khr_multiview) {
1183 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
1184 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &multiview_props);
1185 state_tracker->phys_dev_props_core11.maxMultiviewViewCount = multiview_props.maxMultiviewViewCount;
1186 state_tracker->phys_dev_props_core11.maxMultiviewInstanceIndex = multiview_props.maxMultiviewInstanceIndex;
1187 }
1188
1189 if (dev_ext.vk_khr_maintenance3) {
1190 auto maintenance3_props = LvlInitStruct<VkPhysicalDeviceMaintenance3Properties>();
1191 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_maintenance3, &maintenance3_props);
1192 state_tracker->phys_dev_props_core11.maxPerSetDescriptors = maintenance3_props.maxPerSetDescriptors;
1193 state_tracker->phys_dev_props_core11.maxMemoryAllocationSize = maintenance3_props.maxMemoryAllocationSize;
1194 }
1195
1196 // Some 1.1 properties were added to core without previous extensions
1197 if (state_tracker->api_version >= VK_API_VERSION_1_1) {
1198 auto subgroup_prop = LvlInitStruct<VkPhysicalDeviceSubgroupProperties>();
1199 auto protected_memory_prop = LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>(&subgroup_prop);
1200 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&protected_memory_prop);
1201 instance_dispatch_table.GetPhysicalDeviceProperties2(gpu, &prop2);
1202
1203 state_tracker->phys_dev_props_core11.subgroupSize = subgroup_prop.subgroupSize;
1204 state_tracker->phys_dev_props_core11.subgroupSupportedStages = subgroup_prop.supportedStages;
1205 state_tracker->phys_dev_props_core11.subgroupSupportedOperations = subgroup_prop.supportedOperations;
1206 state_tracker->phys_dev_props_core11.subgroupQuadOperationsInAllStages = subgroup_prop.quadOperationsInAllStages;
1207
1208 state_tracker->phys_dev_props_core11.protectedNoFault = protected_memory_prop.protectedNoFault;
1209 }
1210
1211 // VkPhysicalDeviceVulkan12Properties
1212 //
1213 // Can ingnore VkPhysicalDeviceDriverProperties as it has no validation purpose
1214
1215 if (dev_ext.vk_ext_descriptor_indexing) {
1216 auto descriptor_indexing_prop = LvlInitStruct<VkPhysicalDeviceDescriptorIndexingProperties>();
1217 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_descriptor_indexing, &descriptor_indexing_prop);
1218 state_tracker->phys_dev_props_core12.maxUpdateAfterBindDescriptorsInAllPools =
1219 descriptor_indexing_prop.maxUpdateAfterBindDescriptorsInAllPools;
1220 state_tracker->phys_dev_props_core12.shaderUniformBufferArrayNonUniformIndexingNative =
1221 descriptor_indexing_prop.shaderUniformBufferArrayNonUniformIndexingNative;
1222 state_tracker->phys_dev_props_core12.shaderSampledImageArrayNonUniformIndexingNative =
1223 descriptor_indexing_prop.shaderSampledImageArrayNonUniformIndexingNative;
1224 state_tracker->phys_dev_props_core12.shaderStorageBufferArrayNonUniformIndexingNative =
1225 descriptor_indexing_prop.shaderStorageBufferArrayNonUniformIndexingNative;
1226 state_tracker->phys_dev_props_core12.shaderStorageImageArrayNonUniformIndexingNative =
1227 descriptor_indexing_prop.shaderStorageImageArrayNonUniformIndexingNative;
1228 state_tracker->phys_dev_props_core12.shaderInputAttachmentArrayNonUniformIndexingNative =
1229 descriptor_indexing_prop.shaderInputAttachmentArrayNonUniformIndexingNative;
1230 state_tracker->phys_dev_props_core12.robustBufferAccessUpdateAfterBind =
1231 descriptor_indexing_prop.robustBufferAccessUpdateAfterBind;
1232 state_tracker->phys_dev_props_core12.quadDivergentImplicitLod = descriptor_indexing_prop.quadDivergentImplicitLod;
1233 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSamplers =
1234 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSamplers;
1235 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindUniformBuffers =
1236 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindUniformBuffers;
1237 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageBuffers =
1238 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageBuffers;
1239 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSampledImages =
1240 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSampledImages;
1241 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageImages =
1242 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageImages;
1243 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindInputAttachments =
1244 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindInputAttachments;
1245 state_tracker->phys_dev_props_core12.maxPerStageUpdateAfterBindResources =
1246 descriptor_indexing_prop.maxPerStageUpdateAfterBindResources;
1247 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSamplers =
1248 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSamplers;
1249 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffers =
1250 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffers;
1251 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic =
1252 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
1253 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffers =
1254 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffers;
1255 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic =
1256 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
1257 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSampledImages =
1258 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSampledImages;
1259 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageImages =
1260 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageImages;
1261 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindInputAttachments =
1262 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindInputAttachments;
1263 }
1264
1265 if (dev_ext.vk_khr_depth_stencil_resolve) {
1266 auto depth_stencil_resolve_props = LvlInitStruct<VkPhysicalDeviceDepthStencilResolveProperties>();
1267 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_depth_stencil_resolve, &depth_stencil_resolve_props);
1268 state_tracker->phys_dev_props_core12.supportedDepthResolveModes =
1269 depth_stencil_resolve_props.supportedDepthResolveModes;
1270 state_tracker->phys_dev_props_core12.supportedStencilResolveModes =
1271 depth_stencil_resolve_props.supportedStencilResolveModes;
1272 state_tracker->phys_dev_props_core12.independentResolveNone = depth_stencil_resolve_props.independentResolveNone;
1273 state_tracker->phys_dev_props_core12.independentResolve = depth_stencil_resolve_props.independentResolve;
1274 }
1275
1276 if (dev_ext.vk_khr_timeline_semaphore) {
1277 auto timeline_semaphore_props = LvlInitStruct<VkPhysicalDeviceTimelineSemaphoreProperties>();
1278 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_timeline_semaphore, &timeline_semaphore_props);
1279 state_tracker->phys_dev_props_core12.maxTimelineSemaphoreValueDifference =
1280 timeline_semaphore_props.maxTimelineSemaphoreValueDifference;
1281 }
1282
1283 if (dev_ext.vk_ext_sampler_filter_minmax) {
1284 auto sampler_filter_minmax_props = LvlInitStruct<VkPhysicalDeviceSamplerFilterMinmaxProperties>();
1285 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sampler_filter_minmax, &sampler_filter_minmax_props);
1286 state_tracker->phys_dev_props_core12.filterMinmaxSingleComponentFormats =
1287 sampler_filter_minmax_props.filterMinmaxSingleComponentFormats;
1288 state_tracker->phys_dev_props_core12.filterMinmaxImageComponentMapping =
1289 sampler_filter_minmax_props.filterMinmaxImageComponentMapping;
1290 }
1291
1292 if (dev_ext.vk_khr_shader_float_controls) {
1293 auto float_controls_props = LvlInitStruct<VkPhysicalDeviceFloatControlsProperties>();
1294 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_shader_float_controls, &float_controls_props);
1295 state_tracker->phys_dev_props_core12.denormBehaviorIndependence = float_controls_props.denormBehaviorIndependence;
1296 state_tracker->phys_dev_props_core12.roundingModeIndependence = float_controls_props.roundingModeIndependence;
1297 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat16 =
1298 float_controls_props.shaderSignedZeroInfNanPreserveFloat16;
1299 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat32 =
1300 float_controls_props.shaderSignedZeroInfNanPreserveFloat32;
1301 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat64 =
1302 float_controls_props.shaderSignedZeroInfNanPreserveFloat64;
1303 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat16 = float_controls_props.shaderDenormPreserveFloat16;
1304 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat32 = float_controls_props.shaderDenormPreserveFloat32;
1305 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat64 = float_controls_props.shaderDenormPreserveFloat64;
1306 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat16 =
1307 float_controls_props.shaderDenormFlushToZeroFloat16;
1308 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat32 =
1309 float_controls_props.shaderDenormFlushToZeroFloat32;
1310 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat64 =
1311 float_controls_props.shaderDenormFlushToZeroFloat64;
1312 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat16 = float_controls_props.shaderRoundingModeRTEFloat16;
1313 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat32 = float_controls_props.shaderRoundingModeRTEFloat32;
1314 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat64 = float_controls_props.shaderRoundingModeRTEFloat64;
1315 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat16 = float_controls_props.shaderRoundingModeRTZFloat16;
1316 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat32 = float_controls_props.shaderRoundingModeRTZFloat32;
1317 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat64 = float_controls_props.shaderRoundingModeRTZFloat64;
1318 }
locke-lunargd556cc32019-09-17 01:21:23 -06001319 }
1320
sfricke-samsung828e59d2021-08-22 23:20:49 -07001321 // Extensions with properties to extract to DeviceExtensionProperties
1322 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_push_descriptor, &phys_dev_props->push_descriptor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001323 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_shading_rate_image, &phys_dev_props->shading_rate_image_props);
1324 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_mesh_shader, &phys_dev_props->mesh_shader_props);
1325 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_inline_uniform_block, &phys_dev_props->inline_uniform_block_props);
1326 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_vertex_attribute_divisor, &phys_dev_props->vtx_attrib_divisor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001327 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_transform_feedback, &phys_dev_props->transform_feedback_props);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001328 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_ray_tracing, &phys_dev_props->ray_tracing_propsNV);
sourav parmarcd5fb182020-07-17 12:58:44 -07001329 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_ray_tracing_pipeline, &phys_dev_props->ray_tracing_propsKHR);
1330 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_acceleration_structure, &phys_dev_props->acc_structure_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001331 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_texel_buffer_alignment, &phys_dev_props->texel_buffer_alignment_props);
1332 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map, &phys_dev_props->fragment_density_map_props);
Mike Schuchardtc57de4a2021-07-20 17:26:32 -07001333 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map2, &phys_dev_props->fragment_density_map2_props);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001334 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_performance_query, &phys_dev_props->performance_query_props);
sfricke-samsung8f658d42020-05-03 20:12:24 -07001335 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sample_locations, &phys_dev_props->sample_locations_props);
Tony-LunarG7337b312020-04-15 16:40:25 -06001336 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_custom_border_color, &phys_dev_props->custom_border_color_props);
locke-lunarg3fa463a2020-10-23 16:39:04 -06001337 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &phys_dev_props->multiview_props);
Nathaniel Cesario3291c912020-11-17 16:54:41 -07001338 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_portability_subset, &phys_dev_props->portability_props);
sfricke-samsung828e59d2021-08-22 23:20:49 -07001339 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_fragment_shading_rate, &phys_dev_props->fragment_shading_rate_props);
Locke Lin016d8482021-05-27 12:11:31 -06001340 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_provoking_vertex, &phys_dev_props->provoking_vertex_props);
Tony-LunarG4490de42021-06-21 15:49:19 -06001341 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_multi_draw, &phys_dev_props->multi_draw_props);
ziga-lunarg128904a2021-07-30 13:49:01 +02001342 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_discard_rectangles, &phys_dev_props->discard_rectangle_props);
ziga-lunarg86492812021-08-05 23:58:16 +02001343 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_blend_operation_advanced, &phys_dev_props->blend_operation_advanced_props);
ziga-lunargbd8ded62021-09-20 18:24:39 +02001344 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_conservative_rasterization, &phys_dev_props->conservative_rasterization_props);
ziga-lunarg11fecb92021-09-20 16:48:06 +02001345 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_subgroup_size_control, &phys_dev_props->subgroup_size_control_props);
Piers Daniell41b8c5d2020-01-10 15:42:00 -07001346
sfricke-samsung45996a42021-09-16 13:45:27 -07001347 if (IsExtEnabled(dev_ext.vk_nv_cooperative_matrix)) {
locke-lunargd556cc32019-09-17 01:21:23 -06001348 // Get the needed cooperative_matrix properties
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001349 auto cooperative_matrix_props = LvlInitStruct<VkPhysicalDeviceCooperativeMatrixPropertiesNV>();
1350 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&cooperative_matrix_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001351 instance_dispatch_table.GetPhysicalDeviceProperties2KHR(gpu, &prop2);
1352 state_tracker->phys_dev_ext_props.cooperative_matrix_props = cooperative_matrix_props;
1353
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001354 uint32_t num_cooperative_matrix_properties = 0;
1355 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties, NULL);
1356 state_tracker->cooperative_matrix_properties.resize(num_cooperative_matrix_properties,
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001357 LvlInitStruct<VkCooperativeMatrixPropertiesNV>());
locke-lunargd556cc32019-09-17 01:21:23 -06001358
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001359 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties,
locke-lunargd556cc32019-09-17 01:21:23 -06001360 state_tracker->cooperative_matrix_properties.data());
1361 }
Tobias Hector6663c9b2020-11-05 10:18:02 +00001362
locke-lunargd556cc32019-09-17 01:21:23 -06001363 // Store queue family data
1364 if (pCreateInfo->pQueueCreateInfos != nullptr) {
1365 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
sfricke-samsung590ae1e2020-04-25 01:18:05 -07001366 const VkDeviceQueueCreateInfo &queue_create_info = pCreateInfo->pQueueCreateInfos[i];
sfricke-samsungb585ec12021-05-06 03:10:13 -07001367 state_tracker->queue_family_index_set.insert(queue_create_info.queueFamilyIndex);
1368 state_tracker->device_queue_info_list.push_back(
1369 {i, queue_create_info.queueFamilyIndex, queue_create_info.flags, queue_create_info.queueCount});
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001370 }
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001371 for (const auto &queue_info : state_tracker->device_queue_info_list) {
1372 for (uint32_t i = 0; i < queue_info.queue_count; i++) {
1373 VkQueue queue = VK_NULL_HANDLE;
1374 // vkGetDeviceQueue2() was added in vulkan 1.1, and there was never a KHR version of it.
1375 if (api_version >= VK_API_VERSION_1_1 && queue_info.flags != 0) {
1376 auto get_info = LvlInitStruct<VkDeviceQueueInfo2>();
1377 get_info.flags = queue_info.flags;
1378 get_info.queueFamilyIndex = queue_info.queue_family_index;
1379 get_info.queueIndex = i;
1380 DispatchGetDeviceQueue2(*pDevice, &get_info, &queue);
1381 } else {
1382 DispatchGetDeviceQueue(*pDevice, queue_info.queue_family_index, i, &queue);
1383 }
1384 assert(queue != VK_NULL_HANDLE);
Mike Schuchardta9101d32021-11-12 12:24:08 -08001385 state_tracker->Add(std::make_shared<QUEUE_STATE>(queue, queue_info.queue_family_index, queue_info.flags));
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001386 }
locke-lunargd556cc32019-09-17 01:21:23 -06001387 }
1388 }
1389}
1390
1391void ValidationStateTracker::PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
1392 if (!device) return;
1393
Jeremy Gebbend177d922021-10-28 13:42:10 -06001394 command_pool_map_.clear();
1395 assert(command_buffer_map_.empty());
1396 pipeline_map_.clear();
1397 render_pass_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001398
1399 // This will also delete all sets in the pool & remove them from setMap
Jeremy Gebbend177d922021-10-28 13:42:10 -06001400 descriptor_pool_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001401 // All sets should be removed
Jeremy Gebbend177d922021-10-28 13:42:10 -06001402 assert(descriptor_set_map_.empty());
1403 desc_template_map_.clear();
1404 descriptor_set_layout_map_.clear();
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001405 // Because swapchains are associated with Surfaces, which are at instance level,
1406 // they need to be explicitly destroyed here to avoid continued references to
1407 // the device we're destroying.
Jeremy Gebben65975ed2021-10-29 11:16:10 -06001408 for (auto &entry : swapchain_map_.snapshot()) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001409 entry.second->Destroy();
1410 }
Jeremy Gebbend177d922021-10-28 13:42:10 -06001411 swapchain_map_.clear();
1412 image_view_map_.clear();
1413 image_map_.clear();
1414 buffer_view_map_.clear();
1415 buffer_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001416 // Queues persist until device is destroyed
Jeremy Gebbend177d922021-10-28 13:42:10 -06001417 queue_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001418}
1419
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001420void ValidationStateTracker::PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1421 VkFence fence, VkResult result) {
1422 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001423 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001424
Jeremy Gebben57642982021-09-14 14:14:55 -06001425 uint64_t early_retire_seq = 0;
1426
1427 if (submitCount == 0) {
1428 CB_SUBMISSION submission;
Jeremy Gebben9f537102021-10-05 16:37:12 -06001429 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001430 early_retire_seq = queue_state->Submit(std::move(submission));
1431 }
locke-lunargd556cc32019-09-17 01:21:23 -06001432
1433 // Now process each individual submit
1434 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001435 CB_SUBMISSION submission;
locke-lunargd556cc32019-09-17 01:21:23 -06001436 const VkSubmitInfo *submit = &pSubmits[submit_idx];
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001437 auto *timeline_semaphore_submit = LvlFindInChain<VkTimelineSemaphoreSubmitInfo>(submit->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06001438 for (uint32_t i = 0; i < submit->waitSemaphoreCount; ++i) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001439 uint64_t value{0};
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001440 if (timeline_semaphore_submit && timeline_semaphore_submit->pWaitSemaphoreValues != nullptr &&
1441 (i < timeline_semaphore_submit->waitSemaphoreValueCount)) {
1442 value = timeline_semaphore_submit->pWaitSemaphoreValues[i];
1443 }
Jeremy Gebben9f537102021-10-05 16:37:12 -06001444 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(submit->pWaitSemaphores[i]), value);
locke-lunargd556cc32019-09-17 01:21:23 -06001445 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001446
locke-lunargd556cc32019-09-17 01:21:23 -06001447 for (uint32_t i = 0; i < submit->signalSemaphoreCount; ++i) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001448 uint64_t value{0};
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001449 if (timeline_semaphore_submit && timeline_semaphore_submit->pSignalSemaphoreValues != nullptr &&
1450 (i < timeline_semaphore_submit->signalSemaphoreValueCount)) {
1451 value = timeline_semaphore_submit->pSignalSemaphoreValues[i];
1452 }
Jeremy Gebben9f537102021-10-05 16:37:12 -06001453 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(submit->pSignalSemaphores[i]), value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001454 }
1455
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001456 const auto perf_submit = LvlFindInChain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001457 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02001458
locke-lunargd556cc32019-09-17 01:21:23 -06001459 for (uint32_t i = 0; i < submit->commandBufferCount; i++) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07001460 submission.AddCommandBuffer(GetWrite<CMD_BUFFER_STATE>(submit->pCommandBuffers[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001461 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001462 if (submit_idx == (submitCount - 1) && fence != VK_NULL_HANDLE) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001463 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001464 }
1465 auto submit_seq = queue_state->Submit(std::move(submission));
1466 early_retire_seq = std::max(early_retire_seq, submit_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001467 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001468
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001469 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001470 queue_state->Retire(early_retire_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001471 }
1472}
1473
Tony-LunarG26fe2842021-11-16 14:07:59 -07001474void ValidationStateTracker::RecordQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1475 VkFence fence, VkResult result) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001476 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001477 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001478 uint64_t early_retire_seq = 0;
1479 if (submitCount == 0) {
1480 CB_SUBMISSION submission;
Jeremy Gebben9f537102021-10-05 16:37:12 -06001481 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001482 early_retire_seq = queue_state->Submit(std::move(submission));
1483 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001484
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001485 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
1486 CB_SUBMISSION submission;
1487 const VkSubmitInfo2KHR *submit = &pSubmits[submit_idx];
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001488 for (uint32_t i = 0; i < submit->waitSemaphoreInfoCount; ++i) {
1489 const auto &sem_info = submit->pWaitSemaphoreInfos[i];
Jeremy Gebben9f537102021-10-05 16:37:12 -06001490 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001491 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001492 for (uint32_t i = 0; i < submit->signalSemaphoreInfoCount; ++i) {
1493 const auto &sem_info = submit->pSignalSemaphoreInfos[i];
Jeremy Gebben9f537102021-10-05 16:37:12 -06001494 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001495 }
1496 const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
1497 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
1498
1499 for (uint32_t i = 0; i < submit->commandBufferInfoCount; i++) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07001500 submission.AddCommandBuffer(GetWrite<CMD_BUFFER_STATE>(submit->pCommandBufferInfos[i].commandBuffer));
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001501 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001502 if (submit_idx == (submitCount - 1)) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001503 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001504 }
1505 auto submit_seq = queue_state->Submit(std::move(submission));
1506 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001507 }
locke-lunargd556cc32019-09-17 01:21:23 -06001508 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001509 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001510 }
1511}
1512
Tony-LunarG26fe2842021-11-16 14:07:59 -07001513void ValidationStateTracker::PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1514 VkFence fence, VkResult result) {
1515 RecordQueueSubmit2(queue, submitCount, pSubmits, fence, result);
1516}
1517
1518void ValidationStateTracker::PostCallRecordQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2 *pSubmits,
1519 VkFence fence, VkResult result) {
1520 RecordQueueSubmit2(queue, submitCount, pSubmits, fence, result);
1521}
1522
locke-lunargd556cc32019-09-17 01:21:23 -06001523void ValidationStateTracker::PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1524 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory,
1525 VkResult result) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001526 if (VK_SUCCESS != result) {
1527 return;
locke-lunargd556cc32019-09-17 01:21:23 -06001528 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001529 const auto &memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
1530 const auto &memory_heap = phys_dev_mem_props.memoryHeaps[memory_type.heapIndex];
1531 auto fake_address = fake_memory.Alloc(pAllocateInfo->allocationSize);
1532
1533 layer_data::optional<DedicatedBinding> dedicated_binding;
1534
1535 auto dedicated = LvlFindInChain<VkMemoryDedicatedAllocateInfo>(pAllocateInfo->pNext);
1536 if (dedicated) {
1537 if (dedicated->buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001538 const auto buffer_state = Get<BUFFER_STATE>(dedicated->buffer);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001539 assert(buffer_state);
1540 if (!buffer_state) {
1541 return;
1542 }
1543 dedicated_binding.emplace(dedicated->buffer, buffer_state->createInfo);
1544 } else if (dedicated->image) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001545 const auto image_state = Get<IMAGE_STATE>(dedicated->image);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001546 assert(image_state);
1547 if (!image_state) {
1548 return;
1549 }
1550 dedicated_binding.emplace(dedicated->image, image_state->createInfo);
1551 }
1552 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001553 Add(std::make_shared<DEVICE_MEMORY_STATE>(*pMemory, pAllocateInfo, fake_address, memory_type, memory_heap,
1554 std::move(dedicated_binding), physical_device_count));
locke-lunargd556cc32019-09-17 01:21:23 -06001555 return;
1556}
1557
1558void ValidationStateTracker::PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory mem, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001559 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001560 if (mem_info) {
1561 fake_memory.Free(mem_info->fake_base_address);
1562 }
1563 Destroy<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001564}
1565
1566void ValidationStateTracker::PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
1567 VkFence fence, VkResult result) {
1568 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001569 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06001570
Jeremy Gebben57642982021-09-14 14:14:55 -06001571 uint64_t early_retire_seq = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001572
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001573 for (uint32_t bind_idx = 0; bind_idx < bindInfoCount; ++bind_idx) {
1574 const VkBindSparseInfo &bind_info = pBindInfo[bind_idx];
locke-lunargd556cc32019-09-17 01:21:23 -06001575 // Track objects tied to memory
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001576 for (uint32_t j = 0; j < bind_info.bufferBindCount; j++) {
1577 for (uint32_t k = 0; k < bind_info.pBufferBinds[j].bindCount; k++) {
1578 auto sparse_binding = bind_info.pBufferBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001579 auto buffer_state = Get<BUFFER_STATE>(bind_info.pBufferBinds[j].buffer);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001580 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001581 if (buffer_state && mem_state) {
1582 buffer_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1583 }
locke-lunargd556cc32019-09-17 01:21:23 -06001584 }
1585 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001586 for (uint32_t j = 0; j < bind_info.imageOpaqueBindCount; j++) {
1587 for (uint32_t k = 0; k < bind_info.pImageOpaqueBinds[j].bindCount; k++) {
1588 auto sparse_binding = bind_info.pImageOpaqueBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001589 auto image_state = Get<IMAGE_STATE>(bind_info.pImageOpaqueBinds[j].image);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001590 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001591 if (image_state && mem_state) {
1592 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1593 }
locke-lunargd556cc32019-09-17 01:21:23 -06001594 }
1595 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001596 for (uint32_t j = 0; j < bind_info.imageBindCount; j++) {
1597 for (uint32_t k = 0; k < bind_info.pImageBinds[j].bindCount; k++) {
1598 auto sparse_binding = bind_info.pImageBinds[j].pBinds[k];
locke-lunargd556cc32019-09-17 01:21:23 -06001599 // TODO: This size is broken for non-opaque bindings, need to update to comprehend full sparse binding data
1600 VkDeviceSize size = sparse_binding.extent.depth * sparse_binding.extent.height * sparse_binding.extent.width * 4;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001601 auto image_state = Get<IMAGE_STATE>(bind_info.pImageBinds[j].image);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001602 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001603 if (image_state && mem_state) {
1604 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, size);
1605 }
locke-lunargd556cc32019-09-17 01:21:23 -06001606 }
1607 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001608 CB_SUBMISSION submission;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001609 for (uint32_t i = 0; i < bind_info.waitSemaphoreCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001610 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(bind_info.pWaitSemaphores[i]), 0);
locke-lunargd556cc32019-09-17 01:21:23 -06001611 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001612 for (uint32_t i = 0; i < bind_info.signalSemaphoreCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001613 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(bind_info.pSignalSemaphores[i]), 0);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001614 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001615 if (bind_idx == (bindInfoCount - 1)) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001616 submission.AddFence(Get<FENCE_STATE>(fence));
locke-lunargd556cc32019-09-17 01:21:23 -06001617 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001618 auto submit_seq = queue_state->Submit(std::move(submission));
1619 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001620 }
1621
1622 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001623 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001624 }
1625}
1626
1627void ValidationStateTracker::PostCallRecordCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
1628 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore,
1629 VkResult result) {
1630 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001631 Add(std::make_shared<SEMAPHORE_STATE>(*pSemaphore, LvlFindInChain<VkSemaphoreTypeCreateInfo>(pCreateInfo->pNext)));
locke-lunargd556cc32019-09-17 01:21:23 -06001632}
1633
Mike Schuchardt2df08912020-12-15 16:28:09 -08001634void ValidationStateTracker::RecordImportSemaphoreState(VkSemaphore semaphore, VkExternalSemaphoreHandleTypeFlagBits handle_type,
1635 VkSemaphoreImportFlags flags) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001636 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
1637 if (semaphore_state) {
1638 semaphore_state->Import(handle_type, flags);
locke-lunargd556cc32019-09-17 01:21:23 -06001639 }
1640}
1641
Mike Schuchardt2df08912020-12-15 16:28:09 -08001642void ValidationStateTracker::PostCallRecordSignalSemaphoreKHR(VkDevice device, const VkSemaphoreSignalInfo *pSignalInfo,
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001643 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001644 auto semaphore_state = Get<SEMAPHORE_STATE>(pSignalInfo->semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07001645 if (semaphore_state) {
1646 semaphore_state->RetireTimeline(pSignalInfo->value);
1647 }
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001648}
1649
locke-lunargd556cc32019-09-17 01:21:23 -06001650void ValidationStateTracker::RecordMappedMemory(VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, void **ppData) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001651 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001652 if (mem_info) {
1653 mem_info->mapped_range.offset = offset;
1654 mem_info->mapped_range.size = size;
1655 mem_info->p_driver_data = *ppData;
1656 }
1657}
1658
locke-lunargd556cc32019-09-17 01:21:23 -06001659void ValidationStateTracker::PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1660 VkBool32 waitAll, uint64_t timeout, VkResult result) {
1661 if (VK_SUCCESS != result) return;
1662
1663 // When we know that all fences are complete we can clean/remove their CBs
1664 if ((VK_TRUE == waitAll) || (1 == fenceCount)) {
1665 for (uint32_t i = 0; i < fenceCount; i++) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001666 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Jeremy Gebben57642982021-09-14 14:14:55 -06001667 if (fence_state) {
1668 fence_state->Retire();
1669 }
locke-lunargd556cc32019-09-17 01:21:23 -06001670 }
1671 }
1672 // NOTE : Alternate case not handled here is when some fences have completed. In
1673 // this case for app to guarantee which fences completed it will have to call
1674 // vkGetFenceStatus() at which point we'll clean/remove their CBs if complete.
1675}
1676
John Zulauff89de662020-04-13 18:57:34 -06001677void ValidationStateTracker::RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1678 VkResult result) {
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001679 if (VK_SUCCESS != result) return;
1680
Jeremy Gebben15332642021-12-15 19:33:15 -07001681 // Same logic as vkWaitForFences(). If some semaphores are not signaled, we will get their status when
1682 // the application calls vkGetSemaphoreCounterValue() on each of them.
1683 if ((pWaitInfo->flags & VK_SEMAPHORE_WAIT_ANY_BIT) == 0 || pWaitInfo->semaphoreCount == 1) {
1684 for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
1685 auto semaphore_state = Get<SEMAPHORE_STATE>(pWaitInfo->pSemaphores[i]);
1686 if (semaphore_state) {
1687 semaphore_state->RetireTimeline(pWaitInfo->pValues[i]);
1688 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001689 }
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001690 }
1691}
1692
John Zulauff89de662020-04-13 18:57:34 -06001693void ValidationStateTracker::PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1694 VkResult result) {
1695 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1696}
1697
1698void ValidationStateTracker::PostCallRecordWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo,
1699 uint64_t timeout, VkResult result) {
1700 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1701}
1702
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001703void ValidationStateTracker::RecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1704 VkResult result) {
1705 if (VK_SUCCESS != result) return;
1706
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001707 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben57642982021-09-14 14:14:55 -06001708 if (semaphore_state) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001709 semaphore_state->RetireTimeline(*pValue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001710 }
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001711}
1712
1713void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1714 VkResult result) {
1715 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1716}
1717void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValueKHR(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1718 VkResult result) {
1719 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1720}
1721
locke-lunargd556cc32019-09-17 01:21:23 -06001722void ValidationStateTracker::PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
1723 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001724 auto fence_state = Get<FENCE_STATE>(fence);
Jeremy Gebben57642982021-09-14 14:14:55 -06001725 if (fence_state) {
1726 fence_state->Retire();
1727 }
locke-lunargd556cc32019-09-17 01:21:23 -06001728}
1729
Yilong Lice03a312022-01-02 02:08:35 -08001730void ValidationStateTracker::RecordGetDeviceQueueState(uint32_t queue_family_index, VkDeviceQueueCreateFlags flags, VkQueue queue) {
1731 if (Get<QUEUE_STATE>(queue) == nullptr) {
1732 Add(std::make_shared<QUEUE_STATE>(queue, queue_family_index, flags));
1733 }
1734}
1735
1736void ValidationStateTracker::PostCallRecordGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex,
1737 VkQueue *pQueue) {
1738 RecordGetDeviceQueueState(queueFamilyIndex, {}, *pQueue);
1739}
1740
1741void ValidationStateTracker::PostCallRecordGetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2 *pQueueInfo, VkQueue *pQueue) {
1742 RecordGetDeviceQueueState(pQueueInfo->queueFamilyIndex, pQueueInfo->flags, *pQueue);
1743}
1744
locke-lunargd556cc32019-09-17 01:21:23 -06001745void ValidationStateTracker::PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) {
1746 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001747 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001748 if (queue_state) {
1749 queue_state->Retire();
1750 }
locke-lunargd556cc32019-09-17 01:21:23 -06001751}
1752
1753void ValidationStateTracker::PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) {
1754 if (VK_SUCCESS != result) return;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06001755 for (auto &queue : queue_map_.snapshot()) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001756 queue.second->Retire();
locke-lunargd556cc32019-09-17 01:21:23 -06001757 }
1758}
1759
1760void ValidationStateTracker::PreCallRecordDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001761 Destroy<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06001762}
1763
1764void ValidationStateTracker::PreCallRecordDestroySemaphore(VkDevice device, VkSemaphore semaphore,
1765 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001766 Destroy<SEMAPHORE_STATE>(semaphore);
locke-lunargd556cc32019-09-17 01:21:23 -06001767}
1768
1769void ValidationStateTracker::PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001770 Destroy<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06001771}
1772
1773void ValidationStateTracker::PreCallRecordDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
1774 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001775 Destroy<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001776}
1777
locke-lunargd556cc32019-09-17 01:21:23 -06001778void ValidationStateTracker::UpdateBindBufferMemoryState(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001779 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001780 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001781 // Track objects tied to memory
Jeremy Gebben9f537102021-10-05 16:37:12 -06001782 auto mem_state = Get<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001783 if (mem_state) {
1784 buffer_state->SetMemBinding(mem_state, memoryOffset);
1785 }
locke-lunargd556cc32019-09-17 01:21:23 -06001786 }
1787}
1788
1789void ValidationStateTracker::PostCallRecordBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
1790 VkDeviceSize memoryOffset, VkResult result) {
1791 if (VK_SUCCESS != result) return;
1792 UpdateBindBufferMemoryState(buffer, mem, memoryOffset);
1793}
1794
1795void ValidationStateTracker::PostCallRecordBindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001796 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001797 for (uint32_t i = 0; i < bindInfoCount; i++) {
1798 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1799 }
1800}
1801
1802void ValidationStateTracker::PostCallRecordBindBufferMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001803 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001804 for (uint32_t i = 0; i < bindInfoCount; i++) {
1805 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1806 }
1807}
1808
Spencer Fricke6c127102020-04-16 06:25:20 -07001809void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001810 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001811 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001812 buffer_state->memory_requirements_checked = true;
1813 }
1814}
1815
1816void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1817 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001818 RecordGetBufferMemoryRequirementsState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001819}
1820
1821void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001822 const VkBufferMemoryRequirementsInfo2 *pInfo,
1823 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001824 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001825}
1826
1827void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2KHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001828 const VkBufferMemoryRequirementsInfo2 *pInfo,
1829 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001830 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001831}
1832
Spencer Fricke6c127102020-04-16 06:25:20 -07001833void ValidationStateTracker::RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2 *pInfo) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001834 const VkImagePlaneMemoryRequirementsInfo *plane_info =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001835 (pInfo == nullptr) ? nullptr : LvlFindInChain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001836 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001837 if (image_state) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001838 if (plane_info != nullptr) {
1839 // Multi-plane image
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001840 if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_0_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001841 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001842 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_1_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001843 image_state->memory_requirements_checked[1] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001844 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_2_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001845 image_state->memory_requirements_checked[2] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001846 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001847 } else if (!image_state->disjoint) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001848 // Single Plane image
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001849 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001850 }
locke-lunargd556cc32019-09-17 01:21:23 -06001851 }
1852}
1853
1854void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements(VkDevice device, VkImage image,
1855 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001856 RecordGetImageMemoryRequirementsState(image, nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06001857}
1858
1859void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
1860 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001861 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001862}
1863
1864void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2KHR(VkDevice device,
1865 const VkImageMemoryRequirementsInfo2 *pInfo,
1866 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001867 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001868}
1869
locke-lunargd556cc32019-09-17 01:21:23 -06001870void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements(
1871 VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1872 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001873 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001874 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001875}
1876
1877void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001878 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1879 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001880 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001881 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001882}
1883
1884void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001885 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1886 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001887 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001888 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001889}
1890
1891void ValidationStateTracker::PreCallRecordDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1892 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001893 Destroy<SHADER_MODULE_STATE>(shaderModule);
locke-lunargd556cc32019-09-17 01:21:23 -06001894}
1895
1896void ValidationStateTracker::PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline,
1897 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001898 Destroy<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06001899}
1900
1901void ValidationStateTracker::PreCallRecordDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1902 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001903 Destroy<PIPELINE_LAYOUT_STATE>(pipelineLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001904}
1905
1906void ValidationStateTracker::PreCallRecordDestroySampler(VkDevice device, VkSampler sampler,
1907 const VkAllocationCallbacks *pAllocator) {
1908 if (!sampler) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001909 auto sampler_state = Get<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001910 // Any bound cmd buffers are now invalid
1911 if (sampler_state) {
Yuly Novikov424cdd52020-05-26 16:45:12 -04001912 if (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
1913 sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
1914 custom_border_color_sampler_count--;
1915 }
locke-lunargd556cc32019-09-17 01:21:23 -06001916 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001917 Destroy<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001918}
1919
1920void ValidationStateTracker::PreCallRecordDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1921 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001922 Destroy<cvdescriptorset::DescriptorSetLayout>(descriptorSetLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001923}
1924
1925void ValidationStateTracker::PreCallRecordDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1926 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001927 Destroy<DESCRIPTOR_POOL_STATE>(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001928}
1929
locke-lunargd556cc32019-09-17 01:21:23 -06001930void ValidationStateTracker::PreCallRecordFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
1931 uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001932 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1933 if (pool) {
1934 pool->Free(commandBufferCount, pCommandBuffers);
1935 }
locke-lunargd556cc32019-09-17 01:21:23 -06001936}
1937
1938void ValidationStateTracker::PostCallRecordCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1939 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool,
1940 VkResult result) {
1941 if (VK_SUCCESS != result) return;
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001942 auto queue_flags = physical_device_state->queue_family_properties[pCreateInfo->queueFamilyIndex].queueFlags;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001943 Add(std::make_shared<COMMAND_POOL_STATE>(this, *pCommandPool, pCreateInfo, queue_flags));
locke-lunargd556cc32019-09-17 01:21:23 -06001944}
1945
1946void ValidationStateTracker::PostCallRecordCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1947 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool,
1948 VkResult result) {
1949 if (VK_SUCCESS != result) return;
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001950
1951 uint32_t index_count = 0, n_perf_pass = 0;
1952 bool has_cb = false, has_rb = false;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001953 if (pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001954 const auto *perf = LvlFindInChain<VkQueryPoolPerformanceCreateInfoKHR>(pCreateInfo->pNext);
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001955 index_count = perf->counterIndexCount;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001956
Mark Lobodzinski7e948e42020-09-09 10:23:36 -06001957 const QUEUE_FAMILY_PERF_COUNTERS &counters = *physical_device_state->perf_counters[perf->queueFamilyIndex];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001958 for (uint32_t i = 0; i < perf->counterIndexCount; i++) {
1959 const auto &counter = counters.counters[perf->pCounterIndices[i]];
1960 switch (counter.scope) {
1961 case VK_QUERY_SCOPE_COMMAND_BUFFER_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001962 has_cb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001963 break;
1964 case VK_QUERY_SCOPE_RENDER_PASS_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001965 has_rb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001966 break;
1967 default:
1968 break;
1969 }
1970 }
1971
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001972 DispatchGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physical_device_state->PhysDev(), perf, &n_perf_pass);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001973 }
1974
Jeremy Gebben082a9832021-10-28 13:40:11 -06001975 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 -06001976
locke-lunargd556cc32019-09-17 01:21:23 -06001977}
1978
1979void ValidationStateTracker::PreCallRecordDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
1980 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001981 Destroy<COMMAND_POOL_STATE>(commandPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001982}
1983
1984void ValidationStateTracker::PostCallRecordResetCommandPool(VkDevice device, VkCommandPool commandPool,
1985 VkCommandPoolResetFlags flags, VkResult result) {
1986 if (VK_SUCCESS != result) return;
1987 // Reset all of the CBs allocated from this pool
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001988 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1989 if (pool) {
1990 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001991 }
1992}
1993
1994void ValidationStateTracker::PostCallRecordResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1995 VkResult result) {
1996 for (uint32_t i = 0; i < fenceCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001997 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001998 if (fence_state) {
Jeremy Gebben140a0a52021-12-15 18:22:34 -07001999 fence_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002000 }
2001 }
2002}
2003
locke-lunargd556cc32019-09-17 01:21:23 -06002004void ValidationStateTracker::PreCallRecordDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
2005 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002006 Destroy<FRAMEBUFFER_STATE>(framebuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002007}
2008
2009void ValidationStateTracker::PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
2010 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002011 Destroy<RENDER_PASS_STATE>(renderPass);
locke-lunargd556cc32019-09-17 01:21:23 -06002012}
2013
2014void ValidationStateTracker::PostCallRecordCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2015 const VkAllocationCallbacks *pAllocator, VkFence *pFence, VkResult result) {
2016 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002017 Add(std::make_shared<FENCE_STATE>(*pFence, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002018}
2019
2020bool ValidationStateTracker::PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2021 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2022 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002023 void *cgpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002024 // Set up the state that CoreChecks, gpu_validation and later StateTracker Record will use.
2025 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2026 cgpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2027 cgpl_state->pipe_state.reserve(count);
2028 for (uint32_t i = 0; i < count; i++) {
Jeremy Gebbence23dac2021-11-10 10:19:42 -07002029 if (pCreateInfos[i].renderPass != VK_NULL_HANDLE) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002030 cgpl_state->pipe_state.push_back(std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i],
2031 Get<RENDER_PASS_STATE>(pCreateInfos[i].renderPass),
2032 Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Tony-LunarG273f32f2021-09-28 08:56:30 -06002033 } else if (enabled_features.core13.dynamicRendering) {
amhagana448ea52021-11-02 14:09:14 -04002034 auto dynamic_rendering = LvlFindInChain<VkPipelineRenderingCreateInfoKHR>(pCreateInfos[i].pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002035 cgpl_state->pipe_state.push_back(
2036 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], std::make_shared<RENDER_PASS_STATE>(dynamic_rendering),
Jeremy Gebben9f537102021-10-05 16:37:12 -06002037 Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeremy Gebbence23dac2021-11-10 10:19:42 -07002038 }
locke-lunargd556cc32019-09-17 01:21:23 -06002039 }
2040 return false;
2041}
2042
2043void ValidationStateTracker::PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2044 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2045 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2046 VkResult result, void *cgpl_state_data) {
2047 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2048 // This API may create pipelines regardless of the return value
2049 for (uint32_t i = 0; i < count; i++) {
2050 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002051 (cgpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06002052 Add(std::move((cgpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06002053 }
2054 }
2055 cgpl_state->pipe_state.clear();
2056}
2057
2058bool ValidationStateTracker::PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2059 const VkComputePipelineCreateInfo *pCreateInfos,
2060 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002061 void *ccpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002062 auto *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2063 ccpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2064 ccpl_state->pipe_state.reserve(count);
2065 for (uint32_t i = 0; i < count; i++) {
2066 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002067 ccpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06002068 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002069 }
2070 return false;
2071}
2072
2073void ValidationStateTracker::PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2074 const VkComputePipelineCreateInfo *pCreateInfos,
2075 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2076 VkResult result, void *ccpl_state_data) {
2077 create_compute_pipeline_api_state *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2078
2079 // This API may create pipelines regardless of the return value
2080 for (uint32_t i = 0; i < count; i++) {
2081 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002082 (ccpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06002083 Add(std::move((ccpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06002084 }
2085 }
2086 ccpl_state->pipe_state.clear();
2087}
2088
2089bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache,
2090 uint32_t count,
2091 const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2092 const VkAllocationCallbacks *pAllocator,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002093 VkPipeline *pPipelines, void *crtpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002094 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2095 crtpl_state->pipe_state.reserve(count);
2096 for (uint32_t i = 0; i < count; i++) {
2097 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002098 crtpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06002099 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002100 }
2101 return false;
2102}
2103
2104void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesNV(
2105 VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2106 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines, VkResult result, void *crtpl_state_data) {
2107 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2108 // This API may create pipelines regardless of the return value
2109 for (uint32_t i = 0; i < count; i++) {
2110 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002111 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06002112 Add(std::move((crtpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06002113 }
2114 }
2115 crtpl_state->pipe_state.clear();
2116}
2117
sourav parmarcd5fb182020-07-17 12:58:44 -07002118bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2119 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002120 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2121 const VkAllocationCallbacks *pAllocator,
2122 VkPipeline *pPipelines, void *crtpl_state_data) const {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002123 auto crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002124 crtpl_state->pipe_state.reserve(count);
2125 for (uint32_t i = 0; i < count; i++) {
2126 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002127 crtpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06002128 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002129 }
2130 return false;
2131}
2132
sourav parmarcd5fb182020-07-17 12:58:44 -07002133void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2134 VkPipelineCache pipelineCache, uint32_t count,
2135 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2136 const VkAllocationCallbacks *pAllocator,
2137 VkPipeline *pPipelines, VkResult result,
2138 void *crtpl_state_data) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002139 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
2140 // This API may create pipelines regardless of the return value
2141 for (uint32_t i = 0; i < count; i++) {
2142 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002143 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06002144 Add(std::move((crtpl_state->pipe_state)[i]));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002145 }
2146 }
2147 crtpl_state->pipe_state.clear();
2148}
2149
locke-lunargd556cc32019-09-17 01:21:23 -06002150void ValidationStateTracker::PostCallRecordCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2151 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler,
2152 VkResult result) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002153 Add(std::make_shared<SAMPLER_STATE>(pSampler, pCreateInfo));
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002154 if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
2155 pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
Tony-LunarG7337b312020-04-15 16:40:25 -06002156 custom_border_color_sampler_count++;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002157 }
locke-lunargd556cc32019-09-17 01:21:23 -06002158}
2159
2160void ValidationStateTracker::PostCallRecordCreateDescriptorSetLayout(VkDevice device,
2161 const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2162 const VkAllocationCallbacks *pAllocator,
2163 VkDescriptorSetLayout *pSetLayout, VkResult result) {
2164 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002165 Add(std::make_shared<cvdescriptorset::DescriptorSetLayout>(pCreateInfo, *pSetLayout));
locke-lunargd556cc32019-09-17 01:21:23 -06002166}
2167
locke-lunargd556cc32019-09-17 01:21:23 -06002168void ValidationStateTracker::PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
2169 const VkAllocationCallbacks *pAllocator,
2170 VkPipelineLayout *pPipelineLayout, VkResult result) {
2171 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002172 Add(std::make_shared<PIPELINE_LAYOUT_STATE>(this, *pPipelineLayout, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002173}
2174
2175void ValidationStateTracker::PostCallRecordCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
2176 const VkAllocationCallbacks *pAllocator,
2177 VkDescriptorPool *pDescriptorPool, VkResult result) {
2178 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002179 Add(std::make_shared<DESCRIPTOR_POOL_STATE>(this, *pDescriptorPool, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002180}
2181
2182void ValidationStateTracker::PostCallRecordResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
2183 VkDescriptorPoolResetFlags flags, VkResult result) {
2184 if (VK_SUCCESS != result) return;
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002185 auto pool = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
2186 if (pool) {
2187 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002188 }
locke-lunargd556cc32019-09-17 01:21:23 -06002189}
2190
2191bool ValidationStateTracker::PreCallValidateAllocateDescriptorSets(VkDevice device,
2192 const VkDescriptorSetAllocateInfo *pAllocateInfo,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002193 VkDescriptorSet *pDescriptorSets, void *ads_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002194 // Always update common data
2195 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2196 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2197 UpdateAllocateDescriptorSetsData(pAllocateInfo, ads_state);
2198
2199 return false;
2200}
2201
2202// Allocation state was good and call down chain was made so update state based on allocating descriptor sets
2203void ValidationStateTracker::PostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
2204 VkDescriptorSet *pDescriptorSets, VkResult result,
2205 void *ads_state_data) {
2206 if (VK_SUCCESS != result) return;
2207 // All the updates are contained in a single cvdescriptorset function
2208 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2209 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002210 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(pAllocateInfo->descriptorPool);
2211 if (pool_state) {
2212 pool_state->Allocate(pAllocateInfo, pDescriptorSets, ads_state);
2213 }
locke-lunargd556cc32019-09-17 01:21:23 -06002214}
2215
2216void ValidationStateTracker::PreCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count,
2217 const VkDescriptorSet *pDescriptorSets) {
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002218 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
2219 if (pool_state) {
2220 pool_state->Free(count, pDescriptorSets);
locke-lunargd556cc32019-09-17 01:21:23 -06002221 }
2222}
2223
2224void ValidationStateTracker::PreCallRecordUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
2225 const VkWriteDescriptorSet *pDescriptorWrites,
2226 uint32_t descriptorCopyCount,
2227 const VkCopyDescriptorSet *pDescriptorCopies) {
2228 cvdescriptorset::PerformUpdateDescriptorSets(this, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
2229 pDescriptorCopies);
2230}
2231
2232void ValidationStateTracker::PostCallRecordAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002233 VkCommandBuffer *pCommandBuffers, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002234 if (VK_SUCCESS != result) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06002235 auto pool = Get<COMMAND_POOL_STATE>(pCreateInfo->commandPool);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002236 if (pool) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002237 pool->Allocate(pCreateInfo, pCommandBuffers);
locke-lunargfc78e932020-11-19 17:06:24 -07002238 }
2239}
2240
locke-lunargd556cc32019-09-17 01:21:23 -06002241void ValidationStateTracker::PreCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer,
2242 const VkCommandBufferBeginInfo *pBeginInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002243 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002244 if (!cb_state) return;
locke-lunargfc78e932020-11-19 17:06:24 -07002245
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002246 cb_state->Begin(pBeginInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002247}
2248
2249void ValidationStateTracker::PostCallRecordEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002250 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002251 if (!cb_state) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002252
2253 cb_state->End(result);
locke-lunargd556cc32019-09-17 01:21:23 -06002254}
2255
2256void ValidationStateTracker::PostCallRecordResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags,
2257 VkResult result) {
2258 if (VK_SUCCESS == result) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002259 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2260 if (cb_state) {
2261 cb_state->Reset();
2262 }
locke-lunargd556cc32019-09-17 01:21:23 -06002263 }
2264}
2265
2266CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) {
2267 // initially assume everything is static state
2268 CBStatusFlags flags = CBSTATUS_ALL_STATE_SET;
2269
2270 if (ds) {
2271 for (uint32_t i = 0; i < ds->dynamicStateCount; i++) {
locke-lunarg4189aa22020-10-21 00:23:48 -06002272 flags &= ~ConvertToCBStatusFlagBits(ds->pDynamicStates[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002273 }
2274 }
locke-lunargd556cc32019-09-17 01:21:23 -06002275 return flags;
2276}
2277
2278// Validation cache:
2279// CV is the bottommost implementor of this extension. Don't pass calls down.
locke-lunargd556cc32019-09-17 01:21:23 -06002280
2281void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2282 VkPipeline pipeline) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002283 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002284 assert(cb_state);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002285 cb_state->RecordCmd(CMD_BINDPIPELINE);
locke-lunargd556cc32019-09-17 01:21:23 -06002286
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002287 auto pipe_state = Get<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06002288 if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002289 const auto &create_info = pipe_state->create_info.graphics;
2290 bool rasterization_enabled = VK_FALSE == create_info.pRasterizationState->rasterizerDiscardEnable;
2291 const auto *viewport_state = create_info.pViewportState;
2292 const auto *dynamic_state = create_info.pDynamicState;
locke-lunargd556cc32019-09-17 01:21:23 -06002293 cb_state->status &= ~cb_state->static_status;
Yilong Lid23bc292022-01-02 22:06:12 -08002294 cb_state->static_status = MakeStaticStateMask(dynamic_state ? dynamic_state->ptr() : nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06002295 cb_state->status |= cb_state->static_status;
locke-lunarg4189aa22020-10-21 00:23:48 -06002296 cb_state->dynamic_status = CBSTATUS_ALL_STATE_SET & (~cb_state->static_status);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002297
2298 // Used to calculate CMD_BUFFER_STATE::usedViewportScissorCount upon draw command with this graphics pipeline.
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002299 // If rasterization disabled (no viewport/scissors used), or the actual number of viewports/scissors is dynamic (unknown at
2300 // this time), then these are set to 0 to disable this checking.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002301 auto has_dynamic_viewport_count = cb_state->dynamic_status & CBSTATUS_VIEWPORT_WITH_COUNT_SET;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002302 auto has_dynamic_scissor_count = cb_state->dynamic_status & CBSTATUS_SCISSOR_WITH_COUNT_SET;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002303 cb_state->pipelineStaticViewportCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002304 has_dynamic_viewport_count || !rasterization_enabled ? 0 : viewport_state->viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002305 cb_state->pipelineStaticScissorCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002306 has_dynamic_scissor_count || !rasterization_enabled ? 0 : viewport_state->scissorCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002307
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002308 // Trash dynamic viewport/scissor state if pipeline defines static state and enabled rasterization.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002309 // akeley98 NOTE: There's a bit of an ambiguity in the spec, whether binding such a pipeline overwrites
2310 // the entire viewport (scissor) array, or only the subsection defined by the viewport (scissor) count.
2311 // I am taking the latter interpretation based on the implementation details of NVIDIA's Vulkan driver.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002312 if (!has_dynamic_viewport_count) {
2313 cb_state->trashedViewportCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002314 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_VIEWPORT_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002315 cb_state->trashedViewportMask |= (uint32_t(1) << viewport_state->viewportCount) - 1u;
2316 // should become = ~uint32_t(0) if the other interpretation is correct.
2317 }
2318 }
2319 if (!has_dynamic_scissor_count) {
2320 cb_state->trashedScissorCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002321 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_SCISSOR_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002322 cb_state->trashedScissorMask |= (uint32_t(1) << viewport_state->scissorCount) - 1u;
2323 // should become = ~uint32_t(0) if the other interpretation is correct.
2324 }
2325 }
locke-lunargd556cc32019-09-17 01:21:23 -06002326 }
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002327 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002328 cb_state->lastBound[lv_bind_point].pipeline_state = pipe_state.get();
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002329 if (!disabled[command_buffer_state]) {
2330 cb_state->AddChild(pipe_state);
2331 }
locke-lunargd556cc32019-09-17 01:21:23 -06002332}
2333
2334void ValidationStateTracker::PreCallRecordCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2335 uint32_t viewportCount, const VkViewport *pViewports) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002336 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002337 cb_state->RecordStateCmd(CMD_SETVIEWPORT, CBSTATUS_VIEWPORT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002338 uint32_t bits = ((1u << viewportCount) - 1u) << firstViewport;
2339 cb_state->viewportMask |= bits;
2340 cb_state->trashedViewportMask &= ~bits;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002341
2342 cb_state->dynamicViewports.resize(std::max(size_t(firstViewport + viewportCount), cb_state->dynamicViewports.size()));
2343 for (size_t i = 0; i < viewportCount; ++i) {
2344 cb_state->dynamicViewports[firstViewport + i] = pViewports[i];
2345 }
locke-lunargd556cc32019-09-17 01:21:23 -06002346}
2347
2348void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
2349 uint32_t exclusiveScissorCount,
2350 const VkRect2D *pExclusiveScissors) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002351 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002352 cb_state->RecordStateCmd(CMD_SETEXCLUSIVESCISSORNV, CBSTATUS_EXCLUSIVE_SCISSOR_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002353 // TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
2354 // cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
locke-lunargd556cc32019-09-17 01:21:23 -06002355}
2356
2357void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
2358 VkImageLayout imageLayout) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002359 if (disabled[command_buffer_state]) return;
2360
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002361 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002362 cb_state->RecordCmd(CMD_BINDSHADINGRATEIMAGENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002363
2364 if (imageView != VK_NULL_HANDLE) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002365 auto view_state = Get<IMAGE_VIEW_STATE>(imageView);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002366 cb_state->AddChild(view_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002367 }
2368}
2369
2370void ValidationStateTracker::PreCallRecordCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2371 uint32_t viewportCount,
2372 const VkShadingRatePaletteNV *pShadingRatePalettes) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002373 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002374 cb_state->RecordStateCmd(CMD_SETVIEWPORTSHADINGRATEPALETTENV, CBSTATUS_SHADING_RATE_PALETTE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002375 // TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
2376 // cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
locke-lunargd556cc32019-09-17 01:21:23 -06002377}
2378
2379void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
2380 const VkAccelerationStructureCreateInfoNV *pCreateInfo,
2381 const VkAllocationCallbacks *pAllocator,
2382 VkAccelerationStructureNV *pAccelerationStructure,
2383 VkResult result) {
2384 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002385 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002386
2387 // Query the requirements in case the application doesn't (to avoid bind/validation time query)
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002388 auto as_memory_requirements_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002389 as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002390 as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002391 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &as_memory_requirements_info, &as_state->memory_requirements);
2392
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002393 auto scratch_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002394 scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002395 scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002396 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &scratch_memory_req_info,
2397 &as_state->build_scratch_memory_requirements);
2398
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002399 auto update_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002400 update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002401 update_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002402 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
2403 &as_state->update_scratch_memory_requirements);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002404 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002405 Add(std::move(as_state));
locke-lunargd556cc32019-09-17 01:21:23 -06002406}
2407
Jeff Bolz95176d02020-04-01 00:36:16 -05002408void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
2409 const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
2410 const VkAllocationCallbacks *pAllocator,
2411 VkAccelerationStructureKHR *pAccelerationStructure,
2412 VkResult result) {
2413 if (VK_SUCCESS != result) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002414 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE_KHR>(*pAccelerationStructure, pCreateInfo);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002415 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002416 Add(std::move(as_state));
Jeff Bolz95176d02020-04-01 00:36:16 -05002417}
2418
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002419void ValidationStateTracker::PostCallRecordBuildAccelerationStructuresKHR(
2420 VkDevice device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount,
2421 const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2422 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos, VkResult result) {
2423 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002424 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002425 if (dst_as_state != nullptr) {
2426 dst_as_state->Build(&pInfos[i]);
2427 }
2428 }
2429}
2430
sourav parmarcd5fb182020-07-17 12:58:44 -07002431void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresKHR(
2432 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2433 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002434 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002435 if (!cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002436 return;
2437 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002438 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002439 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002440 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002441 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002442 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002443 if (!disabled[command_buffer_state]) {
2444 cb_state->AddChild(dst_as_state);
2445 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002446 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002447 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002448 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002449 if (src_as_state != nullptr) {
2450 cb_state->AddChild(src_as_state);
2451 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002452 }
2453 }
2454 cb_state->hasBuildAccelerationStructureCmd = true;
2455}
2456
2457void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresIndirectKHR(
2458 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2459 const VkDeviceAddress *pIndirectDeviceAddresses, const uint32_t *pIndirectStrides,
2460 const uint32_t *const *ppMaxPrimitiveCounts) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002461 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2462 if (!cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002463 return;
2464 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002465 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESINDIRECTKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002466 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002467 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002468 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002469 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002470 if (!disabled[command_buffer_state]) {
2471 cb_state->AddChild(dst_as_state);
2472 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002473 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002474 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002475 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002476 if (src_as_state != nullptr) {
2477 cb_state->AddChild(src_as_state);
2478 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002479 }
2480 }
2481 cb_state->hasBuildAccelerationStructureCmd = true;
2482}
locke-lunargd556cc32019-09-17 01:21:23 -06002483void ValidationStateTracker::PostCallRecordGetAccelerationStructureMemoryRequirementsNV(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002484 VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV *pInfo, VkMemoryRequirements2 *pMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002485 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(pInfo->accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002486 if (as_state != nullptr) {
2487 if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV) {
2488 as_state->memory_requirements = *pMemoryRequirements;
2489 as_state->memory_requirements_checked = true;
2490 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV) {
2491 as_state->build_scratch_memory_requirements = *pMemoryRequirements;
2492 as_state->build_scratch_memory_requirements_checked = true;
2493 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV) {
2494 as_state->update_scratch_memory_requirements = *pMemoryRequirements;
2495 as_state->update_scratch_memory_requirements_checked = true;
2496 }
2497 }
2498}
2499
sourav parmarcd5fb182020-07-17 12:58:44 -07002500void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
2501 VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002502 if (VK_SUCCESS != result) return;
2503 for (uint32_t i = 0; i < bindInfoCount; i++) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002504 const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
locke-lunargd556cc32019-09-17 01:21:23 -06002505
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002506 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(info.accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002507 if (as_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002508 // Track objects tied to memory
Jeremy Gebben9f537102021-10-05 16:37:12 -06002509 auto mem_state = Get<DEVICE_MEMORY_STATE>(info.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002510 if (mem_state) {
2511 as_state->SetMemBinding(mem_state, info.memoryOffset);
2512 }
locke-lunargd556cc32019-09-17 01:21:23 -06002513
2514 // GPU validation of top level acceleration structure building needs acceleration structure handles.
Jeff Bolz95176d02020-04-01 00:36:16 -05002515 // XXX TODO: Query device address for KHR extension
sourav parmarcd5fb182020-07-17 12:58:44 -07002516 if (enabled[gpu_validation]) {
locke-lunargd556cc32019-09-17 01:21:23 -06002517 DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
2518 }
2519 }
2520 }
2521}
2522
2523void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
2524 VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
2525 VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002526 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2527 if (!cb_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002528 return;
2529 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002530 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002531
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002532 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
locke-lunargd556cc32019-09-17 01:21:23 -06002533 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002534 dst_as_state->Build(pInfo);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002535 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002536 cb_state->AddChild(dst_as_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002537 }
locke-lunargd556cc32019-09-17 01:21:23 -06002538 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002539 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002540 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002541 if (src_as_state != nullptr) {
2542 cb_state->AddChild(src_as_state);
2543 }
locke-lunargd556cc32019-09-17 01:21:23 -06002544 }
2545 cb_state->hasBuildAccelerationStructureCmd = true;
2546}
2547
2548void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureNV(VkCommandBuffer commandBuffer,
2549 VkAccelerationStructureNV dst,
2550 VkAccelerationStructureNV src,
2551 VkCopyAccelerationStructureModeNV mode) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002552 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002553 if (cb_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002554 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
2555 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002556 if (!disabled[command_buffer_state]) {
2557 cb_state->RecordTransferCmd(CMD_COPYACCELERATIONSTRUCTURENV, src_as_state, dst_as_state);
2558 }
locke-lunargd556cc32019-09-17 01:21:23 -06002559 if (dst_as_state != nullptr && src_as_state != nullptr) {
2560 dst_as_state->built = true;
2561 dst_as_state->build_info = src_as_state->build_info;
locke-lunargd556cc32019-09-17 01:21:23 -06002562 }
2563 }
2564}
2565
Jeff Bolz95176d02020-04-01 00:36:16 -05002566void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
2567 VkAccelerationStructureKHR accelerationStructure,
2568 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002569 Destroy<ACCELERATION_STRUCTURE_STATE_KHR>(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002570}
2571
Jeff Bolz95176d02020-04-01 00:36:16 -05002572void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
2573 VkAccelerationStructureNV accelerationStructure,
2574 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002575 Destroy<ACCELERATION_STRUCTURE_STATE>(accelerationStructure);
Jeff Bolz95176d02020-04-01 00:36:16 -05002576}
2577
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002578void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2579 uint32_t viewportCount,
2580 const VkViewportWScalingNV *pViewportWScalings) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002581 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002582 cb_state->RecordStateCmd(CMD_SETVIEWPORTWSCALINGNV, CBSTATUS_VIEWPORT_W_SCALING_SET);
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002583}
2584
locke-lunargd556cc32019-09-17 01:21:23 -06002585void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002586 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002587 cb_state->RecordStateCmd(CMD_SETLINEWIDTH, CBSTATUS_LINE_WIDTH_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002588}
2589
2590void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
2591 uint16_t lineStipplePattern) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002592 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002593 cb_state->RecordStateCmd(CMD_SETLINESTIPPLEEXT, CBSTATUS_LINE_STIPPLE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002594}
2595
2596void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
2597 float depthBiasClamp, float depthBiasSlopeFactor) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002598 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002599 cb_state->RecordStateCmd(CMD_SETDEPTHBIAS, CBSTATUS_DEPTH_BIAS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002600}
2601
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002602void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
2603 const VkRect2D *pScissors) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002604 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002605 cb_state->RecordStateCmd(CMD_SETSCISSOR, CBSTATUS_SCISSOR_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002606 uint32_t bits = ((1u << scissorCount) - 1u) << firstScissor;
2607 cb_state->scissorMask |= bits;
2608 cb_state->trashedScissorMask &= ~bits;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002609}
2610
locke-lunargd556cc32019-09-17 01:21:23 -06002611void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002612 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002613 cb_state->RecordStateCmd(CMD_SETBLENDCONSTANTS, CBSTATUS_BLEND_CONSTANTS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002614}
2615
2616void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
2617 float maxDepthBounds) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002618 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002619 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDS, CBSTATUS_DEPTH_BOUNDS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002620}
2621
2622void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2623 uint32_t compareMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002624 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002625 cb_state->RecordStateCmd(CMD_SETSTENCILCOMPAREMASK, CBSTATUS_STENCIL_READ_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002626}
2627
2628void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2629 uint32_t writeMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002630 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002631 cb_state->RecordStateCmd(CMD_SETSTENCILWRITEMASK, CBSTATUS_STENCIL_WRITE_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002632}
2633
2634void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2635 uint32_t reference) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002636 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002637 cb_state->RecordStateCmd(CMD_SETSTENCILREFERENCE, CBSTATUS_STENCIL_REFERENCE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002638}
2639
locke-lunargd556cc32019-09-17 01:21:23 -06002640// Update the bound state for the bind point, including the effects of incompatible pipeline layouts
2641void ValidationStateTracker::PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2642 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2643 uint32_t firstSet, uint32_t setCount,
2644 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2645 const uint32_t *pDynamicOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002646 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002647 cb_state->RecordCmd(CMD_BINDDESCRIPTORSETS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002648 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebben4d51c552022-01-06 21:27:15 -07002649 std::shared_ptr<cvdescriptorset::DescriptorSet> no_push_desc;
locke-lunargd556cc32019-09-17 01:21:23 -06002650
Jeremy Gebben4d51c552022-01-06 21:27:15 -07002651 cb_state->UpdateLastBoundDescriptorSets(pipelineBindPoint, pipeline_layout.get(), firstSet, setCount, pDescriptorSets,
2652 no_push_desc, dynamicOffsetCount, pDynamicOffsets);
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002653}
2654
locke-lunargd556cc32019-09-17 01:21:23 -06002655void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
2656 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2657 uint32_t set, uint32_t descriptorWriteCount,
2658 const VkWriteDescriptorSet *pDescriptorWrites) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002659 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002660 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002661 cb_state->PushDescriptorSetState(pipelineBindPoint, pipeline_layout.get(), set, descriptorWriteCount, pDescriptorWrites);
locke-lunargd556cc32019-09-17 01:21:23 -06002662}
2663
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002664void ValidationStateTracker::PostCallRecordCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2665 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2666 const void *pValues) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002667 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2668 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002669 cb_state->RecordCmd(CMD_PUSHCONSTANTS);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002670 auto layout_state = Get<PIPELINE_LAYOUT_STATE>(layout);
2671 cb_state->ResetPushConstantDataIfIncompatible(layout_state.get());
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002672
2673 auto &push_constant_data = cb_state->push_constant_data;
2674 assert((offset + size) <= static_cast<uint32_t>(push_constant_data.size()));
2675 std::memcpy(push_constant_data.data() + offset, pValues, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002676 cb_state->push_constant_pipeline_layout_set = layout;
2677
2678 auto flags = stageFlags;
2679 uint32_t bit_shift = 0;
2680 while (flags) {
2681 if (flags & 1) {
2682 VkShaderStageFlagBits flag = static_cast<VkShaderStageFlagBits>(1 << bit_shift);
2683 const auto it = cb_state->push_constant_data_update.find(flag);
2684
2685 if (it != cb_state->push_constant_data_update.end()) {
locke-lunarg3d8b8f32020-10-26 17:04:16 -06002686 std::memset(it->second.data() + offset, PC_Byte_Updated, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002687 }
2688 }
2689 flags = flags >> 1;
2690 ++bit_shift;
2691 }
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002692 }
2693}
2694
locke-lunargd556cc32019-09-17 01:21:23 -06002695void ValidationStateTracker::PreCallRecordCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2696 VkIndexType indexType) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002697 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002698
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002699 cb_state->RecordStateCmd(CMD_BINDINDEXBUFFER, CBSTATUS_INDEX_BUFFER_BOUND);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002700 cb_state->index_buffer_binding.buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002701 cb_state->index_buffer_binding.size = cb_state->index_buffer_binding.buffer_state->createInfo.size;
locke-lunargd556cc32019-09-17 01:21:23 -06002702 cb_state->index_buffer_binding.offset = offset;
2703 cb_state->index_buffer_binding.index_type = indexType;
2704 // Add binding for this index buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002705 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002706 cb_state->AddChild(cb_state->index_buffer_binding.buffer_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002707 }
locke-lunargd556cc32019-09-17 01:21:23 -06002708}
2709
2710void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2711 uint32_t bindingCount, const VkBuffer *pBuffers,
2712 const VkDeviceSize *pOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002713 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002714 cb_state->RecordCmd(CMD_BINDVERTEXBUFFERS);
locke-lunargd556cc32019-09-17 01:21:23 -06002715
2716 uint32_t end = firstBinding + bindingCount;
2717 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
2718 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
2719 }
2720
2721 for (uint32_t i = 0; i < bindingCount; ++i) {
2722 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06002723 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002724 vertex_buffer_binding.offset = pOffsets[i];
Piers Daniell39842ee2020-07-10 16:42:33 -06002725 vertex_buffer_binding.size = VK_WHOLE_SIZE;
2726 vertex_buffer_binding.stride = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06002727 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002728 if (pBuffers[i] && !disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002729 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Jeff Bolz165818a2020-05-08 11:19:03 -05002730 }
locke-lunargd556cc32019-09-17 01:21:23 -06002731 }
2732}
2733
2734void ValidationStateTracker::PostCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
2735 VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002736 if (disabled[command_buffer_state]) return;
2737
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002738 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002739 cb_state->RecordTransferCmd(CMD_UPDATEBUFFER, Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -06002740}
2741
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002742void ValidationStateTracker::PreCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2743 VkPipelineStageFlags stageMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002744 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002745 cb_state->RecordSetEvent(CMD_SETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002746}
2747
2748void ValidationStateTracker::PreCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2749 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002750 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002751 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
2752
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002753 cb_state->RecordSetEvent(CMD_SETEVENT2KHR, event, stage_masks.src);
2754 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002755}
2756
Tony-LunarGc43525f2021-11-15 16:12:38 -07002757void ValidationStateTracker::PreCallRecordCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
2758 const VkDependencyInfo* pDependencyInfo) {
2759 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2760 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
2761
2762 cb_state->RecordSetEvent(CMD_SETEVENT2, event, stage_masks.src);
2763 cb_state->RecordBarriers(*pDependencyInfo);
2764}
2765
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002766void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2767 VkPipelineStageFlags stageMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002768 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002769 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002770}
2771
2772void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2773 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002774 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002775 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002776}
2777
Tony-LunarGa2662db2021-11-16 07:26:24 -07002778void ValidationStateTracker::PreCallRecordCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
2779 VkPipelineStageFlags2 stageMask) {
2780 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2781 cb_state->RecordResetEvent(CMD_RESETEVENT2, event, stageMask);
2782}
2783
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002784void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2785 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
2786 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2787 uint32_t bufferMemoryBarrierCount,
2788 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2789 uint32_t imageMemoryBarrierCount,
2790 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002791 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2792 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents, sourceStageMask);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002793 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2794 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002795}
2796
2797void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
2798 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002799 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben79649152021-06-22 14:46:24 -06002800 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002801 const auto &dep_info = pDependencyInfos[i];
2802 auto stage_masks = sync_utils::GetGlobalStageMasks(dep_info);
2803 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, 1, &pEvents[i], stage_masks.src);
2804 cb_state->RecordBarriers(dep_info);
Jeremy Gebben79649152021-06-22 14:46:24 -06002805 }
2806}
2807
Tony-LunarG1364cf52021-11-17 16:10:11 -07002808void ValidationStateTracker::PreCallRecordCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2809 const VkDependencyInfo *pDependencyInfos) {
2810 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2811 for (uint32_t i = 0; i < eventCount; i++) {
2812 const auto &dep_info = pDependencyInfos[i];
2813 auto stage_masks = sync_utils::GetGlobalStageMasks(dep_info);
2814 cb_state->RecordWaitEvents(CMD_WAITEVENTS2, 1, &pEvents[i], stage_masks.src);
2815 cb_state->RecordBarriers(dep_info);
2816 }
2817}
2818
Jeremy Gebben79649152021-06-22 14:46:24 -06002819void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2820 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2821 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2822 uint32_t bufferMemoryBarrierCount,
2823 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2824 uint32_t imageMemoryBarrierCount,
2825 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002826 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002827 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
2828 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2829 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06002830}
2831
2832void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
2833 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002834 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002835 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
2836 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06002837}
2838
Tony-LunarG3f6eceb2021-11-18 14:34:49 -07002839void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2(VkCommandBuffer commandBuffer,
2840 const VkDependencyInfo *pDependencyInfo) {
2841 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2842 cb_state->RecordCmd(CMD_PIPELINEBARRIER2);
2843 cb_state->RecordBarriers(*pDependencyInfo);
2844}
2845
locke-lunargd556cc32019-09-17 01:21:23 -06002846void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
2847 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002848 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002849
locke-lunargd556cc32019-09-17 01:21:23 -06002850 QueryObject query = {queryPool, slot};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002851 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002852 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002853 if (!disabled[query_validation]) {
2854 cb_state->BeginQuery(query);
2855 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002856 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002857 auto pool_state = Get<QUERY_POOL_STATE>(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002858 cb_state->AddChild(pool_state);
2859 }
locke-lunargd556cc32019-09-17 01:21:23 -06002860}
2861
2862void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002863 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002864 QueryObject query_obj = {queryPool, slot};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002865 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002866 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002867 if (!disabled[query_validation]) {
2868 cb_state->EndQuery(query_obj);
2869 }
2870 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002871 auto pool_state = Get<QUERY_POOL_STATE>(query_obj.pool);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002872 cb_state->AddChild(pool_state);
2873 }
locke-lunargd556cc32019-09-17 01:21:23 -06002874}
2875
2876void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2877 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002878 if (disabled[query_validation]) return;
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002879 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002880
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002881 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002882 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02002883
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002884 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002885 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002886 cb_state->AddChild(pool_state);
2887 }
locke-lunargd556cc32019-09-17 01:21:23 -06002888}
2889
2890void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2891 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
2892 VkDeviceSize dstOffset, VkDeviceSize stride,
2893 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002894 if (disabled[query_validation] || disabled[command_buffer_state]) return;
2895
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002896 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002897 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002898 auto dst_buff_state = Get<BUFFER_STATE>(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002899 cb_state->AddChild(dst_buff_state);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002900 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002901 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002902}
2903
2904void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2905 VkQueryPool queryPool, uint32_t slot) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002906 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002907 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002908}
2909
2910void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
2911 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
2912 uint32_t slot) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002913 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002914 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06002915}
2916
Tony-LunarGde9936b2021-11-17 15:34:11 -07002917void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2(VkCommandBuffer commandBuffer, VkPipelineStageFlags2 pipelineStage,
2918 VkQueryPool queryPool, uint32_t slot) {
2919 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2920 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2, pipelineStage, queryPool, slot);
2921}
2922
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002923void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
2924 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
2925 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
2926 if (disabled[query_validation]) return;
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002927 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002928 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002929 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002930 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002931 cb_state->AddChild(pool_state);
2932 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002933 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002934}
2935
locke-lunargd556cc32019-09-17 01:21:23 -06002936void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2937 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
2938 VkResult result) {
2939 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002940
Jeremy Gebben88f58142021-06-01 10:07:52 -06002941 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08002942 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002943 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002944
locke-lunargd556cc32019-09-17 01:21:23 -06002945 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002946 views[i] = Get<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002947 }
2948 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06002949
Jeremy Gebben9f537102021-10-05 16:37:12 -06002950 Add(std::make_shared<FRAMEBUFFER_STATE>(*pFramebuffer, pCreateInfo, Get<RENDER_PASS_STATE>(pCreateInfo->renderPass),
Jeremy Gebben082a9832021-10-28 13:40:11 -06002951 std::move(views)));
locke-lunargd556cc32019-09-17 01:21:23 -06002952}
2953
locke-lunargd556cc32019-09-17 01:21:23 -06002954void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2955 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2956 VkResult result) {
2957 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002958 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002959}
2960
Mike Schuchardt2df08912020-12-15 16:28:09 -08002961void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002962 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2963 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002964 if (VK_SUCCESS != result) return;
2965
Jeremy Gebben082a9832021-10-28 13:40:11 -06002966 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002967}
2968
Mike Schuchardt2df08912020-12-15 16:28:09 -08002969void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002970 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2971 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002972 if (VK_SUCCESS != result) return;
2973
Jeremy Gebben082a9832021-10-28 13:40:11 -06002974 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002975}
2976
locke-lunargd556cc32019-09-17 01:21:23 -06002977void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
2978 const VkRenderPassBeginInfo *pRenderPassBegin,
2979 VkSubpassContents contents) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002980 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002981 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002982}
2983
2984void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
2985 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002986 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002987 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002988 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002989}
2990
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002991void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2992 uint32_t counterBufferCount,
2993 const VkBuffer *pCounterBuffers,
2994 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002995 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002996
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002997 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002998 cb_state->transform_feedback_active = true;
2999}
3000
3001void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
3002 uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
3003 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003004 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003005
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003006 cb_state->RecordCmd(CMD_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003007 cb_state->transform_feedback_active = false;
3008}
3009
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003010void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
3011 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003012 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003013
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003014 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003015 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02003016 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
3017 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003018}
3019
3020void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003021 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003022
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003023 cb_state->RecordCmd(CMD_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003024 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02003025 cb_state->conditional_rendering_inside_render_pass = false;
3026 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003027}
3028
amhagana448ea52021-11-02 14:09:14 -04003029void ValidationStateTracker::RecordCmdEndRenderingRenderPassState(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003030 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04003031 cb_state->activeRenderPass = nullptr;
3032}
3033
3034void ValidationStateTracker::PreCallRecordCmdBeginRenderingKHR(VkCommandBuffer commandBuffer,
3035 const VkRenderingInfoKHR *pRenderingInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003036 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04003037 cb_state->BeginRendering(CMD_BEGINRENDERINGKHR, pRenderingInfo);
3038}
3039
3040void ValidationStateTracker::PreCallRecordCmdEndRenderingKHR(VkCommandBuffer commandBuffer) {
3041 RecordCmdEndRenderingRenderPassState(commandBuffer);
3042}
3043
Tony-LunarG977448c2019-12-02 14:52:02 -07003044void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
3045 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003046 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003047 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003048 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07003049}
3050
locke-lunargd556cc32019-09-17 01:21:23 -06003051void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003052 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003053 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003054}
3055
3056void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003057 const VkSubpassBeginInfo *pSubpassBeginInfo,
3058 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003059 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003060 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003061}
3062
Tony-LunarG977448c2019-12-02 14:52:02 -07003063void ValidationStateTracker::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003064 const VkSubpassBeginInfo *pSubpassBeginInfo,
3065 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003066 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003067 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003068}
3069
3070void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003071 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003072 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06003073}
3074
3075void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003076 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003077 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003078 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06003079}
3080
Tony-LunarG977448c2019-12-02 14:52:02 -07003081void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003082 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003083 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003084 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07003085}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003086
locke-lunargd556cc32019-09-17 01:21:23 -06003087void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
3088 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003089 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003090
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003091 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06003092}
3093
3094void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
3095 VkFlags flags, void **ppData, VkResult result) {
3096 if (VK_SUCCESS != result) return;
3097 RecordMappedMemory(mem, offset, size, ppData);
3098}
3099
3100void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003101 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06003102 if (mem_info) {
3103 mem_info->mapped_range = MemRange();
3104 mem_info->p_driver_data = nullptr;
3105 }
3106}
3107
3108void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003109 auto image_state = Get<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06003110 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06003111 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
3112 // See: VUID-vkGetImageSubresourceLayout-image-01895
3113 image_state->fragment_encoder =
3114 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07003115 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003116 if (swapchain_info) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003117 auto swapchain = Get<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003118 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003119 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07003120
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003121 if (!swapchain_image.fake_base_address) {
3122 auto size = image_state->fragment_encoder->TotalSize();
3123 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06003124 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003125 // All images bound to this swapchain and index are aliases
3126 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003127 }
3128 } else {
3129 // Track bound memory range information
Jeremy Gebben9f537102021-10-05 16:37:12 -06003130 auto mem_info = Get<DEVICE_MEMORY_STATE>(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06003131 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003132 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06003133 }
locke-lunargd556cc32019-09-17 01:21:23 -06003134 }
locke-lunargd556cc32019-09-17 01:21:23 -06003135 }
3136}
3137
3138void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
3139 VkDeviceSize memoryOffset, VkResult result) {
3140 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06003141 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003142 bind_info.image = image;
3143 bind_info.memory = mem;
3144 bind_info.memoryOffset = memoryOffset;
3145 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003146}
3147
3148void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003149 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003150 if (VK_SUCCESS != result) return;
3151 for (uint32_t i = 0; i < bindInfoCount; i++) {
3152 UpdateBindImageMemoryState(pBindInfos[i]);
3153 }
3154}
3155
3156void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003157 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003158 if (VK_SUCCESS != result) return;
3159 for (uint32_t i = 0; i < bindInfoCount; i++) {
3160 UpdateBindImageMemoryState(pBindInfos[i]);
3161 }
3162}
3163
3164void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003165 auto event_state = Get<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06003166 if (event_state) {
3167 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
3168 }
locke-lunargd556cc32019-09-17 01:21:23 -06003169}
3170
3171void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
3172 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
3173 VkResult result) {
3174 if (VK_SUCCESS != result) return;
3175 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
3176 pImportSemaphoreFdInfo->flags);
3177}
3178
3179void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003180 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003181 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07003182 if (semaphore_state) {
3183 semaphore_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06003184 }
3185}
3186
3187#ifdef VK_USE_PLATFORM_WIN32_KHR
3188void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
3189 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
3190 if (VK_SUCCESS != result) return;
3191 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
3192 pImportSemaphoreWin32HandleInfo->flags);
3193}
3194
3195void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
3196 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3197 HANDLE *pHandle, VkResult result) {
3198 if (VK_SUCCESS != result) return;
3199 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
3200}
3201
3202void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
3203 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
3204 if (VK_SUCCESS != result) return;
3205 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
3206 pImportFenceWin32HandleInfo->flags);
3207}
3208
3209void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
3210 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3211 HANDLE *pHandle, VkResult result) {
3212 if (VK_SUCCESS != result) return;
3213 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
3214}
3215#endif
3216
3217void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
3218 VkResult result) {
3219 if (VK_SUCCESS != result) return;
3220 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
3221}
3222
Mike Schuchardt2df08912020-12-15 16:28:09 -08003223void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
3224 VkFenceImportFlags flags) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003225 auto fence_node = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003226
3227 if (fence_node) {
3228 fence_node->Import(handle_type, flags);
locke-lunargd556cc32019-09-17 01:21:23 -06003229 }
3230}
3231
3232void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
3233 VkResult result) {
3234 if (VK_SUCCESS != result) return;
3235 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
3236}
3237
Mike Schuchardt2df08912020-12-15 16:28:09 -08003238void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003239 auto fence_state = Get<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06003240 if (fence_state) {
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003241 fence_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06003242 }
3243}
3244
3245void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3246 VkResult result) {
3247 if (VK_SUCCESS != result) return;
3248 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3249}
3250
3251void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3252 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3253 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003254 Add(std::make_shared<EVENT_STATE>(*pEvent, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003255}
3256
3257void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003258 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003259 SWAPCHAIN_NODE *old_swapchain_state) {
3260 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003261 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003262 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003263 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003264 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3265 surface_state->AddParent(swapchain.get());
3266 surface_state->swapchain = swapchain.get();
3267 swapchain->surface = std::move(surface_state);
Jeremy Gebben082a9832021-10-28 13:40:11 -06003268 Add(std::move(swapchain));
locke-lunargd556cc32019-09-17 01:21:23 -06003269 } else {
3270 surface_state->swapchain = nullptr;
3271 }
3272 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003273 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003274 if (old_swapchain_state) {
3275 old_swapchain_state->retired = true;
3276 }
3277 return;
3278}
3279
3280void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3281 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3282 VkResult result) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003283 auto surface_state = Get<SURFACE_STATE>(pCreateInfo->surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003284 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfo->oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003285 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003286}
3287
3288void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3289 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003290 Destroy<SWAPCHAIN_NODE>(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003291}
3292
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003293void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3294 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3295 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3296 VkResult result) {
3297 if (VK_SUCCESS != result) return;
3298 if (!pMode) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003299 Add(std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice));
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003300}
3301
locke-lunargd556cc32019-09-17 01:21:23 -06003302void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003303 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06003304 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3305 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003306 auto semaphore_state = Get<SEMAPHORE_STATE>(pPresentInfo->pWaitSemaphores[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003307 if (semaphore_state) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003308 semaphore_state->EnqueuePresent(queue_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003309 }
3310 }
3311
Tony-LunarG6f887e52021-07-27 11:23:14 -06003312 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003313 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3314 // 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
3315 // confused itself just as much.
3316 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3317 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3318 // Mark the image as having been released to the WSI
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003319 auto swapchain_data = Get<SWAPCHAIN_NODE>(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003320 if (swapchain_data) {
3321 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003322 if (present_id_info) {
3323 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3324 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3325 }
3326 }
locke-lunargd556cc32019-09-17 01:21:23 -06003327 }
3328 }
locke-lunargd556cc32019-09-17 01:21:23 -06003329}
3330
3331void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3332 const VkSwapchainCreateInfoKHR *pCreateInfos,
3333 const VkAllocationCallbacks *pAllocator,
3334 VkSwapchainKHR *pSwapchains, VkResult result) {
3335 if (pCreateInfos) {
3336 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003337 auto surface_state = Get<SURFACE_STATE>(pCreateInfos[i].surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003338 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfos[i].oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003339 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state),
3340 old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003341 }
3342 }
3343}
3344
3345void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3346 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003347 auto fence_state = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003348 if (fence_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003349 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3350 // import
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003351 fence_state->EnqueueSignal(nullptr, 0);
locke-lunargd556cc32019-09-17 01:21:23 -06003352 }
3353
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003354 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07003355 if (semaphore_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003356 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3357 // temporary import
Jeremy Gebben15332642021-12-15 19:33:15 -07003358 semaphore_state->EnqueueAcquire();
locke-lunargd556cc32019-09-17 01:21:23 -06003359 }
3360
3361 // Mark the image as acquired.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003362 auto swapchain_data = Get<SWAPCHAIN_NODE>(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003363 if (swapchain_data) {
3364 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003365 }
3366}
3367
3368void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3369 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3370 VkResult result) {
3371 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3372 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3373}
3374
3375void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3376 uint32_t *pImageIndex, VkResult result) {
3377 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3378 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3379 pAcquireInfo->fence, pImageIndex);
3380}
3381
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003382std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3383 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3384}
3385
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003386void ValidationStateTracker::PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
3387 const VkAllocationCallbacks *pAllocator, VkInstance *pInstance,
3388 VkResult result) {
3389 if (result != VK_SUCCESS) {
3390 return;
3391 }
Jeremy Gebben404f6ac2021-10-28 12:33:28 -06003392 instance_state = this;
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003393 uint32_t count = 0;
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003394 // this can fail if the allocator fails
3395 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, nullptr);
3396 if (result != VK_SUCCESS) {
3397 return;
3398 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003399 std::vector<VkPhysicalDevice> physdev_handles(count);
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003400 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, physdev_handles.data());
3401 if (result != VK_SUCCESS) {
3402 return;
3403 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003404
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003405 for (auto physdev : physdev_handles) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003406 Add(CreatePhysicalDeviceState(physdev));
locke-lunargd556cc32019-09-17 01:21:23 -06003407 }
3408}
3409
3410// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003411static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003412 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003413}
3414
3415void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3416 uint32_t *pQueueFamilyPropertyCount,
3417 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003418 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3419 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003420 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003421}
3422
3423void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003424 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003425 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3426 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003427 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003428}
3429
3430void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003431 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003432 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3433 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003434 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003435}
3436void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3437 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003438 Destroy<SURFACE_STATE>(surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003439}
3440
Jeremy Gebben082a9832021-10-28 13:40:11 -06003441void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) { Add(std::make_shared<SURFACE_STATE>(*pSurface)); }
locke-lunargd556cc32019-09-17 01:21:23 -06003442
3443void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3444 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3445 const VkAllocationCallbacks *pAllocator,
3446 VkSurfaceKHR *pSurface, VkResult result) {
3447 if (VK_SUCCESS != result) return;
3448 RecordVulkanSurface(pSurface);
3449}
3450
3451#ifdef VK_USE_PLATFORM_ANDROID_KHR
3452void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3453 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3454 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3455 VkResult result) {
3456 if (VK_SUCCESS != result) return;
3457 RecordVulkanSurface(pSurface);
3458}
3459#endif // VK_USE_PLATFORM_ANDROID_KHR
3460
3461#ifdef VK_USE_PLATFORM_IOS_MVK
3462void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3463 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3464 VkResult result) {
3465 if (VK_SUCCESS != result) return;
3466 RecordVulkanSurface(pSurface);
3467}
3468#endif // VK_USE_PLATFORM_IOS_MVK
3469
3470#ifdef VK_USE_PLATFORM_MACOS_MVK
3471void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3472 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3473 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3474 VkResult result) {
3475 if (VK_SUCCESS != result) return;
3476 RecordVulkanSurface(pSurface);
3477}
3478#endif // VK_USE_PLATFORM_MACOS_MVK
3479
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003480#ifdef VK_USE_PLATFORM_METAL_EXT
3481void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3482 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3483 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3484 VkResult result) {
3485 if (VK_SUCCESS != result) return;
3486 RecordVulkanSurface(pSurface);
3487}
3488#endif // VK_USE_PLATFORM_METAL_EXT
3489
locke-lunargd556cc32019-09-17 01:21:23 -06003490#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3491void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3492 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3493 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3494 VkResult result) {
3495 if (VK_SUCCESS != result) return;
3496 RecordVulkanSurface(pSurface);
3497}
3498#endif // VK_USE_PLATFORM_WAYLAND_KHR
3499
3500#ifdef VK_USE_PLATFORM_WIN32_KHR
3501void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3502 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
3503 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3504 VkResult result) {
3505 if (VK_SUCCESS != result) return;
3506 RecordVulkanSurface(pSurface);
3507}
3508#endif // VK_USE_PLATFORM_WIN32_KHR
3509
3510#ifdef VK_USE_PLATFORM_XCB_KHR
3511void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
3512 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3513 VkResult result) {
3514 if (VK_SUCCESS != result) return;
3515 RecordVulkanSurface(pSurface);
3516}
3517#endif // VK_USE_PLATFORM_XCB_KHR
3518
3519#ifdef VK_USE_PLATFORM_XLIB_KHR
3520void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
3521 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3522 VkResult result) {
3523 if (VK_SUCCESS != result) return;
3524 RecordVulkanSurface(pSurface);
3525}
3526#endif // VK_USE_PLATFORM_XLIB_KHR
3527
Niklas Haas8b84af12020-04-19 22:20:11 +02003528void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3529 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3530 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3531 VkResult result) {
3532 if (VK_SUCCESS != result) return;
3533 RecordVulkanSurface(pSurface);
3534}
3535
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003536void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
3537 VkSurfaceKHR surface,
3538 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities,
3539 VkResult result) {
3540 if (VK_SUCCESS != result) return;
3541 auto surface_state = Get<SURFACE_STATE>(surface);
3542 surface_state->SetCapabilities(physicalDevice, *pSurfaceCapabilities);
3543}
3544
3545void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
3546 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3547 VkSurfaceCapabilities2KHR *pSurfaceCapabilities, VkResult result) {
3548 if (VK_SUCCESS != result) return;
3549 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3550 surface_state->SetCapabilities(physicalDevice, pSurfaceCapabilities->surfaceCapabilities);
3551}
3552
3553void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice,
3554 VkSurfaceKHR surface,
3555 VkSurfaceCapabilities2EXT *pSurfaceCapabilities,
3556 VkResult result) {
3557 auto surface_state = Get<SURFACE_STATE>(surface);
3558 VkSurfaceCapabilitiesKHR caps{
3559 pSurfaceCapabilities->minImageCount, pSurfaceCapabilities->maxImageCount,
3560 pSurfaceCapabilities->currentExtent, pSurfaceCapabilities->minImageExtent,
3561 pSurfaceCapabilities->maxImageExtent, pSurfaceCapabilities->maxImageArrayLayers,
3562 pSurfaceCapabilities->supportedTransforms, pSurfaceCapabilities->currentTransform,
3563 pSurfaceCapabilities->supportedCompositeAlpha, pSurfaceCapabilities->supportedUsageFlags,
3564 };
3565 surface_state->SetCapabilities(physicalDevice, caps);
3566}
3567
locke-lunargd556cc32019-09-17 01:21:23 -06003568void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3569 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3570 VkBool32 *pSupported, VkResult result) {
3571 if (VK_SUCCESS != result) return;
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003572 auto surface_state = Get<SURFACE_STATE>(surface);
3573 surface_state->SetQueueSupport(physicalDevice, queueFamilyIndex, (*pSupported == VK_TRUE));
3574}
3575
3576void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
3577 VkSurfaceKHR surface,
3578 uint32_t *pPresentModeCount,
3579 VkPresentModeKHR *pPresentModes,
3580 VkResult result) {
3581 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3582
3583 if (pPresentModes) {
3584 auto surface_state = Get<SURFACE_STATE>(surface);
3585 surface_state->SetPresentModes(physicalDevice,
3586 std::vector<VkPresentModeKHR>(pPresentModes, pPresentModes + *pPresentModeCount));
3587 }
3588}
3589
3590void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
3591 uint32_t *pSurfaceFormatCount,
3592 VkSurfaceFormatKHR *pSurfaceFormats,
3593 VkResult result) {
3594 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3595
3596 if (pSurfaceFormats) {
3597 auto surface_state = Get<SURFACE_STATE>(surface);
3598 surface_state->SetFormats(physicalDevice,
3599 std::vector<VkSurfaceFormatKHR>(pSurfaceFormats, pSurfaceFormats + *pSurfaceFormatCount));
3600 }
3601}
3602
3603void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
3604 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3605 uint32_t *pSurfaceFormatCount,
3606 VkSurfaceFormat2KHR *pSurfaceFormats,
3607 VkResult result) {
3608 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3609
3610 if (pSurfaceFormats) {
3611 std::vector<VkSurfaceFormatKHR> fmts(*pSurfaceFormatCount);
3612 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3613 for (uint32_t i = 0; i < *pSurfaceFormatCount; i++) {
3614 fmts[i] = pSurfaceFormats[i].surfaceFormat;
3615 }
3616 surface_state->SetFormats(physicalDevice, std::move(fmts));
3617 }
locke-lunargd556cc32019-09-17 01:21:23 -06003618}
3619
locke-lunargd556cc32019-09-17 01:21:23 -06003620void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3621 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003622 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003623 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003624 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3625}
3626
3627void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003628 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003629 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003630 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3631}
3632
3633void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3634 const VkDebugUtilsLabelEXT *pLabelInfo) {
3635 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3636
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003637 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003638 cb_state->RecordCmd(CMD_INSERTDEBUGUTILSLABELEXT);
3639 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003640 cb_state->debug_label = LoggingLabel(pLabelInfo);
3641}
3642
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003643void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3644 uint32_t queueFamilyIndex,
3645 uint32_t *pCounterCount,
3646 VkPerformanceCounterKHR *pCounters) {
3647 if (NULL == pCounters) return;
3648
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003649 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3650 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003651
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003652 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3653 queue_family_counters->counters.resize(*pCounterCount);
3654 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003655
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003656 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003657}
3658
3659void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3660 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3661 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3662 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3663 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3664}
3665
3666void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3667 VkResult result) {
3668 if (result == VK_SUCCESS) performance_lock_acquired = true;
3669}
3670
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003671void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3672 performance_lock_acquired = false;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06003673 for (auto &cmd_buffer : command_buffer_map_.snapshot()) {
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003674 cmd_buffer.second->performance_lock_released = true;
3675 }
3676}
3677
locke-lunargd556cc32019-09-17 01:21:23 -06003678void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003679 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003680 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003681 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003682}
3683
3684void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003685 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003686 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003687 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003688}
3689
Mike Schuchardt2df08912020-12-15 16:28:09 -08003690void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3691 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003692 Add(std::make_shared<UPDATE_TEMPLATE_STATE>(*pDescriptorUpdateTemplate, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06003693}
3694
Mike Schuchardt2df08912020-12-15 16:28:09 -08003695void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3696 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3697 const VkAllocationCallbacks *pAllocator,
3698 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3699 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003700 if (VK_SUCCESS != result) return;
3701 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3702}
3703
3704void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003705 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3706 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003707 if (VK_SUCCESS != result) return;
3708 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3709}
3710
3711void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003712 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003713 const void *pData) {
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003714 auto const template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
3715 assert(template_state);
3716 if (template_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003717 // TODO: Record template push descriptor updates
3718 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003719 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state.get(), pData);
locke-lunargd556cc32019-09-17 01:21:23 -06003720 }
3721 }
3722}
3723
3724void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3725 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3726 const void *pData) {
3727 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3728}
3729
3730void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003731 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003732 const void *pData) {
3733 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3734}
3735
Mike Schuchardt2df08912020-12-15 16:28:09 -08003736void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3737 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3738 VkPipelineLayout layout, uint32_t set,
3739 const void *pData) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003740 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003741
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003742 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003743 const auto template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003744 if (template_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003745 auto layout_data = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003746 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003747 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003748 // Decode the template into a set of write updates
Jeremy Gebben9f537102021-10-05 16:37:12 -06003749 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state.get(), pData,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003750 dsl->GetDescriptorSetLayout());
Jeremy Gebben9f537102021-10-05 16:37:12 -06003751 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data.get(), set,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003752 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3753 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003754 }
3755}
3756
3757void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3758 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003759 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003760 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003761 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003762 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003763 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003764 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003765 }
3766}
3767
3768void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3769 uint32_t *pPropertyCount,
3770 VkDisplayPlanePropertiesKHR *pProperties,
3771 VkResult result) {
3772 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3773 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3774}
3775
3776void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3777 uint32_t *pPropertyCount,
3778 VkDisplayPlaneProperties2KHR *pProperties,
3779 VkResult result) {
3780 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3781 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3782}
3783
3784void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3785 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3786 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003787 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003788 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003789 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003790}
3791
3792void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3793 uint32_t query, uint32_t index) {
3794 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003795 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003796 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003797 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003798}
3799
3800void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3801 VkSamplerYcbcrConversion ycbcr_conversion) {
Lionel Landwerlin21719f62021-12-09 11:40:09 +02003802 VkFormatFeatureFlags2KHR format_features = 0;
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003803
3804 if (create_info->format != VK_FORMAT_UNDEFINED) {
3805 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07003806 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003807 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
3808 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003809 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003810
Jeremy Gebben082a9832021-10-28 13:40:11 -06003811 Add(std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features));
locke-lunargd556cc32019-09-17 01:21:23 -06003812}
3813
3814void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
3815 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3816 const VkAllocationCallbacks *pAllocator,
3817 VkSamplerYcbcrConversion *pYcbcrConversion,
3818 VkResult result) {
3819 if (VK_SUCCESS != result) return;
3820 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3821}
3822
3823void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(VkDevice device,
3824 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3825 const VkAllocationCallbacks *pAllocator,
3826 VkSamplerYcbcrConversion *pYcbcrConversion,
3827 VkResult result) {
3828 if (VK_SUCCESS != result) return;
3829 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3830}
3831
3832void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
3833 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003834 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003835}
3836
3837void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
3838 VkSamplerYcbcrConversion ycbcrConversion,
3839 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003840 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003841}
3842
Tony-LunarG977448c2019-12-02 14:52:02 -07003843void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3844 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06003845 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07003846 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003847
3848 // Do nothing if the query pool has been destroyed.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003849 auto query_pool_state = Get<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06003850 if (!query_pool_state) return;
3851
3852 // Reset the state of existing entries.
locke-lunargd556cc32019-09-17 01:21:23 -06003853 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
3854 for (uint32_t i = 0; i < max_query_count; ++i) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003855 auto query_index = firstQuery + i;
3856 query_pool_state->SetQueryState(query_index, 0, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003857 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003858 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003859 query_pool_state->SetQueryState(query_index, pass_index, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003860 }
3861 }
locke-lunargd556cc32019-09-17 01:21:23 -06003862 }
3863}
3864
Tony-LunarG977448c2019-12-02 14:52:02 -07003865void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3866 uint32_t queryCount) {
3867 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3868}
3869
3870void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3871 uint32_t queryCount) {
3872 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3873}
3874
locke-lunargd556cc32019-09-17 01:21:23 -06003875void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003876 const UPDATE_TEMPLATE_STATE *template_state,
3877 const void *pData) {
locke-lunargd556cc32019-09-17 01:21:23 -06003878 // Translate the templated update into a normal update for validation...
3879 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
3880 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
3881 decoded_update.desc_writes.data(), 0, NULL);
3882}
3883
3884// Update the common AllocateDescriptorSetsData
3885void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05003886 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06003887 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003888 auto layout = Get<cvdescriptorset::DescriptorSetLayout>(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003889 if (layout) {
3890 ds_data->layout_nodes[i] = layout;
3891 // Count total descriptors required per type
3892 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
3893 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003894 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
3895 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003896 }
3897 }
3898 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
3899 }
3900}
3901
locke-lunargd556cc32019-09-17 01:21:23 -06003902void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3903 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003904 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003905 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003906}
3907
Tony-LunarG745150c2021-07-02 15:07:31 -06003908void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3909 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
3910 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003911 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003912 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003913}
3914
locke-lunargd556cc32019-09-17 01:21:23 -06003915void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3916 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3917 uint32_t firstInstance) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003918 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003919 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003920}
3921
Tony-LunarG745150c2021-07-02 15:07:31 -06003922void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3923 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
3924 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
3925 const int32_t *pVertexOffset) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003926 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003927 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003928}
3929
locke-lunargd556cc32019-09-17 01:21:23 -06003930void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3931 uint32_t count, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003932 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003933 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003934 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003935 if (!disabled[command_buffer_state]) {
3936 cb_state->AddChild(buffer_state);
3937 }
locke-lunargd556cc32019-09-17 01:21:23 -06003938}
3939
3940void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3941 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003942 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003943 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003944 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003945 if (!disabled[command_buffer_state]) {
3946 cb_state->AddChild(buffer_state);
3947 }
locke-lunargd556cc32019-09-17 01:21:23 -06003948}
3949
3950void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003951 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003952 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06003953}
3954
3955void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3956 VkDeviceSize offset) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003957 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003958 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003959 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003960 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003961 cb_state->AddChild(buffer_state);
3962 }
locke-lunargd556cc32019-09-17 01:21:23 -06003963}
3964
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003965void ValidationStateTracker::PostCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3966 uint32_t, uint32_t) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003967 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003968 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3969}
3970
3971void ValidationStateTracker::PostCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3972 uint32_t, uint32_t) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003973 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003974 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3975}
3976
Tony-LunarG977448c2019-12-02 14:52:02 -07003977void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3978 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07003979 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003980 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003981 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003982 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003983 auto buffer_state = Get<BUFFER_STATE>(buffer);
3984 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003985 cb_state->AddChild(buffer_state);
3986 cb_state->AddChild(count_buffer_state);
3987 }
Tony-LunarG977448c2019-12-02 14:52:02 -07003988}
3989
locke-lunargd556cc32019-09-17 01:21:23 -06003990void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3991 VkDeviceSize offset, VkBuffer countBuffer,
3992 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3993 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003994 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003995 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003996}
3997
3998void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3999 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
4000 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004001 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004002 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07004003}
4004
4005void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4006 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07004007 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004008 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004009 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004010 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004011 auto buffer_state = Get<BUFFER_STATE>(buffer);
4012 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004013 cb_state->AddChild(buffer_state);
4014 cb_state->AddChild(count_buffer_state);
4015 }
locke-lunargd556cc32019-09-17 01:21:23 -06004016}
4017
4018void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
4019 VkDeviceSize offset, VkBuffer countBuffer,
4020 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4021 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004022 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004023 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07004024}
4025
4026void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
4027 VkDeviceSize offset, VkBuffer countBuffer,
4028 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4029 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004030 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004031 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06004032}
4033
4034void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
4035 uint32_t firstTask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004036 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004037 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004038}
4039
4040void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4041 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004042 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004043 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004044 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004045 if (!disabled[command_buffer_state] && buffer_state) {
4046 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06004047 }
4048}
4049
4050void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4051 VkDeviceSize offset, VkBuffer countBuffer,
4052 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4053 uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004054 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004055 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004056 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004057 auto buffer_state = Get<BUFFER_STATE>(buffer);
4058 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004059 if (buffer_state) {
4060 cb_state->AddChild(buffer_state);
4061 }
4062 if (count_buffer_state) {
4063 cb_state->AddChild(count_buffer_state);
4064 }
locke-lunargd556cc32019-09-17 01:21:23 -06004065 }
4066}
4067
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004068void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
4069 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
4070 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
4071 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
4072 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
4073 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
4074 uint32_t width, uint32_t height, uint32_t depth) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004075 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004076 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004077 cb_state->hasTraceRaysCmd = true;
4078}
4079
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004080void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
4081 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4082 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4083 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4084 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
4085 uint32_t height, uint32_t depth) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004086 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004087 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004088 cb_state->hasTraceRaysCmd = true;
4089}
4090
4091void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
4092 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4093 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4094 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4095 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
4096 VkDeviceAddress indirectDeviceAddress) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004097 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004098 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004099 cb_state->hasTraceRaysCmd = true;
4100}
4101
locke-lunargd556cc32019-09-17 01:21:23 -06004102void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
4103 const VkAllocationCallbacks *pAllocator,
4104 VkShaderModule *pShaderModule, VkResult result,
4105 void *csm_state_data) {
4106 if (VK_SUCCESS != result) return;
4107 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
4108
sfricke-samsung45996a42021-09-16 13:45:27 -07004109 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06004110 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05004111 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
4112 csm_state->unique_shader_id)
4113 : std::make_shared<SHADER_MODULE_STATE>();
Jeremy Gebben082a9832021-10-28 13:40:11 -06004114 Add(std::move(new_shader_module));
locke-lunargd556cc32019-09-17 01:21:23 -06004115}
4116
John Zulauf22b0fbe2019-10-15 06:26:16 -06004117void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
4118 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
4119 VkResult result) {
4120 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06004121 auto swapchain_state = Get<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004122
4123 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
4124
4125 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004126 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07004127 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07004128 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06004129
Lionel Landwerlin15ed1f62022-01-12 16:54:05 +02004130 auto format_features = GetImageFormatFeatures(
4131 physical_device, has_format_feature2, IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier), device,
4132 pSwapchainImages[i], swapchain_state->image_create_info.format, swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004133
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06004134 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004135 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004136 if (!swapchain_image.fake_base_address) {
4137 auto size = image_state->fragment_encoder->TotalSize();
4138 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07004139 }
4140
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004141 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004142 swapchain_image.image_state = image_state.get();
Jeremy Gebben082a9832021-10-28 13:40:11 -06004143 Add(std::move(image_state));
John Zulauf22b0fbe2019-10-15 06:26:16 -06004144 }
4145 }
4146
4147 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004148 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
4149 }
4150}
sourav parmar35e7a002020-06-09 17:58:44 -07004151
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02004152void ValidationStateTracker::PostCallRecordCopyAccelerationStructureKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
4153 const VkCopyAccelerationStructureInfoKHR *pInfo,
4154 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004155 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
4156 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02004157 if (dst_as_state != nullptr && src_as_state != nullptr) {
4158 dst_as_state->built = true;
4159 dst_as_state->build_info_khr = src_as_state->build_info_khr;
4160 }
4161}
4162
sourav parmar35e7a002020-06-09 17:58:44 -07004163void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
4164 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004165 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07004166 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004167 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004168 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
4169 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07004170 if (dst_as_state != nullptr && src_as_state != nullptr) {
4171 dst_as_state->built = true;
4172 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004173 if (!disabled[command_buffer_state]) {
4174 cb_state->AddChild(dst_as_state);
4175 cb_state->AddChild(src_as_state);
4176 }
sourav parmar35e7a002020-06-09 17:58:44 -07004177 }
4178 }
4179}
Piers Daniell39842ee2020-07-10 16:42:33 -06004180
4181void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004182 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004183 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004184}
4185
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004186void ValidationStateTracker::PreCallRecordCmdSetCullMode(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
4187 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4188 cb_state->RecordStateCmd(CMD_SETCULLMODE, CBSTATUS_CULL_MODE_SET);
4189}
4190
Piers Daniell39842ee2020-07-10 16:42:33 -06004191void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004192 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004193 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004194}
4195
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004196void ValidationStateTracker::PreCallRecordCmdSetFrontFace(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
4197 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4198 cb_state->RecordStateCmd(CMD_SETFRONTFACE, CBSTATUS_FRONT_FACE_SET);
4199}
4200
Piers Daniell39842ee2020-07-10 16:42:33 -06004201void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
4202 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004203 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004204 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004205 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06004206}
4207
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004208void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopology(VkCommandBuffer commandBuffer,
4209 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004210 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004211 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGY, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
4212 cb_state->primitiveTopology = primitiveTopology;
4213}
4214
4215void ValidationStateTracker::RecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4216 const VkViewport *pViewports, CMD_TYPE cmdType) {
4217 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4218 cb_state->RecordStateCmd(cmdType, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004219 uint32_t bits = (1u << viewportCount) - 1u;
4220 cb_state->viewportWithCountMask |= bits;
4221 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00004222 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004223 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004224
4225 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
4226 for (size_t i = 0; i < viewportCount; ++i) {
4227 cb_state->dynamicViewports[i] = pViewports[i];
4228 }
Piers Daniell39842ee2020-07-10 16:42:33 -06004229}
4230
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004231void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4232 const VkViewport *pViewports) {
4233 RecordCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports, CMD_SETVIEWPORTWITHCOUNTEXT);
4234}
4235
4236void ValidationStateTracker::PreCallRecordCmdSetViewportWithCount(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4237 const VkViewport *pViewports) {
4238 RecordCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports, CMD_SETVIEWPORTWITHCOUNT);
4239}
4240
4241void ValidationStateTracker::RecordCmdSetScissorWithCount(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4242 const VkRect2D *pScissors, CMD_TYPE cmdType) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004243 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004244 cb_state->RecordStateCmd(cmdType, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004245 uint32_t bits = (1u << scissorCount) - 1u;
4246 cb_state->scissorWithCountMask |= bits;
4247 cb_state->trashedScissorMask &= ~bits;
4248 cb_state->scissorWithCountCount = scissorCount;
4249 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06004250}
4251
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004252void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4253 const VkRect2D *pScissors) {
4254 RecordCmdSetScissorWithCount(commandBuffer, scissorCount, pScissors, CMD_SETSCISSORWITHCOUNTEXT);
4255}
4256
4257void ValidationStateTracker::PreCallRecordCmdSetScissorWithCount(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4258 const VkRect2D *pScissors) {
4259 RecordCmdSetScissorWithCount(commandBuffer, scissorCount, pScissors, CMD_SETSCISSORWITHCOUNT);
4260}
4261
4262void ValidationStateTracker::RecordCmdBindVertexBuffers2(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4263 uint32_t bindingCount, const VkBuffer *pBuffers,
4264 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4265 const VkDeviceSize *pStrides, CMD_TYPE cmd_type) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004266 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004267 cb_state->RecordStateCmd(cmd_type, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06004268
4269 uint32_t end = firstBinding + bindingCount;
4270 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
4271 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
4272 }
4273
4274 for (uint32_t i = 0; i < bindingCount; ++i) {
4275 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06004276 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004277 vertex_buffer_binding.offset = pOffsets[i];
4278 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4279 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4280 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004281 if (!disabled[command_buffer_state] && pBuffers[i]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06004282 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Piers Daniell39842ee2020-07-10 16:42:33 -06004283 }
4284 }
4285}
4286
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004287void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4288 uint32_t bindingCount, const VkBuffer *pBuffers,
4289 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4290 const VkDeviceSize *pStrides) {
4291 RecordCmdBindVertexBuffers2(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides,
4292 CMD_BINDVERTEXBUFFERS2EXT);
4293}
4294
4295void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4296 uint32_t bindingCount, const VkBuffer *pBuffers,
4297 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4298 const VkDeviceSize *pStrides) {
4299 RecordCmdBindVertexBuffers2(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides,
4300 CMD_BINDVERTEXBUFFERS2);
4301}
4302
Piers Daniell39842ee2020-07-10 16:42:33 -06004303void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004304 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004305 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004306}
4307
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004308void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnable(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
4309 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4310 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLE, CBSTATUS_DEPTH_TEST_ENABLE_SET);
4311}
4312
Piers Daniell39842ee2020-07-10 16:42:33 -06004313void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004314 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004315 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004316}
4317
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004318void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnable(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
4319 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4320 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLE, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
4321}
4322
Piers Daniell39842ee2020-07-10 16:42:33 -06004323void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004324 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004325 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004326}
4327
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004328void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOp(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
4329 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4330 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOP, CBSTATUS_DEPTH_COMPARE_OP_SET);
4331}
4332
Piers Daniell39842ee2020-07-10 16:42:33 -06004333void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4334 VkBool32 depthBoundsTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004335 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004336 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004337}
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004338
4339void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnable(VkCommandBuffer commandBuffer,
4340 VkBool32 depthBoundsTestEnable) {
4341 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4342 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLE, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
4343}
4344
Piers Daniell39842ee2020-07-10 16:42:33 -06004345void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004346 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004347 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004348}
4349
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004350void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnable(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
4351 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4352 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLE, CBSTATUS_STENCIL_TEST_ENABLE_SET);
4353}
4354
Piers Daniell39842ee2020-07-10 16:42:33 -06004355void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4356 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4357 VkCompareOp compareOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004358 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004359 cb_state->RecordStateCmd(CMD_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004360}
locke-lunarg4189aa22020-10-21 00:23:48 -06004361
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004362void ValidationStateTracker::PreCallRecordCmdSetStencilOp(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4363 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4364 VkCompareOp compareOp) {
4365 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4366 cb_state->RecordStateCmd(CMD_SETSTENCILOP, CBSTATUS_STENCIL_OP_SET);
4367}
4368
locke-lunarg4189aa22020-10-21 00:23:48 -06004369void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4370 uint32_t discardRectangleCount,
4371 const VkRect2D *pDiscardRectangles) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004372 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004373 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004374}
4375
4376void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4377 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004378 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004379 cb_state->RecordStateCmd(CMD_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004380}
4381
4382void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4383 VkCoarseSampleOrderTypeNV sampleOrderType,
4384 uint32_t customSampleOrderCount,
4385 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004386 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004387 cb_state->RecordStateCmd(CMD_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004388}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004389
4390void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004391 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004392 cb_state->RecordStateCmd(CMD_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004393}
4394
4395void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004396 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004397 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004398}
4399
4400void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4401 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004402 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004403 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004404}
4405
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004406void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnable(VkCommandBuffer commandBuffer,
4407 VkBool32 rasterizerDiscardEnable) {
4408 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4409 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLE, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
4410}
4411
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004412void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004413 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004414 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004415}
4416
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004417void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnable(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
4418 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4419 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLE, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
4420}
4421
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004422void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4423 VkBool32 primitiveRestartEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004424 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004425 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004426}
Piers Daniell924cd832021-05-18 13:48:47 -06004427
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004428void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnable(VkCommandBuffer commandBuffer,
4429 VkBool32 primitiveRestartEnable) {
4430 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4431 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLE, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
4432}
4433
Piers Daniell924cd832021-05-18 13:48:47 -06004434void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4435 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4436 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4437 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004438 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004439 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4440
4441 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4442 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4443 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004444 if (pipeline_state->create_info.graphics.pDynamicState) {
4445 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4446 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004447 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4448 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4449 break;
4450 }
4451 }
4452 }
4453 }
4454 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004455}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004456
4457void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004458 auto buffer_state = Get<BUFFER_STATE>(pInfo->buffer);
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004459 if (buffer_state) {
4460 // address is used for GPU-AV and ray tracing buffer validation
4461 buffer_state->deviceAddress = address;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06004462 buffer_address_map_.insert(address, buffer_state.get());
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004463 }
4464}
4465
4466void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4467 VkDeviceAddress address) {
4468 RecordGetBufferDeviceAddress(pInfo, address);
4469}
4470
4471void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4472 VkDeviceAddress address) {
4473 RecordGetBufferDeviceAddress(pInfo, address);
4474}
4475
4476void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4477 VkDeviceAddress address) {
4478 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004479}
4480
4481std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4482 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004483 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004484}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004485
4486std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4487 const VkCommandBufferAllocateInfo *create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06004488 const COMMAND_POOL_STATE *pool) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004489 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4490}