blob: 7cafe95e52630cf9d6e61fd6e67a261ffae632a0 [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
1474void ValidationStateTracker::PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1475 VkFence fence, VkResult result) {
1476 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
1513void ValidationStateTracker::PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1514 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory,
1515 VkResult result) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001516 if (VK_SUCCESS != result) {
1517 return;
locke-lunargd556cc32019-09-17 01:21:23 -06001518 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001519 const auto &memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
1520 const auto &memory_heap = phys_dev_mem_props.memoryHeaps[memory_type.heapIndex];
1521 auto fake_address = fake_memory.Alloc(pAllocateInfo->allocationSize);
1522
1523 layer_data::optional<DedicatedBinding> dedicated_binding;
1524
1525 auto dedicated = LvlFindInChain<VkMemoryDedicatedAllocateInfo>(pAllocateInfo->pNext);
1526 if (dedicated) {
1527 if (dedicated->buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001528 const auto buffer_state = Get<BUFFER_STATE>(dedicated->buffer);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001529 assert(buffer_state);
1530 if (!buffer_state) {
1531 return;
1532 }
1533 dedicated_binding.emplace(dedicated->buffer, buffer_state->createInfo);
1534 } else if (dedicated->image) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001535 const auto image_state = Get<IMAGE_STATE>(dedicated->image);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001536 assert(image_state);
1537 if (!image_state) {
1538 return;
1539 }
1540 dedicated_binding.emplace(dedicated->image, image_state->createInfo);
1541 }
1542 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001543 Add(std::make_shared<DEVICE_MEMORY_STATE>(*pMemory, pAllocateInfo, fake_address, memory_type, memory_heap,
1544 std::move(dedicated_binding), physical_device_count));
locke-lunargd556cc32019-09-17 01:21:23 -06001545 return;
1546}
1547
1548void ValidationStateTracker::PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory mem, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001549 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001550 if (mem_info) {
1551 fake_memory.Free(mem_info->fake_base_address);
1552 }
1553 Destroy<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001554}
1555
1556void ValidationStateTracker::PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
1557 VkFence fence, VkResult result) {
1558 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001559 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06001560
Jeremy Gebben57642982021-09-14 14:14:55 -06001561 uint64_t early_retire_seq = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001562
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001563 for (uint32_t bind_idx = 0; bind_idx < bindInfoCount; ++bind_idx) {
1564 const VkBindSparseInfo &bind_info = pBindInfo[bind_idx];
locke-lunargd556cc32019-09-17 01:21:23 -06001565 // Track objects tied to memory
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001566 for (uint32_t j = 0; j < bind_info.bufferBindCount; j++) {
1567 for (uint32_t k = 0; k < bind_info.pBufferBinds[j].bindCount; k++) {
1568 auto sparse_binding = bind_info.pBufferBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001569 auto buffer_state = Get<BUFFER_STATE>(bind_info.pBufferBinds[j].buffer);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001570 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001571 if (buffer_state && mem_state) {
1572 buffer_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1573 }
locke-lunargd556cc32019-09-17 01:21:23 -06001574 }
1575 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001576 for (uint32_t j = 0; j < bind_info.imageOpaqueBindCount; j++) {
1577 for (uint32_t k = 0; k < bind_info.pImageOpaqueBinds[j].bindCount; k++) {
1578 auto sparse_binding = bind_info.pImageOpaqueBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001579 auto image_state = Get<IMAGE_STATE>(bind_info.pImageOpaqueBinds[j].image);
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 (image_state && mem_state) {
1582 image_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.imageBindCount; j++) {
1587 for (uint32_t k = 0; k < bind_info.pImageBinds[j].bindCount; k++) {
1588 auto sparse_binding = bind_info.pImageBinds[j].pBinds[k];
locke-lunargd556cc32019-09-17 01:21:23 -06001589 // TODO: This size is broken for non-opaque bindings, need to update to comprehend full sparse binding data
1590 VkDeviceSize size = sparse_binding.extent.depth * sparse_binding.extent.height * sparse_binding.extent.width * 4;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001591 auto image_state = Get<IMAGE_STATE>(bind_info.pImageBinds[j].image);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001592 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001593 if (image_state && mem_state) {
1594 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, size);
1595 }
locke-lunargd556cc32019-09-17 01:21:23 -06001596 }
1597 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001598 CB_SUBMISSION submission;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001599 for (uint32_t i = 0; i < bind_info.waitSemaphoreCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001600 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(bind_info.pWaitSemaphores[i]), 0);
locke-lunargd556cc32019-09-17 01:21:23 -06001601 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001602 for (uint32_t i = 0; i < bind_info.signalSemaphoreCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001603 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(bind_info.pSignalSemaphores[i]), 0);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001604 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001605 if (bind_idx == (bindInfoCount - 1)) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001606 submission.AddFence(Get<FENCE_STATE>(fence));
locke-lunargd556cc32019-09-17 01:21:23 -06001607 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001608 auto submit_seq = queue_state->Submit(std::move(submission));
1609 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001610 }
1611
1612 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001613 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001614 }
1615}
1616
1617void ValidationStateTracker::PostCallRecordCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
1618 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore,
1619 VkResult result) {
1620 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001621 Add(std::make_shared<SEMAPHORE_STATE>(*pSemaphore, LvlFindInChain<VkSemaphoreTypeCreateInfo>(pCreateInfo->pNext)));
locke-lunargd556cc32019-09-17 01:21:23 -06001622}
1623
Mike Schuchardt2df08912020-12-15 16:28:09 -08001624void ValidationStateTracker::RecordImportSemaphoreState(VkSemaphore semaphore, VkExternalSemaphoreHandleTypeFlagBits handle_type,
1625 VkSemaphoreImportFlags flags) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001626 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
1627 if (semaphore_state) {
1628 semaphore_state->Import(handle_type, flags);
locke-lunargd556cc32019-09-17 01:21:23 -06001629 }
1630}
1631
Mike Schuchardt2df08912020-12-15 16:28:09 -08001632void ValidationStateTracker::PostCallRecordSignalSemaphoreKHR(VkDevice device, const VkSemaphoreSignalInfo *pSignalInfo,
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001633 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001634 auto semaphore_state = Get<SEMAPHORE_STATE>(pSignalInfo->semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07001635 if (semaphore_state) {
1636 semaphore_state->RetireTimeline(pSignalInfo->value);
1637 }
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001638}
1639
locke-lunargd556cc32019-09-17 01:21:23 -06001640void ValidationStateTracker::RecordMappedMemory(VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, void **ppData) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001641 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001642 if (mem_info) {
1643 mem_info->mapped_range.offset = offset;
1644 mem_info->mapped_range.size = size;
1645 mem_info->p_driver_data = *ppData;
1646 }
1647}
1648
locke-lunargd556cc32019-09-17 01:21:23 -06001649void ValidationStateTracker::PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1650 VkBool32 waitAll, uint64_t timeout, VkResult result) {
1651 if (VK_SUCCESS != result) return;
1652
1653 // When we know that all fences are complete we can clean/remove their CBs
1654 if ((VK_TRUE == waitAll) || (1 == fenceCount)) {
1655 for (uint32_t i = 0; i < fenceCount; i++) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001656 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Jeremy Gebben57642982021-09-14 14:14:55 -06001657 if (fence_state) {
1658 fence_state->Retire();
1659 }
locke-lunargd556cc32019-09-17 01:21:23 -06001660 }
1661 }
1662 // NOTE : Alternate case not handled here is when some fences have completed. In
1663 // this case for app to guarantee which fences completed it will have to call
1664 // vkGetFenceStatus() at which point we'll clean/remove their CBs if complete.
1665}
1666
John Zulauff89de662020-04-13 18:57:34 -06001667void ValidationStateTracker::RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1668 VkResult result) {
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001669 if (VK_SUCCESS != result) return;
1670
Jeremy Gebben15332642021-12-15 19:33:15 -07001671 // Same logic as vkWaitForFences(). If some semaphores are not signaled, we will get their status when
1672 // the application calls vkGetSemaphoreCounterValue() on each of them.
1673 if ((pWaitInfo->flags & VK_SEMAPHORE_WAIT_ANY_BIT) == 0 || pWaitInfo->semaphoreCount == 1) {
1674 for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
1675 auto semaphore_state = Get<SEMAPHORE_STATE>(pWaitInfo->pSemaphores[i]);
1676 if (semaphore_state) {
1677 semaphore_state->RetireTimeline(pWaitInfo->pValues[i]);
1678 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001679 }
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001680 }
1681}
1682
John Zulauff89de662020-04-13 18:57:34 -06001683void ValidationStateTracker::PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1684 VkResult result) {
1685 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1686}
1687
1688void ValidationStateTracker::PostCallRecordWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo,
1689 uint64_t timeout, VkResult result) {
1690 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1691}
1692
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001693void ValidationStateTracker::RecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1694 VkResult result) {
1695 if (VK_SUCCESS != result) return;
1696
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001697 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben57642982021-09-14 14:14:55 -06001698 if (semaphore_state) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001699 semaphore_state->RetireTimeline(*pValue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001700 }
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001701}
1702
1703void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1704 VkResult result) {
1705 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1706}
1707void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValueKHR(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1708 VkResult result) {
1709 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1710}
1711
locke-lunargd556cc32019-09-17 01:21:23 -06001712void ValidationStateTracker::PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
1713 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001714 auto fence_state = Get<FENCE_STATE>(fence);
Jeremy Gebben57642982021-09-14 14:14:55 -06001715 if (fence_state) {
1716 fence_state->Retire();
1717 }
locke-lunargd556cc32019-09-17 01:21:23 -06001718}
1719
Yilong Lice03a312022-01-02 02:08:35 -08001720void ValidationStateTracker::RecordGetDeviceQueueState(uint32_t queue_family_index, VkDeviceQueueCreateFlags flags, VkQueue queue) {
1721 if (Get<QUEUE_STATE>(queue) == nullptr) {
1722 Add(std::make_shared<QUEUE_STATE>(queue, queue_family_index, flags));
1723 }
1724}
1725
1726void ValidationStateTracker::PostCallRecordGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex,
1727 VkQueue *pQueue) {
1728 RecordGetDeviceQueueState(queueFamilyIndex, {}, *pQueue);
1729}
1730
1731void ValidationStateTracker::PostCallRecordGetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2 *pQueueInfo, VkQueue *pQueue) {
1732 RecordGetDeviceQueueState(pQueueInfo->queueFamilyIndex, pQueueInfo->flags, *pQueue);
1733}
1734
locke-lunargd556cc32019-09-17 01:21:23 -06001735void ValidationStateTracker::PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) {
1736 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001737 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001738 if (queue_state) {
1739 queue_state->Retire();
1740 }
locke-lunargd556cc32019-09-17 01:21:23 -06001741}
1742
1743void ValidationStateTracker::PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) {
1744 if (VK_SUCCESS != result) return;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06001745 for (auto &queue : queue_map_.snapshot()) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001746 queue.second->Retire();
locke-lunargd556cc32019-09-17 01:21:23 -06001747 }
1748}
1749
1750void ValidationStateTracker::PreCallRecordDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001751 Destroy<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06001752}
1753
1754void ValidationStateTracker::PreCallRecordDestroySemaphore(VkDevice device, VkSemaphore semaphore,
1755 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001756 Destroy<SEMAPHORE_STATE>(semaphore);
locke-lunargd556cc32019-09-17 01:21:23 -06001757}
1758
1759void ValidationStateTracker::PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001760 Destroy<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06001761}
1762
1763void ValidationStateTracker::PreCallRecordDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
1764 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001765 Destroy<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001766}
1767
locke-lunargd556cc32019-09-17 01:21:23 -06001768void ValidationStateTracker::UpdateBindBufferMemoryState(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001769 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001770 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001771 // Track objects tied to memory
Jeremy Gebben9f537102021-10-05 16:37:12 -06001772 auto mem_state = Get<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001773 if (mem_state) {
1774 buffer_state->SetMemBinding(mem_state, memoryOffset);
1775 }
locke-lunargd556cc32019-09-17 01:21:23 -06001776 }
1777}
1778
1779void ValidationStateTracker::PostCallRecordBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
1780 VkDeviceSize memoryOffset, VkResult result) {
1781 if (VK_SUCCESS != result) return;
1782 UpdateBindBufferMemoryState(buffer, mem, memoryOffset);
1783}
1784
1785void ValidationStateTracker::PostCallRecordBindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001786 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001787 for (uint32_t i = 0; i < bindInfoCount; i++) {
1788 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1789 }
1790}
1791
1792void ValidationStateTracker::PostCallRecordBindBufferMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001793 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001794 for (uint32_t i = 0; i < bindInfoCount; i++) {
1795 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1796 }
1797}
1798
Spencer Fricke6c127102020-04-16 06:25:20 -07001799void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001800 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001801 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001802 buffer_state->memory_requirements_checked = true;
1803 }
1804}
1805
1806void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1807 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001808 RecordGetBufferMemoryRequirementsState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001809}
1810
1811void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001812 const VkBufferMemoryRequirementsInfo2 *pInfo,
1813 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001814 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001815}
1816
1817void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2KHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001818 const VkBufferMemoryRequirementsInfo2 *pInfo,
1819 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001820 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001821}
1822
Spencer Fricke6c127102020-04-16 06:25:20 -07001823void ValidationStateTracker::RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2 *pInfo) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001824 const VkImagePlaneMemoryRequirementsInfo *plane_info =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001825 (pInfo == nullptr) ? nullptr : LvlFindInChain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001826 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001827 if (image_state) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001828 if (plane_info != nullptr) {
1829 // Multi-plane image
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001830 if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_0_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001831 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001832 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_1_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001833 image_state->memory_requirements_checked[1] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001834 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_2_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001835 image_state->memory_requirements_checked[2] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001836 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001837 } else if (!image_state->disjoint) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001838 // Single Plane image
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001839 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001840 }
locke-lunargd556cc32019-09-17 01:21:23 -06001841 }
1842}
1843
1844void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements(VkDevice device, VkImage image,
1845 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001846 RecordGetImageMemoryRequirementsState(image, nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06001847}
1848
1849void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
1850 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001851 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001852}
1853
1854void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2KHR(VkDevice device,
1855 const VkImageMemoryRequirementsInfo2 *pInfo,
1856 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001857 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001858}
1859
locke-lunargd556cc32019-09-17 01:21:23 -06001860void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements(
1861 VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1862 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001863 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001864 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001865}
1866
1867void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001868 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1869 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001870 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001871 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001872}
1873
1874void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001875 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1876 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001877 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001878 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001879}
1880
1881void ValidationStateTracker::PreCallRecordDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1882 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001883 Destroy<SHADER_MODULE_STATE>(shaderModule);
locke-lunargd556cc32019-09-17 01:21:23 -06001884}
1885
1886void ValidationStateTracker::PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline,
1887 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001888 Destroy<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06001889}
1890
1891void ValidationStateTracker::PreCallRecordDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1892 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001893 Destroy<PIPELINE_LAYOUT_STATE>(pipelineLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001894}
1895
1896void ValidationStateTracker::PreCallRecordDestroySampler(VkDevice device, VkSampler sampler,
1897 const VkAllocationCallbacks *pAllocator) {
1898 if (!sampler) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001899 auto sampler_state = Get<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001900 // Any bound cmd buffers are now invalid
1901 if (sampler_state) {
Yuly Novikov424cdd52020-05-26 16:45:12 -04001902 if (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
1903 sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
1904 custom_border_color_sampler_count--;
1905 }
locke-lunargd556cc32019-09-17 01:21:23 -06001906 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001907 Destroy<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001908}
1909
1910void ValidationStateTracker::PreCallRecordDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1911 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001912 Destroy<cvdescriptorset::DescriptorSetLayout>(descriptorSetLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001913}
1914
1915void ValidationStateTracker::PreCallRecordDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1916 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001917 Destroy<DESCRIPTOR_POOL_STATE>(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001918}
1919
locke-lunargd556cc32019-09-17 01:21:23 -06001920void ValidationStateTracker::PreCallRecordFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
1921 uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001922 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1923 if (pool) {
1924 pool->Free(commandBufferCount, pCommandBuffers);
1925 }
locke-lunargd556cc32019-09-17 01:21:23 -06001926}
1927
1928void ValidationStateTracker::PostCallRecordCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1929 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool,
1930 VkResult result) {
1931 if (VK_SUCCESS != result) return;
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001932 auto queue_flags = physical_device_state->queue_family_properties[pCreateInfo->queueFamilyIndex].queueFlags;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001933 Add(std::make_shared<COMMAND_POOL_STATE>(this, *pCommandPool, pCreateInfo, queue_flags));
locke-lunargd556cc32019-09-17 01:21:23 -06001934}
1935
1936void ValidationStateTracker::PostCallRecordCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1937 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool,
1938 VkResult result) {
1939 if (VK_SUCCESS != result) return;
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001940
1941 uint32_t index_count = 0, n_perf_pass = 0;
1942 bool has_cb = false, has_rb = false;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001943 if (pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001944 const auto *perf = LvlFindInChain<VkQueryPoolPerformanceCreateInfoKHR>(pCreateInfo->pNext);
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001945 index_count = perf->counterIndexCount;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001946
Mark Lobodzinski7e948e42020-09-09 10:23:36 -06001947 const QUEUE_FAMILY_PERF_COUNTERS &counters = *physical_device_state->perf_counters[perf->queueFamilyIndex];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001948 for (uint32_t i = 0; i < perf->counterIndexCount; i++) {
1949 const auto &counter = counters.counters[perf->pCounterIndices[i]];
1950 switch (counter.scope) {
1951 case VK_QUERY_SCOPE_COMMAND_BUFFER_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001952 has_cb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001953 break;
1954 case VK_QUERY_SCOPE_RENDER_PASS_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001955 has_rb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001956 break;
1957 default:
1958 break;
1959 }
1960 }
1961
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001962 DispatchGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physical_device_state->PhysDev(), perf, &n_perf_pass);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001963 }
1964
Jeremy Gebben082a9832021-10-28 13:40:11 -06001965 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 -06001966
locke-lunargd556cc32019-09-17 01:21:23 -06001967}
1968
1969void ValidationStateTracker::PreCallRecordDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
1970 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001971 Destroy<COMMAND_POOL_STATE>(commandPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001972}
1973
1974void ValidationStateTracker::PostCallRecordResetCommandPool(VkDevice device, VkCommandPool commandPool,
1975 VkCommandPoolResetFlags flags, VkResult result) {
1976 if (VK_SUCCESS != result) return;
1977 // Reset all of the CBs allocated from this pool
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001978 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1979 if (pool) {
1980 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001981 }
1982}
1983
1984void ValidationStateTracker::PostCallRecordResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1985 VkResult result) {
1986 for (uint32_t i = 0; i < fenceCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001987 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001988 if (fence_state) {
Jeremy Gebben140a0a52021-12-15 18:22:34 -07001989 fence_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001990 }
1991 }
1992}
1993
locke-lunargd556cc32019-09-17 01:21:23 -06001994void ValidationStateTracker::PreCallRecordDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
1995 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001996 Destroy<FRAMEBUFFER_STATE>(framebuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001997}
1998
1999void ValidationStateTracker::PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
2000 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002001 Destroy<RENDER_PASS_STATE>(renderPass);
locke-lunargd556cc32019-09-17 01:21:23 -06002002}
2003
2004void ValidationStateTracker::PostCallRecordCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2005 const VkAllocationCallbacks *pAllocator, VkFence *pFence, VkResult result) {
2006 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002007 Add(std::make_shared<FENCE_STATE>(*pFence, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002008}
2009
2010bool ValidationStateTracker::PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2011 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2012 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002013 void *cgpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002014 // Set up the state that CoreChecks, gpu_validation and later StateTracker Record will use.
2015 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2016 cgpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2017 cgpl_state->pipe_state.reserve(count);
2018 for (uint32_t i = 0; i < count; i++) {
Jeremy Gebbence23dac2021-11-10 10:19:42 -07002019 if (pCreateInfos[i].renderPass != VK_NULL_HANDLE) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002020 cgpl_state->pipe_state.push_back(std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i],
2021 Get<RENDER_PASS_STATE>(pCreateInfos[i].renderPass),
2022 Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Tony-LunarG273f32f2021-09-28 08:56:30 -06002023 } else if (enabled_features.core13.dynamicRendering) {
amhagana448ea52021-11-02 14:09:14 -04002024 auto dynamic_rendering = LvlFindInChain<VkPipelineRenderingCreateInfoKHR>(pCreateInfos[i].pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002025 cgpl_state->pipe_state.push_back(
2026 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], std::make_shared<RENDER_PASS_STATE>(dynamic_rendering),
Jeremy Gebben9f537102021-10-05 16:37:12 -06002027 Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeremy Gebbence23dac2021-11-10 10:19:42 -07002028 }
locke-lunargd556cc32019-09-17 01:21:23 -06002029 }
2030 return false;
2031}
2032
2033void ValidationStateTracker::PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2034 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2035 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2036 VkResult result, void *cgpl_state_data) {
2037 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2038 // This API may create pipelines regardless of the return value
2039 for (uint32_t i = 0; i < count; i++) {
2040 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002041 (cgpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06002042 Add(std::move((cgpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06002043 }
2044 }
2045 cgpl_state->pipe_state.clear();
2046}
2047
2048bool ValidationStateTracker::PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2049 const VkComputePipelineCreateInfo *pCreateInfos,
2050 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002051 void *ccpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002052 auto *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2053 ccpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2054 ccpl_state->pipe_state.reserve(count);
2055 for (uint32_t i = 0; i < count; i++) {
2056 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002057 ccpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06002058 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002059 }
2060 return false;
2061}
2062
2063void ValidationStateTracker::PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2064 const VkComputePipelineCreateInfo *pCreateInfos,
2065 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2066 VkResult result, void *ccpl_state_data) {
2067 create_compute_pipeline_api_state *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2068
2069 // This API may create pipelines regardless of the return value
2070 for (uint32_t i = 0; i < count; i++) {
2071 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002072 (ccpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06002073 Add(std::move((ccpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06002074 }
2075 }
2076 ccpl_state->pipe_state.clear();
2077}
2078
2079bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache,
2080 uint32_t count,
2081 const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2082 const VkAllocationCallbacks *pAllocator,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002083 VkPipeline *pPipelines, void *crtpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002084 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2085 crtpl_state->pipe_state.reserve(count);
2086 for (uint32_t i = 0; i < count; i++) {
2087 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002088 crtpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06002089 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002090 }
2091 return false;
2092}
2093
2094void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesNV(
2095 VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2096 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines, VkResult result, void *crtpl_state_data) {
2097 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2098 // This API may create pipelines regardless of the return value
2099 for (uint32_t i = 0; i < count; i++) {
2100 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002101 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06002102 Add(std::move((crtpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06002103 }
2104 }
2105 crtpl_state->pipe_state.clear();
2106}
2107
sourav parmarcd5fb182020-07-17 12:58:44 -07002108bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2109 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002110 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2111 const VkAllocationCallbacks *pAllocator,
2112 VkPipeline *pPipelines, void *crtpl_state_data) const {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002113 auto crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002114 crtpl_state->pipe_state.reserve(count);
2115 for (uint32_t i = 0; i < count; i++) {
2116 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002117 crtpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06002118 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002119 }
2120 return false;
2121}
2122
sourav parmarcd5fb182020-07-17 12:58:44 -07002123void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2124 VkPipelineCache pipelineCache, uint32_t count,
2125 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2126 const VkAllocationCallbacks *pAllocator,
2127 VkPipeline *pPipelines, VkResult result,
2128 void *crtpl_state_data) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002129 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
2130 // This API may create pipelines regardless of the return value
2131 for (uint32_t i = 0; i < count; i++) {
2132 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002133 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06002134 Add(std::move((crtpl_state->pipe_state)[i]));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002135 }
2136 }
2137 crtpl_state->pipe_state.clear();
2138}
2139
locke-lunargd556cc32019-09-17 01:21:23 -06002140void ValidationStateTracker::PostCallRecordCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2141 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler,
2142 VkResult result) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002143 Add(std::make_shared<SAMPLER_STATE>(pSampler, pCreateInfo));
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002144 if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
2145 pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
Tony-LunarG7337b312020-04-15 16:40:25 -06002146 custom_border_color_sampler_count++;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002147 }
locke-lunargd556cc32019-09-17 01:21:23 -06002148}
2149
2150void ValidationStateTracker::PostCallRecordCreateDescriptorSetLayout(VkDevice device,
2151 const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2152 const VkAllocationCallbacks *pAllocator,
2153 VkDescriptorSetLayout *pSetLayout, VkResult result) {
2154 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002155 Add(std::make_shared<cvdescriptorset::DescriptorSetLayout>(pCreateInfo, *pSetLayout));
locke-lunargd556cc32019-09-17 01:21:23 -06002156}
2157
locke-lunargd556cc32019-09-17 01:21:23 -06002158void ValidationStateTracker::PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
2159 const VkAllocationCallbacks *pAllocator,
2160 VkPipelineLayout *pPipelineLayout, VkResult result) {
2161 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002162 Add(std::make_shared<PIPELINE_LAYOUT_STATE>(this, *pPipelineLayout, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002163}
2164
2165void ValidationStateTracker::PostCallRecordCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
2166 const VkAllocationCallbacks *pAllocator,
2167 VkDescriptorPool *pDescriptorPool, VkResult result) {
2168 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002169 Add(std::make_shared<DESCRIPTOR_POOL_STATE>(this, *pDescriptorPool, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002170}
2171
2172void ValidationStateTracker::PostCallRecordResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
2173 VkDescriptorPoolResetFlags flags, VkResult result) {
2174 if (VK_SUCCESS != result) return;
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002175 auto pool = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
2176 if (pool) {
2177 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002178 }
locke-lunargd556cc32019-09-17 01:21:23 -06002179}
2180
2181bool ValidationStateTracker::PreCallValidateAllocateDescriptorSets(VkDevice device,
2182 const VkDescriptorSetAllocateInfo *pAllocateInfo,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002183 VkDescriptorSet *pDescriptorSets, void *ads_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002184 // Always update common data
2185 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2186 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2187 UpdateAllocateDescriptorSetsData(pAllocateInfo, ads_state);
2188
2189 return false;
2190}
2191
2192// Allocation state was good and call down chain was made so update state based on allocating descriptor sets
2193void ValidationStateTracker::PostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
2194 VkDescriptorSet *pDescriptorSets, VkResult result,
2195 void *ads_state_data) {
2196 if (VK_SUCCESS != result) return;
2197 // All the updates are contained in a single cvdescriptorset function
2198 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2199 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002200 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(pAllocateInfo->descriptorPool);
2201 if (pool_state) {
2202 pool_state->Allocate(pAllocateInfo, pDescriptorSets, ads_state);
2203 }
locke-lunargd556cc32019-09-17 01:21:23 -06002204}
2205
2206void ValidationStateTracker::PreCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count,
2207 const VkDescriptorSet *pDescriptorSets) {
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002208 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
2209 if (pool_state) {
2210 pool_state->Free(count, pDescriptorSets);
locke-lunargd556cc32019-09-17 01:21:23 -06002211 }
2212}
2213
2214void ValidationStateTracker::PreCallRecordUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
2215 const VkWriteDescriptorSet *pDescriptorWrites,
2216 uint32_t descriptorCopyCount,
2217 const VkCopyDescriptorSet *pDescriptorCopies) {
2218 cvdescriptorset::PerformUpdateDescriptorSets(this, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
2219 pDescriptorCopies);
2220}
2221
2222void ValidationStateTracker::PostCallRecordAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002223 VkCommandBuffer *pCommandBuffers, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002224 if (VK_SUCCESS != result) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06002225 auto pool = Get<COMMAND_POOL_STATE>(pCreateInfo->commandPool);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002226 if (pool) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002227 pool->Allocate(pCreateInfo, pCommandBuffers);
locke-lunargfc78e932020-11-19 17:06:24 -07002228 }
2229}
2230
locke-lunargd556cc32019-09-17 01:21:23 -06002231void ValidationStateTracker::PreCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer,
2232 const VkCommandBufferBeginInfo *pBeginInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002233 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002234 if (!cb_state) return;
locke-lunargfc78e932020-11-19 17:06:24 -07002235
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002236 cb_state->Begin(pBeginInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002237}
2238
2239void ValidationStateTracker::PostCallRecordEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002240 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002241 if (!cb_state) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002242
2243 cb_state->End(result);
locke-lunargd556cc32019-09-17 01:21:23 -06002244}
2245
2246void ValidationStateTracker::PostCallRecordResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags,
2247 VkResult result) {
2248 if (VK_SUCCESS == result) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002249 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2250 if (cb_state) {
2251 cb_state->Reset();
2252 }
locke-lunargd556cc32019-09-17 01:21:23 -06002253 }
2254}
2255
2256CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) {
2257 // initially assume everything is static state
2258 CBStatusFlags flags = CBSTATUS_ALL_STATE_SET;
2259
2260 if (ds) {
2261 for (uint32_t i = 0; i < ds->dynamicStateCount; i++) {
locke-lunarg4189aa22020-10-21 00:23:48 -06002262 flags &= ~ConvertToCBStatusFlagBits(ds->pDynamicStates[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002263 }
2264 }
locke-lunargd556cc32019-09-17 01:21:23 -06002265 return flags;
2266}
2267
2268// Validation cache:
2269// CV is the bottommost implementor of this extension. Don't pass calls down.
locke-lunargd556cc32019-09-17 01:21:23 -06002270
2271void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2272 VkPipeline pipeline) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002273 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002274 assert(cb_state);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002275 cb_state->RecordCmd(CMD_BINDPIPELINE);
locke-lunargd556cc32019-09-17 01:21:23 -06002276
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002277 auto pipe_state = Get<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06002278 if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002279 const auto &create_info = pipe_state->create_info.graphics;
2280 bool rasterization_enabled = VK_FALSE == create_info.pRasterizationState->rasterizerDiscardEnable;
2281 const auto *viewport_state = create_info.pViewportState;
2282 const auto *dynamic_state = create_info.pDynamicState;
locke-lunargd556cc32019-09-17 01:21:23 -06002283 cb_state->status &= ~cb_state->static_status;
Yilong Lid23bc292022-01-02 22:06:12 -08002284 cb_state->static_status = MakeStaticStateMask(dynamic_state ? dynamic_state->ptr() : nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06002285 cb_state->status |= cb_state->static_status;
locke-lunarg4189aa22020-10-21 00:23:48 -06002286 cb_state->dynamic_status = CBSTATUS_ALL_STATE_SET & (~cb_state->static_status);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002287
2288 // Used to calculate CMD_BUFFER_STATE::usedViewportScissorCount upon draw command with this graphics pipeline.
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002289 // If rasterization disabled (no viewport/scissors used), or the actual number of viewports/scissors is dynamic (unknown at
2290 // this time), then these are set to 0 to disable this checking.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002291 auto has_dynamic_viewport_count = cb_state->dynamic_status & CBSTATUS_VIEWPORT_WITH_COUNT_SET;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002292 auto has_dynamic_scissor_count = cb_state->dynamic_status & CBSTATUS_SCISSOR_WITH_COUNT_SET;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002293 cb_state->pipelineStaticViewportCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002294 has_dynamic_viewport_count || !rasterization_enabled ? 0 : viewport_state->viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002295 cb_state->pipelineStaticScissorCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002296 has_dynamic_scissor_count || !rasterization_enabled ? 0 : viewport_state->scissorCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002297
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002298 // Trash dynamic viewport/scissor state if pipeline defines static state and enabled rasterization.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002299 // akeley98 NOTE: There's a bit of an ambiguity in the spec, whether binding such a pipeline overwrites
2300 // the entire viewport (scissor) array, or only the subsection defined by the viewport (scissor) count.
2301 // I am taking the latter interpretation based on the implementation details of NVIDIA's Vulkan driver.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002302 if (!has_dynamic_viewport_count) {
2303 cb_state->trashedViewportCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002304 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_VIEWPORT_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002305 cb_state->trashedViewportMask |= (uint32_t(1) << viewport_state->viewportCount) - 1u;
2306 // should become = ~uint32_t(0) if the other interpretation is correct.
2307 }
2308 }
2309 if (!has_dynamic_scissor_count) {
2310 cb_state->trashedScissorCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002311 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_SCISSOR_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002312 cb_state->trashedScissorMask |= (uint32_t(1) << viewport_state->scissorCount) - 1u;
2313 // should become = ~uint32_t(0) if the other interpretation is correct.
2314 }
2315 }
locke-lunargd556cc32019-09-17 01:21:23 -06002316 }
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002317 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002318 cb_state->lastBound[lv_bind_point].pipeline_state = pipe_state.get();
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002319 if (!disabled[command_buffer_state]) {
2320 cb_state->AddChild(pipe_state);
2321 }
locke-lunargd556cc32019-09-17 01:21:23 -06002322}
2323
2324void ValidationStateTracker::PreCallRecordCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2325 uint32_t viewportCount, const VkViewport *pViewports) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002326 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002327 cb_state->RecordStateCmd(CMD_SETVIEWPORT, CBSTATUS_VIEWPORT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002328 uint32_t bits = ((1u << viewportCount) - 1u) << firstViewport;
2329 cb_state->viewportMask |= bits;
2330 cb_state->trashedViewportMask &= ~bits;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002331
2332 cb_state->dynamicViewports.resize(std::max(size_t(firstViewport + viewportCount), cb_state->dynamicViewports.size()));
2333 for (size_t i = 0; i < viewportCount; ++i) {
2334 cb_state->dynamicViewports[firstViewport + i] = pViewports[i];
2335 }
locke-lunargd556cc32019-09-17 01:21:23 -06002336}
2337
2338void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
2339 uint32_t exclusiveScissorCount,
2340 const VkRect2D *pExclusiveScissors) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002341 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002342 cb_state->RecordStateCmd(CMD_SETEXCLUSIVESCISSORNV, CBSTATUS_EXCLUSIVE_SCISSOR_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002343 // TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
2344 // cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
locke-lunargd556cc32019-09-17 01:21:23 -06002345}
2346
2347void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
2348 VkImageLayout imageLayout) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002349 if (disabled[command_buffer_state]) return;
2350
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->RecordCmd(CMD_BINDSHADINGRATEIMAGENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002353
2354 if (imageView != VK_NULL_HANDLE) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002355 auto view_state = Get<IMAGE_VIEW_STATE>(imageView);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002356 cb_state->AddChild(view_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002357 }
2358}
2359
2360void ValidationStateTracker::PreCallRecordCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2361 uint32_t viewportCount,
2362 const VkShadingRatePaletteNV *pShadingRatePalettes) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002363 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002364 cb_state->RecordStateCmd(CMD_SETVIEWPORTSHADINGRATEPALETTENV, CBSTATUS_SHADING_RATE_PALETTE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002365 // TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
2366 // cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
locke-lunargd556cc32019-09-17 01:21:23 -06002367}
2368
2369void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
2370 const VkAccelerationStructureCreateInfoNV *pCreateInfo,
2371 const VkAllocationCallbacks *pAllocator,
2372 VkAccelerationStructureNV *pAccelerationStructure,
2373 VkResult result) {
2374 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002375 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002376
2377 // Query the requirements in case the application doesn't (to avoid bind/validation time query)
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002378 auto as_memory_requirements_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002379 as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002380 as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002381 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &as_memory_requirements_info, &as_state->memory_requirements);
2382
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002383 auto scratch_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002384 scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002385 scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002386 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &scratch_memory_req_info,
2387 &as_state->build_scratch_memory_requirements);
2388
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002389 auto update_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002390 update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002391 update_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002392 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
2393 &as_state->update_scratch_memory_requirements);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002394 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002395 Add(std::move(as_state));
locke-lunargd556cc32019-09-17 01:21:23 -06002396}
2397
Jeff Bolz95176d02020-04-01 00:36:16 -05002398void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
2399 const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
2400 const VkAllocationCallbacks *pAllocator,
2401 VkAccelerationStructureKHR *pAccelerationStructure,
2402 VkResult result) {
2403 if (VK_SUCCESS != result) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002404 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE_KHR>(*pAccelerationStructure, pCreateInfo);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002405 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002406 Add(std::move(as_state));
Jeff Bolz95176d02020-04-01 00:36:16 -05002407}
2408
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002409void ValidationStateTracker::PostCallRecordBuildAccelerationStructuresKHR(
2410 VkDevice device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount,
2411 const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2412 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos, VkResult result) {
2413 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002414 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002415 if (dst_as_state != nullptr) {
2416 dst_as_state->Build(&pInfos[i]);
2417 }
2418 }
2419}
2420
sourav parmarcd5fb182020-07-17 12:58:44 -07002421void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresKHR(
2422 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2423 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002424 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002425 if (!cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002426 return;
2427 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002428 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002429 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002430 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002431 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002432 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002433 if (!disabled[command_buffer_state]) {
2434 cb_state->AddChild(dst_as_state);
2435 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002436 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002437 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002438 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002439 if (src_as_state != nullptr) {
2440 cb_state->AddChild(src_as_state);
2441 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002442 }
2443 }
2444 cb_state->hasBuildAccelerationStructureCmd = true;
2445}
2446
2447void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresIndirectKHR(
2448 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2449 const VkDeviceAddress *pIndirectDeviceAddresses, const uint32_t *pIndirectStrides,
2450 const uint32_t *const *ppMaxPrimitiveCounts) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002451 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2452 if (!cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002453 return;
2454 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002455 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESINDIRECTKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002456 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002457 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002458 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002459 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002460 if (!disabled[command_buffer_state]) {
2461 cb_state->AddChild(dst_as_state);
2462 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002463 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002464 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002465 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002466 if (src_as_state != nullptr) {
2467 cb_state->AddChild(src_as_state);
2468 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002469 }
2470 }
2471 cb_state->hasBuildAccelerationStructureCmd = true;
2472}
locke-lunargd556cc32019-09-17 01:21:23 -06002473void ValidationStateTracker::PostCallRecordGetAccelerationStructureMemoryRequirementsNV(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002474 VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV *pInfo, VkMemoryRequirements2 *pMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002475 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(pInfo->accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002476 if (as_state != nullptr) {
2477 if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV) {
2478 as_state->memory_requirements = *pMemoryRequirements;
2479 as_state->memory_requirements_checked = true;
2480 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV) {
2481 as_state->build_scratch_memory_requirements = *pMemoryRequirements;
2482 as_state->build_scratch_memory_requirements_checked = true;
2483 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV) {
2484 as_state->update_scratch_memory_requirements = *pMemoryRequirements;
2485 as_state->update_scratch_memory_requirements_checked = true;
2486 }
2487 }
2488}
2489
sourav parmarcd5fb182020-07-17 12:58:44 -07002490void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
2491 VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002492 if (VK_SUCCESS != result) return;
2493 for (uint32_t i = 0; i < bindInfoCount; i++) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002494 const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
locke-lunargd556cc32019-09-17 01:21:23 -06002495
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002496 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(info.accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002497 if (as_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002498 // Track objects tied to memory
Jeremy Gebben9f537102021-10-05 16:37:12 -06002499 auto mem_state = Get<DEVICE_MEMORY_STATE>(info.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002500 if (mem_state) {
2501 as_state->SetMemBinding(mem_state, info.memoryOffset);
2502 }
locke-lunargd556cc32019-09-17 01:21:23 -06002503
2504 // GPU validation of top level acceleration structure building needs acceleration structure handles.
Jeff Bolz95176d02020-04-01 00:36:16 -05002505 // XXX TODO: Query device address for KHR extension
sourav parmarcd5fb182020-07-17 12:58:44 -07002506 if (enabled[gpu_validation]) {
locke-lunargd556cc32019-09-17 01:21:23 -06002507 DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
2508 }
2509 }
2510 }
2511}
2512
2513void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
2514 VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
2515 VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002516 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2517 if (!cb_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002518 return;
2519 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002520 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002521
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002522 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
locke-lunargd556cc32019-09-17 01:21:23 -06002523 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002524 dst_as_state->Build(pInfo);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002525 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002526 cb_state->AddChild(dst_as_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002527 }
locke-lunargd556cc32019-09-17 01:21:23 -06002528 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002529 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002530 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002531 if (src_as_state != nullptr) {
2532 cb_state->AddChild(src_as_state);
2533 }
locke-lunargd556cc32019-09-17 01:21:23 -06002534 }
2535 cb_state->hasBuildAccelerationStructureCmd = true;
2536}
2537
2538void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureNV(VkCommandBuffer commandBuffer,
2539 VkAccelerationStructureNV dst,
2540 VkAccelerationStructureNV src,
2541 VkCopyAccelerationStructureModeNV mode) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002542 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002543 if (cb_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002544 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
2545 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002546 if (!disabled[command_buffer_state]) {
2547 cb_state->RecordTransferCmd(CMD_COPYACCELERATIONSTRUCTURENV, src_as_state, dst_as_state);
2548 }
locke-lunargd556cc32019-09-17 01:21:23 -06002549 if (dst_as_state != nullptr && src_as_state != nullptr) {
2550 dst_as_state->built = true;
2551 dst_as_state->build_info = src_as_state->build_info;
locke-lunargd556cc32019-09-17 01:21:23 -06002552 }
2553 }
2554}
2555
Jeff Bolz95176d02020-04-01 00:36:16 -05002556void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
2557 VkAccelerationStructureKHR accelerationStructure,
2558 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002559 Destroy<ACCELERATION_STRUCTURE_STATE_KHR>(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002560}
2561
Jeff Bolz95176d02020-04-01 00:36:16 -05002562void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
2563 VkAccelerationStructureNV accelerationStructure,
2564 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002565 Destroy<ACCELERATION_STRUCTURE_STATE>(accelerationStructure);
Jeff Bolz95176d02020-04-01 00:36:16 -05002566}
2567
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002568void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2569 uint32_t viewportCount,
2570 const VkViewportWScalingNV *pViewportWScalings) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002571 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002572 cb_state->RecordStateCmd(CMD_SETVIEWPORTWSCALINGNV, CBSTATUS_VIEWPORT_W_SCALING_SET);
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002573}
2574
locke-lunargd556cc32019-09-17 01:21:23 -06002575void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002576 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002577 cb_state->RecordStateCmd(CMD_SETLINEWIDTH, CBSTATUS_LINE_WIDTH_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002578}
2579
2580void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
2581 uint16_t lineStipplePattern) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002582 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002583 cb_state->RecordStateCmd(CMD_SETLINESTIPPLEEXT, CBSTATUS_LINE_STIPPLE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002584}
2585
2586void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
2587 float depthBiasClamp, float depthBiasSlopeFactor) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002588 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002589 cb_state->RecordStateCmd(CMD_SETDEPTHBIAS, CBSTATUS_DEPTH_BIAS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002590}
2591
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002592void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
2593 const VkRect2D *pScissors) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002594 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002595 cb_state->RecordStateCmd(CMD_SETSCISSOR, CBSTATUS_SCISSOR_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002596 uint32_t bits = ((1u << scissorCount) - 1u) << firstScissor;
2597 cb_state->scissorMask |= bits;
2598 cb_state->trashedScissorMask &= ~bits;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002599}
2600
locke-lunargd556cc32019-09-17 01:21:23 -06002601void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002602 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002603 cb_state->RecordStateCmd(CMD_SETBLENDCONSTANTS, CBSTATUS_BLEND_CONSTANTS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002604}
2605
2606void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
2607 float maxDepthBounds) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002608 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002609 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDS, CBSTATUS_DEPTH_BOUNDS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002610}
2611
2612void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2613 uint32_t compareMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002614 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002615 cb_state->RecordStateCmd(CMD_SETSTENCILCOMPAREMASK, CBSTATUS_STENCIL_READ_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002616}
2617
2618void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2619 uint32_t writeMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002620 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002621 cb_state->RecordStateCmd(CMD_SETSTENCILWRITEMASK, CBSTATUS_STENCIL_WRITE_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002622}
2623
2624void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2625 uint32_t reference) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002626 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002627 cb_state->RecordStateCmd(CMD_SETSTENCILREFERENCE, CBSTATUS_STENCIL_REFERENCE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002628}
2629
locke-lunargd556cc32019-09-17 01:21:23 -06002630// Update the bound state for the bind point, including the effects of incompatible pipeline layouts
2631void ValidationStateTracker::PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2632 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2633 uint32_t firstSet, uint32_t setCount,
2634 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2635 const uint32_t *pDynamicOffsets) {
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->RecordCmd(CMD_BINDDESCRIPTORSETS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002638 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebben4d51c552022-01-06 21:27:15 -07002639 std::shared_ptr<cvdescriptorset::DescriptorSet> no_push_desc;
locke-lunargd556cc32019-09-17 01:21:23 -06002640
Jeremy Gebben4d51c552022-01-06 21:27:15 -07002641 cb_state->UpdateLastBoundDescriptorSets(pipelineBindPoint, pipeline_layout.get(), firstSet, setCount, pDescriptorSets,
2642 no_push_desc, dynamicOffsetCount, pDynamicOffsets);
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002643}
2644
locke-lunargd556cc32019-09-17 01:21:23 -06002645void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
2646 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2647 uint32_t set, uint32_t descriptorWriteCount,
2648 const VkWriteDescriptorSet *pDescriptorWrites) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002649 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002650 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002651 cb_state->PushDescriptorSetState(pipelineBindPoint, pipeline_layout.get(), set, descriptorWriteCount, pDescriptorWrites);
locke-lunargd556cc32019-09-17 01:21:23 -06002652}
2653
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002654void ValidationStateTracker::PostCallRecordCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2655 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2656 const void *pValues) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002657 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2658 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002659 cb_state->RecordCmd(CMD_PUSHCONSTANTS);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002660 auto layout_state = Get<PIPELINE_LAYOUT_STATE>(layout);
2661 cb_state->ResetPushConstantDataIfIncompatible(layout_state.get());
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002662
2663 auto &push_constant_data = cb_state->push_constant_data;
2664 assert((offset + size) <= static_cast<uint32_t>(push_constant_data.size()));
2665 std::memcpy(push_constant_data.data() + offset, pValues, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002666 cb_state->push_constant_pipeline_layout_set = layout;
2667
2668 auto flags = stageFlags;
2669 uint32_t bit_shift = 0;
2670 while (flags) {
2671 if (flags & 1) {
2672 VkShaderStageFlagBits flag = static_cast<VkShaderStageFlagBits>(1 << bit_shift);
2673 const auto it = cb_state->push_constant_data_update.find(flag);
2674
2675 if (it != cb_state->push_constant_data_update.end()) {
locke-lunarg3d8b8f32020-10-26 17:04:16 -06002676 std::memset(it->second.data() + offset, PC_Byte_Updated, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002677 }
2678 }
2679 flags = flags >> 1;
2680 ++bit_shift;
2681 }
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002682 }
2683}
2684
locke-lunargd556cc32019-09-17 01:21:23 -06002685void ValidationStateTracker::PreCallRecordCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2686 VkIndexType indexType) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002687 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002688
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002689 cb_state->RecordStateCmd(CMD_BINDINDEXBUFFER, CBSTATUS_INDEX_BUFFER_BOUND);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002690 cb_state->index_buffer_binding.buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002691 cb_state->index_buffer_binding.size = cb_state->index_buffer_binding.buffer_state->createInfo.size;
locke-lunargd556cc32019-09-17 01:21:23 -06002692 cb_state->index_buffer_binding.offset = offset;
2693 cb_state->index_buffer_binding.index_type = indexType;
2694 // Add binding for this index buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002695 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002696 cb_state->AddChild(cb_state->index_buffer_binding.buffer_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002697 }
locke-lunargd556cc32019-09-17 01:21:23 -06002698}
2699
2700void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2701 uint32_t bindingCount, const VkBuffer *pBuffers,
2702 const VkDeviceSize *pOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002703 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002704 cb_state->RecordCmd(CMD_BINDVERTEXBUFFERS);
locke-lunargd556cc32019-09-17 01:21:23 -06002705
2706 uint32_t end = firstBinding + bindingCount;
2707 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
2708 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
2709 }
2710
2711 for (uint32_t i = 0; i < bindingCount; ++i) {
2712 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06002713 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002714 vertex_buffer_binding.offset = pOffsets[i];
Piers Daniell39842ee2020-07-10 16:42:33 -06002715 vertex_buffer_binding.size = VK_WHOLE_SIZE;
2716 vertex_buffer_binding.stride = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06002717 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002718 if (pBuffers[i] && !disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002719 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Jeff Bolz165818a2020-05-08 11:19:03 -05002720 }
locke-lunargd556cc32019-09-17 01:21:23 -06002721 }
2722}
2723
2724void ValidationStateTracker::PostCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
2725 VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002726 if (disabled[command_buffer_state]) return;
2727
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002728 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002729 cb_state->RecordTransferCmd(CMD_UPDATEBUFFER, Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -06002730}
2731
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002732void ValidationStateTracker::PreCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2733 VkPipelineStageFlags stageMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002734 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002735 cb_state->RecordSetEvent(CMD_SETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002736}
2737
2738void ValidationStateTracker::PreCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2739 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002740 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002741 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
2742
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002743 cb_state->RecordSetEvent(CMD_SETEVENT2KHR, event, stage_masks.src);
2744 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002745}
2746
Tony-LunarGc43525f2021-11-15 16:12:38 -07002747void ValidationStateTracker::PreCallRecordCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
2748 const VkDependencyInfo* pDependencyInfo) {
2749 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2750 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
2751
2752 cb_state->RecordSetEvent(CMD_SETEVENT2, event, stage_masks.src);
2753 cb_state->RecordBarriers(*pDependencyInfo);
2754}
2755
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002756void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2757 VkPipelineStageFlags stageMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002758 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002759 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002760}
2761
2762void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2763 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002764 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002765 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002766}
2767
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002768void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2769 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
2770 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2771 uint32_t bufferMemoryBarrierCount,
2772 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2773 uint32_t imageMemoryBarrierCount,
2774 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002775 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2776 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents, sourceStageMask);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002777 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2778 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002779}
2780
2781void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
2782 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002783 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben79649152021-06-22 14:46:24 -06002784 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002785 const auto &dep_info = pDependencyInfos[i];
2786 auto stage_masks = sync_utils::GetGlobalStageMasks(dep_info);
2787 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, 1, &pEvents[i], stage_masks.src);
2788 cb_state->RecordBarriers(dep_info);
Jeremy Gebben79649152021-06-22 14:46:24 -06002789 }
2790}
2791
2792void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2793 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2794 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2795 uint32_t bufferMemoryBarrierCount,
2796 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2797 uint32_t imageMemoryBarrierCount,
2798 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002799 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002800 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
2801 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2802 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06002803}
2804
2805void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
2806 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002807 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002808 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
2809 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06002810}
2811
locke-lunargd556cc32019-09-17 01:21:23 -06002812void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
2813 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002814 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002815
locke-lunargd556cc32019-09-17 01:21:23 -06002816 QueryObject query = {queryPool, slot};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002817 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002818 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002819 if (!disabled[query_validation]) {
2820 cb_state->BeginQuery(query);
2821 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002822 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002823 auto pool_state = Get<QUERY_POOL_STATE>(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002824 cb_state->AddChild(pool_state);
2825 }
locke-lunargd556cc32019-09-17 01:21:23 -06002826}
2827
2828void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002829 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002830 QueryObject query_obj = {queryPool, slot};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002831 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002832 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002833 if (!disabled[query_validation]) {
2834 cb_state->EndQuery(query_obj);
2835 }
2836 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002837 auto pool_state = Get<QUERY_POOL_STATE>(query_obj.pool);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002838 cb_state->AddChild(pool_state);
2839 }
locke-lunargd556cc32019-09-17 01:21:23 -06002840}
2841
2842void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2843 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002844 if (disabled[query_validation]) return;
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002845 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002846
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002847 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002848 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02002849
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002850 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002851 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002852 cb_state->AddChild(pool_state);
2853 }
locke-lunargd556cc32019-09-17 01:21:23 -06002854}
2855
2856void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2857 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
2858 VkDeviceSize dstOffset, VkDeviceSize stride,
2859 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002860 if (disabled[query_validation] || disabled[command_buffer_state]) return;
2861
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002862 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002863 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002864 auto dst_buff_state = Get<BUFFER_STATE>(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002865 cb_state->AddChild(dst_buff_state);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002866 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002867 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002868}
2869
2870void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2871 VkQueryPool queryPool, uint32_t slot) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002872 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002873 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002874}
2875
2876void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
2877 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
2878 uint32_t slot) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002879 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002880 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06002881}
2882
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002883void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
2884 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
2885 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
2886 if (disabled[query_validation]) return;
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002887 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002888 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002889 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002890 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002891 cb_state->AddChild(pool_state);
2892 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002893 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002894}
2895
locke-lunargd556cc32019-09-17 01:21:23 -06002896void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2897 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
2898 VkResult result) {
2899 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002900
Jeremy Gebben88f58142021-06-01 10:07:52 -06002901 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08002902 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002903 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002904
locke-lunargd556cc32019-09-17 01:21:23 -06002905 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002906 views[i] = Get<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002907 }
2908 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06002909
Jeremy Gebben9f537102021-10-05 16:37:12 -06002910 Add(std::make_shared<FRAMEBUFFER_STATE>(*pFramebuffer, pCreateInfo, Get<RENDER_PASS_STATE>(pCreateInfo->renderPass),
Jeremy Gebben082a9832021-10-28 13:40:11 -06002911 std::move(views)));
locke-lunargd556cc32019-09-17 01:21:23 -06002912}
2913
locke-lunargd556cc32019-09-17 01:21:23 -06002914void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2915 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2916 VkResult result) {
2917 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002918 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002919}
2920
Mike Schuchardt2df08912020-12-15 16:28:09 -08002921void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002922 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2923 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002924 if (VK_SUCCESS != result) return;
2925
Jeremy Gebben082a9832021-10-28 13:40:11 -06002926 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002927}
2928
Mike Schuchardt2df08912020-12-15 16:28:09 -08002929void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002930 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2931 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002932 if (VK_SUCCESS != result) return;
2933
Jeremy Gebben082a9832021-10-28 13:40:11 -06002934 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002935}
2936
locke-lunargd556cc32019-09-17 01:21:23 -06002937void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
2938 const VkRenderPassBeginInfo *pRenderPassBegin,
2939 VkSubpassContents contents) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002940 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002941 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002942}
2943
2944void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
2945 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002946 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002947 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002948 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002949}
2950
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002951void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2952 uint32_t counterBufferCount,
2953 const VkBuffer *pCounterBuffers,
2954 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002955 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002956
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002957 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002958 cb_state->transform_feedback_active = true;
2959}
2960
2961void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2962 uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
2963 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002964 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002965
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002966 cb_state->RecordCmd(CMD_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002967 cb_state->transform_feedback_active = false;
2968}
2969
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002970void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
2971 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002972 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002973
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002974 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002975 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002976 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
2977 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002978}
2979
2980void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002981 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002982
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002983 cb_state->RecordCmd(CMD_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002984 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002985 cb_state->conditional_rendering_inside_render_pass = false;
2986 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002987}
2988
amhagana448ea52021-11-02 14:09:14 -04002989void ValidationStateTracker::RecordCmdEndRenderingRenderPassState(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002990 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002991 cb_state->activeRenderPass = nullptr;
2992}
2993
2994void ValidationStateTracker::PreCallRecordCmdBeginRenderingKHR(VkCommandBuffer commandBuffer,
2995 const VkRenderingInfoKHR *pRenderingInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002996 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002997 cb_state->BeginRendering(CMD_BEGINRENDERINGKHR, pRenderingInfo);
2998}
2999
3000void ValidationStateTracker::PreCallRecordCmdEndRenderingKHR(VkCommandBuffer commandBuffer) {
3001 RecordCmdEndRenderingRenderPassState(commandBuffer);
3002}
3003
Tony-LunarG977448c2019-12-02 14:52:02 -07003004void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
3005 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003006 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003007 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003008 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07003009}
3010
locke-lunargd556cc32019-09-17 01:21:23 -06003011void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003012 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003013 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003014}
3015
3016void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003017 const VkSubpassBeginInfo *pSubpassBeginInfo,
3018 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003019 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003020 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003021}
3022
Tony-LunarG977448c2019-12-02 14:52:02 -07003023void ValidationStateTracker::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003024 const VkSubpassBeginInfo *pSubpassBeginInfo,
3025 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003026 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003027 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003028}
3029
3030void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003031 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003032 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06003033}
3034
3035void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003036 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003037 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003038 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06003039}
3040
Tony-LunarG977448c2019-12-02 14:52:02 -07003041void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003042 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003043 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003044 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07003045}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003046
locke-lunargd556cc32019-09-17 01:21:23 -06003047void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
3048 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003049 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003050
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003051 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06003052}
3053
3054void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
3055 VkFlags flags, void **ppData, VkResult result) {
3056 if (VK_SUCCESS != result) return;
3057 RecordMappedMemory(mem, offset, size, ppData);
3058}
3059
3060void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003061 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06003062 if (mem_info) {
3063 mem_info->mapped_range = MemRange();
3064 mem_info->p_driver_data = nullptr;
3065 }
3066}
3067
3068void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003069 auto image_state = Get<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06003070 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06003071 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
3072 // See: VUID-vkGetImageSubresourceLayout-image-01895
3073 image_state->fragment_encoder =
3074 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07003075 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003076 if (swapchain_info) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003077 auto swapchain = Get<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003078 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003079 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07003080
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003081 if (!swapchain_image.fake_base_address) {
3082 auto size = image_state->fragment_encoder->TotalSize();
3083 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06003084 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003085 // All images bound to this swapchain and index are aliases
3086 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003087 }
3088 } else {
3089 // Track bound memory range information
Jeremy Gebben9f537102021-10-05 16:37:12 -06003090 auto mem_info = Get<DEVICE_MEMORY_STATE>(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06003091 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003092 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06003093 }
locke-lunargd556cc32019-09-17 01:21:23 -06003094 }
locke-lunargd556cc32019-09-17 01:21:23 -06003095 }
3096}
3097
3098void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
3099 VkDeviceSize memoryOffset, VkResult result) {
3100 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06003101 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003102 bind_info.image = image;
3103 bind_info.memory = mem;
3104 bind_info.memoryOffset = memoryOffset;
3105 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003106}
3107
3108void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003109 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003110 if (VK_SUCCESS != result) return;
3111 for (uint32_t i = 0; i < bindInfoCount; i++) {
3112 UpdateBindImageMemoryState(pBindInfos[i]);
3113 }
3114}
3115
3116void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003117 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003118 if (VK_SUCCESS != result) return;
3119 for (uint32_t i = 0; i < bindInfoCount; i++) {
3120 UpdateBindImageMemoryState(pBindInfos[i]);
3121 }
3122}
3123
3124void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003125 auto event_state = Get<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06003126 if (event_state) {
3127 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
3128 }
locke-lunargd556cc32019-09-17 01:21:23 -06003129}
3130
3131void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
3132 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
3133 VkResult result) {
3134 if (VK_SUCCESS != result) return;
3135 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
3136 pImportSemaphoreFdInfo->flags);
3137}
3138
3139void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003140 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003141 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07003142 if (semaphore_state) {
3143 semaphore_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06003144 }
3145}
3146
3147#ifdef VK_USE_PLATFORM_WIN32_KHR
3148void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
3149 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
3150 if (VK_SUCCESS != result) return;
3151 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
3152 pImportSemaphoreWin32HandleInfo->flags);
3153}
3154
3155void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
3156 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3157 HANDLE *pHandle, VkResult result) {
3158 if (VK_SUCCESS != result) return;
3159 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
3160}
3161
3162void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
3163 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
3164 if (VK_SUCCESS != result) return;
3165 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
3166 pImportFenceWin32HandleInfo->flags);
3167}
3168
3169void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
3170 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3171 HANDLE *pHandle, VkResult result) {
3172 if (VK_SUCCESS != result) return;
3173 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
3174}
3175#endif
3176
3177void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
3178 VkResult result) {
3179 if (VK_SUCCESS != result) return;
3180 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
3181}
3182
Mike Schuchardt2df08912020-12-15 16:28:09 -08003183void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
3184 VkFenceImportFlags flags) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003185 auto fence_node = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003186
3187 if (fence_node) {
3188 fence_node->Import(handle_type, flags);
locke-lunargd556cc32019-09-17 01:21:23 -06003189 }
3190}
3191
3192void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
3193 VkResult result) {
3194 if (VK_SUCCESS != result) return;
3195 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
3196}
3197
Mike Schuchardt2df08912020-12-15 16:28:09 -08003198void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003199 auto fence_state = Get<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06003200 if (fence_state) {
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003201 fence_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06003202 }
3203}
3204
3205void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3206 VkResult result) {
3207 if (VK_SUCCESS != result) return;
3208 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3209}
3210
3211void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3212 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3213 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003214 Add(std::make_shared<EVENT_STATE>(*pEvent, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003215}
3216
3217void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003218 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003219 SWAPCHAIN_NODE *old_swapchain_state) {
3220 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003221 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003222 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003223 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003224 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3225 surface_state->AddParent(swapchain.get());
3226 surface_state->swapchain = swapchain.get();
3227 swapchain->surface = std::move(surface_state);
Jeremy Gebben082a9832021-10-28 13:40:11 -06003228 Add(std::move(swapchain));
locke-lunargd556cc32019-09-17 01:21:23 -06003229 } else {
3230 surface_state->swapchain = nullptr;
3231 }
3232 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003233 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003234 if (old_swapchain_state) {
3235 old_swapchain_state->retired = true;
3236 }
3237 return;
3238}
3239
3240void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3241 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3242 VkResult result) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003243 auto surface_state = Get<SURFACE_STATE>(pCreateInfo->surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003244 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfo->oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003245 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003246}
3247
3248void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3249 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003250 Destroy<SWAPCHAIN_NODE>(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003251}
3252
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003253void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3254 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3255 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3256 VkResult result) {
3257 if (VK_SUCCESS != result) return;
3258 if (!pMode) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003259 Add(std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice));
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003260}
3261
locke-lunargd556cc32019-09-17 01:21:23 -06003262void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003263 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06003264 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3265 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003266 auto semaphore_state = Get<SEMAPHORE_STATE>(pPresentInfo->pWaitSemaphores[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003267 if (semaphore_state) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003268 semaphore_state->EnqueuePresent(queue_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003269 }
3270 }
3271
Tony-LunarG6f887e52021-07-27 11:23:14 -06003272 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003273 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3274 // 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
3275 // confused itself just as much.
3276 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3277 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3278 // Mark the image as having been released to the WSI
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003279 auto swapchain_data = Get<SWAPCHAIN_NODE>(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003280 if (swapchain_data) {
3281 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003282 if (present_id_info) {
3283 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3284 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3285 }
3286 }
locke-lunargd556cc32019-09-17 01:21:23 -06003287 }
3288 }
locke-lunargd556cc32019-09-17 01:21:23 -06003289}
3290
3291void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3292 const VkSwapchainCreateInfoKHR *pCreateInfos,
3293 const VkAllocationCallbacks *pAllocator,
3294 VkSwapchainKHR *pSwapchains, VkResult result) {
3295 if (pCreateInfos) {
3296 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003297 auto surface_state = Get<SURFACE_STATE>(pCreateInfos[i].surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003298 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfos[i].oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003299 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state),
3300 old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003301 }
3302 }
3303}
3304
3305void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3306 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003307 auto fence_state = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003308 if (fence_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003309 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3310 // import
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003311 fence_state->EnqueueSignal(nullptr, 0);
locke-lunargd556cc32019-09-17 01:21:23 -06003312 }
3313
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003314 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07003315 if (semaphore_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003316 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3317 // temporary import
Jeremy Gebben15332642021-12-15 19:33:15 -07003318 semaphore_state->EnqueueAcquire();
locke-lunargd556cc32019-09-17 01:21:23 -06003319 }
3320
3321 // Mark the image as acquired.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003322 auto swapchain_data = Get<SWAPCHAIN_NODE>(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003323 if (swapchain_data) {
3324 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003325 }
3326}
3327
3328void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3329 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3330 VkResult result) {
3331 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3332 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3333}
3334
3335void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3336 uint32_t *pImageIndex, VkResult result) {
3337 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3338 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3339 pAcquireInfo->fence, pImageIndex);
3340}
3341
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003342std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3343 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3344}
3345
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003346void ValidationStateTracker::PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
3347 const VkAllocationCallbacks *pAllocator, VkInstance *pInstance,
3348 VkResult result) {
3349 if (result != VK_SUCCESS) {
3350 return;
3351 }
Jeremy Gebben404f6ac2021-10-28 12:33:28 -06003352 instance_state = this;
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003353 uint32_t count = 0;
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003354 // this can fail if the allocator fails
3355 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, nullptr);
3356 if (result != VK_SUCCESS) {
3357 return;
3358 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003359 std::vector<VkPhysicalDevice> physdev_handles(count);
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003360 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, physdev_handles.data());
3361 if (result != VK_SUCCESS) {
3362 return;
3363 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003364
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003365 for (auto physdev : physdev_handles) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003366 Add(CreatePhysicalDeviceState(physdev));
locke-lunargd556cc32019-09-17 01:21:23 -06003367 }
3368}
3369
3370// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003371static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003372 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003373}
3374
3375void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3376 uint32_t *pQueueFamilyPropertyCount,
3377 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003378 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3379 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003380 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003381}
3382
3383void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003384 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003385 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3386 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003387 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003388}
3389
3390void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003391 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003392 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3393 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003394 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003395}
3396void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3397 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003398 Destroy<SURFACE_STATE>(surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003399}
3400
Jeremy Gebben082a9832021-10-28 13:40:11 -06003401void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) { Add(std::make_shared<SURFACE_STATE>(*pSurface)); }
locke-lunargd556cc32019-09-17 01:21:23 -06003402
3403void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3404 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3405 const VkAllocationCallbacks *pAllocator,
3406 VkSurfaceKHR *pSurface, VkResult result) {
3407 if (VK_SUCCESS != result) return;
3408 RecordVulkanSurface(pSurface);
3409}
3410
3411#ifdef VK_USE_PLATFORM_ANDROID_KHR
3412void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3413 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3414 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3415 VkResult result) {
3416 if (VK_SUCCESS != result) return;
3417 RecordVulkanSurface(pSurface);
3418}
3419#endif // VK_USE_PLATFORM_ANDROID_KHR
3420
3421#ifdef VK_USE_PLATFORM_IOS_MVK
3422void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3423 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3424 VkResult result) {
3425 if (VK_SUCCESS != result) return;
3426 RecordVulkanSurface(pSurface);
3427}
3428#endif // VK_USE_PLATFORM_IOS_MVK
3429
3430#ifdef VK_USE_PLATFORM_MACOS_MVK
3431void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3432 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3433 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3434 VkResult result) {
3435 if (VK_SUCCESS != result) return;
3436 RecordVulkanSurface(pSurface);
3437}
3438#endif // VK_USE_PLATFORM_MACOS_MVK
3439
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003440#ifdef VK_USE_PLATFORM_METAL_EXT
3441void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3442 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3443 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3444 VkResult result) {
3445 if (VK_SUCCESS != result) return;
3446 RecordVulkanSurface(pSurface);
3447}
3448#endif // VK_USE_PLATFORM_METAL_EXT
3449
locke-lunargd556cc32019-09-17 01:21:23 -06003450#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3451void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3452 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3453 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3454 VkResult result) {
3455 if (VK_SUCCESS != result) return;
3456 RecordVulkanSurface(pSurface);
3457}
3458#endif // VK_USE_PLATFORM_WAYLAND_KHR
3459
3460#ifdef VK_USE_PLATFORM_WIN32_KHR
3461void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3462 const VkWin32SurfaceCreateInfoKHR *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_WIN32_KHR
3469
3470#ifdef VK_USE_PLATFORM_XCB_KHR
3471void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
3472 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3473 VkResult result) {
3474 if (VK_SUCCESS != result) return;
3475 RecordVulkanSurface(pSurface);
3476}
3477#endif // VK_USE_PLATFORM_XCB_KHR
3478
3479#ifdef VK_USE_PLATFORM_XLIB_KHR
3480void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
3481 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3482 VkResult result) {
3483 if (VK_SUCCESS != result) return;
3484 RecordVulkanSurface(pSurface);
3485}
3486#endif // VK_USE_PLATFORM_XLIB_KHR
3487
Niklas Haas8b84af12020-04-19 22:20:11 +02003488void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3489 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3490 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3491 VkResult result) {
3492 if (VK_SUCCESS != result) return;
3493 RecordVulkanSurface(pSurface);
3494}
3495
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003496void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
3497 VkSurfaceKHR surface,
3498 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities,
3499 VkResult result) {
3500 if (VK_SUCCESS != result) return;
3501 auto surface_state = Get<SURFACE_STATE>(surface);
3502 surface_state->SetCapabilities(physicalDevice, *pSurfaceCapabilities);
3503}
3504
3505void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
3506 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3507 VkSurfaceCapabilities2KHR *pSurfaceCapabilities, VkResult result) {
3508 if (VK_SUCCESS != result) return;
3509 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3510 surface_state->SetCapabilities(physicalDevice, pSurfaceCapabilities->surfaceCapabilities);
3511}
3512
3513void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice,
3514 VkSurfaceKHR surface,
3515 VkSurfaceCapabilities2EXT *pSurfaceCapabilities,
3516 VkResult result) {
3517 auto surface_state = Get<SURFACE_STATE>(surface);
3518 VkSurfaceCapabilitiesKHR caps{
3519 pSurfaceCapabilities->minImageCount, pSurfaceCapabilities->maxImageCount,
3520 pSurfaceCapabilities->currentExtent, pSurfaceCapabilities->minImageExtent,
3521 pSurfaceCapabilities->maxImageExtent, pSurfaceCapabilities->maxImageArrayLayers,
3522 pSurfaceCapabilities->supportedTransforms, pSurfaceCapabilities->currentTransform,
3523 pSurfaceCapabilities->supportedCompositeAlpha, pSurfaceCapabilities->supportedUsageFlags,
3524 };
3525 surface_state->SetCapabilities(physicalDevice, caps);
3526}
3527
locke-lunargd556cc32019-09-17 01:21:23 -06003528void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3529 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3530 VkBool32 *pSupported, VkResult result) {
3531 if (VK_SUCCESS != result) return;
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003532 auto surface_state = Get<SURFACE_STATE>(surface);
3533 surface_state->SetQueueSupport(physicalDevice, queueFamilyIndex, (*pSupported == VK_TRUE));
3534}
3535
3536void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
3537 VkSurfaceKHR surface,
3538 uint32_t *pPresentModeCount,
3539 VkPresentModeKHR *pPresentModes,
3540 VkResult result) {
3541 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3542
3543 if (pPresentModes) {
3544 auto surface_state = Get<SURFACE_STATE>(surface);
3545 surface_state->SetPresentModes(physicalDevice,
3546 std::vector<VkPresentModeKHR>(pPresentModes, pPresentModes + *pPresentModeCount));
3547 }
3548}
3549
3550void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
3551 uint32_t *pSurfaceFormatCount,
3552 VkSurfaceFormatKHR *pSurfaceFormats,
3553 VkResult result) {
3554 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3555
3556 if (pSurfaceFormats) {
3557 auto surface_state = Get<SURFACE_STATE>(surface);
3558 surface_state->SetFormats(physicalDevice,
3559 std::vector<VkSurfaceFormatKHR>(pSurfaceFormats, pSurfaceFormats + *pSurfaceFormatCount));
3560 }
3561}
3562
3563void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
3564 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3565 uint32_t *pSurfaceFormatCount,
3566 VkSurfaceFormat2KHR *pSurfaceFormats,
3567 VkResult result) {
3568 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3569
3570 if (pSurfaceFormats) {
3571 std::vector<VkSurfaceFormatKHR> fmts(*pSurfaceFormatCount);
3572 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3573 for (uint32_t i = 0; i < *pSurfaceFormatCount; i++) {
3574 fmts[i] = pSurfaceFormats[i].surfaceFormat;
3575 }
3576 surface_state->SetFormats(physicalDevice, std::move(fmts));
3577 }
locke-lunargd556cc32019-09-17 01:21:23 -06003578}
3579
locke-lunargd556cc32019-09-17 01:21:23 -06003580void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3581 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003582 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003583 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003584 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3585}
3586
3587void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003588 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003589 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003590 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3591}
3592
3593void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3594 const VkDebugUtilsLabelEXT *pLabelInfo) {
3595 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3596
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003597 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003598 cb_state->RecordCmd(CMD_INSERTDEBUGUTILSLABELEXT);
3599 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003600 cb_state->debug_label = LoggingLabel(pLabelInfo);
3601}
3602
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003603void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3604 uint32_t queueFamilyIndex,
3605 uint32_t *pCounterCount,
3606 VkPerformanceCounterKHR *pCounters) {
3607 if (NULL == pCounters) return;
3608
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003609 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3610 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003611
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003612 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3613 queue_family_counters->counters.resize(*pCounterCount);
3614 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003615
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003616 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003617}
3618
3619void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3620 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3621 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3622 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3623 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3624}
3625
3626void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3627 VkResult result) {
3628 if (result == VK_SUCCESS) performance_lock_acquired = true;
3629}
3630
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003631void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3632 performance_lock_acquired = false;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06003633 for (auto &cmd_buffer : command_buffer_map_.snapshot()) {
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003634 cmd_buffer.second->performance_lock_released = true;
3635 }
3636}
3637
locke-lunargd556cc32019-09-17 01:21:23 -06003638void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003639 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003640 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003641 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003642}
3643
3644void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003645 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003646 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003647 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003648}
3649
Mike Schuchardt2df08912020-12-15 16:28:09 -08003650void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3651 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003652 Add(std::make_shared<UPDATE_TEMPLATE_STATE>(*pDescriptorUpdateTemplate, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06003653}
3654
Mike Schuchardt2df08912020-12-15 16:28:09 -08003655void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3656 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3657 const VkAllocationCallbacks *pAllocator,
3658 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3659 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003660 if (VK_SUCCESS != result) return;
3661 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3662}
3663
3664void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003665 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3666 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003667 if (VK_SUCCESS != result) return;
3668 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3669}
3670
3671void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003672 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003673 const void *pData) {
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003674 auto const template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
3675 assert(template_state);
3676 if (template_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003677 // TODO: Record template push descriptor updates
3678 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003679 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state.get(), pData);
locke-lunargd556cc32019-09-17 01:21:23 -06003680 }
3681 }
3682}
3683
3684void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3685 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3686 const void *pData) {
3687 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3688}
3689
3690void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003691 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003692 const void *pData) {
3693 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3694}
3695
Mike Schuchardt2df08912020-12-15 16:28:09 -08003696void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3697 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3698 VkPipelineLayout layout, uint32_t set,
3699 const void *pData) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003700 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003701
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003702 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003703 const auto template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003704 if (template_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003705 auto layout_data = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003706 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003707 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003708 // Decode the template into a set of write updates
Jeremy Gebben9f537102021-10-05 16:37:12 -06003709 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state.get(), pData,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003710 dsl->GetDescriptorSetLayout());
Jeremy Gebben9f537102021-10-05 16:37:12 -06003711 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data.get(), set,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003712 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3713 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003714 }
3715}
3716
3717void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3718 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003719 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003720 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003721 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003722 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003723 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003724 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003725 }
3726}
3727
3728void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3729 uint32_t *pPropertyCount,
3730 VkDisplayPlanePropertiesKHR *pProperties,
3731 VkResult result) {
3732 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3733 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3734}
3735
3736void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3737 uint32_t *pPropertyCount,
3738 VkDisplayPlaneProperties2KHR *pProperties,
3739 VkResult result) {
3740 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3741 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3742}
3743
3744void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3745 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3746 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003747 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003748 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003749 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003750}
3751
3752void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3753 uint32_t query, uint32_t index) {
3754 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003755 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003756 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003757 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003758}
3759
3760void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3761 VkSamplerYcbcrConversion ycbcr_conversion) {
Lionel Landwerlin21719f62021-12-09 11:40:09 +02003762 VkFormatFeatureFlags2KHR format_features = 0;
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003763
3764 if (create_info->format != VK_FORMAT_UNDEFINED) {
3765 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07003766 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003767 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
3768 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003769 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003770
Jeremy Gebben082a9832021-10-28 13:40:11 -06003771 Add(std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features));
locke-lunargd556cc32019-09-17 01:21:23 -06003772}
3773
3774void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
3775 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3776 const VkAllocationCallbacks *pAllocator,
3777 VkSamplerYcbcrConversion *pYcbcrConversion,
3778 VkResult result) {
3779 if (VK_SUCCESS != result) return;
3780 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3781}
3782
3783void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(VkDevice device,
3784 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3785 const VkAllocationCallbacks *pAllocator,
3786 VkSamplerYcbcrConversion *pYcbcrConversion,
3787 VkResult result) {
3788 if (VK_SUCCESS != result) return;
3789 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3790}
3791
3792void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
3793 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003794 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003795}
3796
3797void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
3798 VkSamplerYcbcrConversion ycbcrConversion,
3799 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003800 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003801}
3802
Tony-LunarG977448c2019-12-02 14:52:02 -07003803void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3804 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06003805 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07003806 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003807
3808 // Do nothing if the query pool has been destroyed.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003809 auto query_pool_state = Get<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06003810 if (!query_pool_state) return;
3811
3812 // Reset the state of existing entries.
locke-lunargd556cc32019-09-17 01:21:23 -06003813 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
3814 for (uint32_t i = 0; i < max_query_count; ++i) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003815 auto query_index = firstQuery + i;
3816 query_pool_state->SetQueryState(query_index, 0, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003817 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003818 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003819 query_pool_state->SetQueryState(query_index, pass_index, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003820 }
3821 }
locke-lunargd556cc32019-09-17 01:21:23 -06003822 }
3823}
3824
Tony-LunarG977448c2019-12-02 14:52:02 -07003825void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3826 uint32_t queryCount) {
3827 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3828}
3829
3830void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3831 uint32_t queryCount) {
3832 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3833}
3834
locke-lunargd556cc32019-09-17 01:21:23 -06003835void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003836 const UPDATE_TEMPLATE_STATE *template_state,
3837 const void *pData) {
locke-lunargd556cc32019-09-17 01:21:23 -06003838 // Translate the templated update into a normal update for validation...
3839 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
3840 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
3841 decoded_update.desc_writes.data(), 0, NULL);
3842}
3843
3844// Update the common AllocateDescriptorSetsData
3845void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05003846 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06003847 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003848 auto layout = Get<cvdescriptorset::DescriptorSetLayout>(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003849 if (layout) {
3850 ds_data->layout_nodes[i] = layout;
3851 // Count total descriptors required per type
3852 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
3853 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003854 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
3855 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003856 }
3857 }
3858 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
3859 }
3860}
3861
locke-lunargd556cc32019-09-17 01:21:23 -06003862void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3863 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003864 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003865 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003866}
3867
Tony-LunarG745150c2021-07-02 15:07:31 -06003868void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3869 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
3870 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003871 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003872 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003873}
3874
locke-lunargd556cc32019-09-17 01:21:23 -06003875void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3876 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3877 uint32_t firstInstance) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003878 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003879 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003880}
3881
Tony-LunarG745150c2021-07-02 15:07:31 -06003882void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3883 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
3884 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
3885 const int32_t *pVertexOffset) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003886 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003887 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003888}
3889
locke-lunargd556cc32019-09-17 01:21:23 -06003890void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3891 uint32_t count, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003892 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003893 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003894 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003895 if (!disabled[command_buffer_state]) {
3896 cb_state->AddChild(buffer_state);
3897 }
locke-lunargd556cc32019-09-17 01:21:23 -06003898}
3899
3900void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3901 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003902 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003903 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003904 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003905 if (!disabled[command_buffer_state]) {
3906 cb_state->AddChild(buffer_state);
3907 }
locke-lunargd556cc32019-09-17 01:21:23 -06003908}
3909
3910void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
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->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06003913}
3914
3915void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3916 VkDeviceSize offset) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003917 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003918 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003919 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003920 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003921 cb_state->AddChild(buffer_state);
3922 }
locke-lunargd556cc32019-09-17 01:21:23 -06003923}
3924
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003925void ValidationStateTracker::PostCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3926 uint32_t, uint32_t) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003927 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003928 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3929}
3930
3931void ValidationStateTracker::PostCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3932 uint32_t, uint32_t) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003933 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003934 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3935}
3936
Tony-LunarG977448c2019-12-02 14:52:02 -07003937void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3938 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07003939 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003940 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003941 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003942 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003943 auto buffer_state = Get<BUFFER_STATE>(buffer);
3944 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003945 cb_state->AddChild(buffer_state);
3946 cb_state->AddChild(count_buffer_state);
3947 }
Tony-LunarG977448c2019-12-02 14:52:02 -07003948}
3949
locke-lunargd556cc32019-09-17 01:21:23 -06003950void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3951 VkDeviceSize offset, VkBuffer countBuffer,
3952 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3953 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003954 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003955 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003956}
3957
3958void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3959 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3960 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003961 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003962 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07003963}
3964
3965void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3966 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07003967 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003968 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003969 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003970 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003971 auto buffer_state = Get<BUFFER_STATE>(buffer);
3972 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003973 cb_state->AddChild(buffer_state);
3974 cb_state->AddChild(count_buffer_state);
3975 }
locke-lunargd556cc32019-09-17 01:21:23 -06003976}
3977
3978void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3979 VkDeviceSize offset, VkBuffer countBuffer,
3980 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3981 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003982 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003983 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003984}
3985
3986void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
3987 VkDeviceSize offset, VkBuffer countBuffer,
3988 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3989 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003990 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003991 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06003992}
3993
3994void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
3995 uint32_t firstTask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003996 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003997 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003998}
3999
4000void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4001 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004002 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004003 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004004 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004005 if (!disabled[command_buffer_state] && buffer_state) {
4006 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06004007 }
4008}
4009
4010void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4011 VkDeviceSize offset, VkBuffer countBuffer,
4012 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4013 uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004014 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004015 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004016 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004017 auto buffer_state = Get<BUFFER_STATE>(buffer);
4018 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004019 if (buffer_state) {
4020 cb_state->AddChild(buffer_state);
4021 }
4022 if (count_buffer_state) {
4023 cb_state->AddChild(count_buffer_state);
4024 }
locke-lunargd556cc32019-09-17 01:21:23 -06004025 }
4026}
4027
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004028void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
4029 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
4030 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
4031 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
4032 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
4033 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
4034 uint32_t width, uint32_t height, uint32_t depth) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004035 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004036 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004037 cb_state->hasTraceRaysCmd = true;
4038}
4039
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004040void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
4041 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4042 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4043 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4044 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
4045 uint32_t height, uint32_t depth) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004046 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004047 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004048 cb_state->hasTraceRaysCmd = true;
4049}
4050
4051void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
4052 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4053 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4054 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4055 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
4056 VkDeviceAddress indirectDeviceAddress) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004057 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004058 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004059 cb_state->hasTraceRaysCmd = true;
4060}
4061
locke-lunargd556cc32019-09-17 01:21:23 -06004062void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
4063 const VkAllocationCallbacks *pAllocator,
4064 VkShaderModule *pShaderModule, VkResult result,
4065 void *csm_state_data) {
4066 if (VK_SUCCESS != result) return;
4067 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
4068
sfricke-samsung45996a42021-09-16 13:45:27 -07004069 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06004070 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05004071 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
4072 csm_state->unique_shader_id)
4073 : std::make_shared<SHADER_MODULE_STATE>();
Jeremy Gebben082a9832021-10-28 13:40:11 -06004074 Add(std::move(new_shader_module));
locke-lunargd556cc32019-09-17 01:21:23 -06004075}
4076
John Zulauf22b0fbe2019-10-15 06:26:16 -06004077void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
4078 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
4079 VkResult result) {
4080 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06004081 auto swapchain_state = Get<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004082
4083 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
4084
4085 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004086 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07004087 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07004088 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06004089
Lionel Landwerlin15ed1f62022-01-12 16:54:05 +02004090 auto format_features = GetImageFormatFeatures(
4091 physical_device, has_format_feature2, IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier), device,
4092 pSwapchainImages[i], swapchain_state->image_create_info.format, swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004093
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06004094 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004095 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004096 if (!swapchain_image.fake_base_address) {
4097 auto size = image_state->fragment_encoder->TotalSize();
4098 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07004099 }
4100
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004101 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004102 swapchain_image.image_state = image_state.get();
Jeremy Gebben082a9832021-10-28 13:40:11 -06004103 Add(std::move(image_state));
John Zulauf22b0fbe2019-10-15 06:26:16 -06004104 }
4105 }
4106
4107 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004108 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
4109 }
4110}
sourav parmar35e7a002020-06-09 17:58:44 -07004111
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02004112void ValidationStateTracker::PostCallRecordCopyAccelerationStructureKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
4113 const VkCopyAccelerationStructureInfoKHR *pInfo,
4114 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004115 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
4116 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02004117 if (dst_as_state != nullptr && src_as_state != nullptr) {
4118 dst_as_state->built = true;
4119 dst_as_state->build_info_khr = src_as_state->build_info_khr;
4120 }
4121}
4122
sourav parmar35e7a002020-06-09 17:58:44 -07004123void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
4124 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004125 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07004126 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004127 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004128 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
4129 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07004130 if (dst_as_state != nullptr && src_as_state != nullptr) {
4131 dst_as_state->built = true;
4132 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004133 if (!disabled[command_buffer_state]) {
4134 cb_state->AddChild(dst_as_state);
4135 cb_state->AddChild(src_as_state);
4136 }
sourav parmar35e7a002020-06-09 17:58:44 -07004137 }
4138 }
4139}
Piers Daniell39842ee2020-07-10 16:42:33 -06004140
4141void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004142 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004143 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004144}
4145
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004146void ValidationStateTracker::PreCallRecordCmdSetCullMode(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
4147 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4148 cb_state->RecordStateCmd(CMD_SETCULLMODE, CBSTATUS_CULL_MODE_SET);
4149}
4150
Piers Daniell39842ee2020-07-10 16:42:33 -06004151void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004152 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004153 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004154}
4155
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004156void ValidationStateTracker::PreCallRecordCmdSetFrontFace(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
4157 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4158 cb_state->RecordStateCmd(CMD_SETFRONTFACE, CBSTATUS_FRONT_FACE_SET);
4159}
4160
Piers Daniell39842ee2020-07-10 16:42:33 -06004161void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
4162 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004163 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004164 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004165 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06004166}
4167
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004168void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopology(VkCommandBuffer commandBuffer,
4169 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004170 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004171 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGY, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
4172 cb_state->primitiveTopology = primitiveTopology;
4173}
4174
4175void ValidationStateTracker::RecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4176 const VkViewport *pViewports, CMD_TYPE cmdType) {
4177 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4178 cb_state->RecordStateCmd(cmdType, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004179 uint32_t bits = (1u << viewportCount) - 1u;
4180 cb_state->viewportWithCountMask |= bits;
4181 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00004182 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004183 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004184
4185 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
4186 for (size_t i = 0; i < viewportCount; ++i) {
4187 cb_state->dynamicViewports[i] = pViewports[i];
4188 }
Piers Daniell39842ee2020-07-10 16:42:33 -06004189}
4190
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004191void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4192 const VkViewport *pViewports) {
4193 RecordCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports, CMD_SETVIEWPORTWITHCOUNTEXT);
4194}
4195
4196void ValidationStateTracker::PreCallRecordCmdSetViewportWithCount(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4197 const VkViewport *pViewports) {
4198 RecordCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports, CMD_SETVIEWPORTWITHCOUNT);
4199}
4200
4201void ValidationStateTracker::RecordCmdSetScissorWithCount(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4202 const VkRect2D *pScissors, CMD_TYPE cmdType) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004203 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004204 cb_state->RecordStateCmd(cmdType, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004205 uint32_t bits = (1u << scissorCount) - 1u;
4206 cb_state->scissorWithCountMask |= bits;
4207 cb_state->trashedScissorMask &= ~bits;
4208 cb_state->scissorWithCountCount = scissorCount;
4209 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06004210}
4211
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004212void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4213 const VkRect2D *pScissors) {
4214 RecordCmdSetScissorWithCount(commandBuffer, scissorCount, pScissors, CMD_SETSCISSORWITHCOUNTEXT);
4215}
4216
4217void ValidationStateTracker::PreCallRecordCmdSetScissorWithCount(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4218 const VkRect2D *pScissors) {
4219 RecordCmdSetScissorWithCount(commandBuffer, scissorCount, pScissors, CMD_SETSCISSORWITHCOUNT);
4220}
4221
4222void ValidationStateTracker::RecordCmdBindVertexBuffers2(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4223 uint32_t bindingCount, const VkBuffer *pBuffers,
4224 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4225 const VkDeviceSize *pStrides, CMD_TYPE cmd_type) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004226 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004227 cb_state->RecordStateCmd(cmd_type, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06004228
4229 uint32_t end = firstBinding + bindingCount;
4230 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
4231 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
4232 }
4233
4234 for (uint32_t i = 0; i < bindingCount; ++i) {
4235 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06004236 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004237 vertex_buffer_binding.offset = pOffsets[i];
4238 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4239 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4240 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004241 if (!disabled[command_buffer_state] && pBuffers[i]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06004242 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Piers Daniell39842ee2020-07-10 16:42:33 -06004243 }
4244 }
4245}
4246
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004247void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4248 uint32_t bindingCount, const VkBuffer *pBuffers,
4249 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4250 const VkDeviceSize *pStrides) {
4251 RecordCmdBindVertexBuffers2(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides,
4252 CMD_BINDVERTEXBUFFERS2EXT);
4253}
4254
4255void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4256 uint32_t bindingCount, const VkBuffer *pBuffers,
4257 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4258 const VkDeviceSize *pStrides) {
4259 RecordCmdBindVertexBuffers2(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides,
4260 CMD_BINDVERTEXBUFFERS2);
4261}
4262
Piers Daniell39842ee2020-07-10 16:42:33 -06004263void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004264 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004265 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004266}
4267
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004268void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnable(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
4269 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4270 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLE, CBSTATUS_DEPTH_TEST_ENABLE_SET);
4271}
4272
Piers Daniell39842ee2020-07-10 16:42:33 -06004273void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004274 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004275 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004276}
4277
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004278void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnable(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
4279 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4280 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLE, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
4281}
4282
Piers Daniell39842ee2020-07-10 16:42:33 -06004283void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004284 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004285 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004286}
4287
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004288void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOp(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
4289 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4290 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOP, CBSTATUS_DEPTH_COMPARE_OP_SET);
4291}
4292
Piers Daniell39842ee2020-07-10 16:42:33 -06004293void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4294 VkBool32 depthBoundsTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004295 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004296 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004297}
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004298
4299void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnable(VkCommandBuffer commandBuffer,
4300 VkBool32 depthBoundsTestEnable) {
4301 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4302 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLE, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
4303}
4304
Piers Daniell39842ee2020-07-10 16:42:33 -06004305void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004306 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004307 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004308}
4309
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004310void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnable(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
4311 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4312 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLE, CBSTATUS_STENCIL_TEST_ENABLE_SET);
4313}
4314
Piers Daniell39842ee2020-07-10 16:42:33 -06004315void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4316 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4317 VkCompareOp compareOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004318 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004319 cb_state->RecordStateCmd(CMD_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004320}
locke-lunarg4189aa22020-10-21 00:23:48 -06004321
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004322void ValidationStateTracker::PreCallRecordCmdSetStencilOp(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4323 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4324 VkCompareOp compareOp) {
4325 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4326 cb_state->RecordStateCmd(CMD_SETSTENCILOP, CBSTATUS_STENCIL_OP_SET);
4327}
4328
locke-lunarg4189aa22020-10-21 00:23:48 -06004329void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4330 uint32_t discardRectangleCount,
4331 const VkRect2D *pDiscardRectangles) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004332 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004333 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004334}
4335
4336void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4337 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004338 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004339 cb_state->RecordStateCmd(CMD_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004340}
4341
4342void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4343 VkCoarseSampleOrderTypeNV sampleOrderType,
4344 uint32_t customSampleOrderCount,
4345 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
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_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004348}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004349
4350void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004351 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004352 cb_state->RecordStateCmd(CMD_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004353}
4354
4355void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004356 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004357 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004358}
4359
4360void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4361 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004362 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004363 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004364}
4365
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004366void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnable(VkCommandBuffer commandBuffer,
4367 VkBool32 rasterizerDiscardEnable) {
4368 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4369 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLE, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
4370}
4371
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004372void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004373 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004374 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004375}
4376
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004377void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnable(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
4378 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4379 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLE, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
4380}
4381
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004382void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4383 VkBool32 primitiveRestartEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004384 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004385 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004386}
Piers Daniell924cd832021-05-18 13:48:47 -06004387
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004388void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnable(VkCommandBuffer commandBuffer,
4389 VkBool32 primitiveRestartEnable) {
4390 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4391 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLE, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
4392}
4393
Piers Daniell924cd832021-05-18 13:48:47 -06004394void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4395 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4396 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4397 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004398 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004399 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4400
4401 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4402 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4403 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004404 if (pipeline_state->create_info.graphics.pDynamicState) {
4405 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4406 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004407 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4408 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4409 break;
4410 }
4411 }
4412 }
4413 }
4414 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004415}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004416
4417void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004418 auto buffer_state = Get<BUFFER_STATE>(pInfo->buffer);
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004419 if (buffer_state) {
4420 // address is used for GPU-AV and ray tracing buffer validation
4421 buffer_state->deviceAddress = address;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06004422 buffer_address_map_.insert(address, buffer_state.get());
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004423 }
4424}
4425
4426void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4427 VkDeviceAddress address) {
4428 RecordGetBufferDeviceAddress(pInfo, address);
4429}
4430
4431void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4432 VkDeviceAddress address) {
4433 RecordGetBufferDeviceAddress(pInfo, address);
4434}
4435
4436void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4437 VkDeviceAddress address) {
4438 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004439}
4440
4441std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4442 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004443 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004444}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004445
4446std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4447 const VkCommandBufferAllocateInfo *create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06004448 const COMMAND_POOL_STATE *pool) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004449 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4450}