blob: 4a4aa8f83dbb76dd8d98a398d966e8ebb4097d04 [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 Gebben3d22d582021-08-11 15:37:58 -0600229 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600241 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600252 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600260 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600271 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600279 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600289 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600297 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600382 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600390 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -0600391 cb_node->RecordTransferCmd(CMD_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 Gebben3d22d582021-08-11 15:37:58 -0600413 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600422 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600431 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600441 auto cb_node = Get<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 Gebben3d22d582021-08-11 15:37:58 -0600449 auto cb_node = Get<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);
1054 instance_dispatch_table.EnumerateDeviceExtensionProperties(gpu, NULL, &n_props, &props[0]);
1055
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 Gebben9f537102021-10-05 16:37:12 -06001361 submission.AddCommandBuffer(Get<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 Gebben9f537102021-10-05 16:37:12 -06001401 submission.AddCommandBuffer(Get<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 Gebbenb20a8242021-11-05 15:14:43 -06002134 auto cb_state = Get<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 Gebbenb20a8242021-11-05 15:14:43 -06002141 auto cb_state = Get<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 Gebbenb20a8242021-11-05 15:14:43 -06002150 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002151 cb_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002152 }
2153}
2154
2155CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) {
2156 // initially assume everything is static state
2157 CBStatusFlags flags = CBSTATUS_ALL_STATE_SET;
2158
2159 if (ds) {
2160 for (uint32_t i = 0; i < ds->dynamicStateCount; i++) {
locke-lunarg4189aa22020-10-21 00:23:48 -06002161 flags &= ~ConvertToCBStatusFlagBits(ds->pDynamicStates[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002162 }
2163 }
locke-lunargd556cc32019-09-17 01:21:23 -06002164 return flags;
2165}
2166
2167// Validation cache:
2168// CV is the bottommost implementor of this extension. Don't pass calls down.
locke-lunargd556cc32019-09-17 01:21:23 -06002169
2170void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2171 VkPipeline pipeline) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002172 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002173 assert(cb_state);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002174 cb_state->RecordCmd(CMD_BINDPIPELINE);
locke-lunargd556cc32019-09-17 01:21:23 -06002175
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002176 auto pipe_state = Get<PIPELINE_STATE>(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06002177 if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002178 const auto &create_info = pipe_state->create_info.graphics;
2179 bool rasterization_enabled = VK_FALSE == create_info.pRasterizationState->rasterizerDiscardEnable;
2180 const auto *viewport_state = create_info.pViewportState;
2181 const auto *dynamic_state = create_info.pDynamicState;
locke-lunargd556cc32019-09-17 01:21:23 -06002182 cb_state->status &= ~cb_state->static_status;
Yilong Lid23bc292022-01-02 22:06:12 -08002183 cb_state->static_status = MakeStaticStateMask(dynamic_state ? dynamic_state->ptr() : nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06002184 cb_state->status |= cb_state->static_status;
locke-lunarg4189aa22020-10-21 00:23:48 -06002185 cb_state->dynamic_status = CBSTATUS_ALL_STATE_SET & (~cb_state->static_status);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002186
2187 // Used to calculate CMD_BUFFER_STATE::usedViewportScissorCount upon draw command with this graphics pipeline.
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002188 // If rasterization disabled (no viewport/scissors used), or the actual number of viewports/scissors is dynamic (unknown at
2189 // this time), then these are set to 0 to disable this checking.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002190 auto has_dynamic_viewport_count = cb_state->dynamic_status & CBSTATUS_VIEWPORT_WITH_COUNT_SET;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002191 auto has_dynamic_scissor_count = cb_state->dynamic_status & CBSTATUS_SCISSOR_WITH_COUNT_SET;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002192 cb_state->pipelineStaticViewportCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002193 has_dynamic_viewport_count || !rasterization_enabled ? 0 : viewport_state->viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002194 cb_state->pipelineStaticScissorCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002195 has_dynamic_scissor_count || !rasterization_enabled ? 0 : viewport_state->scissorCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002196
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002197 // Trash dynamic viewport/scissor state if pipeline defines static state and enabled rasterization.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002198 // akeley98 NOTE: There's a bit of an ambiguity in the spec, whether binding such a pipeline overwrites
2199 // the entire viewport (scissor) array, or only the subsection defined by the viewport (scissor) count.
2200 // I am taking the latter interpretation based on the implementation details of NVIDIA's Vulkan driver.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002201 if (!has_dynamic_viewport_count) {
2202 cb_state->trashedViewportCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002203 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_VIEWPORT_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002204 cb_state->trashedViewportMask |= (uint32_t(1) << viewport_state->viewportCount) - 1u;
2205 // should become = ~uint32_t(0) if the other interpretation is correct.
2206 }
2207 }
2208 if (!has_dynamic_scissor_count) {
2209 cb_state->trashedScissorCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002210 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_SCISSOR_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002211 cb_state->trashedScissorMask |= (uint32_t(1) << viewport_state->scissorCount) - 1u;
2212 // should become = ~uint32_t(0) if the other interpretation is correct.
2213 }
2214 }
locke-lunargd556cc32019-09-17 01:21:23 -06002215 }
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002216 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002217 cb_state->lastBound[lv_bind_point].pipeline_state = pipe_state.get();
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002218 if (!disabled[command_buffer_state]) {
2219 cb_state->AddChild(pipe_state);
2220 }
locke-lunargd556cc32019-09-17 01:21:23 -06002221}
2222
2223void ValidationStateTracker::PreCallRecordCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2224 uint32_t viewportCount, const VkViewport *pViewports) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002225 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002226 cb_state->RecordStateCmd(CMD_SETVIEWPORT, CBSTATUS_VIEWPORT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002227 uint32_t bits = ((1u << viewportCount) - 1u) << firstViewport;
2228 cb_state->viewportMask |= bits;
2229 cb_state->trashedViewportMask &= ~bits;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002230
2231 cb_state->dynamicViewports.resize(std::max(size_t(firstViewport + viewportCount), cb_state->dynamicViewports.size()));
2232 for (size_t i = 0; i < viewportCount; ++i) {
2233 cb_state->dynamicViewports[firstViewport + i] = pViewports[i];
2234 }
locke-lunargd556cc32019-09-17 01:21:23 -06002235}
2236
2237void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
2238 uint32_t exclusiveScissorCount,
2239 const VkRect2D *pExclusiveScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002240 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002241 cb_state->RecordStateCmd(CMD_SETEXCLUSIVESCISSORNV, CBSTATUS_EXCLUSIVE_SCISSOR_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002242 // TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
2243 // cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
locke-lunargd556cc32019-09-17 01:21:23 -06002244}
2245
2246void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
2247 VkImageLayout imageLayout) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002248 if (disabled[command_buffer_state]) return;
2249
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002250 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002251 cb_state->RecordCmd(CMD_BINDSHADINGRATEIMAGENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002252
2253 if (imageView != VK_NULL_HANDLE) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002254 auto view_state = Get<IMAGE_VIEW_STATE>(imageView);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002255 cb_state->AddChild(view_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002256 }
2257}
2258
2259void ValidationStateTracker::PreCallRecordCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2260 uint32_t viewportCount,
2261 const VkShadingRatePaletteNV *pShadingRatePalettes) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002262 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002263 cb_state->RecordStateCmd(CMD_SETVIEWPORTSHADINGRATEPALETTENV, CBSTATUS_SHADING_RATE_PALETTE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002264 // TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
2265 // cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
locke-lunargd556cc32019-09-17 01:21:23 -06002266}
2267
2268void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
2269 const VkAccelerationStructureCreateInfoNV *pCreateInfo,
2270 const VkAllocationCallbacks *pAllocator,
2271 VkAccelerationStructureNV *pAccelerationStructure,
2272 VkResult result) {
2273 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002274 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002275
2276 // Query the requirements in case the application doesn't (to avoid bind/validation time query)
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002277 auto as_memory_requirements_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002278 as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002279 as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002280 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &as_memory_requirements_info, &as_state->memory_requirements);
2281
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002282 auto scratch_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002283 scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002284 scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002285 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &scratch_memory_req_info,
2286 &as_state->build_scratch_memory_requirements);
2287
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002288 auto update_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002289 update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002290 update_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002291 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
2292 &as_state->update_scratch_memory_requirements);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002293 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002294 Add(std::move(as_state));
locke-lunargd556cc32019-09-17 01:21:23 -06002295}
2296
Jeff Bolz95176d02020-04-01 00:36:16 -05002297void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
2298 const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
2299 const VkAllocationCallbacks *pAllocator,
2300 VkAccelerationStructureKHR *pAccelerationStructure,
2301 VkResult result) {
2302 if (VK_SUCCESS != result) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002303 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE_KHR>(*pAccelerationStructure, pCreateInfo);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002304 as_state->allocator = pAllocator;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002305 Add(std::move(as_state));
Jeff Bolz95176d02020-04-01 00:36:16 -05002306}
2307
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002308void ValidationStateTracker::PostCallRecordBuildAccelerationStructuresKHR(
2309 VkDevice device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount,
2310 const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2311 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos, VkResult result) {
2312 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002313 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002314 if (dst_as_state != nullptr) {
2315 dst_as_state->Build(&pInfos[i]);
2316 }
2317 }
2318}
2319
sourav parmarcd5fb182020-07-17 12:58:44 -07002320void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresKHR(
2321 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2322 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002323 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002324 if (!cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002325 return;
2326 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002327 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002328 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002329 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002330 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002331 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002332 if (!disabled[command_buffer_state]) {
2333 cb_state->AddChild(dst_as_state);
2334 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002335 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002336 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002337 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002338 if (src_as_state != nullptr) {
2339 cb_state->AddChild(src_as_state);
2340 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002341 }
2342 }
2343 cb_state->hasBuildAccelerationStructureCmd = true;
2344}
2345
2346void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresIndirectKHR(
2347 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2348 const VkDeviceAddress *pIndirectDeviceAddresses, const uint32_t *pIndirectStrides,
2349 const uint32_t *const *ppMaxPrimitiveCounts) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002350 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002351 if (cb_state == nullptr) {
2352 return;
2353 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002354 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESINDIRECTKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002355 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002356 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002357 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002358 dst_as_state->Build(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002359 if (!disabled[command_buffer_state]) {
2360 cb_state->AddChild(dst_as_state);
2361 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002362 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002363 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002364 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfos[i].srcAccelerationStructure);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002365 if (src_as_state != nullptr) {
2366 cb_state->AddChild(src_as_state);
2367 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002368 }
2369 }
2370 cb_state->hasBuildAccelerationStructureCmd = true;
2371}
locke-lunargd556cc32019-09-17 01:21:23 -06002372void ValidationStateTracker::PostCallRecordGetAccelerationStructureMemoryRequirementsNV(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002373 VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV *pInfo, VkMemoryRequirements2 *pMemoryRequirements) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002374 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(pInfo->accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002375 if (as_state != nullptr) {
2376 if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV) {
2377 as_state->memory_requirements = *pMemoryRequirements;
2378 as_state->memory_requirements_checked = true;
2379 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV) {
2380 as_state->build_scratch_memory_requirements = *pMemoryRequirements;
2381 as_state->build_scratch_memory_requirements_checked = true;
2382 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV) {
2383 as_state->update_scratch_memory_requirements = *pMemoryRequirements;
2384 as_state->update_scratch_memory_requirements_checked = true;
2385 }
2386 }
2387}
2388
sourav parmarcd5fb182020-07-17 12:58:44 -07002389void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
2390 VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002391 if (VK_SUCCESS != result) return;
2392 for (uint32_t i = 0; i < bindInfoCount; i++) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002393 const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
locke-lunargd556cc32019-09-17 01:21:23 -06002394
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002395 auto as_state = Get<ACCELERATION_STRUCTURE_STATE>(info.accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002396 if (as_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002397 // Track objects tied to memory
Jeremy Gebben9f537102021-10-05 16:37:12 -06002398 auto mem_state = Get<DEVICE_MEMORY_STATE>(info.memory);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002399 if (mem_state) {
2400 as_state->SetMemBinding(mem_state, info.memoryOffset);
2401 }
locke-lunargd556cc32019-09-17 01:21:23 -06002402
2403 // GPU validation of top level acceleration structure building needs acceleration structure handles.
Jeff Bolz95176d02020-04-01 00:36:16 -05002404 // XXX TODO: Query device address for KHR extension
sourav parmarcd5fb182020-07-17 12:58:44 -07002405 if (enabled[gpu_validation]) {
locke-lunargd556cc32019-09-17 01:21:23 -06002406 DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
2407 }
2408 }
2409 }
2410}
2411
2412void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
2413 VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
2414 VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002415 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002416 if (cb_state == nullptr) {
2417 return;
2418 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002419 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002420
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002421 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
locke-lunargd556cc32019-09-17 01:21:23 -06002422 if (dst_as_state != nullptr) {
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02002423 dst_as_state->Build(pInfo);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002424 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002425 cb_state->AddChild(dst_as_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002426 }
locke-lunargd556cc32019-09-17 01:21:23 -06002427 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002428 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002429 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002430 if (src_as_state != nullptr) {
2431 cb_state->AddChild(src_as_state);
2432 }
locke-lunargd556cc32019-09-17 01:21:23 -06002433 }
2434 cb_state->hasBuildAccelerationStructureCmd = true;
2435}
2436
2437void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureNV(VkCommandBuffer commandBuffer,
2438 VkAccelerationStructureNV dst,
2439 VkAccelerationStructureNV src,
2440 VkCopyAccelerationStructureModeNV mode) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002441 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002442 if (cb_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002443 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE>(src);
2444 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE>(dst);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002445 if (!disabled[command_buffer_state]) {
2446 cb_state->RecordTransferCmd(CMD_COPYACCELERATIONSTRUCTURENV, src_as_state, dst_as_state);
2447 }
locke-lunargd556cc32019-09-17 01:21:23 -06002448 if (dst_as_state != nullptr && src_as_state != nullptr) {
2449 dst_as_state->built = true;
2450 dst_as_state->build_info = src_as_state->build_info;
locke-lunargd556cc32019-09-17 01:21:23 -06002451 }
2452 }
2453}
2454
Jeff Bolz95176d02020-04-01 00:36:16 -05002455void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
2456 VkAccelerationStructureKHR accelerationStructure,
2457 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002458 Destroy<ACCELERATION_STRUCTURE_STATE_KHR>(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002459}
2460
Jeff Bolz95176d02020-04-01 00:36:16 -05002461void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
2462 VkAccelerationStructureNV accelerationStructure,
2463 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06002464 Destroy<ACCELERATION_STRUCTURE_STATE>(accelerationStructure);
Jeff Bolz95176d02020-04-01 00:36:16 -05002465}
2466
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002467void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2468 uint32_t viewportCount,
2469 const VkViewportWScalingNV *pViewportWScalings) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002470 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002471 cb_state->RecordStateCmd(CMD_SETVIEWPORTWSCALINGNV, CBSTATUS_VIEWPORT_W_SCALING_SET);
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002472}
2473
locke-lunargd556cc32019-09-17 01:21:23 -06002474void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002475 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002476 cb_state->RecordStateCmd(CMD_SETLINEWIDTH, CBSTATUS_LINE_WIDTH_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002477}
2478
2479void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
2480 uint16_t lineStipplePattern) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002481 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002482 cb_state->RecordStateCmd(CMD_SETLINESTIPPLEEXT, CBSTATUS_LINE_STIPPLE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002483}
2484
2485void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
2486 float depthBiasClamp, float depthBiasSlopeFactor) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002487 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002488 cb_state->RecordStateCmd(CMD_SETDEPTHBIAS, CBSTATUS_DEPTH_BIAS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002489}
2490
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002491void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
2492 const VkRect2D *pScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002493 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002494 cb_state->RecordStateCmd(CMD_SETSCISSOR, CBSTATUS_SCISSOR_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002495 uint32_t bits = ((1u << scissorCount) - 1u) << firstScissor;
2496 cb_state->scissorMask |= bits;
2497 cb_state->trashedScissorMask &= ~bits;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002498}
2499
locke-lunargd556cc32019-09-17 01:21:23 -06002500void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002501 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002502 cb_state->RecordStateCmd(CMD_SETBLENDCONSTANTS, CBSTATUS_BLEND_CONSTANTS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002503}
2504
2505void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
2506 float maxDepthBounds) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002507 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002508 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDS, CBSTATUS_DEPTH_BOUNDS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002509}
2510
2511void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2512 uint32_t compareMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002513 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002514 cb_state->RecordStateCmd(CMD_SETSTENCILCOMPAREMASK, CBSTATUS_STENCIL_READ_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002515}
2516
2517void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2518 uint32_t writeMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002519 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002520 cb_state->RecordStateCmd(CMD_SETSTENCILWRITEMASK, CBSTATUS_STENCIL_WRITE_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002521}
2522
2523void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2524 uint32_t reference) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002525 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002526 cb_state->RecordStateCmd(CMD_SETSTENCILREFERENCE, CBSTATUS_STENCIL_REFERENCE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002527}
2528
locke-lunargd556cc32019-09-17 01:21:23 -06002529// Update the bound state for the bind point, including the effects of incompatible pipeline layouts
2530void ValidationStateTracker::PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2531 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2532 uint32_t firstSet, uint32_t setCount,
2533 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2534 const uint32_t *pDynamicOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002535 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002536 cb_state->RecordCmd(CMD_BINDDESCRIPTORSETS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002537 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
locke-lunargd556cc32019-09-17 01:21:23 -06002538
Jeremy Gebben9f537102021-10-05 16:37:12 -06002539 cb_state->UpdateLastBoundDescriptorSets(pipelineBindPoint, pipeline_layout.get(), firstSet, setCount, pDescriptorSets, nullptr,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002540 dynamicOffsetCount, pDynamicOffsets);
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002541}
2542
locke-lunargd556cc32019-09-17 01:21:23 -06002543void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
2544 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2545 uint32_t set, uint32_t descriptorWriteCount,
2546 const VkWriteDescriptorSet *pDescriptorWrites) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002547 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2548 auto pipeline_layout = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002549 cb_state->PushDescriptorSetState(pipelineBindPoint, pipeline_layout.get(), set, descriptorWriteCount, pDescriptorWrites);
locke-lunargd556cc32019-09-17 01:21:23 -06002550}
2551
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002552void ValidationStateTracker::PostCallRecordCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2553 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2554 const void *pValues) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002555 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002556 if (cb_state != nullptr) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002557 cb_state->RecordCmd(CMD_PUSHCONSTANTS);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002558 auto layout_state = Get<PIPELINE_LAYOUT_STATE>(layout);
2559 cb_state->ResetPushConstantDataIfIncompatible(layout_state.get());
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002560
2561 auto &push_constant_data = cb_state->push_constant_data;
2562 assert((offset + size) <= static_cast<uint32_t>(push_constant_data.size()));
2563 std::memcpy(push_constant_data.data() + offset, pValues, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002564 cb_state->push_constant_pipeline_layout_set = layout;
2565
2566 auto flags = stageFlags;
2567 uint32_t bit_shift = 0;
2568 while (flags) {
2569 if (flags & 1) {
2570 VkShaderStageFlagBits flag = static_cast<VkShaderStageFlagBits>(1 << bit_shift);
2571 const auto it = cb_state->push_constant_data_update.find(flag);
2572
2573 if (it != cb_state->push_constant_data_update.end()) {
locke-lunarg3d8b8f32020-10-26 17:04:16 -06002574 std::memset(it->second.data() + offset, PC_Byte_Updated, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002575 }
2576 }
2577 flags = flags >> 1;
2578 ++bit_shift;
2579 }
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002580 }
2581}
2582
locke-lunargd556cc32019-09-17 01:21:23 -06002583void ValidationStateTracker::PreCallRecordCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2584 VkIndexType indexType) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002585 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002586
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002587 cb_state->RecordStateCmd(CMD_BINDINDEXBUFFER, CBSTATUS_INDEX_BUFFER_BOUND);
Jeremy Gebben9f537102021-10-05 16:37:12 -06002588 cb_state->index_buffer_binding.buffer_state = Get<BUFFER_STATE>(buffer);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002589 cb_state->index_buffer_binding.size = cb_state->index_buffer_binding.buffer_state->createInfo.size;
locke-lunargd556cc32019-09-17 01:21:23 -06002590 cb_state->index_buffer_binding.offset = offset;
2591 cb_state->index_buffer_binding.index_type = indexType;
2592 // Add binding for this index buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002593 if (!disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002594 cb_state->AddChild(cb_state->index_buffer_binding.buffer_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002595 }
locke-lunargd556cc32019-09-17 01:21:23 -06002596}
2597
2598void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2599 uint32_t bindingCount, const VkBuffer *pBuffers,
2600 const VkDeviceSize *pOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002601 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002602 cb_state->RecordCmd(CMD_BINDVERTEXBUFFERS);
locke-lunargd556cc32019-09-17 01:21:23 -06002603
2604 uint32_t end = firstBinding + bindingCount;
2605 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
2606 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
2607 }
2608
2609 for (uint32_t i = 0; i < bindingCount; ++i) {
2610 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06002611 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002612 vertex_buffer_binding.offset = pOffsets[i];
Piers Daniell39842ee2020-07-10 16:42:33 -06002613 vertex_buffer_binding.size = VK_WHOLE_SIZE;
2614 vertex_buffer_binding.stride = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06002615 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002616 if (pBuffers[i] && !disabled[command_buffer_state]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002617 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Jeff Bolz165818a2020-05-08 11:19:03 -05002618 }
locke-lunargd556cc32019-09-17 01:21:23 -06002619 }
2620}
2621
2622void ValidationStateTracker::PostCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
2623 VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002624 if (disabled[command_buffer_state]) return;
2625
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002626 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002627 cb_state->RecordTransferCmd(CMD_UPDATEBUFFER, Get<BUFFER_STATE>(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -06002628}
2629
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002630void ValidationStateTracker::PreCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2631 VkPipelineStageFlags stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002632 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002633 cb_state->RecordSetEvent(CMD_SETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002634}
2635
2636void ValidationStateTracker::PreCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2637 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002638 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002639 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
2640
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002641 cb_state->RecordSetEvent(CMD_SETEVENT2KHR, event, stage_masks.src);
2642 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002643}
2644
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002645void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2646 VkPipelineStageFlags stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002647 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002648 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002649}
2650
2651void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2652 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002653 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002654 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002655}
2656
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002657void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2658 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
2659 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2660 uint32_t bufferMemoryBarrierCount,
2661 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2662 uint32_t imageMemoryBarrierCount,
2663 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002664 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002665 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents);
2666 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2667 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002668}
2669
2670void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
2671 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002672 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002673 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, eventCount, pEvents);
Jeremy Gebben79649152021-06-22 14:46:24 -06002674 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002675 cb_state->RecordBarriers(pDependencyInfos[i]);
Jeremy Gebben79649152021-06-22 14:46:24 -06002676 }
2677}
2678
2679void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2680 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2681 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2682 uint32_t bufferMemoryBarrierCount,
2683 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2684 uint32_t imageMemoryBarrierCount,
2685 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002686 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2687 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
2688 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2689 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06002690}
2691
2692void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
2693 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002694 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2695 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
2696 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06002697}
2698
locke-lunargd556cc32019-09-17 01:21:23 -06002699void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
2700 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002701 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002702
locke-lunargd556cc32019-09-17 01:21:23 -06002703 QueryObject query = {queryPool, slot};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002704 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002705 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002706 if (!disabled[query_validation]) {
2707 cb_state->BeginQuery(query);
2708 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002709 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002710 auto pool_state = Get<QUERY_POOL_STATE>(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002711 cb_state->AddChild(pool_state);
2712 }
locke-lunargd556cc32019-09-17 01:21:23 -06002713}
2714
2715void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002716 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002717 QueryObject query_obj = {queryPool, slot};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002718 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002719 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002720 if (!disabled[query_validation]) {
2721 cb_state->EndQuery(query_obj);
2722 }
2723 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002724 auto pool_state = Get<QUERY_POOL_STATE>(query_obj.pool);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002725 cb_state->AddChild(pool_state);
2726 }
locke-lunargd556cc32019-09-17 01:21:23 -06002727}
2728
2729void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2730 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002731 if (disabled[query_validation]) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002732 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002733
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002734 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002735 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02002736
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002737 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002738 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002739 cb_state->AddChild(pool_state);
2740 }
locke-lunargd556cc32019-09-17 01:21:23 -06002741}
2742
2743void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2744 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
2745 VkDeviceSize dstOffset, VkDeviceSize stride,
2746 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002747 if (disabled[query_validation] || disabled[command_buffer_state]) return;
2748
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002749 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002750 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002751 auto dst_buff_state = Get<BUFFER_STATE>(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002752 cb_state->AddChild(dst_buff_state);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002753 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002754 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002755}
2756
2757void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2758 VkQueryPool queryPool, uint32_t slot) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002759 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002760 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002761}
2762
2763void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
2764 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
2765 uint32_t slot) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002766 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002767 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06002768}
2769
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002770void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
2771 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
2772 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
2773 if (disabled[query_validation]) return;
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002774 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002775 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002776 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002777 auto pool_state = Get<QUERY_POOL_STATE>(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002778 cb_state->AddChild(pool_state);
2779 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002780 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002781}
2782
locke-lunargd556cc32019-09-17 01:21:23 -06002783void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2784 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
2785 VkResult result) {
2786 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002787
Jeremy Gebben88f58142021-06-01 10:07:52 -06002788 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08002789 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002790 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002791
locke-lunargd556cc32019-09-17 01:21:23 -06002792 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002793 views[i] = Get<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002794 }
2795 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06002796
Jeremy Gebben9f537102021-10-05 16:37:12 -06002797 Add(std::make_shared<FRAMEBUFFER_STATE>(*pFramebuffer, pCreateInfo, Get<RENDER_PASS_STATE>(pCreateInfo->renderPass),
Jeremy Gebben082a9832021-10-28 13:40:11 -06002798 std::move(views)));
locke-lunargd556cc32019-09-17 01:21:23 -06002799}
2800
locke-lunargd556cc32019-09-17 01:21:23 -06002801void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2802 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2803 VkResult result) {
2804 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06002805 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06002806}
2807
Mike Schuchardt2df08912020-12-15 16:28:09 -08002808void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002809 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2810 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002811 if (VK_SUCCESS != result) return;
2812
Jeremy Gebben082a9832021-10-28 13:40:11 -06002813 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002814}
2815
Mike Schuchardt2df08912020-12-15 16:28:09 -08002816void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002817 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2818 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002819 if (VK_SUCCESS != result) return;
2820
Jeremy Gebben082a9832021-10-28 13:40:11 -06002821 Add(std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo));
Tony-LunarG977448c2019-12-02 14:52:02 -07002822}
2823
locke-lunargd556cc32019-09-17 01:21:23 -06002824void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
2825 const VkRenderPassBeginInfo *pRenderPassBegin,
2826 VkSubpassContents contents) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002827 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002828 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002829}
2830
2831void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
2832 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002833 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002834 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002835 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002836}
2837
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002838void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2839 uint32_t counterBufferCount,
2840 const VkBuffer *pCounterBuffers,
2841 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002842 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002843
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002844 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002845 cb_state->transform_feedback_active = true;
2846}
2847
2848void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2849 uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
2850 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002851 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002852
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002853 cb_state->RecordCmd(CMD_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002854 cb_state->transform_feedback_active = false;
2855}
2856
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002857void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
2858 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002859 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002860
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002861 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002862 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002863 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
2864 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002865}
2866
2867void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002868 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002869
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002870 cb_state->RecordCmd(CMD_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002871 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02002872 cb_state->conditional_rendering_inside_render_pass = false;
2873 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02002874}
2875
amhagana448ea52021-11-02 14:09:14 -04002876void ValidationStateTracker::RecordCmdEndRenderingRenderPassState(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002877 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002878 cb_state->activeRenderPass = nullptr;
2879}
2880
2881void ValidationStateTracker::PreCallRecordCmdBeginRenderingKHR(VkCommandBuffer commandBuffer,
2882 const VkRenderingInfoKHR *pRenderingInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002883 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
amhagana448ea52021-11-02 14:09:14 -04002884 cb_state->BeginRendering(CMD_BEGINRENDERINGKHR, pRenderingInfo);
2885}
2886
2887void ValidationStateTracker::PreCallRecordCmdEndRenderingKHR(VkCommandBuffer commandBuffer) {
2888 RecordCmdEndRenderingRenderPassState(commandBuffer);
2889}
2890
Tony-LunarG977448c2019-12-02 14:52:02 -07002891void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
2892 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002893 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002894 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002895 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07002896}
2897
locke-lunargd556cc32019-09-17 01:21:23 -06002898void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002899 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002900 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002901}
2902
2903void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002904 const VkSubpassBeginInfo *pSubpassBeginInfo,
2905 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002906 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002907 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002908}
2909
Tony-LunarG977448c2019-12-02 14:52:02 -07002910void ValidationStateTracker::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002911 const VkSubpassBeginInfo *pSubpassBeginInfo,
2912 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002913 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002914 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002915}
2916
2917void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002918 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002919 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06002920}
2921
2922void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002923 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002924 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002925 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06002926}
2927
Tony-LunarG977448c2019-12-02 14:52:02 -07002928void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002929 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002930 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002931 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07002932}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002933
locke-lunargd556cc32019-09-17 01:21:23 -06002934void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
2935 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002936 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002937
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002938 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06002939}
2940
2941void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
2942 VkFlags flags, void **ppData, VkResult result) {
2943 if (VK_SUCCESS != result) return;
2944 RecordMappedMemory(mem, offset, size, ppData);
2945}
2946
2947void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06002948 auto mem_info = Get<DEVICE_MEMORY_STATE>(mem);
locke-lunargd556cc32019-09-17 01:21:23 -06002949 if (mem_info) {
2950 mem_info->mapped_range = MemRange();
2951 mem_info->p_driver_data = nullptr;
2952 }
2953}
2954
2955void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002956 auto image_state = Get<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06002957 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06002958 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
2959 // See: VUID-vkGetImageSubresourceLayout-image-01895
2960 image_state->fragment_encoder =
2961 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07002962 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06002963 if (swapchain_info) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06002964 auto swapchain = Get<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06002965 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002966 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07002967
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002968 if (!swapchain_image.fake_base_address) {
2969 auto size = image_state->fragment_encoder->TotalSize();
2970 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06002971 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06002972 // All images bound to this swapchain and index are aliases
2973 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06002974 }
2975 } else {
2976 // Track bound memory range information
Jeremy Gebben9f537102021-10-05 16:37:12 -06002977 auto mem_info = Get<DEVICE_MEMORY_STATE>(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06002978 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002979 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06002980 }
locke-lunargd556cc32019-09-17 01:21:23 -06002981 }
locke-lunargd556cc32019-09-17 01:21:23 -06002982 }
2983}
2984
2985void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
2986 VkDeviceSize memoryOffset, VkResult result) {
2987 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002988 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002989 bind_info.image = image;
2990 bind_info.memory = mem;
2991 bind_info.memoryOffset = memoryOffset;
2992 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06002993}
2994
2995void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002996 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002997 if (VK_SUCCESS != result) return;
2998 for (uint32_t i = 0; i < bindInfoCount; i++) {
2999 UpdateBindImageMemoryState(pBindInfos[i]);
3000 }
3001}
3002
3003void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003004 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003005 if (VK_SUCCESS != result) return;
3006 for (uint32_t i = 0; i < bindInfoCount; i++) {
3007 UpdateBindImageMemoryState(pBindInfos[i]);
3008 }
3009}
3010
3011void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003012 auto event_state = Get<EVENT_STATE>(event);
locke-lunargd556cc32019-09-17 01:21:23 -06003013 if (event_state) {
3014 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
3015 }
locke-lunargd556cc32019-09-17 01:21:23 -06003016}
3017
3018void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
3019 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
3020 VkResult result) {
3021 if (VK_SUCCESS != result) return;
3022 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
3023 pImportSemaphoreFdInfo->flags);
3024}
3025
3026void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003027 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003028 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07003029 if (semaphore_state) {
3030 semaphore_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06003031 }
3032}
3033
3034#ifdef VK_USE_PLATFORM_WIN32_KHR
3035void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
3036 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
3037 if (VK_SUCCESS != result) return;
3038 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
3039 pImportSemaphoreWin32HandleInfo->flags);
3040}
3041
3042void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
3043 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3044 HANDLE *pHandle, VkResult result) {
3045 if (VK_SUCCESS != result) return;
3046 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
3047}
3048
3049void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
3050 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
3051 if (VK_SUCCESS != result) return;
3052 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
3053 pImportFenceWin32HandleInfo->flags);
3054}
3055
3056void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
3057 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3058 HANDLE *pHandle, VkResult result) {
3059 if (VK_SUCCESS != result) return;
3060 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
3061}
3062#endif
3063
3064void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
3065 VkResult result) {
3066 if (VK_SUCCESS != result) return;
3067 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
3068}
3069
Mike Schuchardt2df08912020-12-15 16:28:09 -08003070void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
3071 VkFenceImportFlags flags) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003072 auto fence_node = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003073
3074 if (fence_node) {
3075 fence_node->Import(handle_type, flags);
locke-lunargd556cc32019-09-17 01:21:23 -06003076 }
3077}
3078
3079void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
3080 VkResult result) {
3081 if (VK_SUCCESS != result) return;
3082 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
3083}
3084
Mike Schuchardt2df08912020-12-15 16:28:09 -08003085void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003086 auto fence_state = Get<FENCE_STATE>(fence);
locke-lunargd556cc32019-09-17 01:21:23 -06003087 if (fence_state) {
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003088 fence_state->Export(handle_type);
locke-lunargd556cc32019-09-17 01:21:23 -06003089 }
3090}
3091
3092void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3093 VkResult result) {
3094 if (VK_SUCCESS != result) return;
3095 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3096}
3097
3098void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3099 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3100 if (VK_SUCCESS != result) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003101 Add(std::make_shared<EVENT_STATE>(*pEvent, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003102}
3103
3104void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003105 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003106 SWAPCHAIN_NODE *old_swapchain_state) {
3107 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003108 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003109 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003110 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003111 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3112 surface_state->AddParent(swapchain.get());
3113 surface_state->swapchain = swapchain.get();
3114 swapchain->surface = std::move(surface_state);
Jeremy Gebben082a9832021-10-28 13:40:11 -06003115 Add(std::move(swapchain));
locke-lunargd556cc32019-09-17 01:21:23 -06003116 } else {
3117 surface_state->swapchain = nullptr;
3118 }
3119 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003120 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003121 if (old_swapchain_state) {
3122 old_swapchain_state->retired = true;
3123 }
3124 return;
3125}
3126
3127void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3128 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3129 VkResult result) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003130 auto surface_state = Get<SURFACE_STATE>(pCreateInfo->surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003131 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfo->oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003132 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003133}
3134
3135void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3136 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003137 Destroy<SWAPCHAIN_NODE>(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003138}
3139
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003140void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3141 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3142 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3143 VkResult result) {
3144 if (VK_SUCCESS != result) return;
3145 if (!pMode) return;
Jeremy Gebben082a9832021-10-28 13:40:11 -06003146 Add(std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice));
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003147}
3148
locke-lunargd556cc32019-09-17 01:21:23 -06003149void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003150 auto queue_state = Get<QUEUE_STATE>(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06003151 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3152 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003153 auto semaphore_state = Get<SEMAPHORE_STATE>(pPresentInfo->pWaitSemaphores[i]);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003154 if (semaphore_state) {
Jeremy Gebben15332642021-12-15 19:33:15 -07003155 semaphore_state->EnqueuePresent(queue_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003156 }
3157 }
3158
Tony-LunarG6f887e52021-07-27 11:23:14 -06003159 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003160 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3161 // 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
3162 // confused itself just as much.
3163 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3164 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3165 // Mark the image as having been released to the WSI
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003166 auto swapchain_data = Get<SWAPCHAIN_NODE>(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003167 if (swapchain_data) {
3168 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003169 if (present_id_info) {
3170 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3171 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3172 }
3173 }
locke-lunargd556cc32019-09-17 01:21:23 -06003174 }
3175 }
locke-lunargd556cc32019-09-17 01:21:23 -06003176}
3177
3178void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3179 const VkSwapchainCreateInfoKHR *pCreateInfos,
3180 const VkAllocationCallbacks *pAllocator,
3181 VkSwapchainKHR *pSwapchains, VkResult result) {
3182 if (pCreateInfos) {
3183 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003184 auto surface_state = Get<SURFACE_STATE>(pCreateInfos[i].surface);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003185 auto old_swapchain_state = Get<SWAPCHAIN_NODE>(pCreateInfos[i].oldSwapchain);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003186 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state),
3187 old_swapchain_state.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003188 }
3189 }
3190}
3191
3192void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3193 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003194 auto fence_state = Get<FENCE_STATE>(fence);
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003195 if (fence_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003196 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3197 // import
Jeremy Gebben140a0a52021-12-15 18:22:34 -07003198 fence_state->EnqueueSignal(nullptr, 0);
locke-lunargd556cc32019-09-17 01:21:23 -06003199 }
3200
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003201 auto semaphore_state = Get<SEMAPHORE_STATE>(semaphore);
Jeremy Gebben15332642021-12-15 19:33:15 -07003202 if (semaphore_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003203 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3204 // temporary import
Jeremy Gebben15332642021-12-15 19:33:15 -07003205 semaphore_state->EnqueueAcquire();
locke-lunargd556cc32019-09-17 01:21:23 -06003206 }
3207
3208 // Mark the image as acquired.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003209 auto swapchain_data = Get<SWAPCHAIN_NODE>(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003210 if (swapchain_data) {
3211 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003212 }
3213}
3214
3215void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3216 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3217 VkResult result) {
3218 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3219 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3220}
3221
3222void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3223 uint32_t *pImageIndex, VkResult result) {
3224 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3225 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3226 pAcquireInfo->fence, pImageIndex);
3227}
3228
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003229std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3230 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3231}
3232
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003233void ValidationStateTracker::PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
3234 const VkAllocationCallbacks *pAllocator, VkInstance *pInstance,
3235 VkResult result) {
3236 if (result != VK_SUCCESS) {
3237 return;
3238 }
Jeremy Gebben404f6ac2021-10-28 12:33:28 -06003239 instance_state = this;
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003240 uint32_t count = 0;
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003241 // this can fail if the allocator fails
3242 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, nullptr);
3243 if (result != VK_SUCCESS) {
3244 return;
3245 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003246 std::vector<VkPhysicalDevice> physdev_handles(count);
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003247 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, physdev_handles.data());
3248 if (result != VK_SUCCESS) {
3249 return;
3250 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003251
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003252 for (auto physdev : physdev_handles) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003253 Add(CreatePhysicalDeviceState(physdev));
locke-lunargd556cc32019-09-17 01:21:23 -06003254 }
3255}
3256
3257// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003258static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003259 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003260}
3261
3262void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3263 uint32_t *pQueueFamilyPropertyCount,
3264 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003265 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3266 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003267 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003268}
3269
3270void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003271 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003272 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3273 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003274 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003275}
3276
3277void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003278 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003279 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3280 assert(pd_state);
Jeremy Gebben9f537102021-10-05 16:37:12 -06003281 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state.get(), *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003282}
3283void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3284 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003285 Destroy<SURFACE_STATE>(surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003286}
3287
Jeremy Gebben082a9832021-10-28 13:40:11 -06003288void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) { Add(std::make_shared<SURFACE_STATE>(*pSurface)); }
locke-lunargd556cc32019-09-17 01:21:23 -06003289
3290void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3291 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3292 const VkAllocationCallbacks *pAllocator,
3293 VkSurfaceKHR *pSurface, VkResult result) {
3294 if (VK_SUCCESS != result) return;
3295 RecordVulkanSurface(pSurface);
3296}
3297
3298#ifdef VK_USE_PLATFORM_ANDROID_KHR
3299void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3300 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3301 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3302 VkResult result) {
3303 if (VK_SUCCESS != result) return;
3304 RecordVulkanSurface(pSurface);
3305}
3306#endif // VK_USE_PLATFORM_ANDROID_KHR
3307
3308#ifdef VK_USE_PLATFORM_IOS_MVK
3309void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3310 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3311 VkResult result) {
3312 if (VK_SUCCESS != result) return;
3313 RecordVulkanSurface(pSurface);
3314}
3315#endif // VK_USE_PLATFORM_IOS_MVK
3316
3317#ifdef VK_USE_PLATFORM_MACOS_MVK
3318void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3319 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3320 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3321 VkResult result) {
3322 if (VK_SUCCESS != result) return;
3323 RecordVulkanSurface(pSurface);
3324}
3325#endif // VK_USE_PLATFORM_MACOS_MVK
3326
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003327#ifdef VK_USE_PLATFORM_METAL_EXT
3328void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3329 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3330 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3331 VkResult result) {
3332 if (VK_SUCCESS != result) return;
3333 RecordVulkanSurface(pSurface);
3334}
3335#endif // VK_USE_PLATFORM_METAL_EXT
3336
locke-lunargd556cc32019-09-17 01:21:23 -06003337#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3338void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3339 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3340 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3341 VkResult result) {
3342 if (VK_SUCCESS != result) return;
3343 RecordVulkanSurface(pSurface);
3344}
3345#endif // VK_USE_PLATFORM_WAYLAND_KHR
3346
3347#ifdef VK_USE_PLATFORM_WIN32_KHR
3348void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3349 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
3350 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3351 VkResult result) {
3352 if (VK_SUCCESS != result) return;
3353 RecordVulkanSurface(pSurface);
3354}
3355#endif // VK_USE_PLATFORM_WIN32_KHR
3356
3357#ifdef VK_USE_PLATFORM_XCB_KHR
3358void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
3359 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3360 VkResult result) {
3361 if (VK_SUCCESS != result) return;
3362 RecordVulkanSurface(pSurface);
3363}
3364#endif // VK_USE_PLATFORM_XCB_KHR
3365
3366#ifdef VK_USE_PLATFORM_XLIB_KHR
3367void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
3368 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3369 VkResult result) {
3370 if (VK_SUCCESS != result) return;
3371 RecordVulkanSurface(pSurface);
3372}
3373#endif // VK_USE_PLATFORM_XLIB_KHR
3374
Niklas Haas8b84af12020-04-19 22:20:11 +02003375void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3376 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3377 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3378 VkResult result) {
3379 if (VK_SUCCESS != result) return;
3380 RecordVulkanSurface(pSurface);
3381}
3382
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003383void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
3384 VkSurfaceKHR surface,
3385 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities,
3386 VkResult result) {
3387 if (VK_SUCCESS != result) return;
3388 auto surface_state = Get<SURFACE_STATE>(surface);
3389 surface_state->SetCapabilities(physicalDevice, *pSurfaceCapabilities);
3390}
3391
3392void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
3393 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3394 VkSurfaceCapabilities2KHR *pSurfaceCapabilities, VkResult result) {
3395 if (VK_SUCCESS != result) return;
3396 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3397 surface_state->SetCapabilities(physicalDevice, pSurfaceCapabilities->surfaceCapabilities);
3398}
3399
3400void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice,
3401 VkSurfaceKHR surface,
3402 VkSurfaceCapabilities2EXT *pSurfaceCapabilities,
3403 VkResult result) {
3404 auto surface_state = Get<SURFACE_STATE>(surface);
3405 VkSurfaceCapabilitiesKHR caps{
3406 pSurfaceCapabilities->minImageCount, pSurfaceCapabilities->maxImageCount,
3407 pSurfaceCapabilities->currentExtent, pSurfaceCapabilities->minImageExtent,
3408 pSurfaceCapabilities->maxImageExtent, pSurfaceCapabilities->maxImageArrayLayers,
3409 pSurfaceCapabilities->supportedTransforms, pSurfaceCapabilities->currentTransform,
3410 pSurfaceCapabilities->supportedCompositeAlpha, pSurfaceCapabilities->supportedUsageFlags,
3411 };
3412 surface_state->SetCapabilities(physicalDevice, caps);
3413}
3414
locke-lunargd556cc32019-09-17 01:21:23 -06003415void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3416 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3417 VkBool32 *pSupported, VkResult result) {
3418 if (VK_SUCCESS != result) return;
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003419 auto surface_state = Get<SURFACE_STATE>(surface);
3420 surface_state->SetQueueSupport(physicalDevice, queueFamilyIndex, (*pSupported == VK_TRUE));
3421}
3422
3423void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
3424 VkSurfaceKHR surface,
3425 uint32_t *pPresentModeCount,
3426 VkPresentModeKHR *pPresentModes,
3427 VkResult result) {
3428 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3429
3430 if (pPresentModes) {
3431 auto surface_state = Get<SURFACE_STATE>(surface);
3432 surface_state->SetPresentModes(physicalDevice,
3433 std::vector<VkPresentModeKHR>(pPresentModes, pPresentModes + *pPresentModeCount));
3434 }
3435}
3436
3437void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
3438 uint32_t *pSurfaceFormatCount,
3439 VkSurfaceFormatKHR *pSurfaceFormats,
3440 VkResult result) {
3441 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3442
3443 if (pSurfaceFormats) {
3444 auto surface_state = Get<SURFACE_STATE>(surface);
3445 surface_state->SetFormats(physicalDevice,
3446 std::vector<VkSurfaceFormatKHR>(pSurfaceFormats, pSurfaceFormats + *pSurfaceFormatCount));
3447 }
3448}
3449
3450void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
3451 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3452 uint32_t *pSurfaceFormatCount,
3453 VkSurfaceFormat2KHR *pSurfaceFormats,
3454 VkResult result) {
3455 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3456
3457 if (pSurfaceFormats) {
3458 std::vector<VkSurfaceFormatKHR> fmts(*pSurfaceFormatCount);
3459 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3460 for (uint32_t i = 0; i < *pSurfaceFormatCount; i++) {
3461 fmts[i] = pSurfaceFormats[i].surfaceFormat;
3462 }
3463 surface_state->SetFormats(physicalDevice, std::move(fmts));
3464 }
locke-lunargd556cc32019-09-17 01:21:23 -06003465}
3466
locke-lunargd556cc32019-09-17 01:21:23 -06003467void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3468 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003469 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003470 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003471 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3472}
3473
3474void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003475 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003476 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003477 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3478}
3479
3480void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3481 const VkDebugUtilsLabelEXT *pLabelInfo) {
3482 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3483
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003484 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003485 cb_state->RecordCmd(CMD_INSERTDEBUGUTILSLABELEXT);
3486 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003487 cb_state->debug_label = LoggingLabel(pLabelInfo);
3488}
3489
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003490void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3491 uint32_t queueFamilyIndex,
3492 uint32_t *pCounterCount,
3493 VkPerformanceCounterKHR *pCounters) {
3494 if (NULL == pCounters) return;
3495
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003496 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3497 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003498
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003499 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3500 queue_family_counters->counters.resize(*pCounterCount);
3501 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003502
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003503 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003504}
3505
3506void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3507 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3508 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3509 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3510 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3511}
3512
3513void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3514 VkResult result) {
3515 if (result == VK_SUCCESS) performance_lock_acquired = true;
3516}
3517
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003518void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3519 performance_lock_acquired = false;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06003520 for (auto &cmd_buffer : command_buffer_map_.snapshot()) {
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003521 cmd_buffer.second->performance_lock_released = true;
3522 }
3523}
3524
locke-lunargd556cc32019-09-17 01:21:23 -06003525void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003526 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003527 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003528 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003529}
3530
3531void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003532 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003533 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003534 Destroy<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003535}
3536
Mike Schuchardt2df08912020-12-15 16:28:09 -08003537void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3538 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003539 Add(std::make_shared<UPDATE_TEMPLATE_STATE>(*pDescriptorUpdateTemplate, pCreateInfo));
locke-lunargd556cc32019-09-17 01:21:23 -06003540}
3541
Mike Schuchardt2df08912020-12-15 16:28:09 -08003542void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3543 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3544 const VkAllocationCallbacks *pAllocator,
3545 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3546 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003547 if (VK_SUCCESS != result) return;
3548 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3549}
3550
3551void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003552 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3553 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003554 if (VK_SUCCESS != result) return;
3555 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3556}
3557
3558void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003559 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003560 const void *pData) {
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003561 auto const template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
3562 assert(template_state);
3563 if (template_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06003564 // TODO: Record template push descriptor updates
3565 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003566 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state.get(), pData);
locke-lunargd556cc32019-09-17 01:21:23 -06003567 }
3568 }
3569}
3570
3571void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3572 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3573 const void *pData) {
3574 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3575}
3576
3577void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003578 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003579 const void *pData) {
3580 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3581}
3582
Mike Schuchardt2df08912020-12-15 16:28:09 -08003583void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3584 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3585 VkPipelineLayout layout, uint32_t set,
3586 const void *pData) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003587 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003588
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003589 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003590 const auto template_state = Get<UPDATE_TEMPLATE_STATE>(descriptorUpdateTemplate);
locke-lunargd556cc32019-09-17 01:21:23 -06003591 if (template_state) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003592 auto layout_data = Get<PIPELINE_LAYOUT_STATE>(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003593 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003594 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003595 // Decode the template into a set of write updates
Jeremy Gebben9f537102021-10-05 16:37:12 -06003596 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state.get(), pData,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003597 dsl->GetDescriptorSetLayout());
Jeremy Gebben9f537102021-10-05 16:37:12 -06003598 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data.get(), set,
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003599 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3600 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003601 }
3602}
3603
3604void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3605 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003606 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003607 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003608 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003609 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003610 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003611 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003612 }
3613}
3614
3615void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3616 uint32_t *pPropertyCount,
3617 VkDisplayPlanePropertiesKHR *pProperties,
3618 VkResult result) {
3619 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3620 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3621}
3622
3623void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3624 uint32_t *pPropertyCount,
3625 VkDisplayPlaneProperties2KHR *pProperties,
3626 VkResult result) {
3627 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3628 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3629}
3630
3631void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3632 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3633 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003634 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003635 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003636 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003637}
3638
3639void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3640 uint32_t query, uint32_t index) {
3641 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003642 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003643 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003644 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003645}
3646
3647void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3648 VkSamplerYcbcrConversion ycbcr_conversion) {
Lionel Landwerlin21719f62021-12-09 11:40:09 +02003649 VkFormatFeatureFlags2KHR format_features = 0;
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003650
3651 if (create_info->format != VK_FORMAT_UNDEFINED) {
3652 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07003653 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003654 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
3655 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003656 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003657
Jeremy Gebben082a9832021-10-28 13:40:11 -06003658 Add(std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features));
locke-lunargd556cc32019-09-17 01:21:23 -06003659}
3660
3661void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
3662 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3663 const VkAllocationCallbacks *pAllocator,
3664 VkSamplerYcbcrConversion *pYcbcrConversion,
3665 VkResult result) {
3666 if (VK_SUCCESS != result) return;
3667 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3668}
3669
3670void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(VkDevice device,
3671 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3672 const VkAllocationCallbacks *pAllocator,
3673 VkSamplerYcbcrConversion *pYcbcrConversion,
3674 VkResult result) {
3675 if (VK_SUCCESS != result) return;
3676 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3677}
3678
3679void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
3680 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003681 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003682}
3683
3684void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
3685 VkSamplerYcbcrConversion ycbcrConversion,
3686 const VkAllocationCallbacks *pAllocator) {
Jeremy Gebben082a9832021-10-28 13:40:11 -06003687 Destroy<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003688}
3689
Tony-LunarG977448c2019-12-02 14:52:02 -07003690void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3691 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06003692 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07003693 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003694
3695 // Do nothing if the query pool has been destroyed.
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003696 auto query_pool_state = Get<QUERY_POOL_STATE>(queryPool);
locke-lunargd556cc32019-09-17 01:21:23 -06003697 if (!query_pool_state) return;
3698
3699 // Reset the state of existing entries.
locke-lunargd556cc32019-09-17 01:21:23 -06003700 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
3701 for (uint32_t i = 0; i < max_query_count; ++i) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003702 auto query_index = firstQuery + i;
3703 query_pool_state->SetQueryState(query_index, 0, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003704 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003705 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
Jeremy Gebben1858ae92021-12-02 11:28:05 -07003706 query_pool_state->SetQueryState(query_index, pass_index, QUERYSTATE_RESET);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003707 }
3708 }
locke-lunargd556cc32019-09-17 01:21:23 -06003709 }
3710}
3711
Tony-LunarG977448c2019-12-02 14:52:02 -07003712void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3713 uint32_t queryCount) {
3714 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3715}
3716
3717void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3718 uint32_t queryCount) {
3719 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3720}
3721
locke-lunargd556cc32019-09-17 01:21:23 -06003722void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
Jeremy Gebbenfc890452021-10-27 10:56:49 -06003723 const UPDATE_TEMPLATE_STATE *template_state,
3724 const void *pData) {
locke-lunargd556cc32019-09-17 01:21:23 -06003725 // Translate the templated update into a normal update for validation...
3726 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
3727 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
3728 decoded_update.desc_writes.data(), 0, NULL);
3729}
3730
3731// Update the common AllocateDescriptorSetsData
3732void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05003733 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06003734 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06003735 auto layout = Get<cvdescriptorset::DescriptorSetLayout>(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003736 if (layout) {
3737 ds_data->layout_nodes[i] = layout;
3738 // Count total descriptors required per type
3739 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
3740 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003741 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
3742 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003743 }
3744 }
3745 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
3746 }
3747}
3748
locke-lunargd556cc32019-09-17 01:21:23 -06003749void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3750 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003751 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003752 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003753}
3754
Tony-LunarG745150c2021-07-02 15:07:31 -06003755void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3756 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
3757 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003758 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003759 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003760}
3761
locke-lunargd556cc32019-09-17 01:21:23 -06003762void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3763 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3764 uint32_t firstInstance) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003765 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003766 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003767}
3768
Tony-LunarG745150c2021-07-02 15:07:31 -06003769void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3770 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
3771 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
3772 const int32_t *pVertexOffset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003773 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003774 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003775}
3776
locke-lunargd556cc32019-09-17 01:21:23 -06003777void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3778 uint32_t count, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003779 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3780 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003781 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003782 if (!disabled[command_buffer_state]) {
3783 cb_state->AddChild(buffer_state);
3784 }
locke-lunargd556cc32019-09-17 01:21:23 -06003785}
3786
3787void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3788 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003789 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3790 auto buffer_state = Get<BUFFER_STATE>(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003791 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003792 if (!disabled[command_buffer_state]) {
3793 cb_state->AddChild(buffer_state);
3794 }
locke-lunargd556cc32019-09-17 01:21:23 -06003795}
3796
3797void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003798 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003799 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06003800}
3801
3802void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3803 VkDeviceSize offset) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003804 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003805 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003806 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003807 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003808 cb_state->AddChild(buffer_state);
3809 }
locke-lunargd556cc32019-09-17 01:21:23 -06003810}
3811
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003812void ValidationStateTracker::PostCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3813 uint32_t, uint32_t) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003814 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003815 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3816}
3817
3818void ValidationStateTracker::PostCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
3819 uint32_t, uint32_t) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003820 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06003821 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
3822}
3823
Tony-LunarG977448c2019-12-02 14:52:02 -07003824void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3825 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07003826 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003827 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003828 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003829 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003830 auto buffer_state = Get<BUFFER_STATE>(buffer);
3831 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003832 cb_state->AddChild(buffer_state);
3833 cb_state->AddChild(count_buffer_state);
3834 }
Tony-LunarG977448c2019-12-02 14:52:02 -07003835}
3836
locke-lunargd556cc32019-09-17 01:21:23 -06003837void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3838 VkDeviceSize offset, VkBuffer countBuffer,
3839 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3840 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003841 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003842 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003843}
3844
3845void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3846 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
3847 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003848 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003849 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07003850}
3851
3852void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3853 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07003854 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003855 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003856 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003857 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003858 auto buffer_state = Get<BUFFER_STATE>(buffer);
3859 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003860 cb_state->AddChild(buffer_state);
3861 cb_state->AddChild(count_buffer_state);
3862 }
locke-lunargd556cc32019-09-17 01:21:23 -06003863}
3864
3865void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
3866 VkDeviceSize offset, VkBuffer countBuffer,
3867 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3868 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003869 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003870 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07003871}
3872
3873void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
3874 VkDeviceSize offset, VkBuffer countBuffer,
3875 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3876 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06003877 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07003878 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06003879}
3880
3881void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
3882 uint32_t firstTask) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003883 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003884 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003885}
3886
3887void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
3888 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003889 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003890 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003891 auto buffer_state = Get<BUFFER_STATE>(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003892 if (!disabled[command_buffer_state] && buffer_state) {
3893 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003894 }
3895}
3896
3897void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
3898 VkDeviceSize offset, VkBuffer countBuffer,
3899 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
3900 uint32_t stride) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003901 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003902 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003903 if (!disabled[command_buffer_state]) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003904 auto buffer_state = Get<BUFFER_STATE>(buffer);
3905 auto count_buffer_state = Get<BUFFER_STATE>(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003906 if (buffer_state) {
3907 cb_state->AddChild(buffer_state);
3908 }
3909 if (count_buffer_state) {
3910 cb_state->AddChild(count_buffer_state);
3911 }
locke-lunargd556cc32019-09-17 01:21:23 -06003912 }
3913}
3914
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003915void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
3916 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
3917 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
3918 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
3919 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
3920 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
3921 uint32_t width, uint32_t height, uint32_t depth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003922 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003923 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003924 cb_state->hasTraceRaysCmd = true;
3925}
3926
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003927void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
3928 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
3929 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
3930 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
3931 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
3932 uint32_t height, uint32_t depth) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003933 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003934 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003935 cb_state->hasTraceRaysCmd = true;
3936}
3937
3938void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
3939 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
3940 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
3941 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
3942 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
3943 VkDeviceAddress indirectDeviceAddress) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06003944 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003945 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06003946 cb_state->hasTraceRaysCmd = true;
3947}
3948
locke-lunargd556cc32019-09-17 01:21:23 -06003949void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
3950 const VkAllocationCallbacks *pAllocator,
3951 VkShaderModule *pShaderModule, VkResult result,
3952 void *csm_state_data) {
3953 if (VK_SUCCESS != result) return;
3954 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
3955
sfricke-samsung45996a42021-09-16 13:45:27 -07003956 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06003957 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003958 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
3959 csm_state->unique_shader_id)
3960 : std::make_shared<SHADER_MODULE_STATE>();
Jeremy Gebben082a9832021-10-28 13:40:11 -06003961 Add(std::move(new_shader_module));
locke-lunargd556cc32019-09-17 01:21:23 -06003962}
3963
John Zulauf22b0fbe2019-10-15 06:26:16 -06003964void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
3965 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
3966 VkResult result) {
3967 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben9f537102021-10-05 16:37:12 -06003968 auto swapchain_state = Get<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06003969
3970 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
3971
3972 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06003973 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07003974 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07003975 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06003976
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003977 auto format_features =
Lionel Landwerlind0f84e42021-12-07 15:46:09 +02003978 GetImageFormatFeatures(physical_device, has_format_feature2, device, pSwapchainImages[i],
3979 swapchain_state->image_create_info.format, swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06003980
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06003981 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003982 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003983 if (!swapchain_image.fake_base_address) {
3984 auto size = image_state->fragment_encoder->TotalSize();
3985 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07003986 }
3987
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003988 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003989 swapchain_image.image_state = image_state.get();
Jeremy Gebben082a9832021-10-28 13:40:11 -06003990 Add(std::move(image_state));
John Zulauf22b0fbe2019-10-15 06:26:16 -06003991 }
3992 }
3993
3994 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06003995 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
3996 }
3997}
sourav parmar35e7a002020-06-09 17:58:44 -07003998
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02003999void ValidationStateTracker::PostCallRecordCopyAccelerationStructureKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
4000 const VkCopyAccelerationStructureInfoKHR *pInfo,
4001 VkResult result) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004002 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
4003 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
Lars-Ivar Hesselberg Simonsen0dd3a812021-10-28 14:09:01 +02004004 if (dst_as_state != nullptr && src_as_state != nullptr) {
4005 dst_as_state->built = true;
4006 dst_as_state->build_info_khr = src_as_state->build_info_khr;
4007 }
4008}
4009
sourav parmar35e7a002020-06-09 17:58:44 -07004010void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
4011 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004012 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07004013 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004014 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004015 auto src_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->src);
4016 auto dst_as_state = Get<ACCELERATION_STRUCTURE_STATE_KHR>(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07004017 if (dst_as_state != nullptr && src_as_state != nullptr) {
4018 dst_as_state->built = true;
4019 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004020 if (!disabled[command_buffer_state]) {
4021 cb_state->AddChild(dst_as_state);
4022 cb_state->AddChild(src_as_state);
4023 }
sourav parmar35e7a002020-06-09 17:58:44 -07004024 }
4025 }
4026}
Piers Daniell39842ee2020-07-10 16:42:33 -06004027
4028void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004029 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004030 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004031}
4032
4033void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004034 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004035 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004036}
4037
4038void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
4039 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004040 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004041 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004042 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06004043}
4044
4045void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4046 const VkViewport *pViewports) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004047 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004048 cb_state->RecordStateCmd(CMD_SETVIEWPORTWITHCOUNTEXT, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004049 uint32_t bits = (1u << viewportCount) - 1u;
4050 cb_state->viewportWithCountMask |= bits;
4051 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00004052 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004053 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004054
4055 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
4056 for (size_t i = 0; i < viewportCount; ++i) {
4057 cb_state->dynamicViewports[i] = pViewports[i];
4058 }
Piers Daniell39842ee2020-07-10 16:42:33 -06004059}
4060
4061void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4062 const VkRect2D *pScissors) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004063 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004064 cb_state->RecordStateCmd(CMD_SETSCISSORWITHCOUNTEXT, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004065 uint32_t bits = (1u << scissorCount) - 1u;
4066 cb_state->scissorWithCountMask |= bits;
4067 cb_state->trashedScissorMask &= ~bits;
4068 cb_state->scissorWithCountCount = scissorCount;
4069 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06004070}
4071
4072void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4073 uint32_t bindingCount, const VkBuffer *pBuffers,
4074 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4075 const VkDeviceSize *pStrides) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004076 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004077 cb_state->RecordStateCmd(CMD_BINDVERTEXBUFFERS2EXT, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06004078
4079 uint32_t end = firstBinding + bindingCount;
4080 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
4081 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
4082 }
4083
4084 for (uint32_t i = 0; i < bindingCount; ++i) {
4085 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
Jeremy Gebben9f537102021-10-05 16:37:12 -06004086 vertex_buffer_binding.buffer_state = Get<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004087 vertex_buffer_binding.offset = pOffsets[i];
4088 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4089 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4090 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004091 if (!disabled[command_buffer_state] && pBuffers[i]) {
Jeremy Gebben9f537102021-10-05 16:37:12 -06004092 cb_state->AddChild(vertex_buffer_binding.buffer_state);
Piers Daniell39842ee2020-07-10 16:42:33 -06004093 }
4094 }
4095}
4096
4097void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004098 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004099 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004100}
4101
4102void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004103 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004104 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004105}
4106
4107void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004108 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004109 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004110}
4111
4112void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4113 VkBool32 depthBoundsTestEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004114 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004115 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004116}
4117void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004118 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004119 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004120}
4121
4122void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4123 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4124 VkCompareOp compareOp) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004125 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004126 cb_state->RecordStateCmd(CMD_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004127}
locke-lunarg4189aa22020-10-21 00:23:48 -06004128
4129void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4130 uint32_t discardRectangleCount,
4131 const VkRect2D *pDiscardRectangles) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004132 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004133 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004134}
4135
4136void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4137 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004138 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004139 cb_state->RecordStateCmd(CMD_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004140}
4141
4142void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4143 VkCoarseSampleOrderTypeNV sampleOrderType,
4144 uint32_t customSampleOrderCount,
4145 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004146 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004147 cb_state->RecordStateCmd(CMD_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004148}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004149
4150void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004151 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004152 cb_state->RecordStateCmd(CMD_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004153}
4154
4155void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004156 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004157 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004158}
4159
4160void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4161 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004162 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004163 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004164}
4165
4166void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004167 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004168 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004169}
4170
4171void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4172 VkBool32 primitiveRestartEnable) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004173 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004174 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004175}
Piers Daniell924cd832021-05-18 13:48:47 -06004176
4177void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4178 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4179 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4180 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004181 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004182 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4183
4184 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4185 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4186 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004187 if (pipeline_state->create_info.graphics.pDynamicState) {
4188 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4189 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004190 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4191 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4192 break;
4193 }
4194 }
4195 }
4196 }
4197 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004198}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004199
4200void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
Jeremy Gebbenb20a8242021-11-05 15:14:43 -06004201 auto buffer_state = Get<BUFFER_STATE>(pInfo->buffer);
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004202 if (buffer_state) {
4203 // address is used for GPU-AV and ray tracing buffer validation
4204 buffer_state->deviceAddress = address;
Jeremy Gebben65975ed2021-10-29 11:16:10 -06004205 buffer_address_map_.insert(address, buffer_state.get());
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004206 }
4207}
4208
4209void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4210 VkDeviceAddress address) {
4211 RecordGetBufferDeviceAddress(pInfo, address);
4212}
4213
4214void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4215 VkDeviceAddress address) {
4216 RecordGetBufferDeviceAddress(pInfo, address);
4217}
4218
4219void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4220 VkDeviceAddress address) {
4221 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004222}
4223
4224std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4225 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004226 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004227}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004228
4229std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4230 const VkCommandBufferAllocateInfo *create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06004231 const COMMAND_POOL_STATE *pool) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004232 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4233}