blob: 3f74fcd2a60eb9d07ae0bffd369f1927c2623534 [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 Landwerlind0f84e42021-12-07 15:46:09 +0200136VkFormatFeatureFlags2KHR GetImageFormatFeatures(VkPhysicalDevice physical_device, bool has_format_feature2, VkDevice device,
137 VkImage image, VkFormat format, VkImageTiling tiling) {
138 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>();
144 auto fmt_props_3 = LvlInitStruct<VkFormatProperties3KHR>(&fmt_drm_props);
145 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 Landwerlind0f84e42021-12-07 15:46:09 +0200214 format_features =
215 GetImageFormatFeatures(physical_device, has_format_feature2, device, *pImage, pCreateInfo->format, pCreateInfo->tiling);
locke-lunargd556cc32019-09-17 01:21:23 -0600216 }
Jeremy Gebben082a9832021-10-28 13:40:11 -0600217 Add(std::make_shared<IMAGE_STATE>(this, *pImage, pCreateInfo, format_features));
locke-lunargd556cc32019-09-17 01:21:23 -0600218}
219
220void ValidationStateTracker::PreCallRecordDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600221 Destroy<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -0600222}
223
224void ValidationStateTracker::PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
225 VkImageLayout imageLayout, const VkClearColorValue *pColor,
226 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600227 if (disabled[command_buffer_state]) return;
228
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700229 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600230 if (cb_node) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600231 cb_node->RecordTransferCmd(CMD_CLEARCOLORIMAGE, Get<IMAGE_STATE>(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600232 }
233}
234
235void ValidationStateTracker::PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image,
236 VkImageLayout imageLayout,
237 const VkClearDepthStencilValue *pDepthStencil,
238 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600239 if (disabled[command_buffer_state]) return;
240
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700241 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600242 if (cb_node) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600243 cb_node->RecordTransferCmd(CMD_CLEARDEPTHSTENCILIMAGE, Get<IMAGE_STATE>(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600244 }
245}
246
247void ValidationStateTracker::PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage,
248 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
249 uint32_t regionCount, const VkImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600250 if (disabled[command_buffer_state]) return;
251
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700252 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600253 cb_node->RecordTransferCmd(CMD_COPYIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600254}
255
Jeff Leger178b1e52020-10-05 12:22:23 -0400256void ValidationStateTracker::PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer,
257 const VkCopyImageInfo2KHR *pCopyImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600258 if (disabled[command_buffer_state]) return;
259
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700260 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600261 cb_node->RecordTransferCmd(CMD_COPYIMAGE2KHR, Get<IMAGE_STATE>(pCopyImageInfo->srcImage),
262 Get<IMAGE_STATE>(pCopyImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400263}
264
locke-lunargd556cc32019-09-17 01:21:23 -0600265void ValidationStateTracker::PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage,
266 VkImageLayout srcImageLayout, VkImage dstImage,
267 VkImageLayout dstImageLayout, uint32_t regionCount,
268 const VkImageResolve *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600269 if (disabled[command_buffer_state]) return;
270
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700271 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600272 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600273}
274
Jeff Leger178b1e52020-10-05 12:22:23 -0400275void ValidationStateTracker::PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer,
276 const VkResolveImageInfo2KHR *pResolveImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600277 if (disabled[command_buffer_state]) return;
278
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700279 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600280 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE2KHR, Get<IMAGE_STATE>(pResolveImageInfo->srcImage),
281 Get<IMAGE_STATE>(pResolveImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400282}
283
locke-lunargd556cc32019-09-17 01:21:23 -0600284void ValidationStateTracker::PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage,
285 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
286 uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600287 if (disabled[command_buffer_state]) return;
288
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700289 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600290 cb_node->RecordTransferCmd(CMD_BLITIMAGE, Get<IMAGE_STATE>(srcImage), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600291}
292
Jeff Leger178b1e52020-10-05 12:22:23 -0400293void ValidationStateTracker::PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer,
294 const VkBlitImageInfo2KHR *pBlitImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600295 if (disabled[command_buffer_state]) return;
296
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700297 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600298 cb_node->RecordTransferCmd(CMD_BLITIMAGE2KHR, Get<IMAGE_STATE>(pBlitImageInfo->srcImage),
299 Get<IMAGE_STATE>(pBlitImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400300}
301
locke-lunargd556cc32019-09-17 01:21:23 -0600302void ValidationStateTracker::PostCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
303 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer,
304 VkResult result) {
305 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600306
Jeremy Gebbenc8937b62021-09-24 15:50:56 -0600307 auto buffer_state = std::make_shared<BUFFER_STATE>(this, *pBuffer, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -0600308
James Rumble2f6e7bb2021-07-13 15:21:20 +0100309 if (pCreateInfo) {
310 const auto *opaque_capture_address = LvlFindInChain<VkBufferOpaqueCaptureAddressCreateInfo>(pCreateInfo->pNext);
311 if (opaque_capture_address) {
312 // address is used for GPU-AV and ray tracing buffer validation
313 buffer_state->deviceAddress = opaque_capture_address->opaqueCaptureAddress;
Jeremy Gebben65975ed2021-10-29 11:16:10 -0600314 buffer_address_map_.insert(opaque_capture_address->opaqueCaptureAddress, buffer_state.get());
James Rumble2f6e7bb2021-07-13 15:21:20 +0100315 }
316 }
Jeremy Gebben082a9832021-10-28 13:40:11 -0600317 Add(std::move(buffer_state));
locke-lunargd556cc32019-09-17 01:21:23 -0600318}
319
320void ValidationStateTracker::PostCallRecordCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
321 const VkAllocationCallbacks *pAllocator, VkBufferView *pView,
322 VkResult result) {
323 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600324
Jeremy Gebben9f537102021-10-05 16:37:12 -0600325 auto buffer_state = Get<BUFFER_STATE>(pCreateInfo->buffer);
locke-lunarg25b6c352020-08-06 17:44:18 -0600326
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200327 VkFormatFeatureFlags2KHR buffer_features;
328 if (has_format_feature2) {
329 auto fmt_props_3 = LvlInitStruct<VkFormatProperties3KHR>();
330 auto fmt_props_2 = LvlInitStruct<VkFormatProperties2>(&fmt_props_3);
331 DispatchGetPhysicalDeviceFormatProperties2(physical_device, pCreateInfo->format, &fmt_props_2);
332 buffer_features = fmt_props_3.bufferFeatures;
333 } else {
334 VkFormatProperties format_properties;
335 DispatchGetPhysicalDeviceFormatProperties(physical_device, pCreateInfo->format, &format_properties);
336 buffer_features = format_properties.bufferFeatures;
337 }
locke-lunarg25b6c352020-08-06 17:44:18 -0600338
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200339 Add(std::make_shared<BUFFER_VIEW_STATE>(buffer_state, *pView, pCreateInfo, buffer_features));
locke-lunargd556cc32019-09-17 01:21:23 -0600340}
341
342void ValidationStateTracker::PostCallRecordCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
343 const VkAllocationCallbacks *pAllocator, VkImageView *pView,
344 VkResult result) {
345 if (result != VK_SUCCESS) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -0600346 auto image_state = Get<IMAGE_STATE>(pCreateInfo->image);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700347
Lionel Landwerlin21719f62021-12-09 11:40:09 +0200348 VkFormatFeatureFlags2KHR format_features = 0;
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600349 if (image_state->HasAHBFormat() == true) {
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700350 // The ImageView uses same Image's format feature since they share same AHB
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600351 format_features = image_state->format_features;
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700352 } else {
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200353 format_features = GetImageFormatFeatures(physical_device, has_format_feature2, device, image_state->image(),
354 pCreateInfo->format, image_state->createInfo.tiling);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700355 }
356
locke-lunarg9939d4b2020-10-26 20:11:08 -0600357 // 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 -0600358 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600359 if (IsExtEnabled(device_extensions.vk_ext_filter_cubic)) {
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700360 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600361 imageview_format_info.imageViewType = pCreateInfo->viewType;
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700362 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600363 image_format_info.type = image_state->createInfo.imageType;
364 image_format_info.format = image_state->createInfo.format;
365 image_format_info.tiling = image_state->createInfo.tiling;
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600366 auto usage_create_info = LvlFindInChain<VkImageViewUsageCreateInfo>(pCreateInfo->pNext);
367 image_format_info.usage = usage_create_info ? usage_create_info->usage : image_state->createInfo.usage;
locke-lunarg9939d4b2020-10-26 20:11:08 -0600368 image_format_info.flags = image_state->createInfo.flags;
369
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600370 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600371
372 DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_format_info, &image_format_properties);
373 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600374
Jeremy Gebben082a9832021-10-28 13:40:11 -0600375 Add(std::make_shared<IMAGE_VIEW_STATE>(image_state, *pView, pCreateInfo, format_features, filter_cubic_props));
locke-lunargd556cc32019-09-17 01:21:23 -0600376}
377
378void ValidationStateTracker::PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
379 uint32_t regionCount, const VkBufferCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600380 if (disabled[command_buffer_state]) return;
381
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700382 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600383 cb_node->RecordTransferCmd(CMD_COPYBUFFER, Get<BUFFER_STATE>(srcBuffer), Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600384}
385
Jeff Leger178b1e52020-10-05 12:22:23 -0400386void ValidationStateTracker::PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600387 const VkCopyBufferInfo2KHR *pCopyBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600388 if (disabled[command_buffer_state]) return;
389
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700390 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600391 cb_node->RecordTransferCmd(CMD_COPYBUFFER2KHR, Get<BUFFER_STATE>(pCopyBufferInfo->srcBuffer),
392 Get<BUFFER_STATE>(pCopyBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400393}
394
locke-lunargd556cc32019-09-17 01:21:23 -0600395void ValidationStateTracker::PreCallRecordDestroyImageView(VkDevice device, VkImageView imageView,
396 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600397 Destroy<IMAGE_VIEW_STATE>(imageView);
locke-lunargd556cc32019-09-17 01:21:23 -0600398}
399
400void ValidationStateTracker::PreCallRecordDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600401 Destroy<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600402}
403
404void ValidationStateTracker::PreCallRecordDestroyBufferView(VkDevice device, VkBufferView bufferView,
405 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -0600406 Destroy<BUFFER_VIEW_STATE>(bufferView);
locke-lunargd556cc32019-09-17 01:21:23 -0600407}
408
409void ValidationStateTracker::PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
410 VkDeviceSize size, uint32_t data) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600411 if (disabled[command_buffer_state]) return;
412
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700413 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600414 cb_node->RecordTransferCmd(CMD_FILLBUFFER, Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600415}
416
417void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
418 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
419 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600420 if (disabled[command_buffer_state]) return;
421
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700422 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600423
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600424 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER, Get<IMAGE_STATE>(srcImage), Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600425}
426
Jeff Leger178b1e52020-10-05 12:22:23 -0400427void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
428 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600429 if (disabled[command_buffer_state]) return;
430
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700431 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600432 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER2KHR, Get<IMAGE_STATE>(pCopyImageToBufferInfo->srcImage),
433 Get<BUFFER_STATE>(pCopyImageToBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400434}
435
locke-lunargd556cc32019-09-17 01:21:23 -0600436void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
437 VkImageLayout dstImageLayout, uint32_t regionCount,
438 const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600439 if (disabled[command_buffer_state]) return;
440
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700441 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600442 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE, Get<BUFFER_STATE>(srcBuffer), Get<IMAGE_STATE>(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600443}
444
Jeff Leger178b1e52020-10-05 12:22:23 -0400445void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
446 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600447 if (disabled[command_buffer_state]) return;
448
Jeremy Gebben332d4dd2022-01-01 12:40:02 -0700449 auto cb_node = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600450 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE2KHR, Get<BUFFER_STATE>(pCopyBufferToImageInfo->srcBuffer),
451 Get<IMAGE_STATE>(pCopyBufferToImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400452}
453
sfricke-samsungbf1a2ed2020-06-14 23:31:00 -0700454// Gets union of all features defined by Potential Format Features
455// 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 +0200456VkFormatFeatureFlags2KHR ValidationStateTracker::GetPotentialFormatFeatures(VkFormat format) const {
457 VkFormatFeatureFlags2KHR format_features = 0;
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700458
459 if (format != VK_FORMAT_UNDEFINED) {
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200460 if (has_format_feature2) {
461 auto fmt_drm_props = LvlInitStruct<VkDrmFormatModifierPropertiesList2EXT>();
462 auto fmt_props_3 = LvlInitStruct<VkFormatProperties3KHR>(&fmt_drm_props);
463 auto fmt_props_2 = LvlInitStruct<VkFormatProperties2>(&fmt_props_3);
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100464
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200465 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &fmt_props_2);
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100466
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200467 format_features |= fmt_props_3.linearTilingFeatures;
468 format_features |= fmt_props_3.optimalTilingFeatures;
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100469
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200470 if (IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier)) {
471 std::vector<VkDrmFormatModifierProperties2EXT> drm_properties;
472 drm_properties.resize(fmt_drm_props.drmFormatModifierCount);
473 fmt_drm_props.pDrmFormatModifierProperties = drm_properties.data();
474 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &fmt_props_2);
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100475
Lionel Landwerlind0f84e42021-12-07 15:46:09 +0200476 for (uint32_t i = 0; i < fmt_drm_props.drmFormatModifierCount; i++) {
477 format_features |= fmt_drm_props.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
478 }
479 }
480 } else {
481 VkFormatProperties format_properties;
482 DispatchGetPhysicalDeviceFormatProperties(physical_device, format, &format_properties);
483 format_features |= format_properties.linearTilingFeatures;
484 format_features |= format_properties.optimalTilingFeatures;
485
486 if (IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier)) {
487 auto fmt_drm_props = LvlInitStruct<VkDrmFormatModifierPropertiesListEXT>();
488 auto fmt_props_2 = LvlInitStruct<VkFormatProperties2>(&fmt_drm_props);
489
490 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &fmt_props_2);
491
492 std::vector<VkDrmFormatModifierPropertiesEXT> drm_properties;
493 drm_properties.resize(fmt_drm_props.drmFormatModifierCount);
494 fmt_drm_props.pDrmFormatModifierProperties = drm_properties.data();
495 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &fmt_props_2);
496
497 for (uint32_t i = 0; i < fmt_drm_props.drmFormatModifierCount; i++) {
498 format_features |= fmt_drm_props.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
499 }
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700500 }
501 }
502 }
503
504 return format_features;
505}
506
locke-lunargd556cc32019-09-17 01:21:23 -0600507void ValidationStateTracker::PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
508 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice,
509 VkResult result) {
510 if (VK_SUCCESS != result) return;
511
Locke Linf3873542021-04-26 11:25:10 -0600512 ValidationObject *device_object = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
513 ValidationObject *validation_data = GetValidationObject(device_object->object_dispatch, this->container_type);
514 ValidationStateTracker *state_tracker = static_cast<ValidationStateTracker *>(validation_data);
515
locke-lunargd556cc32019-09-17 01:21:23 -0600516 const VkPhysicalDeviceFeatures *enabled_features_found = pCreateInfo->pEnabledFeatures;
517 if (nullptr == enabled_features_found) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700518 const auto *features2 = LvlFindInChain<VkPhysicalDeviceFeatures2>(pCreateInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -0600519 if (features2) {
520 enabled_features_found = &(features2->features);
521 }
522 }
523
locke-lunargd556cc32019-09-17 01:21:23 -0600524 if (nullptr == enabled_features_found) {
525 state_tracker->enabled_features.core = {};
526 } else {
527 state_tracker->enabled_features.core = *enabled_features_found;
528 }
529
locke-lunargd556cc32019-09-17 01:21:23 -0600530 // Save local link to this device's physical device state
Jeremy Gebben9f537102021-10-05 16:37:12 -0600531 state_tracker->physical_device_state = Get<PHYSICAL_DEVICE_STATE>(gpu).get();
locke-lunargd556cc32019-09-17 01:21:23 -0600532
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700533 const auto *vulkan_12_features = LvlFindInChain<VkPhysicalDeviceVulkan12Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700534 if (vulkan_12_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700535 state_tracker->enabled_features.core12 = *vulkan_12_features;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700536 } else {
sfricke-samsung27c70722020-05-02 08:42:39 -0700537 // Set Extension Feature Aliases to false as there is no struct to check
538 state_tracker->enabled_features.core12.drawIndirectCount = VK_FALSE;
539 state_tracker->enabled_features.core12.samplerMirrorClampToEdge = VK_FALSE;
540 state_tracker->enabled_features.core12.descriptorIndexing = VK_FALSE;
541 state_tracker->enabled_features.core12.samplerFilterMinmax = VK_FALSE;
542 state_tracker->enabled_features.core12.shaderOutputLayer = VK_FALSE;
543 state_tracker->enabled_features.core12.shaderOutputViewportIndex = VK_FALSE;
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800544 state_tracker->enabled_features.core12.subgroupBroadcastDynamicId = VK_FALSE;
sfricke-samsung27c70722020-05-02 08:42:39 -0700545
546 // These structs are only allowed in pNext chain if there is no VkPhysicalDeviceVulkan12Features
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700547
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700548 const auto *eight_bit_storage_features = LvlFindInChain<VkPhysicalDevice8BitStorageFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700549 if (eight_bit_storage_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700550 state_tracker->enabled_features.core12.storageBuffer8BitAccess = eight_bit_storage_features->storageBuffer8BitAccess;
551 state_tracker->enabled_features.core12.uniformAndStorageBuffer8BitAccess =
552 eight_bit_storage_features->uniformAndStorageBuffer8BitAccess;
553 state_tracker->enabled_features.core12.storagePushConstant8 = eight_bit_storage_features->storagePushConstant8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700554 }
555
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700556 const auto *float16_int8_features = LvlFindInChain<VkPhysicalDeviceShaderFloat16Int8Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700557 if (float16_int8_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700558 state_tracker->enabled_features.core12.shaderFloat16 = float16_int8_features->shaderFloat16;
559 state_tracker->enabled_features.core12.shaderInt8 = float16_int8_features->shaderInt8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700560 }
561
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700562 const auto *descriptor_indexing_features = LvlFindInChain<VkPhysicalDeviceDescriptorIndexingFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700563 if (descriptor_indexing_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700564 state_tracker->enabled_features.core12.shaderInputAttachmentArrayDynamicIndexing =
565 descriptor_indexing_features->shaderInputAttachmentArrayDynamicIndexing;
566 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayDynamicIndexing =
567 descriptor_indexing_features->shaderUniformTexelBufferArrayDynamicIndexing;
568 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayDynamicIndexing =
569 descriptor_indexing_features->shaderStorageTexelBufferArrayDynamicIndexing;
570 state_tracker->enabled_features.core12.shaderUniformBufferArrayNonUniformIndexing =
571 descriptor_indexing_features->shaderUniformBufferArrayNonUniformIndexing;
572 state_tracker->enabled_features.core12.shaderSampledImageArrayNonUniformIndexing =
573 descriptor_indexing_features->shaderSampledImageArrayNonUniformIndexing;
574 state_tracker->enabled_features.core12.shaderStorageBufferArrayNonUniformIndexing =
575 descriptor_indexing_features->shaderStorageBufferArrayNonUniformIndexing;
576 state_tracker->enabled_features.core12.shaderStorageImageArrayNonUniformIndexing =
577 descriptor_indexing_features->shaderStorageImageArrayNonUniformIndexing;
578 state_tracker->enabled_features.core12.shaderInputAttachmentArrayNonUniformIndexing =
579 descriptor_indexing_features->shaderInputAttachmentArrayNonUniformIndexing;
580 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayNonUniformIndexing =
581 descriptor_indexing_features->shaderUniformTexelBufferArrayNonUniformIndexing;
582 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayNonUniformIndexing =
583 descriptor_indexing_features->shaderStorageTexelBufferArrayNonUniformIndexing;
584 state_tracker->enabled_features.core12.descriptorBindingUniformBufferUpdateAfterBind =
585 descriptor_indexing_features->descriptorBindingUniformBufferUpdateAfterBind;
586 state_tracker->enabled_features.core12.descriptorBindingSampledImageUpdateAfterBind =
587 descriptor_indexing_features->descriptorBindingSampledImageUpdateAfterBind;
588 state_tracker->enabled_features.core12.descriptorBindingStorageImageUpdateAfterBind =
589 descriptor_indexing_features->descriptorBindingStorageImageUpdateAfterBind;
590 state_tracker->enabled_features.core12.descriptorBindingStorageBufferUpdateAfterBind =
591 descriptor_indexing_features->descriptorBindingStorageBufferUpdateAfterBind;
592 state_tracker->enabled_features.core12.descriptorBindingUniformTexelBufferUpdateAfterBind =
593 descriptor_indexing_features->descriptorBindingUniformTexelBufferUpdateAfterBind;
594 state_tracker->enabled_features.core12.descriptorBindingStorageTexelBufferUpdateAfterBind =
595 descriptor_indexing_features->descriptorBindingStorageTexelBufferUpdateAfterBind;
596 state_tracker->enabled_features.core12.descriptorBindingUpdateUnusedWhilePending =
597 descriptor_indexing_features->descriptorBindingUpdateUnusedWhilePending;
598 state_tracker->enabled_features.core12.descriptorBindingPartiallyBound =
599 descriptor_indexing_features->descriptorBindingPartiallyBound;
600 state_tracker->enabled_features.core12.descriptorBindingVariableDescriptorCount =
601 descriptor_indexing_features->descriptorBindingVariableDescriptorCount;
602 state_tracker->enabled_features.core12.runtimeDescriptorArray = descriptor_indexing_features->runtimeDescriptorArray;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700603 }
604
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700605 const auto *scalar_block_layout_features = LvlFindInChain<VkPhysicalDeviceScalarBlockLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700606 if (scalar_block_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700607 state_tracker->enabled_features.core12.scalarBlockLayout = scalar_block_layout_features->scalarBlockLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700608 }
609
610 const auto *imageless_framebuffer_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700611 LvlFindInChain<VkPhysicalDeviceImagelessFramebufferFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700612 if (imageless_framebuffer_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700613 state_tracker->enabled_features.core12.imagelessFramebuffer = imageless_framebuffer_features->imagelessFramebuffer;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700614 }
615
616 const auto *uniform_buffer_standard_layout_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700617 LvlFindInChain<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700618 if (uniform_buffer_standard_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700619 state_tracker->enabled_features.core12.uniformBufferStandardLayout =
620 uniform_buffer_standard_layout_features->uniformBufferStandardLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700621 }
622
623 const auto *subgroup_extended_types_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700624 LvlFindInChain<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700625 if (subgroup_extended_types_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700626 state_tracker->enabled_features.core12.shaderSubgroupExtendedTypes =
627 subgroup_extended_types_features->shaderSubgroupExtendedTypes;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700628 }
629
630 const auto *separate_depth_stencil_layouts_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700631 LvlFindInChain<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700632 if (separate_depth_stencil_layouts_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700633 state_tracker->enabled_features.core12.separateDepthStencilLayouts =
634 separate_depth_stencil_layouts_features->separateDepthStencilLayouts;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700635 }
636
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700637 const auto *host_query_reset_features = LvlFindInChain<VkPhysicalDeviceHostQueryResetFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700638 if (host_query_reset_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700639 state_tracker->enabled_features.core12.hostQueryReset = host_query_reset_features->hostQueryReset;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700640 }
641
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700642 const auto *timeline_semaphore_features = LvlFindInChain<VkPhysicalDeviceTimelineSemaphoreFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700643 if (timeline_semaphore_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700644 state_tracker->enabled_features.core12.timelineSemaphore = timeline_semaphore_features->timelineSemaphore;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700645 }
646
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700647 const auto *buffer_device_address = LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700648 if (buffer_device_address) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700649 state_tracker->enabled_features.core12.bufferDeviceAddress = buffer_device_address->bufferDeviceAddress;
650 state_tracker->enabled_features.core12.bufferDeviceAddressCaptureReplay =
651 buffer_device_address->bufferDeviceAddressCaptureReplay;
652 state_tracker->enabled_features.core12.bufferDeviceAddressMultiDevice =
653 buffer_device_address->bufferDeviceAddressMultiDevice;
654 }
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800655
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700656 const auto *atomic_int64_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicInt64Features>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800657 if (atomic_int64_features) {
658 state_tracker->enabled_features.core12.shaderBufferInt64Atomics = atomic_int64_features->shaderBufferInt64Atomics;
659 state_tracker->enabled_features.core12.shaderSharedInt64Atomics = atomic_int64_features->shaderSharedInt64Atomics;
660 }
661
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700662 const auto *memory_model_features = LvlFindInChain<VkPhysicalDeviceVulkanMemoryModelFeatures>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800663 if (memory_model_features) {
664 state_tracker->enabled_features.core12.vulkanMemoryModel = memory_model_features->vulkanMemoryModel;
665 state_tracker->enabled_features.core12.vulkanMemoryModelDeviceScope =
666 memory_model_features->vulkanMemoryModelDeviceScope;
667 state_tracker->enabled_features.core12.vulkanMemoryModelAvailabilityVisibilityChains =
668 memory_model_features->vulkanMemoryModelAvailabilityVisibilityChains;
669 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700670 }
671
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700672 const auto *vulkan_11_features = LvlFindInChain<VkPhysicalDeviceVulkan11Features>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700673 if (vulkan_11_features) {
674 state_tracker->enabled_features.core11 = *vulkan_11_features;
675 } else {
sfricke-samsung828e59d2021-08-22 23:20:49 -0700676 // These structs are only allowed in pNext chain if there is no vkPhysicalDeviceVulkan11Features
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700677
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700678 const auto *sixteen_bit_storage_features = LvlFindInChain<VkPhysicalDevice16BitStorageFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700679 if (sixteen_bit_storage_features) {
680 state_tracker->enabled_features.core11.storageBuffer16BitAccess =
681 sixteen_bit_storage_features->storageBuffer16BitAccess;
682 state_tracker->enabled_features.core11.uniformAndStorageBuffer16BitAccess =
683 sixteen_bit_storage_features->uniformAndStorageBuffer16BitAccess;
684 state_tracker->enabled_features.core11.storagePushConstant16 = sixteen_bit_storage_features->storagePushConstant16;
685 state_tracker->enabled_features.core11.storageInputOutput16 = sixteen_bit_storage_features->storageInputOutput16;
686 }
687
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700688 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700689 if (multiview_features) {
690 state_tracker->enabled_features.core11.multiview = multiview_features->multiview;
691 state_tracker->enabled_features.core11.multiviewGeometryShader = multiview_features->multiviewGeometryShader;
692 state_tracker->enabled_features.core11.multiviewTessellationShader = multiview_features->multiviewTessellationShader;
693 }
694
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700695 const auto *variable_pointers_features = LvlFindInChain<VkPhysicalDeviceVariablePointersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700696 if (variable_pointers_features) {
697 state_tracker->enabled_features.core11.variablePointersStorageBuffer =
698 variable_pointers_features->variablePointersStorageBuffer;
699 state_tracker->enabled_features.core11.variablePointers = variable_pointers_features->variablePointers;
700 }
701
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700702 const auto *protected_memory_features = LvlFindInChain<VkPhysicalDeviceProtectedMemoryFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700703 if (protected_memory_features) {
704 state_tracker->enabled_features.core11.protectedMemory = protected_memory_features->protectedMemory;
705 }
706
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700707 const auto *ycbcr_conversion_features = LvlFindInChain<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700708 if (ycbcr_conversion_features) {
709 state_tracker->enabled_features.core11.samplerYcbcrConversion = ycbcr_conversion_features->samplerYcbcrConversion;
710 }
711
712 const auto *shader_draw_parameters_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700713 LvlFindInChain<VkPhysicalDeviceShaderDrawParametersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700714 if (shader_draw_parameters_features) {
715 state_tracker->enabled_features.core11.shaderDrawParameters = shader_draw_parameters_features->shaderDrawParameters;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700716 }
717 }
718
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700719 const auto *device_group_ci = LvlFindInChain<VkDeviceGroupDeviceCreateInfo>(pCreateInfo->pNext);
Tony-LunarGca4891a2020-08-10 15:46:46 -0600720 if (device_group_ci) {
721 state_tracker->physical_device_count = device_group_ci->physicalDeviceCount;
722 state_tracker->device_group_create_info = *device_group_ci;
723 } else {
724 state_tracker->physical_device_count = 1;
725 }
locke-lunargd556cc32019-09-17 01:21:23 -0600726
sfricke-samsung828e59d2021-08-22 23:20:49 -0700727 // Features from other extensions passesd in create info
728 {
729 const auto *exclusive_scissor_features = LvlFindInChain<VkPhysicalDeviceExclusiveScissorFeaturesNV>(pCreateInfo->pNext);
730 if (exclusive_scissor_features) {
731 state_tracker->enabled_features.exclusive_scissor_features = *exclusive_scissor_features;
732 }
locke-lunargd556cc32019-09-17 01:21:23 -0600733
sfricke-samsung828e59d2021-08-22 23:20:49 -0700734 const auto *shading_rate_image_features = LvlFindInChain<VkPhysicalDeviceShadingRateImageFeaturesNV>(pCreateInfo->pNext);
735 if (shading_rate_image_features) {
736 state_tracker->enabled_features.shading_rate_image_features = *shading_rate_image_features;
737 }
locke-lunargd556cc32019-09-17 01:21:23 -0600738
sfricke-samsung828e59d2021-08-22 23:20:49 -0700739 const auto *mesh_shader_features = LvlFindInChain<VkPhysicalDeviceMeshShaderFeaturesNV>(pCreateInfo->pNext);
740 if (mesh_shader_features) {
741 state_tracker->enabled_features.mesh_shader_features = *mesh_shader_features;
742 }
locke-lunargd556cc32019-09-17 01:21:23 -0600743
sfricke-samsung828e59d2021-08-22 23:20:49 -0700744 const auto *inline_uniform_block_features =
745 LvlFindInChain<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(pCreateInfo->pNext);
746 if (inline_uniform_block_features) {
747 state_tracker->enabled_features.inline_uniform_block_features = *inline_uniform_block_features;
748 }
locke-lunargd556cc32019-09-17 01:21:23 -0600749
sfricke-samsung828e59d2021-08-22 23:20:49 -0700750 const auto *transform_feedback_features = LvlFindInChain<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(pCreateInfo->pNext);
751 if (transform_feedback_features) {
752 state_tracker->enabled_features.transform_feedback_features = *transform_feedback_features;
753 }
locke-lunargd556cc32019-09-17 01:21:23 -0600754
sfricke-samsung828e59d2021-08-22 23:20:49 -0700755 const auto *vtx_attrib_div_features = LvlFindInChain<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(pCreateInfo->pNext);
756 if (vtx_attrib_div_features) {
757 state_tracker->enabled_features.vtx_attrib_divisor_features = *vtx_attrib_div_features;
758 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700759
sfricke-samsung828e59d2021-08-22 23:20:49 -0700760 const auto *buffer_device_address_ext_features =
761 LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(pCreateInfo->pNext);
762 if (buffer_device_address_ext_features) {
763 state_tracker->enabled_features.buffer_device_address_ext_features = *buffer_device_address_ext_features;
764 }
locke-lunargd556cc32019-09-17 01:21:23 -0600765
sfricke-samsung828e59d2021-08-22 23:20:49 -0700766 const auto *cooperative_matrix_features = LvlFindInChain<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(pCreateInfo->pNext);
767 if (cooperative_matrix_features) {
768 state_tracker->enabled_features.cooperative_matrix_features = *cooperative_matrix_features;
769 }
locke-lunargd556cc32019-09-17 01:21:23 -0600770
sfricke-samsung828e59d2021-08-22 23:20:49 -0700771 const auto *compute_shader_derivatives_features =
772 LvlFindInChain<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(pCreateInfo->pNext);
773 if (compute_shader_derivatives_features) {
774 state_tracker->enabled_features.compute_shader_derivatives_features = *compute_shader_derivatives_features;
775 }
locke-lunargd556cc32019-09-17 01:21:23 -0600776
sfricke-samsung828e59d2021-08-22 23:20:49 -0700777 const auto *fragment_shader_barycentric_features =
778 LvlFindInChain<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(pCreateInfo->pNext);
779 if (fragment_shader_barycentric_features) {
780 state_tracker->enabled_features.fragment_shader_barycentric_features = *fragment_shader_barycentric_features;
781 }
locke-lunargd556cc32019-09-17 01:21:23 -0600782
sfricke-samsung828e59d2021-08-22 23:20:49 -0700783 const auto *shader_image_footprint_features =
784 LvlFindInChain<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(pCreateInfo->pNext);
785 if (shader_image_footprint_features) {
786 state_tracker->enabled_features.shader_image_footprint_features = *shader_image_footprint_features;
787 }
locke-lunargd556cc32019-09-17 01:21:23 -0600788
sfricke-samsung828e59d2021-08-22 23:20:49 -0700789 const auto *fragment_shader_interlock_features =
790 LvlFindInChain<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(pCreateInfo->pNext);
791 if (fragment_shader_interlock_features) {
792 state_tracker->enabled_features.fragment_shader_interlock_features = *fragment_shader_interlock_features;
793 }
locke-lunargd556cc32019-09-17 01:21:23 -0600794
sfricke-samsung828e59d2021-08-22 23:20:49 -0700795 const auto *demote_to_helper_invocation_features =
796 LvlFindInChain<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>(pCreateInfo->pNext);
797 if (demote_to_helper_invocation_features) {
798 state_tracker->enabled_features.demote_to_helper_invocation_features = *demote_to_helper_invocation_features;
799 }
locke-lunargd556cc32019-09-17 01:21:23 -0600800
sfricke-samsung828e59d2021-08-22 23:20:49 -0700801 const auto *texel_buffer_alignment_features =
802 LvlFindInChain<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(pCreateInfo->pNext);
803 if (texel_buffer_alignment_features) {
804 state_tracker->enabled_features.texel_buffer_alignment_features = *texel_buffer_alignment_features;
805 }
locke-lunargd556cc32019-09-17 01:21:23 -0600806
sfricke-samsung828e59d2021-08-22 23:20:49 -0700807 const auto *pipeline_exe_props_features =
808 LvlFindInChain<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(pCreateInfo->pNext);
809 if (pipeline_exe_props_features) {
810 state_tracker->enabled_features.pipeline_exe_props_features = *pipeline_exe_props_features;
811 }
locke-lunargd556cc32019-09-17 01:21:23 -0600812
sfricke-samsung828e59d2021-08-22 23:20:49 -0700813 const auto *dedicated_allocation_image_aliasing_features =
814 LvlFindInChain<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(pCreateInfo->pNext);
815 if (dedicated_allocation_image_aliasing_features) {
816 state_tracker->enabled_features.dedicated_allocation_image_aliasing_features =
817 *dedicated_allocation_image_aliasing_features;
818 }
Jeff Bolz82f854d2019-09-17 14:56:47 -0500819
sfricke-samsung828e59d2021-08-22 23:20:49 -0700820 const auto *performance_query_features = LvlFindInChain<VkPhysicalDevicePerformanceQueryFeaturesKHR>(pCreateInfo->pNext);
821 if (performance_query_features) {
822 state_tracker->enabled_features.performance_query_features = *performance_query_features;
823 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +0100824
sfricke-samsung828e59d2021-08-22 23:20:49 -0700825 const auto *device_coherent_memory_features = LvlFindInChain<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(pCreateInfo->pNext);
826 if (device_coherent_memory_features) {
827 state_tracker->enabled_features.device_coherent_memory_features = *device_coherent_memory_features;
828 }
Tobias Hector782bcde2019-11-28 16:19:42 +0000829
sfricke-samsung828e59d2021-08-22 23:20:49 -0700830 const auto *ycbcr_image_array_features = LvlFindInChain<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(pCreateInfo->pNext);
831 if (ycbcr_image_array_features) {
832 state_tracker->enabled_features.ycbcr_image_array_features = *ycbcr_image_array_features;
833 }
sfricke-samsungcead0802020-01-30 22:20:10 -0800834
sfricke-samsung828e59d2021-08-22 23:20:49 -0700835 const auto *ray_query_features = LvlFindInChain<VkPhysicalDeviceRayQueryFeaturesKHR>(pCreateInfo->pNext);
836 if (ray_query_features) {
837 state_tracker->enabled_features.ray_query_features = *ray_query_features;
838 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700839
sfricke-samsung828e59d2021-08-22 23:20:49 -0700840 const auto *ray_tracing_pipeline_features =
841 LvlFindInChain<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>(pCreateInfo->pNext);
842 if (ray_tracing_pipeline_features) {
843 state_tracker->enabled_features.ray_tracing_pipeline_features = *ray_tracing_pipeline_features;
844 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700845
sfricke-samsung828e59d2021-08-22 23:20:49 -0700846 const auto *ray_tracing_acceleration_structure_features =
847 LvlFindInChain<VkPhysicalDeviceAccelerationStructureFeaturesKHR>(pCreateInfo->pNext);
848 if (ray_tracing_acceleration_structure_features) {
849 state_tracker->enabled_features.ray_tracing_acceleration_structure_features =
850 *ray_tracing_acceleration_structure_features;
851 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500852
sfricke-samsung828e59d2021-08-22 23:20:49 -0700853 const auto *robustness2_features = LvlFindInChain<VkPhysicalDeviceRobustness2FeaturesEXT>(pCreateInfo->pNext);
854 if (robustness2_features) {
855 state_tracker->enabled_features.robustness2_features = *robustness2_features;
856 }
Jeff Bolz165818a2020-05-08 11:19:03 -0500857
sfricke-samsung828e59d2021-08-22 23:20:49 -0700858 const auto *fragment_density_map_features =
859 LvlFindInChain<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(pCreateInfo->pNext);
860 if (fragment_density_map_features) {
861 state_tracker->enabled_features.fragment_density_map_features = *fragment_density_map_features;
862 }
janharaldfredriksen-arm3b793772020-05-12 18:55:53 +0200863
sfricke-samsung828e59d2021-08-22 23:20:49 -0700864 const auto *fragment_density_map_features2 =
865 LvlFindInChain<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(pCreateInfo->pNext);
866 if (fragment_density_map_features2) {
867 state_tracker->enabled_features.fragment_density_map2_features = *fragment_density_map_features2;
868 }
janharaldfredriksen-arm36e17572020-07-07 13:59:28 +0200869
sfricke-samsung828e59d2021-08-22 23:20:49 -0700870 const auto *astc_decode_features = LvlFindInChain<VkPhysicalDeviceASTCDecodeFeaturesEXT>(pCreateInfo->pNext);
871 if (astc_decode_features) {
872 state_tracker->enabled_features.astc_decode_features = *astc_decode_features;
873 }
sfricke-samsung0c4a06f2020-06-27 01:24:32 -0700874
sfricke-samsung828e59d2021-08-22 23:20:49 -0700875 const auto *custom_border_color_features = LvlFindInChain<VkPhysicalDeviceCustomBorderColorFeaturesEXT>(pCreateInfo->pNext);
876 if (custom_border_color_features) {
877 state_tracker->enabled_features.custom_border_color_features = *custom_border_color_features;
878 }
Tony-LunarG7337b312020-04-15 16:40:25 -0600879
sfricke-samsung828e59d2021-08-22 23:20:49 -0700880 const auto *pipeline_creation_cache_control_features =
881 LvlFindInChain<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>(pCreateInfo->pNext);
882 if (pipeline_creation_cache_control_features) {
883 state_tracker->enabled_features.pipeline_creation_cache_control_features = *pipeline_creation_cache_control_features;
884 }
sfricke-samsungfd661d62020-05-16 00:57:27 -0700885
sfricke-samsung828e59d2021-08-22 23:20:49 -0700886 const auto *fragment_shading_rate_features =
887 LvlFindInChain<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(pCreateInfo->pNext);
888 if (fragment_shading_rate_features) {
889 state_tracker->enabled_features.fragment_shading_rate_features = *fragment_shading_rate_features;
890 }
Tobias Hector6663c9b2020-11-05 10:18:02 +0000891
sfricke-samsung828e59d2021-08-22 23:20:49 -0700892 const auto *extended_dynamic_state_features =
893 LvlFindInChain<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(pCreateInfo->pNext);
894 if (extended_dynamic_state_features) {
895 state_tracker->enabled_features.extended_dynamic_state_features = *extended_dynamic_state_features;
896 }
Piers Daniell39842ee2020-07-10 16:42:33 -0600897
sfricke-samsung828e59d2021-08-22 23:20:49 -0700898 const auto *extended_dynamic_state2_features =
899 LvlFindInChain<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>(pCreateInfo->pNext);
900 if (extended_dynamic_state2_features) {
901 state_tracker->enabled_features.extended_dynamic_state2_features = *extended_dynamic_state2_features;
902 }
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -0700903
sfricke-samsung828e59d2021-08-22 23:20:49 -0700904 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
905 if (multiview_features) {
906 state_tracker->enabled_features.multiview_features = *multiview_features;
907 }
locke-lunarg3fa463a2020-10-23 16:39:04 -0600908
sfricke-samsung828e59d2021-08-22 23:20:49 -0700909 const auto *portability_features = LvlFindInChain<VkPhysicalDevicePortabilitySubsetFeaturesKHR>(pCreateInfo->pNext);
910 if (portability_features) {
911 state_tracker->enabled_features.portability_subset_features = *portability_features;
912 }
Nathaniel Cesariob3f2d702020-11-09 09:20:49 -0700913
sfricke-samsung828e59d2021-08-22 23:20:49 -0700914 const auto *shader_integer_functions2_features =
915 LvlFindInChain<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(pCreateInfo->pNext);
916 if (shader_integer_functions2_features) {
917 state_tracker->enabled_features.shader_integer_functions2_features = *shader_integer_functions2_features;
918 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800919
sfricke-samsung828e59d2021-08-22 23:20:49 -0700920 const auto *shader_sm_builtins_features = LvlFindInChain<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>(pCreateInfo->pNext);
921 if (shader_sm_builtins_features) {
922 state_tracker->enabled_features.shader_sm_builtins_features = *shader_sm_builtins_features;
923 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800924
sfricke-samsung828e59d2021-08-22 23:20:49 -0700925 const auto *shader_atomic_float_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>(pCreateInfo->pNext);
926 if (shader_atomic_float_features) {
927 state_tracker->enabled_features.shader_atomic_float_features = *shader_atomic_float_features;
928 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800929
sfricke-samsung828e59d2021-08-22 23:20:49 -0700930 const auto *shader_image_atomic_int64_features =
931 LvlFindInChain<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>(pCreateInfo->pNext);
932 if (shader_image_atomic_int64_features) {
933 state_tracker->enabled_features.shader_image_atomic_int64_features = *shader_image_atomic_int64_features;
934 }
sfricke-samsung0065ce02020-12-03 22:46:37 -0800935
sfricke-samsung828e59d2021-08-22 23:20:49 -0700936 const auto *shader_clock_features = LvlFindInChain<VkPhysicalDeviceShaderClockFeaturesKHR>(pCreateInfo->pNext);
937 if (shader_clock_features) {
938 state_tracker->enabled_features.shader_clock_features = *shader_clock_features;
939 }
sfricke-samsung486a51e2021-01-02 00:10:15 -0800940
sfricke-samsung828e59d2021-08-22 23:20:49 -0700941 const auto *conditional_rendering_features =
942 LvlFindInChain<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(pCreateInfo->pNext);
943 if (conditional_rendering_features) {
944 state_tracker->enabled_features.conditional_rendering_features = *conditional_rendering_features;
945 }
Jeremy Gebben5f585ae2021-02-02 09:03:06 -0700946
sfricke-samsung828e59d2021-08-22 23:20:49 -0700947 const auto *workgroup_memory_explicit_layout_features =
948 LvlFindInChain<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>(pCreateInfo->pNext);
949 if (workgroup_memory_explicit_layout_features) {
950 state_tracker->enabled_features.workgroup_memory_explicit_layout_features = *workgroup_memory_explicit_layout_features;
951 }
Shannon McPhersondb287d42021-02-02 15:27:32 -0700952
sfricke-samsung828e59d2021-08-22 23:20:49 -0700953 const auto *synchronization2_features = LvlFindInChain<VkPhysicalDeviceSynchronization2FeaturesKHR>(pCreateInfo->pNext);
954 if (synchronization2_features) {
955 state_tracker->enabled_features.synchronization2_features = *synchronization2_features;
956 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -0700957
sfricke-samsung828e59d2021-08-22 23:20:49 -0700958 const auto *provoking_vertex_features = lvl_find_in_chain<VkPhysicalDeviceProvokingVertexFeaturesEXT>(pCreateInfo->pNext);
959 if (provoking_vertex_features) {
960 state_tracker->enabled_features.provoking_vertex_features = *provoking_vertex_features;
961 }
Locke Linf3873542021-04-26 11:25:10 -0600962
sfricke-samsung828e59d2021-08-22 23:20:49 -0700963 const auto *vertex_input_dynamic_state_features =
964 LvlFindInChain<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>(pCreateInfo->pNext);
965 if (vertex_input_dynamic_state_features) {
966 state_tracker->enabled_features.vertex_input_dynamic_state_features = *vertex_input_dynamic_state_features;
967 }
Piers Daniellcb6d8032021-04-19 18:51:26 -0600968
sfricke-samsung828e59d2021-08-22 23:20:49 -0700969 const auto *inherited_viewport_scissor_features =
970 LvlFindInChain<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(pCreateInfo->pNext);
971 if (inherited_viewport_scissor_features) {
972 state_tracker->enabled_features.inherited_viewport_scissor_features = *inherited_viewport_scissor_features;
973 }
David Zhao Akeley44139b12021-04-26 16:16:13 -0700974
sfricke-samsung828e59d2021-08-22 23:20:49 -0700975 const auto *multi_draw_features = LvlFindInChain<VkPhysicalDeviceMultiDrawFeaturesEXT>(pCreateInfo->pNext);
976 if (multi_draw_features) {
977 state_tracker->enabled_features.multi_draw_features = *multi_draw_features;
978 }
Tony-LunarG4490de42021-06-21 15:49:19 -0600979
sfricke-samsung828e59d2021-08-22 23:20:49 -0700980 const auto *color_write_features = LvlFindInChain<VkPhysicalDeviceColorWriteEnableFeaturesEXT>(pCreateInfo->pNext);
981 if (color_write_features) {
982 state_tracker->enabled_features.color_write_features = *color_write_features;
983 }
ziga-lunarg29ba2b92021-07-20 21:51:45 +0200984
sfricke-samsung828e59d2021-08-22 23:20:49 -0700985 const auto *shader_atomic_float2_features =
986 LvlFindInChain<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT>(pCreateInfo->pNext);
987 if (shader_atomic_float2_features) {
988 state_tracker->enabled_features.shader_atomic_float2_features = *shader_atomic_float2_features;
989 }
Mike Schuchardtb3870ea2021-07-20 18:56:51 -0700990
sfricke-samsung828e59d2021-08-22 23:20:49 -0700991 const auto *present_id_features = LvlFindInChain<VkPhysicalDevicePresentIdFeaturesKHR>(pCreateInfo->pNext);
992 if (present_id_features) {
993 state_tracker->enabled_features.present_id_features = *present_id_features;
994 }
Tony-LunarG6f887e52021-07-27 11:23:14 -0600995
sfricke-samsung828e59d2021-08-22 23:20:49 -0700996 const auto *present_wait_features = LvlFindInChain<VkPhysicalDevicePresentWaitFeaturesKHR>(pCreateInfo->pNext);
997 if (present_wait_features) {
998 state_tracker->enabled_features.present_wait_features = *present_wait_features;
999 }
Mike Schuchardt9f65d3f2021-08-25 15:11:39 -07001000
1001 const auto *ray_tracing_motion_blur_features =
1002 LvlFindInChain<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV>(pCreateInfo->pNext);
1003 if (ray_tracing_motion_blur_features) {
1004 state_tracker->enabled_features.ray_tracing_motion_blur_features = *ray_tracing_motion_blur_features;
1005 }
Mike Schuchardtb4d90452021-08-30 09:24:51 -07001006
1007 const auto *shader_integer_dot_product_features =
1008 LvlFindInChain<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR>(pCreateInfo->pNext);
1009 if (shader_integer_dot_product_features) {
1010 state_tracker->enabled_features.shader_integer_dot_product_features = *shader_integer_dot_product_features;
1011 }
Tony-LunarG0b0d8be2021-08-30 13:50:38 -06001012
1013 const auto *primitive_topology_list_restart_features =
1014 LvlFindInChain<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>(pCreateInfo->pNext);
1015 if (primitive_topology_list_restart_features) {
1016 state_tracker->enabled_features.primitive_topology_list_restart_features = *primitive_topology_list_restart_features;
1017 }
sfricke-samsung10b35ce2021-09-29 08:50:20 -07001018
1019 const auto *rgba10x6_formats_features = LvlFindInChain<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT>(pCreateInfo->pNext);
1020 if (rgba10x6_formats_features) {
1021 state_tracker->enabled_features.rgba10x6_formats_features = *rgba10x6_formats_features;
1022 }
sfricke-samsungd3c917b2021-10-19 08:24:57 -07001023
1024 const auto *maintenance4_features = LvlFindInChain<VkPhysicalDeviceMaintenance4FeaturesKHR>(pCreateInfo->pNext);
1025 if (maintenance4_features) {
1026 state_tracker->enabled_features.maintenance4_features = *maintenance4_features;
1027 }
Jeremy Gebbence23dac2021-11-10 10:19:42 -07001028
1029 const auto *dynamic_rendering_features = LvlFindInChain<VkPhysicalDeviceDynamicRenderingFeaturesKHR>(pCreateInfo->pNext);
1030 if (dynamic_rendering_features) {
1031 state_tracker->enabled_features.dynamic_rendering_features = *dynamic_rendering_features;
1032 }
Tony-LunarG69604c42021-11-22 16:00:12 -07001033
1034 const auto *image_view_min_lod_features = LvlFindInChain<VkPhysicalDeviceImageViewMinLodFeaturesEXT>(pCreateInfo->pNext);
1035 if (image_view_min_lod_features) {
1036 state_tracker->enabled_features.image_view_min_lod_features = *image_view_min_lod_features;
1037 }
Tony-LunarG6f887e52021-07-27 11:23:14 -06001038 }
1039
ziga-lunarg73163742021-08-25 13:15:29 +02001040 const auto *subgroup_size_control_features = LvlFindInChain<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>(pCreateInfo->pNext);
1041 if (subgroup_size_control_features) {
1042 state_tracker->enabled_features.subgroup_size_control_features = *subgroup_size_control_features;
1043 }
1044
locke-lunargd556cc32019-09-17 01:21:23 -06001045 // Store physical device properties and physical device mem limits into CoreChecks structs
1046 DispatchGetPhysicalDeviceMemoryProperties(gpu, &state_tracker->phys_dev_mem_props);
1047 DispatchGetPhysicalDeviceProperties(gpu, &state_tracker->phys_dev_props);
1048
Lionel Landwerlind0f84e42021-12-07 15:46:09 +02001049 {
1050 uint32_t n_props = 0;
1051 std::vector<VkExtensionProperties> props;
1052 instance_dispatch_table.EnumerateDeviceExtensionProperties(gpu, NULL, &n_props, NULL);
1053 props.resize(n_props);
Tony-LunarG8c380b92022-01-12 13:44:04 -07001054 instance_dispatch_table.EnumerateDeviceExtensionProperties(gpu, NULL, &n_props, props.data());
Lionel Landwerlind0f84e42021-12-07 15:46:09 +02001055
1056 for (const auto &ext_prop : props) {
1057 state_tracker->phys_dev_extensions.insert(ext_prop.extensionName);
1058 }
1059
1060 // Even if VK_KHR_format_feature_flags2 is available, we need to have
1061 // a path to grab that information from the physical device. This
1062 // requires to have VK_KHR_get_physical_device_properties2 enabled or
1063 // Vulkan 1.1 (which made this core).
1064 state_tracker->has_format_feature2 =
1065 (state_tracker->api_version >= VK_API_VERSION_1_1 ||
1066 IsExtEnabled(state_tracker->instance_extensions.vk_khr_get_physical_device_properties2)) &&
1067 state_tracker->phys_dev_extensions.find(VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME) !=
1068 state_tracker->phys_dev_extensions.end();
1069 }
1070
locke-lunargd556cc32019-09-17 01:21:23 -06001071 const auto &dev_ext = state_tracker->device_extensions;
1072 auto *phys_dev_props = &state_tracker->phys_dev_ext_props;
1073
sfricke-samsung828e59d2021-08-22 23:20:49 -07001074 // Vulkan 1.2 can get properties from single struct, otherwise need to add to it per extension
sfricke-samsung45996a42021-09-16 13:45:27 -07001075 if (dev_ext.vk_feature_version_1_2) {
1076 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core11);
1077 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core12);
sfricke-samsung828e59d2021-08-22 23:20:49 -07001078 } else {
1079 // VkPhysicalDeviceVulkan11Properties
1080 //
1081 // Can ingnore VkPhysicalDeviceIDProperties as it has no validation purpose
1082
1083 if (dev_ext.vk_khr_multiview) {
1084 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
1085 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &multiview_props);
1086 state_tracker->phys_dev_props_core11.maxMultiviewViewCount = multiview_props.maxMultiviewViewCount;
1087 state_tracker->phys_dev_props_core11.maxMultiviewInstanceIndex = multiview_props.maxMultiviewInstanceIndex;
1088 }
1089
1090 if (dev_ext.vk_khr_maintenance3) {
1091 auto maintenance3_props = LvlInitStruct<VkPhysicalDeviceMaintenance3Properties>();
1092 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_maintenance3, &maintenance3_props);
1093 state_tracker->phys_dev_props_core11.maxPerSetDescriptors = maintenance3_props.maxPerSetDescriptors;
1094 state_tracker->phys_dev_props_core11.maxMemoryAllocationSize = maintenance3_props.maxMemoryAllocationSize;
1095 }
1096
1097 // Some 1.1 properties were added to core without previous extensions
1098 if (state_tracker->api_version >= VK_API_VERSION_1_1) {
1099 auto subgroup_prop = LvlInitStruct<VkPhysicalDeviceSubgroupProperties>();
1100 auto protected_memory_prop = LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>(&subgroup_prop);
1101 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&protected_memory_prop);
1102 instance_dispatch_table.GetPhysicalDeviceProperties2(gpu, &prop2);
1103
1104 state_tracker->phys_dev_props_core11.subgroupSize = subgroup_prop.subgroupSize;
1105 state_tracker->phys_dev_props_core11.subgroupSupportedStages = subgroup_prop.supportedStages;
1106 state_tracker->phys_dev_props_core11.subgroupSupportedOperations = subgroup_prop.supportedOperations;
1107 state_tracker->phys_dev_props_core11.subgroupQuadOperationsInAllStages = subgroup_prop.quadOperationsInAllStages;
1108
1109 state_tracker->phys_dev_props_core11.protectedNoFault = protected_memory_prop.protectedNoFault;
1110 }
1111
1112 // VkPhysicalDeviceVulkan12Properties
1113 //
1114 // Can ingnore VkPhysicalDeviceDriverProperties as it has no validation purpose
1115
1116 if (dev_ext.vk_ext_descriptor_indexing) {
1117 auto descriptor_indexing_prop = LvlInitStruct<VkPhysicalDeviceDescriptorIndexingProperties>();
1118 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_descriptor_indexing, &descriptor_indexing_prop);
1119 state_tracker->phys_dev_props_core12.maxUpdateAfterBindDescriptorsInAllPools =
1120 descriptor_indexing_prop.maxUpdateAfterBindDescriptorsInAllPools;
1121 state_tracker->phys_dev_props_core12.shaderUniformBufferArrayNonUniformIndexingNative =
1122 descriptor_indexing_prop.shaderUniformBufferArrayNonUniformIndexingNative;
1123 state_tracker->phys_dev_props_core12.shaderSampledImageArrayNonUniformIndexingNative =
1124 descriptor_indexing_prop.shaderSampledImageArrayNonUniformIndexingNative;
1125 state_tracker->phys_dev_props_core12.shaderStorageBufferArrayNonUniformIndexingNative =
1126 descriptor_indexing_prop.shaderStorageBufferArrayNonUniformIndexingNative;
1127 state_tracker->phys_dev_props_core12.shaderStorageImageArrayNonUniformIndexingNative =
1128 descriptor_indexing_prop.shaderStorageImageArrayNonUniformIndexingNative;
1129 state_tracker->phys_dev_props_core12.shaderInputAttachmentArrayNonUniformIndexingNative =
1130 descriptor_indexing_prop.shaderInputAttachmentArrayNonUniformIndexingNative;
1131 state_tracker->phys_dev_props_core12.robustBufferAccessUpdateAfterBind =
1132 descriptor_indexing_prop.robustBufferAccessUpdateAfterBind;
1133 state_tracker->phys_dev_props_core12.quadDivergentImplicitLod = descriptor_indexing_prop.quadDivergentImplicitLod;
1134 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSamplers =
1135 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSamplers;
1136 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindUniformBuffers =
1137 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindUniformBuffers;
1138 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageBuffers =
1139 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageBuffers;
1140 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSampledImages =
1141 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSampledImages;
1142 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageImages =
1143 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageImages;
1144 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindInputAttachments =
1145 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindInputAttachments;
1146 state_tracker->phys_dev_props_core12.maxPerStageUpdateAfterBindResources =
1147 descriptor_indexing_prop.maxPerStageUpdateAfterBindResources;
1148 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSamplers =
1149 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSamplers;
1150 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffers =
1151 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffers;
1152 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic =
1153 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
1154 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffers =
1155 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffers;
1156 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic =
1157 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
1158 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSampledImages =
1159 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSampledImages;
1160 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageImages =
1161 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageImages;
1162 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindInputAttachments =
1163 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindInputAttachments;
1164 }
1165
1166 if (dev_ext.vk_khr_depth_stencil_resolve) {
1167 auto depth_stencil_resolve_props = LvlInitStruct<VkPhysicalDeviceDepthStencilResolveProperties>();
1168 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_depth_stencil_resolve, &depth_stencil_resolve_props);
1169 state_tracker->phys_dev_props_core12.supportedDepthResolveModes =
1170 depth_stencil_resolve_props.supportedDepthResolveModes;
1171 state_tracker->phys_dev_props_core12.supportedStencilResolveModes =
1172 depth_stencil_resolve_props.supportedStencilResolveModes;
1173 state_tracker->phys_dev_props_core12.independentResolveNone = depth_stencil_resolve_props.independentResolveNone;
1174 state_tracker->phys_dev_props_core12.independentResolve = depth_stencil_resolve_props.independentResolve;
1175 }
1176
1177 if (dev_ext.vk_khr_timeline_semaphore) {
1178 auto timeline_semaphore_props = LvlInitStruct<VkPhysicalDeviceTimelineSemaphoreProperties>();
1179 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_timeline_semaphore, &timeline_semaphore_props);
1180 state_tracker->phys_dev_props_core12.maxTimelineSemaphoreValueDifference =
1181 timeline_semaphore_props.maxTimelineSemaphoreValueDifference;
1182 }
1183
1184 if (dev_ext.vk_ext_sampler_filter_minmax) {
1185 auto sampler_filter_minmax_props = LvlInitStruct<VkPhysicalDeviceSamplerFilterMinmaxProperties>();
1186 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sampler_filter_minmax, &sampler_filter_minmax_props);
1187 state_tracker->phys_dev_props_core12.filterMinmaxSingleComponentFormats =
1188 sampler_filter_minmax_props.filterMinmaxSingleComponentFormats;
1189 state_tracker->phys_dev_props_core12.filterMinmaxImageComponentMapping =
1190 sampler_filter_minmax_props.filterMinmaxImageComponentMapping;
1191 }
1192
1193 if (dev_ext.vk_khr_shader_float_controls) {
1194 auto float_controls_props = LvlInitStruct<VkPhysicalDeviceFloatControlsProperties>();
1195 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_shader_float_controls, &float_controls_props);
1196 state_tracker->phys_dev_props_core12.denormBehaviorIndependence = float_controls_props.denormBehaviorIndependence;
1197 state_tracker->phys_dev_props_core12.roundingModeIndependence = float_controls_props.roundingModeIndependence;
1198 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat16 =
1199 float_controls_props.shaderSignedZeroInfNanPreserveFloat16;
1200 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat32 =
1201 float_controls_props.shaderSignedZeroInfNanPreserveFloat32;
1202 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat64 =
1203 float_controls_props.shaderSignedZeroInfNanPreserveFloat64;
1204 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat16 = float_controls_props.shaderDenormPreserveFloat16;
1205 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat32 = float_controls_props.shaderDenormPreserveFloat32;
1206 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat64 = float_controls_props.shaderDenormPreserveFloat64;
1207 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat16 =
1208 float_controls_props.shaderDenormFlushToZeroFloat16;
1209 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat32 =
1210 float_controls_props.shaderDenormFlushToZeroFloat32;
1211 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat64 =
1212 float_controls_props.shaderDenormFlushToZeroFloat64;
1213 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat16 = float_controls_props.shaderRoundingModeRTEFloat16;
1214 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat32 = float_controls_props.shaderRoundingModeRTEFloat32;
1215 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat64 = float_controls_props.shaderRoundingModeRTEFloat64;
1216 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat16 = float_controls_props.shaderRoundingModeRTZFloat16;
1217 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat32 = float_controls_props.shaderRoundingModeRTZFloat32;
1218 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat64 = float_controls_props.shaderRoundingModeRTZFloat64;
1219 }
locke-lunargd556cc32019-09-17 01:21:23 -06001220 }
1221
sfricke-samsung828e59d2021-08-22 23:20:49 -07001222 // Extensions with properties to extract to DeviceExtensionProperties
1223 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_push_descriptor, &phys_dev_props->push_descriptor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001224 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_shading_rate_image, &phys_dev_props->shading_rate_image_props);
1225 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_mesh_shader, &phys_dev_props->mesh_shader_props);
1226 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_inline_uniform_block, &phys_dev_props->inline_uniform_block_props);
1227 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_vertex_attribute_divisor, &phys_dev_props->vtx_attrib_divisor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001228 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_transform_feedback, &phys_dev_props->transform_feedback_props);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001229 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_ray_tracing, &phys_dev_props->ray_tracing_propsNV);
sourav parmarcd5fb182020-07-17 12:58:44 -07001230 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_ray_tracing_pipeline, &phys_dev_props->ray_tracing_propsKHR);
1231 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_acceleration_structure, &phys_dev_props->acc_structure_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001232 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_texel_buffer_alignment, &phys_dev_props->texel_buffer_alignment_props);
1233 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map, &phys_dev_props->fragment_density_map_props);
Mike Schuchardtc57de4a2021-07-20 17:26:32 -07001234 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map2, &phys_dev_props->fragment_density_map2_props);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001235 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_performance_query, &phys_dev_props->performance_query_props);
sfricke-samsung8f658d42020-05-03 20:12:24 -07001236 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sample_locations, &phys_dev_props->sample_locations_props);
Tony-LunarG7337b312020-04-15 16:40:25 -06001237 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_custom_border_color, &phys_dev_props->custom_border_color_props);
locke-lunarg3fa463a2020-10-23 16:39:04 -06001238 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &phys_dev_props->multiview_props);
Nathaniel Cesario3291c912020-11-17 16:54:41 -07001239 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_portability_subset, &phys_dev_props->portability_props);
sfricke-samsung828e59d2021-08-22 23:20:49 -07001240 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_fragment_shading_rate, &phys_dev_props->fragment_shading_rate_props);
Locke Lin016d8482021-05-27 12:11:31 -06001241 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_provoking_vertex, &phys_dev_props->provoking_vertex_props);
Tony-LunarG4490de42021-06-21 15:49:19 -06001242 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_multi_draw, &phys_dev_props->multi_draw_props);
ziga-lunarg128904a2021-07-30 13:49:01 +02001243 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_discard_rectangles, &phys_dev_props->discard_rectangle_props);
ziga-lunarg86492812021-08-05 23:58:16 +02001244 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_blend_operation_advanced, &phys_dev_props->blend_operation_advanced_props);
ziga-lunargbd8ded62021-09-20 18:24:39 +02001245 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_conservative_rasterization, &phys_dev_props->conservative_rasterization_props);
ziga-lunarg11fecb92021-09-20 16:48:06 +02001246 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_subgroup_size_control, &phys_dev_props->subgroup_size_control_props);
Piers Daniell41b8c5d2020-01-10 15:42:00 -07001247
sfricke-samsung45996a42021-09-16 13:45:27 -07001248 if (IsExtEnabled(dev_ext.vk_nv_cooperative_matrix)) {
locke-lunargd556cc32019-09-17 01:21:23 -06001249 // Get the needed cooperative_matrix properties
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001250 auto cooperative_matrix_props = LvlInitStruct<VkPhysicalDeviceCooperativeMatrixPropertiesNV>();
1251 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&cooperative_matrix_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001252 instance_dispatch_table.GetPhysicalDeviceProperties2KHR(gpu, &prop2);
1253 state_tracker->phys_dev_ext_props.cooperative_matrix_props = cooperative_matrix_props;
1254
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001255 uint32_t num_cooperative_matrix_properties = 0;
1256 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties, NULL);
1257 state_tracker->cooperative_matrix_properties.resize(num_cooperative_matrix_properties,
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001258 LvlInitStruct<VkCooperativeMatrixPropertiesNV>());
locke-lunargd556cc32019-09-17 01:21:23 -06001259
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001260 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties,
locke-lunargd556cc32019-09-17 01:21:23 -06001261 state_tracker->cooperative_matrix_properties.data());
1262 }
Tobias Hector6663c9b2020-11-05 10:18:02 +00001263
locke-lunargd556cc32019-09-17 01:21:23 -06001264 // Store queue family data
1265 if (pCreateInfo->pQueueCreateInfos != nullptr) {
1266 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
sfricke-samsung590ae1e2020-04-25 01:18:05 -07001267 const VkDeviceQueueCreateInfo &queue_create_info = pCreateInfo->pQueueCreateInfos[i];
sfricke-samsungb585ec12021-05-06 03:10:13 -07001268 state_tracker->queue_family_index_set.insert(queue_create_info.queueFamilyIndex);
1269 state_tracker->device_queue_info_list.push_back(
1270 {i, queue_create_info.queueFamilyIndex, queue_create_info.flags, queue_create_info.queueCount});
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001271 }
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001272 for (const auto &queue_info : state_tracker->device_queue_info_list) {
1273 for (uint32_t i = 0; i < queue_info.queue_count; i++) {
1274 VkQueue queue = VK_NULL_HANDLE;
1275 // vkGetDeviceQueue2() was added in vulkan 1.1, and there was never a KHR version of it.
1276 if (api_version >= VK_API_VERSION_1_1 && queue_info.flags != 0) {
1277 auto get_info = LvlInitStruct<VkDeviceQueueInfo2>();
1278 get_info.flags = queue_info.flags;
1279 get_info.queueFamilyIndex = queue_info.queue_family_index;
1280 get_info.queueIndex = i;
1281 DispatchGetDeviceQueue2(*pDevice, &get_info, &queue);
1282 } else {
1283 DispatchGetDeviceQueue(*pDevice, queue_info.queue_family_index, i, &queue);
1284 }
1285 assert(queue != VK_NULL_HANDLE);
Mike Schuchardta9101d32021-11-12 12:24:08 -08001286 state_tracker->Add(std::make_shared<QUEUE_STATE>(queue, queue_info.queue_family_index, queue_info.flags));
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001287 }
locke-lunargd556cc32019-09-17 01:21:23 -06001288 }
1289 }
1290}
1291
1292void ValidationStateTracker::PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
1293 if (!device) return;
1294
Jeremy Gebbend177d922021-10-28 13:42:10 -06001295 command_pool_map_.clear();
1296 assert(command_buffer_map_.empty());
1297 pipeline_map_.clear();
1298 render_pass_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001299
1300 // This will also delete all sets in the pool & remove them from setMap
Jeremy Gebbend177d922021-10-28 13:42:10 -06001301 descriptor_pool_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001302 // All sets should be removed
Jeremy Gebbend177d922021-10-28 13:42:10 -06001303 assert(descriptor_set_map_.empty());
1304 desc_template_map_.clear();
1305 descriptor_set_layout_map_.clear();
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001306 // Because swapchains are associated with Surfaces, which are at instance level,
1307 // they need to be explicitly destroyed here to avoid continued references to
1308 // the device we're destroying.
Jeremy Gebben65975ed2021-10-29 11:16:10 -06001309 for (auto &entry : swapchain_map_.snapshot()) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001310 entry.second->Destroy();
1311 }
Jeremy Gebbend177d922021-10-28 13:42:10 -06001312 swapchain_map_.clear();
1313 image_view_map_.clear();
1314 image_map_.clear();
1315 buffer_view_map_.clear();
1316 buffer_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001317 // Queues persist until device is destroyed
Jeremy Gebbend177d922021-10-28 13:42:10 -06001318 queue_map_.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001319}
1320
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001321void ValidationStateTracker::PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1322 VkFence fence, VkResult result) {
1323 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001324 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001325
Jeremy Gebben57642982021-09-14 14:14:55 -06001326 uint64_t early_retire_seq = 0;
1327
1328 if (submitCount == 0) {
1329 CB_SUBMISSION submission;
Jeremy Gebben9f537102021-10-05 16:37:12 -06001330 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001331 early_retire_seq = queue_state->Submit(std::move(submission));
1332 }
locke-lunargd556cc32019-09-17 01:21:23 -06001333
1334 // Now process each individual submit
1335 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001336 CB_SUBMISSION submission;
locke-lunargd556cc32019-09-17 01:21:23 -06001337 const VkSubmitInfo *submit = &pSubmits[submit_idx];
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001338 auto *timeline_semaphore_submit = LvlFindInChain<VkTimelineSemaphoreSubmitInfo>(submit->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06001339 for (uint32_t i = 0; i < submit->waitSemaphoreCount; ++i) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001340 uint64_t value{0};
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001341 if (timeline_semaphore_submit && timeline_semaphore_submit->pWaitSemaphoreValues != nullptr &&
1342 (i < timeline_semaphore_submit->waitSemaphoreValueCount)) {
1343 value = timeline_semaphore_submit->pWaitSemaphoreValues[i];
1344 }
Jeremy Gebben9f537102021-10-05 16:37:12 -06001345 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(submit->pWaitSemaphores[i]), value);
locke-lunargd556cc32019-09-17 01:21:23 -06001346 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001347
locke-lunargd556cc32019-09-17 01:21:23 -06001348 for (uint32_t i = 0; i < submit->signalSemaphoreCount; ++i) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001349 uint64_t value{0};
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001350 if (timeline_semaphore_submit && timeline_semaphore_submit->pSignalSemaphoreValues != nullptr &&
1351 (i < timeline_semaphore_submit->signalSemaphoreValueCount)) {
1352 value = timeline_semaphore_submit->pSignalSemaphoreValues[i];
1353 }
Jeremy Gebben9f537102021-10-05 16:37:12 -06001354 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(submit->pSignalSemaphores[i]), value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001355 }
1356
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001357 const auto perf_submit = LvlFindInChain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001358 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02001359
locke-lunargd556cc32019-09-17 01:21:23 -06001360 for (uint32_t i = 0; i < submit->commandBufferCount; i++) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07001361 submission.AddCommandBuffer(GetWrite<CMD_BUFFER_STATE>(submit->pCommandBuffers[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001362 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001363 if (submit_idx == (submitCount - 1) && fence != VK_NULL_HANDLE) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001364 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001365 }
1366 auto submit_seq = queue_state->Submit(std::move(submission));
1367 early_retire_seq = std::max(early_retire_seq, submit_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001368 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001369
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001370 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001371 queue_state->Retire(early_retire_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001372 }
1373}
1374
1375void ValidationStateTracker::PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1376 VkFence fence, VkResult result) {
1377 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001378 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001379 uint64_t early_retire_seq = 0;
1380 if (submitCount == 0) {
1381 CB_SUBMISSION submission;
Jeremy Gebben9f537102021-10-05 16:37:12 -06001382 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001383 early_retire_seq = queue_state->Submit(std::move(submission));
1384 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001385
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001386 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
1387 CB_SUBMISSION submission;
1388 const VkSubmitInfo2KHR *submit = &pSubmits[submit_idx];
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001389 for (uint32_t i = 0; i < submit->waitSemaphoreInfoCount; ++i) {
1390 const auto &sem_info = submit->pWaitSemaphoreInfos[i];
Jeremy Gebben9f537102021-10-05 16:37:12 -06001391 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001392 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001393 for (uint32_t i = 0; i < submit->signalSemaphoreInfoCount; ++i) {
1394 const auto &sem_info = submit->pSignalSemaphoreInfos[i];
Jeremy Gebben9f537102021-10-05 16:37:12 -06001395 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001396 }
1397 const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
1398 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
1399
1400 for (uint32_t i = 0; i < submit->commandBufferInfoCount; i++) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07001401 submission.AddCommandBuffer(GetWrite<CMD_BUFFER_STATE>(submit->pCommandBufferInfos[i].commandBuffer));
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001402 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001403 if (submit_idx == (submitCount - 1)) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001404 submission.AddFence(Get<FENCE_STATE>(fence));
Jeremy Gebben57642982021-09-14 14:14:55 -06001405 }
1406 auto submit_seq = queue_state->Submit(std::move(submission));
1407 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001408 }
locke-lunargd556cc32019-09-17 01:21:23 -06001409 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001410 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001411 }
1412}
1413
1414void ValidationStateTracker::PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1415 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory,
1416 VkResult result) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001417 if (VK_SUCCESS != result) {
1418 return;
locke-lunargd556cc32019-09-17 01:21:23 -06001419 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001420 const auto &memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
1421 const auto &memory_heap = phys_dev_mem_props.memoryHeaps[memory_type.heapIndex];
1422 auto fake_address = fake_memory.Alloc(pAllocateInfo->allocationSize);
1423
1424 layer_data::optional<DedicatedBinding> dedicated_binding;
1425
1426 auto dedicated = LvlFindInChain<VkMemoryDedicatedAllocateInfo>(pAllocateInfo->pNext);
1427 if (dedicated) {
1428 if (dedicated->buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001429 const auto buffer_state = Get<BUFFER_STATE>(dedicated->buffer);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001430 assert(buffer_state);
1431 if (!buffer_state) {
1432 return;
1433 }
1434 dedicated_binding.emplace(dedicated->buffer, buffer_state->createInfo);
1435 } else if (dedicated->image) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001436 const auto image_state = Get<IMAGE_STATE>(dedicated->image);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001437 assert(image_state);
1438 if (!image_state) {
1439 return;
1440 }
1441 dedicated_binding.emplace(dedicated->image, image_state->createInfo);
1442 }
1443 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001444 Add(std::make_shared<DEVICE_MEMORY_STATE>(*pMemory, pAllocateInfo, fake_address, memory_type, memory_heap,
1445 std::move(dedicated_binding), physical_device_count));
locke-lunargd556cc32019-09-17 01:21:23 -06001446 return;
1447}
1448
1449void ValidationStateTracker::PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory mem, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001450 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001451 if (mem_info) {
1452 fake_memory.Free(mem_info->fake_base_address);
1453 }
1454 Destroy<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001455}
1456
1457void ValidationStateTracker::PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
1458 VkFence fence, VkResult result) {
1459 if (result != VK_SUCCESS) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001460 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06001461
Jeremy Gebben57642982021-09-14 14:14:55 -06001462 uint64_t early_retire_seq = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001463
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001464 for (uint32_t bind_idx = 0; bind_idx < bindInfoCount; ++bind_idx) {
1465 const VkBindSparseInfo &bind_info = pBindInfo[bind_idx];
locke-lunargd556cc32019-09-17 01:21:23 -06001466 // Track objects tied to memory
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001467 for (uint32_t j = 0; j < bind_info.bufferBindCount; j++) {
1468 for (uint32_t k = 0; k < bind_info.pBufferBinds[j].bindCount; k++) {
1469 auto sparse_binding = bind_info.pBufferBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001470 auto buffer_state = Get<BUFFER_STATE>(bind_info.pBufferBinds[j].buffer);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001471 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001472 if (buffer_state && mem_state) {
1473 buffer_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1474 }
locke-lunargd556cc32019-09-17 01:21:23 -06001475 }
1476 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001477 for (uint32_t j = 0; j < bind_info.imageOpaqueBindCount; j++) {
1478 for (uint32_t k = 0; k < bind_info.pImageOpaqueBinds[j].bindCount; k++) {
1479 auto sparse_binding = bind_info.pImageOpaqueBinds[j].pBinds[k];
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001480 auto image_state = Get<IMAGE_STATE>(bind_info.pImageOpaqueBinds[j].image);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001481 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001482 if (image_state && mem_state) {
1483 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1484 }
locke-lunargd556cc32019-09-17 01:21:23 -06001485 }
1486 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001487 for (uint32_t j = 0; j < bind_info.imageBindCount; j++) {
1488 for (uint32_t k = 0; k < bind_info.pImageBinds[j].bindCount; k++) {
1489 auto sparse_binding = bind_info.pImageBinds[j].pBinds[k];
locke-lunargd556cc32019-09-17 01:21:23 -06001490 // TODO: This size is broken for non-opaque bindings, need to update to comprehend full sparse binding data
1491 VkDeviceSize size = sparse_binding.extent.depth * sparse_binding.extent.height * sparse_binding.extent.width * 4;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001492 auto image_state = Get<IMAGE_STATE>(bind_info.pImageBinds[j].image);
Jeremy Gebben9f537102021-10-05 16:37:12 -06001493 auto mem_state = Get<DEVICE_MEMORY_STATE>(sparse_binding.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001494 if (image_state && mem_state) {
1495 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, size);
1496 }
locke-lunargd556cc32019-09-17 01:21:23 -06001497 }
1498 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001499 CB_SUBMISSION submission;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001500 for (uint32_t i = 0; i < bind_info.waitSemaphoreCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001501 submission.AddWaitSemaphore(Get<SEMAPHORE_STATE>(bind_info.pWaitSemaphores[i]), 0);
locke-lunargd556cc32019-09-17 01:21:23 -06001502 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001503 for (uint32_t i = 0; i < bind_info.signalSemaphoreCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001504 submission.AddSignalSemaphore(Get<SEMAPHORE_STATE>(bind_info.pSignalSemaphores[i]), 0);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001505 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001506 if (bind_idx == (bindInfoCount - 1)) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001507 submission.AddFence(Get<FENCE_STATE>(fence));
locke-lunargd556cc32019-09-17 01:21:23 -06001508 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001509 auto submit_seq = queue_state->Submit(std::move(submission));
1510 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001511 }
1512
1513 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001514 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001515 }
1516}
1517
1518void ValidationStateTracker::PostCallRecordCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
1519 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore,
1520 VkResult result) {
1521 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001522 Add(std::make_shared<SEMAPHORE_STATE>(*pSemaphore, LvlFindInChain<VkSemaphoreTypeCreateInfo>(pCreateInfo->pNext)));
locke-lunargd556cc32019-09-17 01:21:23 -06001523}
1524
Mike Schuchardt2df08912020-12-15 16:28:09 -08001525void ValidationStateTracker::RecordImportSemaphoreState(VkSemaphore semaphore, VkExternalSemaphoreHandleTypeFlagBits handle_type,
1526 VkSemaphoreImportFlags flags) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001527 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
1528 if (semaphore_state) {
1529 semaphore_state->Import(handle_type, flags);
locke-lunargd556cc32019-09-17 01:21:23 -06001530 }
1531}
1532
Mike Schuchardt2df08912020-12-15 16:28:09 -08001533void ValidationStateTracker::PostCallRecordSignalSemaphoreKHR(VkDevice device, const VkSemaphoreSignalInfo *pSignalInfo,
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001534 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001535 auto semaphore_state = Get<SEMAPHORE_STATE>(pSignalInfo->semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07001536 if (semaphore_state) {
1537 semaphore_state->RetireTimeline(pSignalInfo->value);
1538 }
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001539}
1540
locke-lunargd556cc32019-09-17 01:21:23 -06001541void ValidationStateTracker::RecordMappedMemory(VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, void **ppData) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001542 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06001543 if (mem_info) {
1544 mem_info->mapped_range.offset = offset;
1545 mem_info->mapped_range.size = size;
1546 mem_info->p_driver_data = *ppData;
1547 }
1548}
1549
locke-lunargd556cc32019-09-17 01:21:23 -06001550void ValidationStateTracker::PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1551 VkBool32 waitAll, uint64_t timeout, VkResult result) {
1552 if (VK_SUCCESS != result) return;
1553
1554 // When we know that all fences are complete we can clean/remove their CBs
1555 if ((VK_TRUE == waitAll) || (1 == fenceCount)) {
1556 for (uint32_t i = 0; i < fenceCount; i++) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001557 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Jeremy Gebben57642982021-09-14 14:14:55 -06001558 if (fence_state) {
1559 fence_state->Retire();
1560 }
locke-lunargd556cc32019-09-17 01:21:23 -06001561 }
1562 }
1563 // NOTE : Alternate case not handled here is when some fences have completed. In
1564 // this case for app to guarantee which fences completed it will have to call
1565 // vkGetFenceStatus() at which point we'll clean/remove their CBs if complete.
1566}
1567
John Zulauff89de662020-04-13 18:57:34 -06001568void ValidationStateTracker::RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1569 VkResult result) {
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001570 if (VK_SUCCESS != result) return;
1571
Jeremy Gebben15332642021-12-15 19:33:15 -07001572 // Same logic as vkWaitForFences(). If some semaphores are not signaled, we will get their status when
1573 // the application calls vkGetSemaphoreCounterValue() on each of them.
1574 if ((pWaitInfo->flags & VK_SEMAPHORE_WAIT_ANY_BIT) == 0 || pWaitInfo->semaphoreCount == 1) {
1575 for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
1576 auto semaphore_state = Get<SEMAPHORE_STATE>(pWaitInfo->pSemaphores[i]);
1577 if (semaphore_state) {
1578 semaphore_state->RetireTimeline(pWaitInfo->pValues[i]);
1579 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001580 }
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001581 }
1582}
1583
John Zulauff89de662020-04-13 18:57:34 -06001584void ValidationStateTracker::PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1585 VkResult result) {
1586 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1587}
1588
1589void ValidationStateTracker::PostCallRecordWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo,
1590 uint64_t timeout, VkResult result) {
1591 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1592}
1593
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001594void ValidationStateTracker::RecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1595 VkResult result) {
1596 if (VK_SUCCESS != result) return;
1597
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001598 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben57642982021-09-14 14:14:55 -06001599 if (semaphore_state) {
Jeremy Gebben15332642021-12-15 19:33:15 -07001600 semaphore_state->RetireTimeline(*pValue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001601 }
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001602}
1603
1604void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1605 VkResult result) {
1606 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1607}
1608void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValueKHR(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1609 VkResult result) {
1610 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1611}
1612
locke-lunargd556cc32019-09-17 01:21:23 -06001613void ValidationStateTracker::PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
1614 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001615 auto fence_state = Get<FENCE_STATE>(fence);
Jeremy Gebben57642982021-09-14 14:14:55 -06001616 if (fence_state) {
1617 fence_state->Retire();
1618 }
locke-lunargd556cc32019-09-17 01:21:23 -06001619}
1620
Yilong Lice03a312022-01-02 02:08:35 -08001621void ValidationStateTracker::RecordGetDeviceQueueState(uint32_t queue_family_index, VkDeviceQueueCreateFlags flags, VkQueue queue) {
1622 if (Get<QUEUE_STATE>(queue) == nullptr) {
1623 Add(std::make_shared<QUEUE_STATE>(queue, queue_family_index, flags));
1624 }
1625}
1626
1627void ValidationStateTracker::PostCallRecordGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex,
1628 VkQueue *pQueue) {
1629 RecordGetDeviceQueueState(queueFamilyIndex, {}, *pQueue);
1630}
1631
1632void ValidationStateTracker::PostCallRecordGetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2 *pQueueInfo, VkQueue *pQueue) {
1633 RecordGetDeviceQueueState(pQueueInfo->queueFamilyIndex, pQueueInfo->flags, *pQueue);
1634}
1635
locke-lunargd556cc32019-09-17 01:21:23 -06001636void ValidationStateTracker::PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) {
1637 if (VK_SUCCESS != result) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001638 auto queue_state = Get<QUEUE_STATE>(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001639 if (queue_state) {
1640 queue_state->Retire();
1641 }
locke-lunargd556cc32019-09-17 01:21:23 -06001642}
1643
1644void ValidationStateTracker::PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) {
1645 if (VK_SUCCESS != result) return;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06001646 for (auto &queue : queue_map_.snapshot()) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001647 queue.second->Retire();
locke-lunargd556cc32019-09-17 01:21:23 -06001648 }
1649}
1650
1651void ValidationStateTracker::PreCallRecordDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001652 Destroy<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06001653}
1654
1655void ValidationStateTracker::PreCallRecordDestroySemaphore(VkDevice device, VkSemaphore semaphore,
1656 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001657 Destroy<SEMAPHORE_STATE>(semaphore);
locke-lunargd556cc32019-09-17 01:21:23 -06001658}
1659
1660void ValidationStateTracker::PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001661 Destroy<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06001662}
1663
1664void ValidationStateTracker::PreCallRecordDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
1665 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001666 Destroy<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001667}
1668
locke-lunargd556cc32019-09-17 01:21:23 -06001669void ValidationStateTracker::UpdateBindBufferMemoryState(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001670 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001671 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001672 // Track objects tied to memory
Jeremy Gebben9f537102021-10-05 16:37:12 -06001673 auto mem_state = Get<DEVICE_MEMORY_STATE>(mem);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001674 if (mem_state) {
1675 buffer_state->SetMemBinding(mem_state, memoryOffset);
1676 }
locke-lunargd556cc32019-09-17 01:21:23 -06001677 }
1678}
1679
1680void ValidationStateTracker::PostCallRecordBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
1681 VkDeviceSize memoryOffset, VkResult result) {
1682 if (VK_SUCCESS != result) return;
1683 UpdateBindBufferMemoryState(buffer, mem, memoryOffset);
1684}
1685
1686void ValidationStateTracker::PostCallRecordBindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001687 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001688 for (uint32_t i = 0; i < bindInfoCount; i++) {
1689 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1690 }
1691}
1692
1693void ValidationStateTracker::PostCallRecordBindBufferMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001694 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001695 for (uint32_t i = 0; i < bindInfoCount; i++) {
1696 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1697 }
1698}
1699
Spencer Fricke6c127102020-04-16 06:25:20 -07001700void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001701 auto buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001702 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001703 buffer_state->memory_requirements_checked = true;
1704 }
1705}
1706
1707void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1708 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001709 RecordGetBufferMemoryRequirementsState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001710}
1711
1712void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001713 const VkBufferMemoryRequirementsInfo2 *pInfo,
1714 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001715 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001716}
1717
1718void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2KHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001719 const VkBufferMemoryRequirementsInfo2 *pInfo,
1720 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001721 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001722}
1723
Spencer Fricke6c127102020-04-16 06:25:20 -07001724void ValidationStateTracker::RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2 *pInfo) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001725 const VkImagePlaneMemoryRequirementsInfo *plane_info =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001726 (pInfo == nullptr) ? nullptr : LvlFindInChain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001727 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001728 if (image_state) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001729 if (plane_info != nullptr) {
1730 // Multi-plane image
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001731 if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_0_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001732 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001733 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_1_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001734 image_state->memory_requirements_checked[1] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001735 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_2_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001736 image_state->memory_requirements_checked[2] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001737 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001738 } else if (!image_state->disjoint) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001739 // Single Plane image
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001740 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001741 }
locke-lunargd556cc32019-09-17 01:21:23 -06001742 }
1743}
1744
1745void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements(VkDevice device, VkImage image,
1746 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001747 RecordGetImageMemoryRequirementsState(image, nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06001748}
1749
1750void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
1751 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001752 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001753}
1754
1755void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2KHR(VkDevice device,
1756 const VkImageMemoryRequirementsInfo2 *pInfo,
1757 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001758 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001759}
1760
locke-lunargd556cc32019-09-17 01:21:23 -06001761void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements(
1762 VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1763 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001764 auto image_state = Get<IMAGE_STATE>(image);
locke-lunargd556cc32019-09-17 01:21:23 -06001765 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001766}
1767
1768void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001769 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1770 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001771 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001772 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001773}
1774
1775void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001776 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1777 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001778 auto image_state = Get<IMAGE_STATE>(pInfo->image);
locke-lunargd556cc32019-09-17 01:21:23 -06001779 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001780}
1781
1782void ValidationStateTracker::PreCallRecordDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1783 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001784 Destroy<SHADER_MODULE_STATE>(shaderModule);
locke-lunargd556cc32019-09-17 01:21:23 -06001785}
1786
1787void ValidationStateTracker::PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline,
1788 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001789 Destroy<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06001790}
1791
1792void ValidationStateTracker::PreCallRecordDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1793 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001794 Destroy<PIPELINE_LAYOUT_STATE>(pipelineLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001795}
1796
1797void ValidationStateTracker::PreCallRecordDestroySampler(VkDevice device, VkSampler sampler,
1798 const VkAllocationCallbacks *pAllocator) {
1799 if (!sampler) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001800 auto sampler_state = Get<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001801 // Any bound cmd buffers are now invalid
1802 if (sampler_state) {
Yuly Novikov424cdd52020-05-26 16:45:12 -04001803 if (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
1804 sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
1805 custom_border_color_sampler_count--;
1806 }
locke-lunargd556cc32019-09-17 01:21:23 -06001807 }
Jeremy Gebben082a9832021-10-28 13:40:11 -06001808 Destroy<SAMPLER_STATE>(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001809}
1810
1811void ValidationStateTracker::PreCallRecordDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1812 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001813 Destroy<cvdescriptorset::DescriptorSetLayout>(descriptorSetLayout);
locke-lunargd556cc32019-09-17 01:21:23 -06001814}
1815
1816void ValidationStateTracker::PreCallRecordDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1817 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001818 Destroy<DESCRIPTOR_POOL_STATE>(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001819}
1820
locke-lunargd556cc32019-09-17 01:21:23 -06001821void ValidationStateTracker::PreCallRecordFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
1822 uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001823 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1824 if (pool) {
1825 pool->Free(commandBufferCount, pCommandBuffers);
1826 }
locke-lunargd556cc32019-09-17 01:21:23 -06001827}
1828
1829void ValidationStateTracker::PostCallRecordCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1830 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool,
1831 VkResult result) {
1832 if (VK_SUCCESS != result) return;
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001833 auto queue_flags = physical_device_state->queue_family_properties[pCreateInfo->queueFamilyIndex].queueFlags;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001834 Add(std::make_shared<COMMAND_POOL_STATE>(this, *pCommandPool, pCreateInfo, queue_flags));
locke-lunargd556cc32019-09-17 01:21:23 -06001835}
1836
1837void ValidationStateTracker::PostCallRecordCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1838 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool,
1839 VkResult result) {
1840 if (VK_SUCCESS != result) return;
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001841
1842 uint32_t index_count = 0, n_perf_pass = 0;
1843 bool has_cb = false, has_rb = false;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001844 if (pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001845 const auto *perf = LvlFindInChain<VkQueryPoolPerformanceCreateInfoKHR>(pCreateInfo->pNext);
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001846 index_count = perf->counterIndexCount;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001847
Mark Lobodzinski7e948e42020-09-09 10:23:36 -06001848 const QUEUE_FAMILY_PERF_COUNTERS &counters = *physical_device_state->perf_counters[perf->queueFamilyIndex];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001849 for (uint32_t i = 0; i < perf->counterIndexCount; i++) {
1850 const auto &counter = counters.counters[perf->pCounterIndices[i]];
1851 switch (counter.scope) {
1852 case VK_QUERY_SCOPE_COMMAND_BUFFER_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001853 has_cb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001854 break;
1855 case VK_QUERY_SCOPE_RENDER_PASS_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001856 has_rb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001857 break;
1858 default:
1859 break;
1860 }
1861 }
1862
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001863 DispatchGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physical_device_state->PhysDev(), perf, &n_perf_pass);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001864 }
1865
Jeremy Gebben082a9832021-10-28 13:40:11 -06001866 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 -06001867
locke-lunargd556cc32019-09-17 01:21:23 -06001868}
1869
1870void ValidationStateTracker::PreCallRecordDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
1871 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001872 Destroy<COMMAND_POOL_STATE>(commandPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001873}
1874
1875void ValidationStateTracker::PostCallRecordResetCommandPool(VkDevice device, VkCommandPool commandPool,
1876 VkCommandPoolResetFlags flags, VkResult result) {
1877 if (VK_SUCCESS != result) return;
1878 // Reset all of the CBs allocated from this pool
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001879 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1880 if (pool) {
1881 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001882 }
1883}
1884
1885void ValidationStateTracker::PostCallRecordResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1886 VkResult result) {
1887 for (uint32_t i = 0; i < fenceCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001888 auto fence_state = Get<FENCE_STATE>(pFences[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001889 if (fence_state) {
Jeremy Gebben140a0a52021-12-15 18:22:34 -07001890 fence_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001891 }
1892 }
1893}
1894
locke-lunargd556cc32019-09-17 01:21:23 -06001895void ValidationStateTracker::PreCallRecordDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
1896 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001897 Destroy<FRAMEBUFFER_STATE>(framebuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001898}
1899
1900void ValidationStateTracker::PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
1901 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06001902 Destroy<RENDER_PASS_STATE>(renderPass);
locke-lunargd556cc32019-09-17 01:21:23 -06001903}
1904
1905void ValidationStateTracker::PostCallRecordCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
1906 const VkAllocationCallbacks *pAllocator, VkFence *pFence, VkResult result) {
1907 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06001908 Add(std::make_shared<FENCE_STATE>(*pFence, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06001909}
1910
1911bool ValidationStateTracker::PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1912 const VkGraphicsPipelineCreateInfo *pCreateInfos,
1913 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001914 void *cgpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001915 // Set up the state that CoreChecks, gpu_validation and later StateTracker Record will use.
1916 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
1917 cgpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
1918 cgpl_state->pipe_state.reserve(count);
1919 for (uint32_t i = 0; i < count; i++) {
Jeremy Gebbence23dac2021-11-10 10:19:42 -07001920 if (pCreateInfos[i].renderPass != VK_NULL_HANDLE) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06001921 cgpl_state->pipe_state.push_back(std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i],
1922 Get<RENDER_PASS_STATE>(pCreateInfos[i].renderPass),
1923 Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
amhagana448ea52021-11-02 14:09:14 -04001924 } else if (enabled_features.dynamic_rendering_features.dynamicRendering) {
1925 auto dynamic_rendering = LvlFindInChain<VkPipelineRenderingCreateInfoKHR>(pCreateInfos[i].pNext);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06001926 cgpl_state->pipe_state.push_back(
1927 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], std::make_shared<RENDER_PASS_STATE>(dynamic_rendering),
Jeremy Gebben9f537102021-10-05 16:37:12 -06001928 Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeremy Gebbence23dac2021-11-10 10:19:42 -07001929 }
locke-lunargd556cc32019-09-17 01:21:23 -06001930 }
1931 return false;
1932}
1933
1934void ValidationStateTracker::PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1935 const VkGraphicsPipelineCreateInfo *pCreateInfos,
1936 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
1937 VkResult result, void *cgpl_state_data) {
1938 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
1939 // This API may create pipelines regardless of the return value
1940 for (uint32_t i = 0; i < count; i++) {
1941 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001942 (cgpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001943 Add(std::move((cgpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001944 }
1945 }
1946 cgpl_state->pipe_state.clear();
1947}
1948
1949bool ValidationStateTracker::PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1950 const VkComputePipelineCreateInfo *pCreateInfos,
1951 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001952 void *ccpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001953 auto *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
1954 ccpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
1955 ccpl_state->pipe_state.reserve(count);
1956 for (uint32_t i = 0; i < count; i++) {
1957 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06001958 ccpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06001959 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06001960 }
1961 return false;
1962}
1963
1964void ValidationStateTracker::PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
1965 const VkComputePipelineCreateInfo *pCreateInfos,
1966 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
1967 VkResult result, void *ccpl_state_data) {
1968 create_compute_pipeline_api_state *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
1969
1970 // This API may create pipelines regardless of the return value
1971 for (uint32_t i = 0; i < count; i++) {
1972 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001973 (ccpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06001974 Add(std::move((ccpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001975 }
1976 }
1977 ccpl_state->pipe_state.clear();
1978}
1979
1980bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache,
1981 uint32_t count,
1982 const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
1983 const VkAllocationCallbacks *pAllocator,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001984 VkPipeline *pPipelines, void *crtpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06001985 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
1986 crtpl_state->pipe_state.reserve(count);
1987 for (uint32_t i = 0; i < count; i++) {
1988 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06001989 crtpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06001990 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06001991 }
1992 return false;
1993}
1994
1995void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesNV(
1996 VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
1997 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines, VkResult result, void *crtpl_state_data) {
1998 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
1999 // This API may create pipelines regardless of the return value
2000 for (uint32_t i = 0; i < count; i++) {
2001 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002002 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06002003 Add(std::move((crtpl_state->pipe_state)[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06002004 }
2005 }
2006 crtpl_state->pipe_state.clear();
2007}
2008
sourav parmarcd5fb182020-07-17 12:58:44 -07002009bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2010 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002011 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2012 const VkAllocationCallbacks *pAllocator,
2013 VkPipeline *pPipelines, void *crtpl_state_data) const {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002014 auto crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002015 crtpl_state->pipe_state.reserve(count);
2016 for (uint32_t i = 0; i < count; i++) {
2017 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002018 crtpl_state->pipe_state.push_back(
Jeremy Gebben9f537102021-10-05 16:37:12 -06002019 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], Get<PIPELINE_LAYOUT_STATE>(pCreateInfos[i].layout)));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002020 }
2021 return false;
2022}
2023
sourav parmarcd5fb182020-07-17 12:58:44 -07002024void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2025 VkPipelineCache pipelineCache, uint32_t count,
2026 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2027 const VkAllocationCallbacks *pAllocator,
2028 VkPipeline *pPipelines, VkResult result,
2029 void *crtpl_state_data) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002030 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
2031 // This API may create pipelines regardless of the return value
2032 for (uint32_t i = 0; i < count; i++) {
2033 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002034 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeremy Gebben082a9832021-10-28 13:40:11 -06002035 Add(std::move((crtpl_state->pipe_state)[i]));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002036 }
2037 }
2038 crtpl_state->pipe_state.clear();
2039}
2040
locke-lunargd556cc32019-09-17 01:21:23 -06002041void ValidationStateTracker::PostCallRecordCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2042 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler,
2043 VkResult result) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002044 Add(std::make_shared<SAMPLER_STATE>(pSampler, pCreateInfo));
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002045 if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
2046 pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
Tony-LunarG7337b312020-04-15 16:40:25 -06002047 custom_border_color_sampler_count++;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002048 }
locke-lunargd556cc32019-09-17 01:21:23 -06002049}
2050
2051void ValidationStateTracker::PostCallRecordCreateDescriptorSetLayout(VkDevice device,
2052 const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2053 const VkAllocationCallbacks *pAllocator,
2054 VkDescriptorSetLayout *pSetLayout, VkResult result) {
2055 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002056 Add(std::make_shared<cvdescriptorset::DescriptorSetLayout>(pCreateInfo, *pSetLayout));
locke-lunargd556cc32019-09-17 01:21:23 -06002057}
2058
locke-lunargd556cc32019-09-17 01:21:23 -06002059void ValidationStateTracker::PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
2060 const VkAllocationCallbacks *pAllocator,
2061 VkPipelineLayout *pPipelineLayout, VkResult result) {
2062 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002063 Add(std::make_shared<PIPELINE_LAYOUT_STATE>(this, *pPipelineLayout, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002064}
2065
2066void ValidationStateTracker::PostCallRecordCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
2067 const VkAllocationCallbacks *pAllocator,
2068 VkDescriptorPool *pDescriptorPool, VkResult result) {
2069 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002070 Add(std::make_shared<DESCRIPTOR_POOL_STATE>(this, *pDescriptorPool, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002071}
2072
2073void ValidationStateTracker::PostCallRecordResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
2074 VkDescriptorPoolResetFlags flags, VkResult result) {
2075 if (VK_SUCCESS != result) return;
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002076 auto pool = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
2077 if (pool) {
2078 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002079 }
locke-lunargd556cc32019-09-17 01:21:23 -06002080}
2081
2082bool ValidationStateTracker::PreCallValidateAllocateDescriptorSets(VkDevice device,
2083 const VkDescriptorSetAllocateInfo *pAllocateInfo,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002084 VkDescriptorSet *pDescriptorSets, void *ads_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002085 // Always update common data
2086 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2087 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2088 UpdateAllocateDescriptorSetsData(pAllocateInfo, ads_state);
2089
2090 return false;
2091}
2092
2093// Allocation state was good and call down chain was made so update state based on allocating descriptor sets
2094void ValidationStateTracker::PostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
2095 VkDescriptorSet *pDescriptorSets, VkResult result,
2096 void *ads_state_data) {
2097 if (VK_SUCCESS != result) return;
2098 // All the updates are contained in a single cvdescriptorset function
2099 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2100 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002101 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(pAllocateInfo->descriptorPool);
2102 if (pool_state) {
2103 pool_state->Allocate(pAllocateInfo, pDescriptorSets, ads_state);
2104 }
locke-lunargd556cc32019-09-17 01:21:23 -06002105}
2106
2107void ValidationStateTracker::PreCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count,
2108 const VkDescriptorSet *pDescriptorSets) {
Jeremy Gebben1fbebb82021-10-27 10:27:27 -06002109 auto pool_state = Get<DESCRIPTOR_POOL_STATE>(descriptorPool);
2110 if (pool_state) {
2111 pool_state->Free(count, pDescriptorSets);
locke-lunargd556cc32019-09-17 01:21:23 -06002112 }
2113}
2114
2115void ValidationStateTracker::PreCallRecordUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
2116 const VkWriteDescriptorSet *pDescriptorWrites,
2117 uint32_t descriptorCopyCount,
2118 const VkCopyDescriptorSet *pDescriptorCopies) {
2119 cvdescriptorset::PerformUpdateDescriptorSets(this, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
2120 pDescriptorCopies);
2121}
2122
2123void ValidationStateTracker::PostCallRecordAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002124 VkCommandBuffer *pCommandBuffers, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002125 if (VK_SUCCESS != result) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06002126 auto pool = Get<COMMAND_POOL_STATE>(pCreateInfo->commandPool);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002127 if (pool) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002128 pool->Allocate(pCreateInfo, pCommandBuffers);
locke-lunargfc78e932020-11-19 17:06:24 -07002129 }
2130}
2131
locke-lunargd556cc32019-09-17 01:21:23 -06002132void ValidationStateTracker::PreCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer,
2133 const VkCommandBufferBeginInfo *pBeginInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002134 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002135 if (!cb_state) return;
locke-lunargfc78e932020-11-19 17:06:24 -07002136
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002137 cb_state->Begin(pBeginInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002138}
2139
2140void ValidationStateTracker::PostCallRecordEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002141 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002142 if (!cb_state) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002143
2144 cb_state->End(result);
locke-lunargd556cc32019-09-17 01:21:23 -06002145}
2146
2147void ValidationStateTracker::PostCallRecordResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags,
2148 VkResult result) {
2149 if (VK_SUCCESS == result) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002150 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2151 if (cb_state) {
2152 cb_state->Reset();
2153 }
locke-lunargd556cc32019-09-17 01:21:23 -06002154 }
2155}
2156
2157CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) {
2158 // initially assume everything is static state
2159 CBStatusFlags flags = CBSTATUS_ALL_STATE_SET;
2160
2161 if (ds) {
2162 for (uint32_t i = 0; i < ds->dynamicStateCount; i++) {
locke-lunarg4189aa22020-10-21 00:23:48 -06002163 flags &= ~ConvertToCBStatusFlagBits(ds->pDynamicStates[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002164 }
2165 }
locke-lunargd556cc32019-09-17 01:21:23 -06002166 return flags;
2167}
2168
2169// Validation cache:
2170// CV is the bottommost implementor of this extension. Don't pass calls down.
locke-lunargd556cc32019-09-17 01:21:23 -06002171
2172void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2173 VkPipeline pipeline) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002174 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002175 assert(cb_state);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002176 cb_state->RecordCmd(CMD_BINDPIPELINE);
locke-lunargd556cc32019-09-17 01:21:23 -06002177
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002178 auto pipe_state = Get<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06002179 if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002180 const auto &create_info = pipe_state->create_info.graphics;
2181 bool rasterization_enabled = VK_FALSE == create_info.pRasterizationState->rasterizerDiscardEnable;
2182 const auto *viewport_state = create_info.pViewportState;
2183 const auto *dynamic_state = create_info.pDynamicState;
locke-lunargd556cc32019-09-17 01:21:23 -06002184 cb_state->status &= ~cb_state->static_status;
Yilong Lid23bc292022-01-02 22:06:12 -08002185 cb_state->static_status = MakeStaticStateMask(dynamic_state ? dynamic_state->ptr() : nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06002186 cb_state->status |= cb_state->static_status;
locke-lunarg4189aa22020-10-21 00:23:48 -06002187 cb_state->dynamic_status = CBSTATUS_ALL_STATE_SET & (~cb_state->static_status);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002188
2189 // Used to calculate CMD_BUFFER_STATE::usedViewportScissorCount upon draw command with this graphics pipeline.
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002190 // If rasterization disabled (no viewport/scissors used), or the actual number of viewports/scissors is dynamic (unknown at
2191 // this time), then these are set to 0 to disable this checking.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002192 auto has_dynamic_viewport_count = cb_state->dynamic_status & CBSTATUS_VIEWPORT_WITH_COUNT_SET;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002193 auto has_dynamic_scissor_count = cb_state->dynamic_status & CBSTATUS_SCISSOR_WITH_COUNT_SET;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002194 cb_state->pipelineStaticViewportCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002195 has_dynamic_viewport_count || !rasterization_enabled ? 0 : viewport_state->viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002196 cb_state->pipelineStaticScissorCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002197 has_dynamic_scissor_count || !rasterization_enabled ? 0 : viewport_state->scissorCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002198
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002199 // Trash dynamic viewport/scissor state if pipeline defines static state and enabled rasterization.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002200 // akeley98 NOTE: There's a bit of an ambiguity in the spec, whether binding such a pipeline overwrites
2201 // the entire viewport (scissor) array, or only the subsection defined by the viewport (scissor) count.
2202 // I am taking the latter interpretation based on the implementation details of NVIDIA's Vulkan driver.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002203 if (!has_dynamic_viewport_count) {
2204 cb_state->trashedViewportCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002205 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_VIEWPORT_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002206 cb_state->trashedViewportMask |= (uint32_t(1) << viewport_state->viewportCount) - 1u;
2207 // should become = ~uint32_t(0) if the other interpretation is correct.
2208 }
2209 }
2210 if (!has_dynamic_scissor_count) {
2211 cb_state->trashedScissorCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002212 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_SCISSOR_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002213 cb_state->trashedScissorMask |= (uint32_t(1) << viewport_state->scissorCount) - 1u;
2214 // should become = ~uint32_t(0) if the other interpretation is correct.
2215 }
2216 }
locke-lunargd556cc32019-09-17 01:21:23 -06002217 }
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002218 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002219 cb_state->lastBound[lv_bind_point].pipeline_state = pipe_state.get();
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002220 if (!disabled[command_buffer_state]) {
2221 cb_state->AddChild(pipe_state);
2222 }
locke-lunargd556cc32019-09-17 01:21:23 -06002223}
2224
2225void ValidationStateTracker::PreCallRecordCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2226 uint32_t viewportCount, const VkViewport *pViewports) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002227 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002228 cb_state->RecordStateCmd(CMD_SETVIEWPORT, CBSTATUS_VIEWPORT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002229 uint32_t bits = ((1u << viewportCount) - 1u) << firstViewport;
2230 cb_state->viewportMask |= bits;
2231 cb_state->trashedViewportMask &= ~bits;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002232
2233 cb_state->dynamicViewports.resize(std::max(size_t(firstViewport + viewportCount), cb_state->dynamicViewports.size()));
2234 for (size_t i = 0; i < viewportCount; ++i) {
2235 cb_state->dynamicViewports[firstViewport + i] = pViewports[i];
2236 }
locke-lunargd556cc32019-09-17 01:21:23 -06002237}
2238
2239void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
2240 uint32_t exclusiveScissorCount,
2241 const VkRect2D *pExclusiveScissors) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002242 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002243 cb_state->RecordStateCmd(CMD_SETEXCLUSIVESCISSORNV, CBSTATUS_EXCLUSIVE_SCISSOR_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002244 // TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
2245 // cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
locke-lunargd556cc32019-09-17 01:21:23 -06002246}
2247
2248void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
2249 VkImageLayout imageLayout) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002250 if (disabled[command_buffer_state]) return;
2251
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002252 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002253 cb_state->RecordCmd(CMD_BINDSHADINGRATEIMAGENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002254
2255 if (imageView != VK_NULL_HANDLE) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002256 auto view_state = Get<IMAGE_VIEW_STATE>(imageView);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002257 cb_state->AddChild(view_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002258 }
2259}
2260
2261void ValidationStateTracker::PreCallRecordCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2262 uint32_t viewportCount,
2263 const VkShadingRatePaletteNV *pShadingRatePalettes) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002264 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002265 cb_state->RecordStateCmd(CMD_SETVIEWPORTSHADINGRATEPALETTENV, CBSTATUS_SHADING_RATE_PALETTE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002266 // TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
2267 // cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
locke-lunargd556cc32019-09-17 01:21:23 -06002268}
2269
2270void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
2271 const VkAccelerationStructureCreateInfoNV *pCreateInfo,
2272 const VkAllocationCallbacks *pAllocator,
2273 VkAccelerationStructureNV *pAccelerationStructure,
2274 VkResult result) {
2275 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002276 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002277
2278 // Query the requirements in case the application doesn't (to avoid bind/validation time query)
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002279 auto as_memory_requirements_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002280 as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002281 as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002282 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &as_memory_requirements_info, &as_state->memory_requirements);
2283
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002284 auto scratch_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002285 scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002286 scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002287 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &scratch_memory_req_info,
2288 &as_state->build_scratch_memory_requirements);
2289
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002290 auto update_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002291 update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002292 update_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002293 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
2294 &as_state->update_scratch_memory_requirements);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002295 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002296 Add(std::move(as_state));
locke-lunargd556cc32019-09-17 01:21:23 -06002297}
2298
Jeff Bolz95176d02020-04-01 00:36:16 -05002299void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
2300 const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
2301 const VkAllocationCallbacks *pAllocator,
2302 VkAccelerationStructureKHR *pAccelerationStructure,
2303 VkResult result) {
2304 if (VK_SUCCESS != result) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002305 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE_KHR>(*pAccelerationStructure, pCreateInfo);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002306 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002307 Add(std::move(as_state));
Jeff Bolz95176d02020-04-01 00:36:16 -05002308}
2309
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002310void ValidationStateTracker::PostCallRecordBuildAccelerationStructuresKHR(
2311 VkDevice device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount,
2312 const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2313 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos, VkResult result) {
2314 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002315 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002316 if (dst_as_state != nullptr) {
2317 dst_as_state->Build(&pInfos[i]);
2318 }
2319 }
2320}
2321
sourav parmarcd5fb182020-07-17 12:58:44 -07002322void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresKHR(
2323 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2324 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002325 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002326 if (!cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002327 return;
2328 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002329 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002330 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002331 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002332 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002333 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002334 if (!disabled[command_buffer_state]) {
2335 cb_state->AddChild(dst_as_state);
2336 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002337 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002338 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002339 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002340 if (src_as_state != nullptr) {
2341 cb_state->AddChild(src_as_state);
2342 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002343 }
2344 }
2345 cb_state->hasBuildAccelerationStructureCmd = true;
2346}
2347
2348void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresIndirectKHR(
2349 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2350 const VkDeviceAddress *pIndirectDeviceAddresses, const uint32_t *pIndirectStrides,
2351 const uint32_t *const *ppMaxPrimitiveCounts) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002352 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2353 if (!cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002354 return;
2355 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002356 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESINDIRECTKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002357 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002358 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002359 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002360 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002361 if (!disabled[command_buffer_state]) {
2362 cb_state->AddChild(dst_as_state);
2363 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002364 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002365 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002366 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002367 if (src_as_state != nullptr) {
2368 cb_state->AddChild(src_as_state);
2369 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002370 }
2371 }
2372 cb_state->hasBuildAccelerationStructureCmd = true;
2373}
locke-lunargd556cc32019-09-17 01:21:23 -06002374void ValidationStateTracker::PostCallRecordGetAccelerationStructureMemoryRequirementsNV(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002375 VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV *pInfo, VkMemoryRequirements2 *pMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002376 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(pInfo->accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002377 if (as_state != nullptr) {
2378 if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV) {
2379 as_state->memory_requirements = *pMemoryRequirements;
2380 as_state->memory_requirements_checked = true;
2381 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV) {
2382 as_state->build_scratch_memory_requirements = *pMemoryRequirements;
2383 as_state->build_scratch_memory_requirements_checked = true;
2384 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV) {
2385 as_state->update_scratch_memory_requirements = *pMemoryRequirements;
2386 as_state->update_scratch_memory_requirements_checked = true;
2387 }
2388 }
2389}
2390
sourav parmarcd5fb182020-07-17 12:58:44 -07002391void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
2392 VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002393 if (VK_SUCCESS != result) return;
2394 for (uint32_t i = 0; i < bindInfoCount; i++) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002395 const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
locke-lunargd556cc32019-09-17 01:21:23 -06002396
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002397 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(info.accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002398 if (as_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002399 // Track objects tied to memory
Jeremy Gebben9f537102021-10-05 16:37:12 -06002400 auto mem_state = Get<DEVICE_MEMORY_STATE>(info.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002401 if (mem_state) {
2402 as_state->SetMemBinding(mem_state, info.memoryOffset);
2403 }
locke-lunargd556cc32019-09-17 01:21:23 -06002404
2405 // GPU validation of top level acceleration structure building needs acceleration structure handles.
Jeff Bolz95176d02020-04-01 00:36:16 -05002406 // XXX TODO: Query device address for KHR extension
sourav parmarcd5fb182020-07-17 12:58:44 -07002407 if (enabled[gpu_validation]) {
locke-lunargd556cc32019-09-17 01:21:23 -06002408 DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
2409 }
2410 }
2411 }
2412}
2413
2414void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
2415 VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
2416 VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002417 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2418 if (!cb_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002419 return;
2420 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002421 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002422
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002423 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
locke-lunargd556cc32019-09-17 01:21:23 -06002424 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002425 dst_as_state->Build(pInfo);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002426 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002427 cb_state->AddChild(dst_as_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002428 }
locke-lunargd556cc32019-09-17 01:21:23 -06002429 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002430 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002431 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002432 if (src_as_state != nullptr) {
2433 cb_state->AddChild(src_as_state);
2434 }
locke-lunargd556cc32019-09-17 01:21:23 -06002435 }
2436 cb_state->hasBuildAccelerationStructureCmd = true;
2437}
2438
2439void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureNV(VkCommandBuffer commandBuffer,
2440 VkAccelerationStructureNV dst,
2441 VkAccelerationStructureNV src,
2442 VkCopyAccelerationStructureModeNV mode) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002443 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002444 if (cb_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002445 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
2446 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002447 if (!disabled[command_buffer_state]) {
2448 cb_state->RecordTransferCmd(CMD_COPYACCELERATIONSTRUCTURENV, src_as_state, dst_as_state);
2449 }
locke-lunargd556cc32019-09-17 01:21:23 -06002450 if (dst_as_state != nullptr && src_as_state != nullptr) {
2451 dst_as_state->built = true;
2452 dst_as_state->build_info = src_as_state->build_info;
locke-lunargd556cc32019-09-17 01:21:23 -06002453 }
2454 }
2455}
2456
Jeff Bolz95176d02020-04-01 00:36:16 -05002457void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
2458 VkAccelerationStructureKHR accelerationStructure,
2459 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002460 Destroy<ACCELERATION_STRUCTURE_STATE_KHR>(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002461}
2462
Jeff Bolz95176d02020-04-01 00:36:16 -05002463void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
2464 VkAccelerationStructureNV accelerationStructure,
2465 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002466 Destroy<ACCELERATION_STRUCTURE_STATE>(accelerationStructure);
Jeff Bolz95176d02020-04-01 00:36:16 -05002467}
2468
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002469void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2470 uint32_t viewportCount,
2471 const VkViewportWScalingNV *pViewportWScalings) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002472 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002473 cb_state->RecordStateCmd(CMD_SETVIEWPORTWSCALINGNV, CBSTATUS_VIEWPORT_W_SCALING_SET);
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002474}
2475
locke-lunargd556cc32019-09-17 01:21:23 -06002476void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002477 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002478 cb_state->RecordStateCmd(CMD_SETLINEWIDTH, CBSTATUS_LINE_WIDTH_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002479}
2480
2481void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
2482 uint16_t lineStipplePattern) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002483 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002484 cb_state->RecordStateCmd(CMD_SETLINESTIPPLEEXT, CBSTATUS_LINE_STIPPLE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002485}
2486
2487void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
2488 float depthBiasClamp, float depthBiasSlopeFactor) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002489 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002490 cb_state->RecordStateCmd(CMD_SETDEPTHBIAS, CBSTATUS_DEPTH_BIAS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002491}
2492
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002493void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
2494 const VkRect2D *pScissors) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002495 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002496 cb_state->RecordStateCmd(CMD_SETSCISSOR, CBSTATUS_SCISSOR_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002497 uint32_t bits = ((1u << scissorCount) - 1u) << firstScissor;
2498 cb_state->scissorMask |= bits;
2499 cb_state->trashedScissorMask &= ~bits;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002500}
2501
locke-lunargd556cc32019-09-17 01:21:23 -06002502void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002503 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002504 cb_state->RecordStateCmd(CMD_SETBLENDCONSTANTS, CBSTATUS_BLEND_CONSTANTS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002505}
2506
2507void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
2508 float maxDepthBounds) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002509 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002510 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDS, CBSTATUS_DEPTH_BOUNDS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002511}
2512
2513void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2514 uint32_t compareMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002515 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002516 cb_state->RecordStateCmd(CMD_SETSTENCILCOMPAREMASK, CBSTATUS_STENCIL_READ_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002517}
2518
2519void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2520 uint32_t writeMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002521 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002522 cb_state->RecordStateCmd(CMD_SETSTENCILWRITEMASK, CBSTATUS_STENCIL_WRITE_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002523}
2524
2525void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2526 uint32_t reference) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002527 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002528 cb_state->RecordStateCmd(CMD_SETSTENCILREFERENCE, CBSTATUS_STENCIL_REFERENCE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002529}
2530
locke-lunargd556cc32019-09-17 01:21:23 -06002531// Update the bound state for the bind point, including the effects of incompatible pipeline layouts
2532void ValidationStateTracker::PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2533 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2534 uint32_t firstSet, uint32_t setCount,
2535 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2536 const uint32_t *pDynamicOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002537 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002538 cb_state->RecordCmd(CMD_BINDDESCRIPTORSETS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002539 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebben4d51c552022-01-06 21:27:15 -07002540 std::shared_ptr<cvdescriptorset::DescriptorSet> no_push_desc;
locke-lunargd556cc32019-09-17 01:21:23 -06002541
Jeremy Gebben4d51c552022-01-06 21:27:15 -07002542 cb_state->UpdateLastBoundDescriptorSets(pipelineBindPoint, pipeline_layout.get(), firstSet, setCount, pDescriptorSets,
2543 no_push_desc, dynamicOffsetCount, pDynamicOffsets);
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002544}
2545
locke-lunargd556cc32019-09-17 01:21:23 -06002546void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
2547 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2548 uint32_t set, uint32_t descriptorWriteCount,
2549 const VkWriteDescriptorSet *pDescriptorWrites) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002550 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002551 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002552 cb_state->PushDescriptorSetState(pipelineBindPoint, pipeline_layout.get(), set, descriptorWriteCount, pDescriptorWrites);
locke-lunargd556cc32019-09-17 01:21:23 -06002553}
2554
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002555void ValidationStateTracker::PostCallRecordCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2556 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2557 const void *pValues) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002558 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2559 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002560 cb_state->RecordCmd(CMD_PUSHCONSTANTS);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002561 auto layout_state = Get<PIPELINE_LAYOUT_STATE>(layout);
2562 cb_state->ResetPushConstantDataIfIncompatible(layout_state.get());
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002563
2564 auto &push_constant_data = cb_state->push_constant_data;
2565 assert((offset + size) <= static_cast<uint32_t>(push_constant_data.size()));
2566 std::memcpy(push_constant_data.data() + offset, pValues, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002567 cb_state->push_constant_pipeline_layout_set = layout;
2568
2569 auto flags = stageFlags;
2570 uint32_t bit_shift = 0;
2571 while (flags) {
2572 if (flags & 1) {
2573 VkShaderStageFlagBits flag = static_cast<VkShaderStageFlagBits>(1 << bit_shift);
2574 const auto it = cb_state->push_constant_data_update.find(flag);
2575
2576 if (it != cb_state->push_constant_data_update.end()) {
locke-lunarg3d8b8f32020-10-26 17:04:16 -06002577 std::memset(it->second.data() + offset, PC_Byte_Updated, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002578 }
2579 }
2580 flags = flags >> 1;
2581 ++bit_shift;
2582 }
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002583 }
2584}
2585
locke-lunargd556cc32019-09-17 01:21:23 -06002586void ValidationStateTracker::PreCallRecordCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2587 VkIndexType indexType) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002588 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002589
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002590 cb_state->RecordStateCmd(CMD_BINDINDEXBUFFER, CBSTATUS_INDEX_BUFFER_BOUND);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002591 cb_state->index_buffer_binding.buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002592 cb_state->index_buffer_binding.size = cb_state->index_buffer_binding.buffer_state->createInfo.size;
locke-lunargd556cc32019-09-17 01:21:23 -06002593 cb_state->index_buffer_binding.offset = offset;
2594 cb_state->index_buffer_binding.index_type = indexType;
2595 // Add binding for this index buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002596 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002597 cb_state->AddChild(cb_state->index_buffer_binding.buffer_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002598 }
locke-lunargd556cc32019-09-17 01:21:23 -06002599}
2600
2601void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2602 uint32_t bindingCount, const VkBuffer *pBuffers,
2603 const VkDeviceSize *pOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002604 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002605 cb_state->RecordCmd(CMD_BINDVERTEXBUFFERS);
locke-lunargd556cc32019-09-17 01:21:23 -06002606
2607 uint32_t end = firstBinding + bindingCount;
2608 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
2609 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
2610 }
2611
2612 for (uint32_t i = 0; i < bindingCount; ++i) {
2613 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06002614 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002615 vertex_buffer_binding.offset = pOffsets[i];
Piers Daniell39842ee2020-07-10 16:42:33 -06002616 vertex_buffer_binding.size = VK_WHOLE_SIZE;
2617 vertex_buffer_binding.stride = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06002618 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002619 if (pBuffers[i] && !disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002620 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Jeff Bolz165818a2020-05-08 11:19:03 -05002621 }
locke-lunargd556cc32019-09-17 01:21:23 -06002622 }
2623}
2624
2625void ValidationStateTracker::PostCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
2626 VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002627 if (disabled[command_buffer_state]) return;
2628
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002629 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002630 cb_state->RecordTransferCmd(CMD_UPDATEBUFFER, Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -06002631}
2632
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002633void ValidationStateTracker::PreCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2634 VkPipelineStageFlags stageMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002635 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002636 cb_state->RecordSetEvent(CMD_SETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002637}
2638
2639void ValidationStateTracker::PreCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2640 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002641 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002642 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
2643
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002644 cb_state->RecordSetEvent(CMD_SETEVENT2KHR, event, stage_masks.src);
2645 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002646}
2647
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002648void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2649 VkPipelineStageFlags stageMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002650 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002651 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002652}
2653
2654void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2655 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002656 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002657 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002658}
2659
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002660void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2661 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
2662 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2663 uint32_t bufferMemoryBarrierCount,
2664 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2665 uint32_t imageMemoryBarrierCount,
2666 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002667 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
2668 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents, sourceStageMask);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002669 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2670 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002671}
2672
2673void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
2674 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002675 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben79649152021-06-22 14:46:24 -06002676 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002677 const auto &dep_info = pDependencyInfos[i];
2678 auto stage_masks = sync_utils::GetGlobalStageMasks(dep_info);
2679 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, 1, &pEvents[i], stage_masks.src);
2680 cb_state->RecordBarriers(dep_info);
Jeremy Gebben79649152021-06-22 14:46:24 -06002681 }
2682}
2683
2684void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2685 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2686 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2687 uint32_t bufferMemoryBarrierCount,
2688 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2689 uint32_t imageMemoryBarrierCount,
2690 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002691 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002692 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
2693 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2694 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06002695}
2696
2697void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
2698 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002699 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002700 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
2701 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06002702}
2703
locke-lunargd556cc32019-09-17 01:21:23 -06002704void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
2705 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002706 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002707
locke-lunargd556cc32019-09-17 01:21:23 -06002708 QueryObject query = {queryPool, slot};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002709 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002710 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002711 if (!disabled[query_validation]) {
2712 cb_state->BeginQuery(query);
2713 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002714 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002715 auto pool_state = Get<QUERY_POOL_STATE>(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002716 cb_state->AddChild(pool_state);
2717 }
locke-lunargd556cc32019-09-17 01:21:23 -06002718}
2719
2720void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002721 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002722 QueryObject query_obj = {queryPool, slot};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002723 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002724 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002725 if (!disabled[query_validation]) {
2726 cb_state->EndQuery(query_obj);
2727 }
2728 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002729 auto pool_state = Get<QUERY_POOL_STATE>(query_obj.pool);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002730 cb_state->AddChild(pool_state);
2731 }
locke-lunargd556cc32019-09-17 01:21:23 -06002732}
2733
2734void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2735 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002736 if (disabled[query_validation]) return;
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002737 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002738
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002739 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002740 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02002741
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002742 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002743 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002744 cb_state->AddChild(pool_state);
2745 }
locke-lunargd556cc32019-09-17 01:21:23 -06002746}
2747
2748void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2749 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
2750 VkDeviceSize dstOffset, VkDeviceSize stride,
2751 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002752 if (disabled[query_validation] || disabled[command_buffer_state]) return;
2753
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002754 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002755 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002756 auto dst_buff_state = Get<BUFFER_STATE>(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002757 cb_state->AddChild(dst_buff_state);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002758 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002759 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002760}
2761
2762void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2763 VkQueryPool queryPool, uint32_t slot) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002764 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002765 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002766}
2767
2768void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
2769 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
2770 uint32_t slot) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002771 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002772 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06002773}
2774
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002775void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
2776 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
2777 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
2778 if (disabled[query_validation]) return;
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002779 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002780 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002781 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002782 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002783 cb_state->AddChild(pool_state);
2784 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002785 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002786}
2787
locke-lunargd556cc32019-09-17 01:21:23 -06002788void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2789 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
2790 VkResult result) {
2791 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002792
Jeremy Gebben88f58142021-06-01 10:07:52 -06002793 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08002794 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002795 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002796
locke-lunargd556cc32019-09-17 01:21:23 -06002797 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002798 views[i] = Get<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002799 }
2800 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06002801
Jeremy Gebben9f537102021-10-05 16:37:12 -06002802 Add(std::make_shared<FRAMEBUFFER_STATE>(*pFramebuffer, pCreateInfo, Get<RENDER_PASS_STATE>(pCreateInfo->renderPass),
Jeremy Gebben082a9832021-10-28 13:40:11 -06002803 std::move(views)));
locke-lunargd556cc32019-09-17 01:21:23 -06002804}
2805
locke-lunargd556cc32019-09-17 01:21:23 -06002806void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2807 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2808 VkResult result) {
2809 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002810 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002811}
2812
Mike Schuchardt2df08912020-12-15 16:28:09 -08002813void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002814 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2815 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002816 if (VK_SUCCESS != result) return;
2817
Jeremy Gebben082a9832021-10-28 13:40:11 -06002818 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002819}
2820
Mike Schuchardt2df08912020-12-15 16:28:09 -08002821void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002822 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2823 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002824 if (VK_SUCCESS != result) return;
2825
Jeremy Gebben082a9832021-10-28 13:40:11 -06002826 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002827}
2828
locke-lunargd556cc32019-09-17 01:21:23 -06002829void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
2830 const VkRenderPassBeginInfo *pRenderPassBegin,
2831 VkSubpassContents contents) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002832 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002833 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002834}
2835
2836void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
2837 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002838 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002839 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002840 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002841}
2842
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002843void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2844 uint32_t counterBufferCount,
2845 const VkBuffer *pCounterBuffers,
2846 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002847 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002848
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002849 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002850 cb_state->transform_feedback_active = true;
2851}
2852
2853void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2854 uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
2855 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002856 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002857
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002858 cb_state->RecordCmd(CMD_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002859 cb_state->transform_feedback_active = false;
2860}
2861
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002862void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
2863 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002864 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002865
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002866 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002867 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002868 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
2869 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002870}
2871
2872void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002873 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002874
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002875 cb_state->RecordCmd(CMD_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002876 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002877 cb_state->conditional_rendering_inside_render_pass = false;
2878 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002879}
2880
amhagana448ea52021-11-02 14:09:14 -04002881void ValidationStateTracker::RecordCmdEndRenderingRenderPassState(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002882 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002883 cb_state->activeRenderPass = nullptr;
2884}
2885
2886void ValidationStateTracker::PreCallRecordCmdBeginRenderingKHR(VkCommandBuffer commandBuffer,
2887 const VkRenderingInfoKHR *pRenderingInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002888 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002889 cb_state->BeginRendering(CMD_BEGINRENDERINGKHR, pRenderingInfo);
2890}
2891
2892void ValidationStateTracker::PreCallRecordCmdEndRenderingKHR(VkCommandBuffer commandBuffer) {
2893 RecordCmdEndRenderingRenderPassState(commandBuffer);
2894}
2895
Tony-LunarG977448c2019-12-02 14:52:02 -07002896void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
2897 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002898 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002899 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002900 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07002901}
2902
locke-lunargd556cc32019-09-17 01:21:23 -06002903void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002904 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002905 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002906}
2907
2908void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002909 const VkSubpassBeginInfo *pSubpassBeginInfo,
2910 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002911 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002912 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002913}
2914
Tony-LunarG977448c2019-12-02 14:52:02 -07002915void ValidationStateTracker::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002916 const VkSubpassBeginInfo *pSubpassBeginInfo,
2917 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002918 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002919 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002920}
2921
2922void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002923 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002924 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06002925}
2926
2927void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002928 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002929 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002930 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06002931}
2932
Tony-LunarG977448c2019-12-02 14:52:02 -07002933void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002934 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002935 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002936 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07002937}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002938
locke-lunargd556cc32019-09-17 01:21:23 -06002939void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
2940 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07002941 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002942
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002943 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06002944}
2945
2946void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
2947 VkFlags flags, void **ppData, VkResult result) {
2948 if (VK_SUCCESS != result) return;
2949 RecordMappedMemory(mem, offset, size, ppData);
2950}
2951
2952void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002953 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06002954 if (mem_info) {
2955 mem_info->mapped_range = MemRange();
2956 mem_info->p_driver_data = nullptr;
2957 }
2958}
2959
2960void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002961 auto image_state = Get<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06002962 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06002963 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
2964 // See: VUID-vkGetImageSubresourceLayout-image-01895
2965 image_state->fragment_encoder =
2966 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07002967 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06002968 if (swapchain_info) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002969 auto swapchain = Get<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06002970 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002971 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07002972
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002973 if (!swapchain_image.fake_base_address) {
2974 auto size = image_state->fragment_encoder->TotalSize();
2975 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002976 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002977 // All images bound to this swapchain and index are aliases
2978 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06002979 }
2980 } else {
2981 // Track bound memory range information
Jeremy Gebben9f537102021-10-05 16:37:12 -06002982 auto mem_info = Get<DEVICE_MEMORY_STATE>(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06002983 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002984 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06002985 }
locke-lunargd556cc32019-09-17 01:21:23 -06002986 }
locke-lunargd556cc32019-09-17 01:21:23 -06002987 }
2988}
2989
2990void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
2991 VkDeviceSize memoryOffset, VkResult result) {
2992 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002993 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002994 bind_info.image = image;
2995 bind_info.memory = mem;
2996 bind_info.memoryOffset = memoryOffset;
2997 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06002998}
2999
3000void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003001 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003002 if (VK_SUCCESS != result) return;
3003 for (uint32_t i = 0; i < bindInfoCount; i++) {
3004 UpdateBindImageMemoryState(pBindInfos[i]);
3005 }
3006}
3007
3008void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003009 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003010 if (VK_SUCCESS != result) return;
3011 for (uint32_t i = 0; i < bindInfoCount; i++) {
3012 UpdateBindImageMemoryState(pBindInfos[i]);
3013 }
3014}
3015
3016void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003017 auto event_state = Get<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06003018 if (event_state) {
3019 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
3020 }
locke-lunargd556cc32019-09-17 01:21:23 -06003021}
3022
3023void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
3024 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
3025 VkResult result) {
3026 if (VK_SUCCESS != result) return;
3027 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
3028 pImportSemaphoreFdInfo->flags);
3029}
3030
3031void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003032 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003033 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07003034 if (semaphore_state) {
3035 semaphore_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06003036 }
3037}
3038
3039#ifdef VK_USE_PLATFORM_WIN32_KHR
3040void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
3041 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
3042 if (VK_SUCCESS != result) return;
3043 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
3044 pImportSemaphoreWin32HandleInfo->flags);
3045}
3046
3047void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
3048 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3049 HANDLE *pHandle, VkResult result) {
3050 if (VK_SUCCESS != result) return;
3051 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
3052}
3053
3054void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
3055 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
3056 if (VK_SUCCESS != result) return;
3057 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
3058 pImportFenceWin32HandleInfo->flags);
3059}
3060
3061void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
3062 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3063 HANDLE *pHandle, VkResult result) {
3064 if (VK_SUCCESS != result) return;
3065 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
3066}
3067#endif
3068
3069void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
3070 VkResult result) {
3071 if (VK_SUCCESS != result) return;
3072 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
3073}
3074
Mike Schuchardt2df08912020-12-15 16:28:09 -08003075void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
3076 VkFenceImportFlags flags) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003077 auto fence_node = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003078
3079 if (fence_node) {
3080 fence_node->Import(handle_type, flags);
locke-lunargd556cc32019-09-17 01:21:23 -06003081 }
3082}
3083
3084void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
3085 VkResult result) {
3086 if (VK_SUCCESS != result) return;
3087 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
3088}
3089
Mike Schuchardt2df08912020-12-15 16:28:09 -08003090void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003091 auto fence_state = Get<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06003092 if (fence_state) {
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003093 fence_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06003094 }
3095}
3096
3097void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3098 VkResult result) {
3099 if (VK_SUCCESS != result) return;
3100 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3101}
3102
3103void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3104 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3105 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003106 Add(std::make_shared<EVENT_STATE>(*pEvent, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003107}
3108
3109void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003110 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003111 SWAPCHAIN_NODE *old_swapchain_state) {
3112 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003113 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003114 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003115 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003116 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3117 surface_state->AddParent(swapchain.get());
3118 surface_state->swapchain = swapchain.get();
3119 swapchain->surface = std::move(surface_state);
Jeremy Gebben082a9832021-10-28 13:40:11 -06003120 Add(std::move(swapchain));
locke-lunargd556cc32019-09-17 01:21:23 -06003121 } else {
3122 surface_state->swapchain = nullptr;
3123 }
3124 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003125 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003126 if (old_swapchain_state) {
3127 old_swapchain_state->retired = true;
3128 }
3129 return;
3130}
3131
3132void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3133 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3134 VkResult result) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003135 auto surface_state = Get<SURFACE_STATE>(pCreateInfo->surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003136 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfo->oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003137 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003138}
3139
3140void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3141 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003142 Destroy<SWAPCHAIN_NODE>(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003143}
3144
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003145void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3146 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3147 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3148 VkResult result) {
3149 if (VK_SUCCESS != result) return;
3150 if (!pMode) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003151 Add(std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice));
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003152}
3153
locke-lunargd556cc32019-09-17 01:21:23 -06003154void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003155 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06003156 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3157 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003158 auto semaphore_state = Get<SEMAPHORE_STATE>(pPresentInfo->pWaitSemaphores[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003159 if (semaphore_state) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003160 semaphore_state->EnqueuePresent(queue_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003161 }
3162 }
3163
Tony-LunarG6f887e52021-07-27 11:23:14 -06003164 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003165 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3166 // 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
3167 // confused itself just as much.
3168 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3169 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3170 // Mark the image as having been released to the WSI
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003171 auto swapchain_data = Get<SWAPCHAIN_NODE>(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003172 if (swapchain_data) {
3173 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003174 if (present_id_info) {
3175 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3176 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3177 }
3178 }
locke-lunargd556cc32019-09-17 01:21:23 -06003179 }
3180 }
locke-lunargd556cc32019-09-17 01:21:23 -06003181}
3182
3183void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3184 const VkSwapchainCreateInfoKHR *pCreateInfos,
3185 const VkAllocationCallbacks *pAllocator,
3186 VkSwapchainKHR *pSwapchains, VkResult result) {
3187 if (pCreateInfos) {
3188 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003189 auto surface_state = Get<SURFACE_STATE>(pCreateInfos[i].surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003190 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfos[i].oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003191 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state),
3192 old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003193 }
3194 }
3195}
3196
3197void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3198 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003199 auto fence_state = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003200 if (fence_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003201 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3202 // import
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003203 fence_state->EnqueueSignal(nullptr, 0);
locke-lunargd556cc32019-09-17 01:21:23 -06003204 }
3205
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003206 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07003207 if (semaphore_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003208 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3209 // temporary import
Jeremy Gebben15332642021-12-15 19:33:15 -07003210 semaphore_state->EnqueueAcquire();
locke-lunargd556cc32019-09-17 01:21:23 -06003211 }
3212
3213 // Mark the image as acquired.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003214 auto swapchain_data = Get<SWAPCHAIN_NODE>(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003215 if (swapchain_data) {
3216 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003217 }
3218}
3219
3220void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3221 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3222 VkResult result) {
3223 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3224 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3225}
3226
3227void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3228 uint32_t *pImageIndex, VkResult result) {
3229 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3230 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3231 pAcquireInfo->fence, pImageIndex);
3232}
3233
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003234std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3235 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3236}
3237
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003238void ValidationStateTracker::PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
3239 const VkAllocationCallbacks *pAllocator, VkInstance *pInstance,
3240 VkResult result) {
3241 if (result != VK_SUCCESS) {
3242 return;
3243 }
Jeremy Gebben404f6ac2021-10-28 12:33:28 -06003244 instance_state = this;
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003245 uint32_t count = 0;
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003246 // this can fail if the allocator fails
3247 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, nullptr);
3248 if (result != VK_SUCCESS) {
3249 return;
3250 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003251 std::vector<VkPhysicalDevice> physdev_handles(count);
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003252 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, physdev_handles.data());
3253 if (result != VK_SUCCESS) {
3254 return;
3255 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003256
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003257 for (auto physdev : physdev_handles) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003258 Add(CreatePhysicalDeviceState(physdev));
locke-lunargd556cc32019-09-17 01:21:23 -06003259 }
3260}
3261
3262// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003263static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003264 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003265}
3266
3267void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3268 uint32_t *pQueueFamilyPropertyCount,
3269 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003270 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3271 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003272 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003273}
3274
3275void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003276 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003277 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3278 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003279 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003280}
3281
3282void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003283 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003284 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3285 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003286 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003287}
3288void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3289 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003290 Destroy<SURFACE_STATE>(surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003291}
3292
Jeremy Gebben082a9832021-10-28 13:40:11 -06003293void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) { Add(std::make_shared<SURFACE_STATE>(*pSurface)); }
locke-lunargd556cc32019-09-17 01:21:23 -06003294
3295void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3296 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3297 const VkAllocationCallbacks *pAllocator,
3298 VkSurfaceKHR *pSurface, VkResult result) {
3299 if (VK_SUCCESS != result) return;
3300 RecordVulkanSurface(pSurface);
3301}
3302
3303#ifdef VK_USE_PLATFORM_ANDROID_KHR
3304void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3305 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3306 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3307 VkResult result) {
3308 if (VK_SUCCESS != result) return;
3309 RecordVulkanSurface(pSurface);
3310}
3311#endif // VK_USE_PLATFORM_ANDROID_KHR
3312
3313#ifdef VK_USE_PLATFORM_IOS_MVK
3314void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3315 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3316 VkResult result) {
3317 if (VK_SUCCESS != result) return;
3318 RecordVulkanSurface(pSurface);
3319}
3320#endif // VK_USE_PLATFORM_IOS_MVK
3321
3322#ifdef VK_USE_PLATFORM_MACOS_MVK
3323void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3324 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3325 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3326 VkResult result) {
3327 if (VK_SUCCESS != result) return;
3328 RecordVulkanSurface(pSurface);
3329}
3330#endif // VK_USE_PLATFORM_MACOS_MVK
3331
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003332#ifdef VK_USE_PLATFORM_METAL_EXT
3333void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3334 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3335 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3336 VkResult result) {
3337 if (VK_SUCCESS != result) return;
3338 RecordVulkanSurface(pSurface);
3339}
3340#endif // VK_USE_PLATFORM_METAL_EXT
3341
locke-lunargd556cc32019-09-17 01:21:23 -06003342#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3343void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3344 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3345 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3346 VkResult result) {
3347 if (VK_SUCCESS != result) return;
3348 RecordVulkanSurface(pSurface);
3349}
3350#endif // VK_USE_PLATFORM_WAYLAND_KHR
3351
3352#ifdef VK_USE_PLATFORM_WIN32_KHR
3353void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3354 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
3355 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3356 VkResult result) {
3357 if (VK_SUCCESS != result) return;
3358 RecordVulkanSurface(pSurface);
3359}
3360#endif // VK_USE_PLATFORM_WIN32_KHR
3361
3362#ifdef VK_USE_PLATFORM_XCB_KHR
3363void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
3364 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3365 VkResult result) {
3366 if (VK_SUCCESS != result) return;
3367 RecordVulkanSurface(pSurface);
3368}
3369#endif // VK_USE_PLATFORM_XCB_KHR
3370
3371#ifdef VK_USE_PLATFORM_XLIB_KHR
3372void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
3373 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3374 VkResult result) {
3375 if (VK_SUCCESS != result) return;
3376 RecordVulkanSurface(pSurface);
3377}
3378#endif // VK_USE_PLATFORM_XLIB_KHR
3379
Niklas Haas8b84af12020-04-19 22:20:11 +02003380void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3381 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3382 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3383 VkResult result) {
3384 if (VK_SUCCESS != result) return;
3385 RecordVulkanSurface(pSurface);
3386}
3387
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003388void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
3389 VkSurfaceKHR surface,
3390 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities,
3391 VkResult result) {
3392 if (VK_SUCCESS != result) return;
3393 auto surface_state = Get<SURFACE_STATE>(surface);
3394 surface_state->SetCapabilities(physicalDevice, *pSurfaceCapabilities);
3395}
3396
3397void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
3398 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3399 VkSurfaceCapabilities2KHR *pSurfaceCapabilities, VkResult result) {
3400 if (VK_SUCCESS != result) return;
3401 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3402 surface_state->SetCapabilities(physicalDevice, pSurfaceCapabilities->surfaceCapabilities);
3403}
3404
3405void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice,
3406 VkSurfaceKHR surface,
3407 VkSurfaceCapabilities2EXT *pSurfaceCapabilities,
3408 VkResult result) {
3409 auto surface_state = Get<SURFACE_STATE>(surface);
3410 VkSurfaceCapabilitiesKHR caps{
3411 pSurfaceCapabilities->minImageCount, pSurfaceCapabilities->maxImageCount,
3412 pSurfaceCapabilities->currentExtent, pSurfaceCapabilities->minImageExtent,
3413 pSurfaceCapabilities->maxImageExtent, pSurfaceCapabilities->maxImageArrayLayers,
3414 pSurfaceCapabilities->supportedTransforms, pSurfaceCapabilities->currentTransform,
3415 pSurfaceCapabilities->supportedCompositeAlpha, pSurfaceCapabilities->supportedUsageFlags,
3416 };
3417 surface_state->SetCapabilities(physicalDevice, caps);
3418}
3419
locke-lunargd556cc32019-09-17 01:21:23 -06003420void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3421 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3422 VkBool32 *pSupported, VkResult result) {
3423 if (VK_SUCCESS != result) return;
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003424 auto surface_state = Get<SURFACE_STATE>(surface);
3425 surface_state->SetQueueSupport(physicalDevice, queueFamilyIndex, (*pSupported == VK_TRUE));
3426}
3427
3428void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
3429 VkSurfaceKHR surface,
3430 uint32_t *pPresentModeCount,
3431 VkPresentModeKHR *pPresentModes,
3432 VkResult result) {
3433 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3434
3435 if (pPresentModes) {
3436 auto surface_state = Get<SURFACE_STATE>(surface);
3437 surface_state->SetPresentModes(physicalDevice,
3438 std::vector<VkPresentModeKHR>(pPresentModes, pPresentModes + *pPresentModeCount));
3439 }
3440}
3441
3442void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
3443 uint32_t *pSurfaceFormatCount,
3444 VkSurfaceFormatKHR *pSurfaceFormats,
3445 VkResult result) {
3446 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3447
3448 if (pSurfaceFormats) {
3449 auto surface_state = Get<SURFACE_STATE>(surface);
3450 surface_state->SetFormats(physicalDevice,
3451 std::vector<VkSurfaceFormatKHR>(pSurfaceFormats, pSurfaceFormats + *pSurfaceFormatCount));
3452 }
3453}
3454
3455void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
3456 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3457 uint32_t *pSurfaceFormatCount,
3458 VkSurfaceFormat2KHR *pSurfaceFormats,
3459 VkResult result) {
3460 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3461
3462 if (pSurfaceFormats) {
3463 std::vector<VkSurfaceFormatKHR> fmts(*pSurfaceFormatCount);
3464 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3465 for (uint32_t i = 0; i < *pSurfaceFormatCount; i++) {
3466 fmts[i] = pSurfaceFormats[i].surfaceFormat;
3467 }
3468 surface_state->SetFormats(physicalDevice, std::move(fmts));
3469 }
locke-lunargd556cc32019-09-17 01:21:23 -06003470}
3471
locke-lunargd556cc32019-09-17 01:21:23 -06003472void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3473 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003474 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003475 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003476 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3477}
3478
3479void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003480 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003481 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003482 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3483}
3484
3485void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3486 const VkDebugUtilsLabelEXT *pLabelInfo) {
3487 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3488
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003489 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003490 cb_state->RecordCmd(CMD_INSERTDEBUGUTILSLABELEXT);
3491 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003492 cb_state->debug_label = LoggingLabel(pLabelInfo);
3493}
3494
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003495void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3496 uint32_t queueFamilyIndex,
3497 uint32_t *pCounterCount,
3498 VkPerformanceCounterKHR *pCounters) {
3499 if (NULL == pCounters) return;
3500
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003501 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3502 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003503
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003504 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3505 queue_family_counters->counters.resize(*pCounterCount);
3506 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003507
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003508 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003509}
3510
3511void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3512 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3513 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3514 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3515 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3516}
3517
3518void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3519 VkResult result) {
3520 if (result == VK_SUCCESS) performance_lock_acquired = true;
3521}
3522
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003523void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3524 performance_lock_acquired = false;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06003525 for (auto &cmd_buffer : command_buffer_map_.snapshot()) {
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003526 cmd_buffer.second->performance_lock_released = true;
3527 }
3528}
3529
locke-lunargd556cc32019-09-17 01:21:23 -06003530void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003531 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003532 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003533 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003534}
3535
3536void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003537 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003538 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003539 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003540}
3541
Mike Schuchardt2df08912020-12-15 16:28:09 -08003542void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3543 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003544 Add(std::make_shared<UPDATE_TEMPLATE_STATE>(*pDescriptorUpdateTemplate, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06003545}
3546
Mike Schuchardt2df08912020-12-15 16:28:09 -08003547void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3548 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3549 const VkAllocationCallbacks *pAllocator,
3550 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3551 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003552 if (VK_SUCCESS != result) return;
3553 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3554}
3555
3556void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003557 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3558 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003559 if (VK_SUCCESS != result) return;
3560 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3561}
3562
3563void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003564 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003565 const void *pData) {
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003566 auto const template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
3567 assert(template_state);
3568 if (template_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003569 // TODO: Record template push descriptor updates
3570 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003571 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state.get(), pData);
locke-lunargd556cc32019-09-17 01:21:23 -06003572 }
3573 }
3574}
3575
3576void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3577 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3578 const void *pData) {
3579 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3580}
3581
3582void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003583 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003584 const void *pData) {
3585 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3586}
3587
Mike Schuchardt2df08912020-12-15 16:28:09 -08003588void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3589 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3590 VkPipelineLayout layout, uint32_t set,
3591 const void *pData) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003592 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003593
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003594 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003595 const auto template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003596 if (template_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003597 auto layout_data = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003598 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003599 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003600 // Decode the template into a set of write updates
Jeremy Gebben9f537102021-10-05 16:37:12 -06003601 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state.get(), pData,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003602 dsl->GetDescriptorSetLayout());
Jeremy Gebben9f537102021-10-05 16:37:12 -06003603 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data.get(), set,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003604 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3605 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003606 }
3607}
3608
3609void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3610 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003611 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003612 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003613 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003614 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003615 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003616 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003617 }
3618}
3619
3620void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3621 uint32_t *pPropertyCount,
3622 VkDisplayPlanePropertiesKHR *pProperties,
3623 VkResult result) {
3624 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3625 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3626}
3627
3628void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3629 uint32_t *pPropertyCount,
3630 VkDisplayPlaneProperties2KHR *pProperties,
3631 VkResult result) {
3632 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3633 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3634}
3635
3636void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3637 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3638 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003639 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003640 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003641 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003642}
3643
3644void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3645 uint32_t query, uint32_t index) {
3646 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003647 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003648 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003649 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003650}
3651
3652void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3653 VkSamplerYcbcrConversion ycbcr_conversion) {
Lionel Landwerlin21719f62021-12-09 11:40:09 +02003654 VkFormatFeatureFlags2KHR format_features = 0;
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003655
3656 if (create_info->format != VK_FORMAT_UNDEFINED) {
3657 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07003658 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003659 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
3660 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003661 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003662
Jeremy Gebben082a9832021-10-28 13:40:11 -06003663 Add(std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features));
locke-lunargd556cc32019-09-17 01:21:23 -06003664}
3665
3666void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
3667 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3668 const VkAllocationCallbacks *pAllocator,
3669 VkSamplerYcbcrConversion *pYcbcrConversion,
3670 VkResult result) {
3671 if (VK_SUCCESS != result) return;
3672 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3673}
3674
3675void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(VkDevice device,
3676 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3677 const VkAllocationCallbacks *pAllocator,
3678 VkSamplerYcbcrConversion *pYcbcrConversion,
3679 VkResult result) {
3680 if (VK_SUCCESS != result) return;
3681 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3682}
3683
3684void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
3685 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003686 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003687}
3688
3689void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
3690 VkSamplerYcbcrConversion ycbcrConversion,
3691 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003692 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003693}
3694
Tony-LunarG977448c2019-12-02 14:52:02 -07003695void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3696 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06003697 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07003698 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003699
3700 // Do nothing if the query pool has been destroyed.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003701 auto query_pool_state = Get<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06003702 if (!query_pool_state) return;
3703
3704 // Reset the state of existing entries.
locke-lunargd556cc32019-09-17 01:21:23 -06003705 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
3706 for (uint32_t i = 0; i < max_query_count; ++i) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003707 auto query_index = firstQuery + i;
3708 query_pool_state->SetQueryState(query_index, 0, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003709 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003710 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003711 query_pool_state->SetQueryState(query_index, pass_index, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003712 }
3713 }
locke-lunargd556cc32019-09-17 01:21:23 -06003714 }
3715}
3716
Tony-LunarG977448c2019-12-02 14:52:02 -07003717void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3718 uint32_t queryCount) {
3719 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3720}
3721
3722void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3723 uint32_t queryCount) {
3724 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3725}
3726
locke-lunargd556cc32019-09-17 01:21:23 -06003727void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003728 const UPDATE_TEMPLATE_STATE *template_state,
3729 const void *pData) {
locke-lunargd556cc32019-09-17 01:21:23 -06003730 // Translate the templated update into a normal update for validation...
3731 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
3732 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
3733 decoded_update.desc_writes.data(), 0, NULL);
3734}
3735
3736// Update the common AllocateDescriptorSetsData
3737void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05003738 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06003739 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003740 auto layout = Get<cvdescriptorset::DescriptorSetLayout>(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003741 if (layout) {
3742 ds_data->layout_nodes[i] = layout;
3743 // Count total descriptors required per type
3744 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
3745 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003746 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
3747 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003748 }
3749 }
3750 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
3751 }
3752}
3753
locke-lunargd556cc32019-09-17 01:21:23 -06003754void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3755 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003756 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003757 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003758}
3759
Tony-LunarG745150c2021-07-02 15:07:31 -06003760void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3761 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
3762 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003763 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003764 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003765}
3766
locke-lunargd556cc32019-09-17 01:21:23 -06003767void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3768 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3769 uint32_t firstInstance) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003770 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003771 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003772}
3773
Tony-LunarG745150c2021-07-02 15:07:31 -06003774void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3775 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
3776 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
3777 const int32_t *pVertexOffset) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003778 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003779 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003780}
3781
locke-lunargd556cc32019-09-17 01:21:23 -06003782void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3783 uint32_t count, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003784 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003785 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003786 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003787 if (!disabled[command_buffer_state]) {
3788 cb_state->AddChild(buffer_state);
3789 }
locke-lunargd556cc32019-09-17 01:21:23 -06003790}
3791
3792void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3793 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003794 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003795 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003796 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003797 if (!disabled[command_buffer_state]) {
3798 cb_state->AddChild(buffer_state);
3799 }
locke-lunargd556cc32019-09-17 01:21:23 -06003800}
3801
3802void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003803 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003804 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06003805}
3806
3807void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3808 VkDeviceSize offset) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003809 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003810 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003811 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003812 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003813 cb_state->AddChild(buffer_state);
3814 }
locke-lunargd556cc32019-09-17 01:21:23 -06003815}
3816
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003817void ValidationStateTracker::PostCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3818 uint32_t, uint32_t) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003819 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003820 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3821}
3822
3823void ValidationStateTracker::PostCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3824 uint32_t, uint32_t) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003825 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003826 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3827}
3828
Tony-LunarG977448c2019-12-02 14:52:02 -07003829void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3830 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07003831 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003832 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003833 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003834 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003835 auto buffer_state = Get<BUFFER_STATE>(buffer);
3836 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003837 cb_state->AddChild(buffer_state);
3838 cb_state->AddChild(count_buffer_state);
3839 }
Tony-LunarG977448c2019-12-02 14:52:02 -07003840}
3841
locke-lunargd556cc32019-09-17 01:21:23 -06003842void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3843 VkDeviceSize offset, VkBuffer countBuffer,
3844 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3845 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003846 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003847 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003848}
3849
3850void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3851 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3852 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003853 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003854 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07003855}
3856
3857void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3858 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07003859 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003860 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003861 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003862 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003863 auto buffer_state = Get<BUFFER_STATE>(buffer);
3864 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003865 cb_state->AddChild(buffer_state);
3866 cb_state->AddChild(count_buffer_state);
3867 }
locke-lunargd556cc32019-09-17 01:21:23 -06003868}
3869
3870void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3871 VkDeviceSize offset, VkBuffer countBuffer,
3872 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3873 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003874 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003875 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003876}
3877
3878void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
3879 VkDeviceSize offset, VkBuffer countBuffer,
3880 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3881 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003882 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003883 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06003884}
3885
3886void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
3887 uint32_t firstTask) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003888 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003889 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003890}
3891
3892void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
3893 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003894 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003895 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003896 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003897 if (!disabled[command_buffer_state] && buffer_state) {
3898 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003899 }
3900}
3901
3902void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
3903 VkDeviceSize offset, VkBuffer countBuffer,
3904 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3905 uint32_t stride) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003906 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003907 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003908 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003909 auto buffer_state = Get<BUFFER_STATE>(buffer);
3910 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003911 if (buffer_state) {
3912 cb_state->AddChild(buffer_state);
3913 }
3914 if (count_buffer_state) {
3915 cb_state->AddChild(count_buffer_state);
3916 }
locke-lunargd556cc32019-09-17 01:21:23 -06003917 }
3918}
3919
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003920void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
3921 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
3922 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
3923 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
3924 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
3925 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
3926 uint32_t width, uint32_t height, uint32_t depth) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003927 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003928 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003929 cb_state->hasTraceRaysCmd = true;
3930}
3931
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003932void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
3933 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
3934 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
3935 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
3936 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
3937 uint32_t height, uint32_t depth) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003938 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003939 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003940 cb_state->hasTraceRaysCmd = true;
3941}
3942
3943void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
3944 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
3945 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
3946 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
3947 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
3948 VkDeviceAddress indirectDeviceAddress) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07003949 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003950 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003951 cb_state->hasTraceRaysCmd = true;
3952}
3953
locke-lunargd556cc32019-09-17 01:21:23 -06003954void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
3955 const VkAllocationCallbacks *pAllocator,
3956 VkShaderModule *pShaderModule, VkResult result,
3957 void *csm_state_data) {
3958 if (VK_SUCCESS != result) return;
3959 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
3960
sfricke-samsung45996a42021-09-16 13:45:27 -07003961 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06003962 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003963 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
3964 csm_state->unique_shader_id)
3965 : std::make_shared<SHADER_MODULE_STATE>();
Jeremy Gebben082a9832021-10-28 13:40:11 -06003966 Add(std::move(new_shader_module));
locke-lunargd556cc32019-09-17 01:21:23 -06003967}
3968
John Zulauf22b0fbe2019-10-15 06:26:16 -06003969void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
3970 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
3971 VkResult result) {
3972 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06003973 auto swapchain_state = Get<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06003974
3975 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
3976
3977 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06003978 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07003979 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07003980 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06003981
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003982 auto format_features =
Lionel Landwerlind0f84e42021-12-07 15:46:09 +02003983 GetImageFormatFeatures(physical_device, has_format_feature2, device, pSwapchainImages[i],
3984 swapchain_state->image_create_info.format, swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06003985
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06003986 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003987 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003988 if (!swapchain_image.fake_base_address) {
3989 auto size = image_state->fragment_encoder->TotalSize();
3990 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07003991 }
3992
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003993 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003994 swapchain_image.image_state = image_state.get();
Jeremy Gebben082a9832021-10-28 13:40:11 -06003995 Add(std::move(image_state));
John Zulauf22b0fbe2019-10-15 06:26:16 -06003996 }
3997 }
3998
3999 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004000 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
4001 }
4002}
sourav parmar35e7a002020-06-09 17:58:44 -07004003
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02004004void ValidationStateTracker::PostCallRecordCopyAccelerationStructureKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
4005 const VkCopyAccelerationStructureInfoKHR *pInfo,
4006 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004007 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
4008 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02004009 if (dst_as_state != nullptr && src_as_state != nullptr) {
4010 dst_as_state->built = true;
4011 dst_as_state->build_info_khr = src_as_state->build_info_khr;
4012 }
4013}
4014
sourav parmar35e7a002020-06-09 17:58:44 -07004015void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
4016 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004017 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07004018 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004019 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004020 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
4021 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07004022 if (dst_as_state != nullptr && src_as_state != nullptr) {
4023 dst_as_state->built = true;
4024 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004025 if (!disabled[command_buffer_state]) {
4026 cb_state->AddChild(dst_as_state);
4027 cb_state->AddChild(src_as_state);
4028 }
sourav parmar35e7a002020-06-09 17:58:44 -07004029 }
4030 }
4031}
Piers Daniell39842ee2020-07-10 16:42:33 -06004032
4033void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004034 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004035 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004036}
4037
4038void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004039 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004040 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004041}
4042
4043void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
4044 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004045 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004046 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004047 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06004048}
4049
4050void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4051 const VkViewport *pViewports) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004052 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004053 cb_state->RecordStateCmd(CMD_SETVIEWPORTWITHCOUNTEXT, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004054 uint32_t bits = (1u << viewportCount) - 1u;
4055 cb_state->viewportWithCountMask |= bits;
4056 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00004057 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004058 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004059
4060 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
4061 for (size_t i = 0; i < viewportCount; ++i) {
4062 cb_state->dynamicViewports[i] = pViewports[i];
4063 }
Piers Daniell39842ee2020-07-10 16:42:33 -06004064}
4065
4066void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4067 const VkRect2D *pScissors) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004068 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004069 cb_state->RecordStateCmd(CMD_SETSCISSORWITHCOUNTEXT, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004070 uint32_t bits = (1u << scissorCount) - 1u;
4071 cb_state->scissorWithCountMask |= bits;
4072 cb_state->trashedScissorMask &= ~bits;
4073 cb_state->scissorWithCountCount = scissorCount;
4074 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06004075}
4076
4077void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4078 uint32_t bindingCount, const VkBuffer *pBuffers,
4079 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4080 const VkDeviceSize *pStrides) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004081 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004082 cb_state->RecordStateCmd(CMD_BINDVERTEXBUFFERS2EXT, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06004083
4084 uint32_t end = firstBinding + bindingCount;
4085 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
4086 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
4087 }
4088
4089 for (uint32_t i = 0; i < bindingCount; ++i) {
4090 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06004091 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004092 vertex_buffer_binding.offset = pOffsets[i];
4093 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4094 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4095 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004096 if (!disabled[command_buffer_state] && pBuffers[i]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06004097 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Piers Daniell39842ee2020-07-10 16:42:33 -06004098 }
4099 }
4100}
4101
4102void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004103 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004104 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004105}
4106
4107void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004108 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004109 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004110}
4111
4112void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004113 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004114 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004115}
4116
4117void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4118 VkBool32 depthBoundsTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004119 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004120 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004121}
4122void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004123 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004124 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004125}
4126
4127void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4128 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4129 VkCompareOp compareOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004130 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004131 cb_state->RecordStateCmd(CMD_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004132}
locke-lunarg4189aa22020-10-21 00:23:48 -06004133
4134void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4135 uint32_t discardRectangleCount,
4136 const VkRect2D *pDiscardRectangles) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004137 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004138 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004139}
4140
4141void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4142 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
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_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004145}
4146
4147void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4148 VkCoarseSampleOrderTypeNV sampleOrderType,
4149 uint32_t customSampleOrderCount,
4150 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004151 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004152 cb_state->RecordStateCmd(CMD_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004153}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004154
4155void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004156 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004157 cb_state->RecordStateCmd(CMD_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004158}
4159
4160void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004161 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004162 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004163}
4164
4165void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4166 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004167 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004168 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004169}
4170
4171void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004172 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004173 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004174}
4175
4176void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4177 VkBool32 primitiveRestartEnable) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004178 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004179 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004180}
Piers Daniell924cd832021-05-18 13:48:47 -06004181
4182void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4183 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4184 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4185 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebben332d4dd2022-01-01 12:40:02 -07004186 auto cb_state = GetWrite<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004187 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4188
4189 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4190 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4191 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004192 if (pipeline_state->create_info.graphics.pDynamicState) {
4193 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4194 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004195 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4196 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4197 break;
4198 }
4199 }
4200 }
4201 }
4202 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004203}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004204
4205void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004206 auto buffer_state = Get<BUFFER_STATE>(pInfo->buffer);
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004207 if (buffer_state) {
4208 // address is used for GPU-AV and ray tracing buffer validation
4209 buffer_state->deviceAddress = address;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06004210 buffer_address_map_.insert(address, buffer_state.get());
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004211 }
4212}
4213
4214void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4215 VkDeviceAddress address) {
4216 RecordGetBufferDeviceAddress(pInfo, address);
4217}
4218
4219void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4220 VkDeviceAddress address) {
4221 RecordGetBufferDeviceAddress(pInfo, address);
4222}
4223
4224void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4225 VkDeviceAddress address) {
4226 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004227}
4228
4229std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4230 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004231 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004232}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004233
4234std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4235 const VkCommandBufferAllocateInfo *create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06004236 const COMMAND_POOL_STATE *pool) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004237 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4238}