blob: 75c43b4d8f42594942bf2375be9dae529e574c22 [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
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002747void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2748 VkPipelineStageFlags stageMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002749 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002750 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002751}
2752
2753void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2754 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002755 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002756 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002757}
2758
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002759void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2760 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
2761 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2762 uint32_t bufferMemoryBarrierCount,
2763 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2764 uint32_t imageMemoryBarrierCount,
2765 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002766 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2767 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents, sourceStageMask);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002768 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2769 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002770}
2771
2772void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
2773 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002774 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben79649152021-06-22 14:46:24 -06002775 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002776 const auto &dep_info = pDependencyInfos[i];
2777 auto stage_masks = sync_utils::GetGlobalStageMasks(dep_info);
2778 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, 1, &pEvents[i], stage_masks.src);
2779 cb_state->RecordBarriers(dep_info);
Jeremy Gebben79649152021-06-22 14:46:24 -06002780 }
2781}
2782
2783void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2784 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2785 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2786 uint32_t bufferMemoryBarrierCount,
2787 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2788 uint32_t imageMemoryBarrierCount,
2789 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002790 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002791 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
2792 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2793 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06002794}
2795
2796void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
2797 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002798 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002799 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
2800 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06002801}
2802
locke-lunargd556cc32019-09-17 01:21:23 -06002803void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
2804 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002805 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002806
locke-lunargd556cc32019-09-17 01:21:23 -06002807 QueryObject query = {queryPool, slot};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002808 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002809 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002810 if (!disabled[query_validation]) {
2811 cb_state->BeginQuery(query);
2812 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002813 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002814 auto pool_state = Get<QUERY_POOL_STATE>(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002815 cb_state->AddChild(pool_state);
2816 }
locke-lunargd556cc32019-09-17 01:21:23 -06002817}
2818
2819void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002820 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002821 QueryObject query_obj = {queryPool, slot};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002822 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002823 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002824 if (!disabled[query_validation]) {
2825 cb_state->EndQuery(query_obj);
2826 }
2827 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002828 auto pool_state = Get<QUERY_POOL_STATE>(query_obj.pool);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002829 cb_state->AddChild(pool_state);
2830 }
locke-lunargd556cc32019-09-17 01:21:23 -06002831}
2832
2833void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2834 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002835 if (disabled[query_validation]) return;
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002836 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002837
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002838 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002839 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02002840
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002841 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002842 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002843 cb_state->AddChild(pool_state);
2844 }
locke-lunargd556cc32019-09-17 01:21:23 -06002845}
2846
2847void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2848 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
2849 VkDeviceSize dstOffset, VkDeviceSize stride,
2850 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002851 if (disabled[query_validation] || disabled[command_buffer_state]) return;
2852
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002853 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002854 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002855 auto dst_buff_state = Get<BUFFER_STATE>(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002856 cb_state->AddChild(dst_buff_state);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002857 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002858 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002859}
2860
2861void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2862 VkQueryPool queryPool, uint32_t slot) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002863 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002864 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002865}
2866
2867void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
2868 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
2869 uint32_t slot) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002870 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002871 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06002872}
2873
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002874void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
2875 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
2876 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
2877 if (disabled[query_validation]) return;
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002878 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002879 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002880 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002881 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002882 cb_state->AddChild(pool_state);
2883 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002884 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002885}
2886
locke-lunargd556cc32019-09-17 01:21:23 -06002887void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2888 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
2889 VkResult result) {
2890 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002891
Jeremy Gebben88f58142021-06-01 10:07:52 -06002892 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08002893 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002894 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002895
locke-lunargd556cc32019-09-17 01:21:23 -06002896 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002897 views[i] = Get<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002898 }
2899 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06002900
Jeremy Gebben9f537102021-10-05 16:37:12 -06002901 Add(std::make_shared<FRAMEBUFFER_STATE>(*pFramebuffer, pCreateInfo, Get<RENDER_PASS_STATE>(pCreateInfo->renderPass),
Jeremy Gebben082a9832021-10-28 13:40:11 -06002902 std::move(views)));
locke-lunargd556cc32019-09-17 01:21:23 -06002903}
2904
locke-lunargd556cc32019-09-17 01:21:23 -06002905void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2906 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2907 VkResult result) {
2908 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002909 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002910}
2911
Mike Schuchardt2df08912020-12-15 16:28:09 -08002912void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002913 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2914 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002915 if (VK_SUCCESS != result) return;
2916
Jeremy Gebben082a9832021-10-28 13:40:11 -06002917 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002918}
2919
Mike Schuchardt2df08912020-12-15 16:28:09 -08002920void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002921 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2922 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002923 if (VK_SUCCESS != result) return;
2924
Jeremy Gebben082a9832021-10-28 13:40:11 -06002925 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002926}
2927
locke-lunargd556cc32019-09-17 01:21:23 -06002928void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
2929 const VkRenderPassBeginInfo *pRenderPassBegin,
2930 VkSubpassContents contents) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002931 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002932 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002933}
2934
2935void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
2936 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002937 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002938 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002939 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002940}
2941
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002942void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2943 uint32_t counterBufferCount,
2944 const VkBuffer *pCounterBuffers,
2945 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002946 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002947
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002948 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002949 cb_state->transform_feedback_active = true;
2950}
2951
2952void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2953 uint32_t counterBufferCount, 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_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002958 cb_state->transform_feedback_active = false;
2959}
2960
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002961void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
2962 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002963 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002964
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002965 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002966 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002967 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
2968 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002969}
2970
2971void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
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_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002975 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002976 cb_state->conditional_rendering_inside_render_pass = false;
2977 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002978}
2979
amhagana448ea52021-11-02 14:09:14 -04002980void ValidationStateTracker::RecordCmdEndRenderingRenderPassState(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002981 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002982 cb_state->activeRenderPass = nullptr;
2983}
2984
2985void ValidationStateTracker::PreCallRecordCmdBeginRenderingKHR(VkCommandBuffer commandBuffer,
2986 const VkRenderingInfoKHR *pRenderingInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002987 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002988 cb_state->BeginRendering(CMD_BEGINRENDERINGKHR, pRenderingInfo);
2989}
2990
2991void ValidationStateTracker::PreCallRecordCmdEndRenderingKHR(VkCommandBuffer commandBuffer) {
2992 RecordCmdEndRenderingRenderPassState(commandBuffer);
2993}
2994
Tony-LunarG977448c2019-12-02 14:52:02 -07002995void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
2996 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002997 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002998 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002999 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07003000}
3001
locke-lunargd556cc32019-09-17 01:21:23 -06003002void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003003 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003004 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003005}
3006
3007void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003008 const VkSubpassBeginInfo *pSubpassBeginInfo,
3009 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003010 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003011 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003012}
3013
Tony-LunarG977448c2019-12-02 14:52:02 -07003014void ValidationStateTracker::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003015 const VkSubpassBeginInfo *pSubpassBeginInfo,
3016 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003017 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003018 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003019}
3020
3021void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003022 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003023 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06003024}
3025
3026void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003027 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003028 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003029 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06003030}
3031
Tony-LunarG977448c2019-12-02 14:52:02 -07003032void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003033 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003034 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003035 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07003036}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003037
locke-lunargd556cc32019-09-17 01:21:23 -06003038void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
3039 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003040 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003041
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003042 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06003043}
3044
3045void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
3046 VkFlags flags, void **ppData, VkResult result) {
3047 if (VK_SUCCESS != result) return;
3048 RecordMappedMemory(mem, offset, size, ppData);
3049}
3050
3051void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003052 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06003053 if (mem_info) {
3054 mem_info->mapped_range = MemRange();
3055 mem_info->p_driver_data = nullptr;
3056 }
3057}
3058
3059void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003060 auto image_state = Get<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06003061 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06003062 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
3063 // See: VUID-vkGetImageSubresourceLayout-image-01895
3064 image_state->fragment_encoder =
3065 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07003066 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003067 if (swapchain_info) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003068 auto swapchain = Get<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003069 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003070 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07003071
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003072 if (!swapchain_image.fake_base_address) {
3073 auto size = image_state->fragment_encoder->TotalSize();
3074 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06003075 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003076 // All images bound to this swapchain and index are aliases
3077 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003078 }
3079 } else {
3080 // Track bound memory range information
Jeremy Gebben9f537102021-10-05 16:37:12 -06003081 auto mem_info = Get<DEVICE_MEMORY_STATE>(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06003082 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003083 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06003084 }
locke-lunargd556cc32019-09-17 01:21:23 -06003085 }
locke-lunargd556cc32019-09-17 01:21:23 -06003086 }
3087}
3088
3089void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
3090 VkDeviceSize memoryOffset, VkResult result) {
3091 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06003092 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003093 bind_info.image = image;
3094 bind_info.memory = mem;
3095 bind_info.memoryOffset = memoryOffset;
3096 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003097}
3098
3099void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003100 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003101 if (VK_SUCCESS != result) return;
3102 for (uint32_t i = 0; i < bindInfoCount; i++) {
3103 UpdateBindImageMemoryState(pBindInfos[i]);
3104 }
3105}
3106
3107void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003108 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003109 if (VK_SUCCESS != result) return;
3110 for (uint32_t i = 0; i < bindInfoCount; i++) {
3111 UpdateBindImageMemoryState(pBindInfos[i]);
3112 }
3113}
3114
3115void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003116 auto event_state = Get<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06003117 if (event_state) {
3118 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
3119 }
locke-lunargd556cc32019-09-17 01:21:23 -06003120}
3121
3122void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
3123 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
3124 VkResult result) {
3125 if (VK_SUCCESS != result) return;
3126 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
3127 pImportSemaphoreFdInfo->flags);
3128}
3129
3130void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003131 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003132 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07003133 if (semaphore_state) {
3134 semaphore_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06003135 }
3136}
3137
3138#ifdef VK_USE_PLATFORM_WIN32_KHR
3139void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
3140 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
3141 if (VK_SUCCESS != result) return;
3142 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
3143 pImportSemaphoreWin32HandleInfo->flags);
3144}
3145
3146void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
3147 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3148 HANDLE *pHandle, VkResult result) {
3149 if (VK_SUCCESS != result) return;
3150 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
3151}
3152
3153void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
3154 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
3155 if (VK_SUCCESS != result) return;
3156 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
3157 pImportFenceWin32HandleInfo->flags);
3158}
3159
3160void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
3161 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3162 HANDLE *pHandle, VkResult result) {
3163 if (VK_SUCCESS != result) return;
3164 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
3165}
3166#endif
3167
3168void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
3169 VkResult result) {
3170 if (VK_SUCCESS != result) return;
3171 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
3172}
3173
Mike Schuchardt2df08912020-12-15 16:28:09 -08003174void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
3175 VkFenceImportFlags flags) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003176 auto fence_node = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003177
3178 if (fence_node) {
3179 fence_node->Import(handle_type, flags);
locke-lunargd556cc32019-09-17 01:21:23 -06003180 }
3181}
3182
3183void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
3184 VkResult result) {
3185 if (VK_SUCCESS != result) return;
3186 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
3187}
3188
Mike Schuchardt2df08912020-12-15 16:28:09 -08003189void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003190 auto fence_state = Get<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06003191 if (fence_state) {
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003192 fence_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06003193 }
3194}
3195
3196void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3197 VkResult result) {
3198 if (VK_SUCCESS != result) return;
3199 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3200}
3201
3202void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3203 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3204 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003205 Add(std::make_shared<EVENT_STATE>(*pEvent, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003206}
3207
3208void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003209 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003210 SWAPCHAIN_NODE *old_swapchain_state) {
3211 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003212 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003213 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003214 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003215 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3216 surface_state->AddParent(swapchain.get());
3217 surface_state->swapchain = swapchain.get();
3218 swapchain->surface = std::move(surface_state);
Jeremy Gebben082a9832021-10-28 13:40:11 -06003219 Add(std::move(swapchain));
locke-lunargd556cc32019-09-17 01:21:23 -06003220 } else {
3221 surface_state->swapchain = nullptr;
3222 }
3223 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003224 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003225 if (old_swapchain_state) {
3226 old_swapchain_state->retired = true;
3227 }
3228 return;
3229}
3230
3231void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3232 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3233 VkResult result) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003234 auto surface_state = Get<SURFACE_STATE>(pCreateInfo->surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003235 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfo->oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003236 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003237}
3238
3239void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3240 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003241 Destroy<SWAPCHAIN_NODE>(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003242}
3243
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003244void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3245 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3246 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3247 VkResult result) {
3248 if (VK_SUCCESS != result) return;
3249 if (!pMode) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003250 Add(std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice));
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003251}
3252
locke-lunargd556cc32019-09-17 01:21:23 -06003253void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003254 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06003255 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3256 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003257 auto semaphore_state = Get<SEMAPHORE_STATE>(pPresentInfo->pWaitSemaphores[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003258 if (semaphore_state) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003259 semaphore_state->EnqueuePresent(queue_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003260 }
3261 }
3262
Tony-LunarG6f887e52021-07-27 11:23:14 -06003263 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003264 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3265 // 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
3266 // confused itself just as much.
3267 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3268 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3269 // Mark the image as having been released to the WSI
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003270 auto swapchain_data = Get<SWAPCHAIN_NODE>(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003271 if (swapchain_data) {
3272 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003273 if (present_id_info) {
3274 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3275 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3276 }
3277 }
locke-lunargd556cc32019-09-17 01:21:23 -06003278 }
3279 }
locke-lunargd556cc32019-09-17 01:21:23 -06003280}
3281
3282void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3283 const VkSwapchainCreateInfoKHR *pCreateInfos,
3284 const VkAllocationCallbacks *pAllocator,
3285 VkSwapchainKHR *pSwapchains, VkResult result) {
3286 if (pCreateInfos) {
3287 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003288 auto surface_state = Get<SURFACE_STATE>(pCreateInfos[i].surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003289 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfos[i].oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003290 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state),
3291 old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003292 }
3293 }
3294}
3295
3296void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3297 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003298 auto fence_state = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003299 if (fence_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003300 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3301 // import
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003302 fence_state->EnqueueSignal(nullptr, 0);
locke-lunargd556cc32019-09-17 01:21:23 -06003303 }
3304
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003305 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07003306 if (semaphore_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003307 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3308 // temporary import
Jeremy Gebben15332642021-12-15 19:33:15 -07003309 semaphore_state->EnqueueAcquire();
locke-lunargd556cc32019-09-17 01:21:23 -06003310 }
3311
3312 // Mark the image as acquired.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003313 auto swapchain_data = Get<SWAPCHAIN_NODE>(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003314 if (swapchain_data) {
3315 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003316 }
3317}
3318
3319void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3320 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3321 VkResult result) {
3322 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3323 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3324}
3325
3326void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3327 uint32_t *pImageIndex, VkResult result) {
3328 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3329 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3330 pAcquireInfo->fence, pImageIndex);
3331}
3332
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003333std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3334 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3335}
3336
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003337void ValidationStateTracker::PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
3338 const VkAllocationCallbacks *pAllocator, VkInstance *pInstance,
3339 VkResult result) {
3340 if (result != VK_SUCCESS) {
3341 return;
3342 }
Jeremy Gebben404f6ac2021-10-28 12:33:28 -06003343 instance_state = this;
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003344 uint32_t count = 0;
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003345 // this can fail if the allocator fails
3346 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, nullptr);
3347 if (result != VK_SUCCESS) {
3348 return;
3349 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003350 std::vector<VkPhysicalDevice> physdev_handles(count);
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003351 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, physdev_handles.data());
3352 if (result != VK_SUCCESS) {
3353 return;
3354 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003355
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003356 for (auto physdev : physdev_handles) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003357 Add(CreatePhysicalDeviceState(physdev));
locke-lunargd556cc32019-09-17 01:21:23 -06003358 }
3359}
3360
3361// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003362static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003363 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003364}
3365
3366void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3367 uint32_t *pQueueFamilyPropertyCount,
3368 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003369 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3370 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003371 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003372}
3373
3374void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003375 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003376 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3377 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003378 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003379}
3380
3381void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003382 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003383 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3384 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003385 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003386}
3387void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3388 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003389 Destroy<SURFACE_STATE>(surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003390}
3391
Jeremy Gebben082a9832021-10-28 13:40:11 -06003392void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) { Add(std::make_shared<SURFACE_STATE>(*pSurface)); }
locke-lunargd556cc32019-09-17 01:21:23 -06003393
3394void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3395 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3396 const VkAllocationCallbacks *pAllocator,
3397 VkSurfaceKHR *pSurface, VkResult result) {
3398 if (VK_SUCCESS != result) return;
3399 RecordVulkanSurface(pSurface);
3400}
3401
3402#ifdef VK_USE_PLATFORM_ANDROID_KHR
3403void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3404 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3405 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3406 VkResult result) {
3407 if (VK_SUCCESS != result) return;
3408 RecordVulkanSurface(pSurface);
3409}
3410#endif // VK_USE_PLATFORM_ANDROID_KHR
3411
3412#ifdef VK_USE_PLATFORM_IOS_MVK
3413void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *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_IOS_MVK
3420
3421#ifdef VK_USE_PLATFORM_MACOS_MVK
3422void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3423 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3424 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3425 VkResult result) {
3426 if (VK_SUCCESS != result) return;
3427 RecordVulkanSurface(pSurface);
3428}
3429#endif // VK_USE_PLATFORM_MACOS_MVK
3430
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003431#ifdef VK_USE_PLATFORM_METAL_EXT
3432void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3433 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3434 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3435 VkResult result) {
3436 if (VK_SUCCESS != result) return;
3437 RecordVulkanSurface(pSurface);
3438}
3439#endif // VK_USE_PLATFORM_METAL_EXT
3440
locke-lunargd556cc32019-09-17 01:21:23 -06003441#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3442void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3443 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3444 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3445 VkResult result) {
3446 if (VK_SUCCESS != result) return;
3447 RecordVulkanSurface(pSurface);
3448}
3449#endif // VK_USE_PLATFORM_WAYLAND_KHR
3450
3451#ifdef VK_USE_PLATFORM_WIN32_KHR
3452void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3453 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
3454 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3455 VkResult result) {
3456 if (VK_SUCCESS != result) return;
3457 RecordVulkanSurface(pSurface);
3458}
3459#endif // VK_USE_PLATFORM_WIN32_KHR
3460
3461#ifdef VK_USE_PLATFORM_XCB_KHR
3462void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *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_XCB_KHR
3469
3470#ifdef VK_USE_PLATFORM_XLIB_KHR
3471void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *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_XLIB_KHR
3478
Niklas Haas8b84af12020-04-19 22:20:11 +02003479void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3480 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3481 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3482 VkResult result) {
3483 if (VK_SUCCESS != result) return;
3484 RecordVulkanSurface(pSurface);
3485}
3486
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003487void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
3488 VkSurfaceKHR surface,
3489 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities,
3490 VkResult result) {
3491 if (VK_SUCCESS != result) return;
3492 auto surface_state = Get<SURFACE_STATE>(surface);
3493 surface_state->SetCapabilities(physicalDevice, *pSurfaceCapabilities);
3494}
3495
3496void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
3497 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3498 VkSurfaceCapabilities2KHR *pSurfaceCapabilities, VkResult result) {
3499 if (VK_SUCCESS != result) return;
3500 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3501 surface_state->SetCapabilities(physicalDevice, pSurfaceCapabilities->surfaceCapabilities);
3502}
3503
3504void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice,
3505 VkSurfaceKHR surface,
3506 VkSurfaceCapabilities2EXT *pSurfaceCapabilities,
3507 VkResult result) {
3508 auto surface_state = Get<SURFACE_STATE>(surface);
3509 VkSurfaceCapabilitiesKHR caps{
3510 pSurfaceCapabilities->minImageCount, pSurfaceCapabilities->maxImageCount,
3511 pSurfaceCapabilities->currentExtent, pSurfaceCapabilities->minImageExtent,
3512 pSurfaceCapabilities->maxImageExtent, pSurfaceCapabilities->maxImageArrayLayers,
3513 pSurfaceCapabilities->supportedTransforms, pSurfaceCapabilities->currentTransform,
3514 pSurfaceCapabilities->supportedCompositeAlpha, pSurfaceCapabilities->supportedUsageFlags,
3515 };
3516 surface_state->SetCapabilities(physicalDevice, caps);
3517}
3518
locke-lunargd556cc32019-09-17 01:21:23 -06003519void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3520 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3521 VkBool32 *pSupported, VkResult result) {
3522 if (VK_SUCCESS != result) return;
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003523 auto surface_state = Get<SURFACE_STATE>(surface);
3524 surface_state->SetQueueSupport(physicalDevice, queueFamilyIndex, (*pSupported == VK_TRUE));
3525}
3526
3527void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
3528 VkSurfaceKHR surface,
3529 uint32_t *pPresentModeCount,
3530 VkPresentModeKHR *pPresentModes,
3531 VkResult result) {
3532 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3533
3534 if (pPresentModes) {
3535 auto surface_state = Get<SURFACE_STATE>(surface);
3536 surface_state->SetPresentModes(physicalDevice,
3537 std::vector<VkPresentModeKHR>(pPresentModes, pPresentModes + *pPresentModeCount));
3538 }
3539}
3540
3541void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
3542 uint32_t *pSurfaceFormatCount,
3543 VkSurfaceFormatKHR *pSurfaceFormats,
3544 VkResult result) {
3545 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3546
3547 if (pSurfaceFormats) {
3548 auto surface_state = Get<SURFACE_STATE>(surface);
3549 surface_state->SetFormats(physicalDevice,
3550 std::vector<VkSurfaceFormatKHR>(pSurfaceFormats, pSurfaceFormats + *pSurfaceFormatCount));
3551 }
3552}
3553
3554void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
3555 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3556 uint32_t *pSurfaceFormatCount,
3557 VkSurfaceFormat2KHR *pSurfaceFormats,
3558 VkResult result) {
3559 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3560
3561 if (pSurfaceFormats) {
3562 std::vector<VkSurfaceFormatKHR> fmts(*pSurfaceFormatCount);
3563 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3564 for (uint32_t i = 0; i < *pSurfaceFormatCount; i++) {
3565 fmts[i] = pSurfaceFormats[i].surfaceFormat;
3566 }
3567 surface_state->SetFormats(physicalDevice, std::move(fmts));
3568 }
locke-lunargd556cc32019-09-17 01:21:23 -06003569}
3570
locke-lunargd556cc32019-09-17 01:21:23 -06003571void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3572 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003573 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003574 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003575 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3576}
3577
3578void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003579 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003580 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003581 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3582}
3583
3584void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3585 const VkDebugUtilsLabelEXT *pLabelInfo) {
3586 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3587
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_INSERTDEBUGUTILSLABELEXT);
3590 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003591 cb_state->debug_label = LoggingLabel(pLabelInfo);
3592}
3593
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003594void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3595 uint32_t queueFamilyIndex,
3596 uint32_t *pCounterCount,
3597 VkPerformanceCounterKHR *pCounters) {
3598 if (NULL == pCounters) return;
3599
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003600 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3601 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003602
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003603 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3604 queue_family_counters->counters.resize(*pCounterCount);
3605 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003606
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003607 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003608}
3609
3610void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3611 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3612 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3613 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3614 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3615}
3616
3617void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3618 VkResult result) {
3619 if (result == VK_SUCCESS) performance_lock_acquired = true;
3620}
3621
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003622void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3623 performance_lock_acquired = false;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06003624 for (auto &cmd_buffer : command_buffer_map_.snapshot()) {
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003625 cmd_buffer.second->performance_lock_released = true;
3626 }
3627}
3628
locke-lunargd556cc32019-09-17 01:21:23 -06003629void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003630 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003631 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003632 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003633}
3634
3635void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003636 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003637 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003638 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003639}
3640
Mike Schuchardt2df08912020-12-15 16:28:09 -08003641void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3642 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003643 Add(std::make_shared<UPDATE_TEMPLATE_STATE>(*pDescriptorUpdateTemplate, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06003644}
3645
Mike Schuchardt2df08912020-12-15 16:28:09 -08003646void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3647 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3648 const VkAllocationCallbacks *pAllocator,
3649 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3650 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003651 if (VK_SUCCESS != result) return;
3652 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3653}
3654
3655void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003656 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3657 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003658 if (VK_SUCCESS != result) return;
3659 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3660}
3661
3662void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003663 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003664 const void *pData) {
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003665 auto const template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
3666 assert(template_state);
3667 if (template_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003668 // TODO: Record template push descriptor updates
3669 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003670 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state.get(), pData);
locke-lunargd556cc32019-09-17 01:21:23 -06003671 }
3672 }
3673}
3674
3675void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3676 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3677 const void *pData) {
3678 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3679}
3680
3681void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003682 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003683 const void *pData) {
3684 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3685}
3686
Mike Schuchardt2df08912020-12-15 16:28:09 -08003687void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3688 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3689 VkPipelineLayout layout, uint32_t set,
3690 const void *pData) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003691 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003692
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003693 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003694 const auto template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003695 if (template_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003696 auto layout_data = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003697 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003698 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003699 // Decode the template into a set of write updates
Jeremy Gebben9f537102021-10-05 16:37:12 -06003700 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state.get(), pData,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003701 dsl->GetDescriptorSetLayout());
Jeremy Gebben9f537102021-10-05 16:37:12 -06003702 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data.get(), set,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003703 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3704 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003705 }
3706}
3707
3708void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3709 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003710 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003711 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003712 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003713 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003714 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003715 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003716 }
3717}
3718
3719void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3720 uint32_t *pPropertyCount,
3721 VkDisplayPlanePropertiesKHR *pProperties,
3722 VkResult result) {
3723 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3724 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3725}
3726
3727void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3728 uint32_t *pPropertyCount,
3729 VkDisplayPlaneProperties2KHR *pProperties,
3730 VkResult result) {
3731 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3732 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3733}
3734
3735void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3736 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3737 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003738 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003739 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003740 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003741}
3742
3743void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3744 uint32_t query, uint32_t index) {
3745 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003746 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003747 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003748 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003749}
3750
3751void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3752 VkSamplerYcbcrConversion ycbcr_conversion) {
Lionel Landwerlin21719f62021-12-09 11:40:09 +02003753 VkFormatFeatureFlags2KHR format_features = 0;
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003754
3755 if (create_info->format != VK_FORMAT_UNDEFINED) {
3756 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07003757 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003758 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
3759 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003760 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003761
Jeremy Gebben082a9832021-10-28 13:40:11 -06003762 Add(std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features));
locke-lunargd556cc32019-09-17 01:21:23 -06003763}
3764
3765void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
3766 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3767 const VkAllocationCallbacks *pAllocator,
3768 VkSamplerYcbcrConversion *pYcbcrConversion,
3769 VkResult result) {
3770 if (VK_SUCCESS != result) return;
3771 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3772}
3773
3774void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(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::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
3784 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003785 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003786}
3787
3788void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
3789 VkSamplerYcbcrConversion ycbcrConversion,
3790 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003791 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003792}
3793
Tony-LunarG977448c2019-12-02 14:52:02 -07003794void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3795 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06003796 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07003797 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003798
3799 // Do nothing if the query pool has been destroyed.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003800 auto query_pool_state = Get<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06003801 if (!query_pool_state) return;
3802
3803 // Reset the state of existing entries.
locke-lunargd556cc32019-09-17 01:21:23 -06003804 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
3805 for (uint32_t i = 0; i < max_query_count; ++i) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003806 auto query_index = firstQuery + i;
3807 query_pool_state->SetQueryState(query_index, 0, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003808 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003809 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003810 query_pool_state->SetQueryState(query_index, pass_index, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003811 }
3812 }
locke-lunargd556cc32019-09-17 01:21:23 -06003813 }
3814}
3815
Tony-LunarG977448c2019-12-02 14:52:02 -07003816void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3817 uint32_t queryCount) {
3818 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3819}
3820
3821void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3822 uint32_t queryCount) {
3823 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3824}
3825
locke-lunargd556cc32019-09-17 01:21:23 -06003826void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003827 const UPDATE_TEMPLATE_STATE *template_state,
3828 const void *pData) {
locke-lunargd556cc32019-09-17 01:21:23 -06003829 // Translate the templated update into a normal update for validation...
3830 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
3831 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
3832 decoded_update.desc_writes.data(), 0, NULL);
3833}
3834
3835// Update the common AllocateDescriptorSetsData
3836void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05003837 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06003838 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003839 auto layout = Get<cvdescriptorset::DescriptorSetLayout>(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003840 if (layout) {
3841 ds_data->layout_nodes[i] = layout;
3842 // Count total descriptors required per type
3843 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
3844 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003845 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
3846 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003847 }
3848 }
3849 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
3850 }
3851}
3852
locke-lunargd556cc32019-09-17 01:21:23 -06003853void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3854 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003855 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003856 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003857}
3858
Tony-LunarG745150c2021-07-02 15:07:31 -06003859void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3860 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
3861 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003862 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003863 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003864}
3865
locke-lunargd556cc32019-09-17 01:21:23 -06003866void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3867 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3868 uint32_t firstInstance) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003869 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003870 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003871}
3872
Tony-LunarG745150c2021-07-02 15:07:31 -06003873void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3874 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
3875 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
3876 const int32_t *pVertexOffset) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003877 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003878 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003879}
3880
locke-lunargd556cc32019-09-17 01:21:23 -06003881void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3882 uint32_t count, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003883 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003884 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003885 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003886 if (!disabled[command_buffer_state]) {
3887 cb_state->AddChild(buffer_state);
3888 }
locke-lunargd556cc32019-09-17 01:21:23 -06003889}
3890
3891void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3892 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003893 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003894 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003895 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003896 if (!disabled[command_buffer_state]) {
3897 cb_state->AddChild(buffer_state);
3898 }
locke-lunargd556cc32019-09-17 01:21:23 -06003899}
3900
3901void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003902 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003903 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06003904}
3905
3906void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3907 VkDeviceSize offset) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003908 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003909 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003910 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003911 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003912 cb_state->AddChild(buffer_state);
3913 }
locke-lunargd556cc32019-09-17 01:21:23 -06003914}
3915
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003916void ValidationStateTracker::PostCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3917 uint32_t, uint32_t) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003918 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003919 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3920}
3921
3922void ValidationStateTracker::PostCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3923 uint32_t, uint32_t) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003924 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003925 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3926}
3927
Tony-LunarG977448c2019-12-02 14:52:02 -07003928void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3929 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07003930 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003931 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003932 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003933 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003934 auto buffer_state = Get<BUFFER_STATE>(buffer);
3935 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003936 cb_state->AddChild(buffer_state);
3937 cb_state->AddChild(count_buffer_state);
3938 }
Tony-LunarG977448c2019-12-02 14:52:02 -07003939}
3940
locke-lunargd556cc32019-09-17 01:21:23 -06003941void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3942 VkDeviceSize offset, VkBuffer countBuffer,
3943 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3944 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003945 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003946 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003947}
3948
3949void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3950 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3951 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003952 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003953 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07003954}
3955
3956void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3957 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07003958 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003959 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003960 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003961 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003962 auto buffer_state = Get<BUFFER_STATE>(buffer);
3963 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003964 cb_state->AddChild(buffer_state);
3965 cb_state->AddChild(count_buffer_state);
3966 }
locke-lunargd556cc32019-09-17 01:21:23 -06003967}
3968
3969void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3970 VkDeviceSize offset, VkBuffer countBuffer,
3971 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3972 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003973 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003974 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003975}
3976
3977void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
3978 VkDeviceSize offset, VkBuffer countBuffer,
3979 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3980 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003981 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003982 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06003983}
3984
3985void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
3986 uint32_t firstTask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003987 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003988 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003989}
3990
3991void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
3992 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003993 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003994 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003995 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003996 if (!disabled[command_buffer_state] && buffer_state) {
3997 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003998 }
3999}
4000
4001void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4002 VkDeviceSize offset, VkBuffer countBuffer,
4003 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4004 uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004005 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004006 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004007 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004008 auto buffer_state = Get<BUFFER_STATE>(buffer);
4009 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004010 if (buffer_state) {
4011 cb_state->AddChild(buffer_state);
4012 }
4013 if (count_buffer_state) {
4014 cb_state->AddChild(count_buffer_state);
4015 }
locke-lunargd556cc32019-09-17 01:21:23 -06004016 }
4017}
4018
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004019void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
4020 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
4021 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
4022 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
4023 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
4024 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
4025 uint32_t width, uint32_t height, uint32_t depth) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004026 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004027 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004028 cb_state->hasTraceRaysCmd = true;
4029}
4030
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004031void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
4032 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4033 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4034 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4035 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
4036 uint32_t height, uint32_t depth) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004037 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004038 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004039 cb_state->hasTraceRaysCmd = true;
4040}
4041
4042void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
4043 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4044 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4045 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4046 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
4047 VkDeviceAddress indirectDeviceAddress) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004048 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004049 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004050 cb_state->hasTraceRaysCmd = true;
4051}
4052
locke-lunargd556cc32019-09-17 01:21:23 -06004053void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
4054 const VkAllocationCallbacks *pAllocator,
4055 VkShaderModule *pShaderModule, VkResult result,
4056 void *csm_state_data) {
4057 if (VK_SUCCESS != result) return;
4058 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
4059
sfricke-samsung45996a42021-09-16 13:45:27 -07004060 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06004061 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05004062 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
4063 csm_state->unique_shader_id)
4064 : std::make_shared<SHADER_MODULE_STATE>();
Jeremy Gebben082a9832021-10-28 13:40:11 -06004065 Add(std::move(new_shader_module));
locke-lunargd556cc32019-09-17 01:21:23 -06004066}
4067
John Zulauf22b0fbe2019-10-15 06:26:16 -06004068void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
4069 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
4070 VkResult result) {
4071 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06004072 auto swapchain_state = Get<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004073
4074 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
4075
4076 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004077 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07004078 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07004079 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06004080
Lionel Landwerlin15ed1f62022-01-12 16:54:05 +02004081 auto format_features = GetImageFormatFeatures(
4082 physical_device, has_format_feature2, IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier), device,
4083 pSwapchainImages[i], swapchain_state->image_create_info.format, swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004084
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06004085 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004086 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004087 if (!swapchain_image.fake_base_address) {
4088 auto size = image_state->fragment_encoder->TotalSize();
4089 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07004090 }
4091
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004092 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004093 swapchain_image.image_state = image_state.get();
Jeremy Gebben082a9832021-10-28 13:40:11 -06004094 Add(std::move(image_state));
John Zulauf22b0fbe2019-10-15 06:26:16 -06004095 }
4096 }
4097
4098 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004099 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
4100 }
4101}
sourav parmar35e7a002020-06-09 17:58:44 -07004102
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02004103void ValidationStateTracker::PostCallRecordCopyAccelerationStructureKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
4104 const VkCopyAccelerationStructureInfoKHR *pInfo,
4105 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004106 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
4107 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02004108 if (dst_as_state != nullptr && src_as_state != nullptr) {
4109 dst_as_state->built = true;
4110 dst_as_state->build_info_khr = src_as_state->build_info_khr;
4111 }
4112}
4113
sourav parmar35e7a002020-06-09 17:58:44 -07004114void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
4115 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004116 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07004117 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004118 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004119 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
4120 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07004121 if (dst_as_state != nullptr && src_as_state != nullptr) {
4122 dst_as_state->built = true;
4123 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004124 if (!disabled[command_buffer_state]) {
4125 cb_state->AddChild(dst_as_state);
4126 cb_state->AddChild(src_as_state);
4127 }
sourav parmar35e7a002020-06-09 17:58:44 -07004128 }
4129 }
4130}
Piers Daniell39842ee2020-07-10 16:42:33 -06004131
4132void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004133 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004134 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004135}
4136
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004137void ValidationStateTracker::PreCallRecordCmdSetCullMode(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
4138 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4139 cb_state->RecordStateCmd(CMD_SETCULLMODE, CBSTATUS_CULL_MODE_SET);
4140}
4141
Piers Daniell39842ee2020-07-10 16:42:33 -06004142void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004143 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004144 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004145}
4146
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004147void ValidationStateTracker::PreCallRecordCmdSetFrontFace(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
4148 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4149 cb_state->RecordStateCmd(CMD_SETFRONTFACE, CBSTATUS_FRONT_FACE_SET);
4150}
4151
Piers Daniell39842ee2020-07-10 16:42:33 -06004152void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
4153 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004154 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004155 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004156 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06004157}
4158
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004159void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopology(VkCommandBuffer commandBuffer,
4160 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004161 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004162 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGY, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
4163 cb_state->primitiveTopology = primitiveTopology;
4164}
4165
4166void ValidationStateTracker::RecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4167 const VkViewport *pViewports, CMD_TYPE cmdType) {
4168 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4169 cb_state->RecordStateCmd(cmdType, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004170 uint32_t bits = (1u << viewportCount) - 1u;
4171 cb_state->viewportWithCountMask |= bits;
4172 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00004173 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004174 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004175
4176 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
4177 for (size_t i = 0; i < viewportCount; ++i) {
4178 cb_state->dynamicViewports[i] = pViewports[i];
4179 }
Piers Daniell39842ee2020-07-10 16:42:33 -06004180}
4181
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004182void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4183 const VkViewport *pViewports) {
4184 RecordCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports, CMD_SETVIEWPORTWITHCOUNTEXT);
4185}
4186
4187void ValidationStateTracker::PreCallRecordCmdSetViewportWithCount(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4188 const VkViewport *pViewports) {
4189 RecordCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports, CMD_SETVIEWPORTWITHCOUNT);
4190}
4191
4192void ValidationStateTracker::RecordCmdSetScissorWithCount(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4193 const VkRect2D *pScissors, CMD_TYPE cmdType) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004194 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004195 cb_state->RecordStateCmd(cmdType, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004196 uint32_t bits = (1u << scissorCount) - 1u;
4197 cb_state->scissorWithCountMask |= bits;
4198 cb_state->trashedScissorMask &= ~bits;
4199 cb_state->scissorWithCountCount = scissorCount;
4200 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06004201}
4202
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004203void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4204 const VkRect2D *pScissors) {
4205 RecordCmdSetScissorWithCount(commandBuffer, scissorCount, pScissors, CMD_SETSCISSORWITHCOUNTEXT);
4206}
4207
4208void ValidationStateTracker::PreCallRecordCmdSetScissorWithCount(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4209 const VkRect2D *pScissors) {
4210 RecordCmdSetScissorWithCount(commandBuffer, scissorCount, pScissors, CMD_SETSCISSORWITHCOUNT);
4211}
4212
4213void ValidationStateTracker::RecordCmdBindVertexBuffers2(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4214 uint32_t bindingCount, const VkBuffer *pBuffers,
4215 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4216 const VkDeviceSize *pStrides, CMD_TYPE cmd_type) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004217 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004218 cb_state->RecordStateCmd(cmd_type, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06004219
4220 uint32_t end = firstBinding + bindingCount;
4221 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
4222 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
4223 }
4224
4225 for (uint32_t i = 0; i < bindingCount; ++i) {
4226 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06004227 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004228 vertex_buffer_binding.offset = pOffsets[i];
4229 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4230 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4231 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004232 if (!disabled[command_buffer_state] && pBuffers[i]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06004233 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Piers Daniell39842ee2020-07-10 16:42:33 -06004234 }
4235 }
4236}
4237
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004238void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4239 uint32_t bindingCount, const VkBuffer *pBuffers,
4240 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4241 const VkDeviceSize *pStrides) {
4242 RecordCmdBindVertexBuffers2(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides,
4243 CMD_BINDVERTEXBUFFERS2EXT);
4244}
4245
4246void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4247 uint32_t bindingCount, const VkBuffer *pBuffers,
4248 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4249 const VkDeviceSize *pStrides) {
4250 RecordCmdBindVertexBuffers2(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides,
4251 CMD_BINDVERTEXBUFFERS2);
4252}
4253
Piers Daniell39842ee2020-07-10 16:42:33 -06004254void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004255 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004256 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004257}
4258
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004259void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnable(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
4260 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4261 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLE, CBSTATUS_DEPTH_TEST_ENABLE_SET);
4262}
4263
Piers Daniell39842ee2020-07-10 16:42:33 -06004264void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004265 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004266 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004267}
4268
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004269void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnable(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
4270 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4271 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLE, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
4272}
4273
Piers Daniell39842ee2020-07-10 16:42:33 -06004274void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004275 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004276 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004277}
4278
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004279void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOp(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
4280 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4281 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOP, CBSTATUS_DEPTH_COMPARE_OP_SET);
4282}
4283
Piers Daniell39842ee2020-07-10 16:42:33 -06004284void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4285 VkBool32 depthBoundsTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004286 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004287 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004288}
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004289
4290void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnable(VkCommandBuffer commandBuffer,
4291 VkBool32 depthBoundsTestEnable) {
4292 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4293 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLE, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
4294}
4295
Piers Daniell39842ee2020-07-10 16:42:33 -06004296void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004297 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004298 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004299}
4300
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004301void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnable(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
4302 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4303 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLE, CBSTATUS_STENCIL_TEST_ENABLE_SET);
4304}
4305
Piers Daniell39842ee2020-07-10 16:42:33 -06004306void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4307 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4308 VkCompareOp compareOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004309 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004310 cb_state->RecordStateCmd(CMD_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004311}
locke-lunarg4189aa22020-10-21 00:23:48 -06004312
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004313void ValidationStateTracker::PreCallRecordCmdSetStencilOp(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4314 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4315 VkCompareOp compareOp) {
4316 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4317 cb_state->RecordStateCmd(CMD_SETSTENCILOP, CBSTATUS_STENCIL_OP_SET);
4318}
4319
locke-lunarg4189aa22020-10-21 00:23:48 -06004320void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4321 uint32_t discardRectangleCount,
4322 const VkRect2D *pDiscardRectangles) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004323 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004324 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004325}
4326
4327void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4328 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004329 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004330 cb_state->RecordStateCmd(CMD_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004331}
4332
4333void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4334 VkCoarseSampleOrderTypeNV sampleOrderType,
4335 uint32_t customSampleOrderCount,
4336 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004337 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004338 cb_state->RecordStateCmd(CMD_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004339}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004340
4341void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004342 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004343 cb_state->RecordStateCmd(CMD_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004344}
4345
4346void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004347 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004348 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004349}
4350
4351void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4352 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004353 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004354 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004355}
4356
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004357void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnable(VkCommandBuffer commandBuffer,
4358 VkBool32 rasterizerDiscardEnable) {
4359 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4360 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLE, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
4361}
4362
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004363void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004364 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004365 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004366}
4367
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004368void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnable(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
4369 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4370 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLE, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
4371}
4372
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004373void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4374 VkBool32 primitiveRestartEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004375 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004376 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004377}
Piers Daniell924cd832021-05-18 13:48:47 -06004378
Tony-LunarG3f953ba2021-10-15 15:35:39 -06004379void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnable(VkCommandBuffer commandBuffer,
4380 VkBool32 primitiveRestartEnable) {
4381 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
4382 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLE, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
4383}
4384
Piers Daniell924cd832021-05-18 13:48:47 -06004385void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4386 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4387 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4388 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004389 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004390 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4391
4392 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4393 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4394 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004395 if (pipeline_state->create_info.graphics.pDynamicState) {
4396 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4397 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004398 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4399 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4400 break;
4401 }
4402 }
4403 }
4404 }
4405 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004406}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004407
4408void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004409 auto buffer_state = Get<BUFFER_STATE>(pInfo->buffer);
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004410 if (buffer_state) {
4411 // address is used for GPU-AV and ray tracing buffer validation
4412 buffer_state->deviceAddress = address;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06004413 buffer_address_map_.insert(address, buffer_state.get());
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004414 }
4415}
4416
4417void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4418 VkDeviceAddress address) {
4419 RecordGetBufferDeviceAddress(pInfo, address);
4420}
4421
4422void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4423 VkDeviceAddress address) {
4424 RecordGetBufferDeviceAddress(pInfo, address);
4425}
4426
4427void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4428 VkDeviceAddress address) {
4429 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004430}
4431
4432std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4433 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004434 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004435}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004436
4437std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4438 const VkCommandBufferAllocateInfo *create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06004439 const COMMAND_POOL_STATE *pool) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004440 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4441}