blob: 70e46de34566d6196fa3ebb15d03b353f37fa12e [file] [log] [blame]
sfricke-samsung486a51e2021-01-02 00:10:15 -08001/* Copyright (c) 2015-2021 The Khronos Group Inc.
2 * Copyright (c) 2015-2021 Valve Corporation
3 * Copyright (c) 2015-2021 LunarG, Inc.
4 * Copyright (C) 2015-2021 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
John Zulauf64ffe552021-02-06 10:25:07 -070088std::vector<std::shared_ptr<const IMAGE_VIEW_STATE>> ValidationStateTracker::GetSharedAttachmentViews(
89 const VkRenderPassBeginInfo &rp_begin, const FRAMEBUFFER_STATE &fb_state) const {
90 auto get_fn = [this](VkImageView handle) { return this->GetShared<IMAGE_VIEW_STATE>(handle); };
91 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>
99VkFormatFeatureFlags ValidationStateTracker::GetExternalFormatFeaturesANDROID(const CreateInfo *create_info) const {
100 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;
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700115 auto ahb_format_props = LvlFindInChain<VkAndroidHardwareBufferFormatPropertiesANDROID>(pProperties->pNext);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700116 if (ahb_format_props) {
Jeremy Gebbenfc6f8152021-03-18 16:58:55 -0600117 ahb_ext_formats_map.emplace(ahb_format_props->externalFormat, ahb_format_props->formatFeatures);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700118 }
119}
120
locke-lunargd556cc32019-09-17 01:21:23 -0600121#else
122
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -0600123template <typename CreateInfo>
124VkFormatFeatureFlags ValidationStateTracker::GetExternalFormatFeaturesANDROID(const CreateInfo *create_info) const {
125 return 0;
126}
locke-lunargd556cc32019-09-17 01:21:23 -0600127
128#endif // VK_USE_PLATFORM_ANDROID_KHR
129
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600130VkFormatFeatureFlags GetImageFormatFeatures(VkPhysicalDevice physical_device, VkDevice device, VkImage image, VkFormat format,
131 VkImageTiling tiling) {
132 VkFormatFeatureFlags format_features = 0;
Petr Kraus44f1c482020-04-25 20:09:25 +0200133 // Add feature support according to Image Format Features (vkspec.html#resources-image-format-features)
134 // if format is AHB external format then the features are already set
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600135 if (tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
136 VkImageDrmFormatModifierPropertiesEXT drm_format_properties = {VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
137 nullptr};
138 DispatchGetImageDrmFormatModifierPropertiesEXT(device, image, &drm_format_properties);
Petr Kraus44f1c482020-04-25 20:09:25 +0200139
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600140 VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, nullptr};
141 VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
142 nullptr};
143 format_properties_2.pNext = (void *)&drm_properties_list;
144 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
145 std::vector<VkDrmFormatModifierPropertiesEXT> drm_properties;
146 drm_properties.resize(drm_properties_list.drmFormatModifierCount);
147 drm_properties_list.pDrmFormatModifierProperties = &drm_properties[0];
148 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
Petr Kraus44f1c482020-04-25 20:09:25 +0200149
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600150 for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
151 if (drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifier == drm_format_properties.drmFormatModifier) {
152 format_features = drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
153 break;
Petr Kraus44f1c482020-04-25 20:09:25 +0200154 }
Petr Kraus44f1c482020-04-25 20:09:25 +0200155 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600156 } else {
157 VkFormatProperties format_properties;
158 DispatchGetPhysicalDeviceFormatProperties(physical_device, format, &format_properties);
159 format_features =
160 (tiling == VK_IMAGE_TILING_LINEAR) ? format_properties.linearTilingFeatures : format_properties.optimalTilingFeatures;
Petr Kraus44f1c482020-04-25 20:09:25 +0200161 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600162 return format_features;
Petr Kraus44f1c482020-04-25 20:09:25 +0200163}
164
locke-lunargd556cc32019-09-17 01:21:23 -0600165void ValidationStateTracker::PostCallRecordCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
166 const VkAllocationCallbacks *pAllocator, VkImage *pImage, VkResult result) {
167 if (VK_SUCCESS != result) return;
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600168 VkFormatFeatureFlags format_features = 0;
sfricke-samsung45996a42021-09-16 13:45:27 -0700169 if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600170 format_features = GetExternalFormatFeaturesANDROID(pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -0600171 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600172 if (format_features == 0) {
173 format_features = GetImageFormatFeatures(physical_device, device, *pImage, pCreateInfo->format, pCreateInfo->tiling);
locke-lunargd556cc32019-09-17 01:21:23 -0600174 }
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -0600175 imageMap[*pImage] = std::make_shared<IMAGE_STATE>(this, *pImage, pCreateInfo, format_features);
locke-lunargd556cc32019-09-17 01:21:23 -0600176}
177
178void ValidationStateTracker::PreCallRecordDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
179 if (!image) return;
180 IMAGE_STATE *image_state = GetImageState(image);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600181 if (!image_state) return;
182
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600183 image_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -0600184 imageMap.erase(image);
185}
186
187void ValidationStateTracker::PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
188 VkImageLayout imageLayout, const VkClearColorValue *pColor,
189 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600190
191 if (disabled[command_buffer_state]) return;
192
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600193 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600194 if (cb_node) {
195 cb_node->RecordTransferCmd(CMD_CLEARCOLORIMAGE, GetImageState(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600196 }
197}
198
199void ValidationStateTracker::PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image,
200 VkImageLayout imageLayout,
201 const VkClearDepthStencilValue *pDepthStencil,
202 uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600203 if (disabled[command_buffer_state]) return;
204
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600205 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600206 if (cb_node) {
207 cb_node->RecordTransferCmd(CMD_CLEARDEPTHSTENCILIMAGE, GetImageState(image));
locke-lunargd556cc32019-09-17 01:21:23 -0600208 }
209}
210
211void ValidationStateTracker::PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage,
212 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
213 uint32_t regionCount, const VkImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600214 if (disabled[command_buffer_state]) return;
215
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600216 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600217 cb_node->RecordTransferCmd(CMD_COPYIMAGE, GetImageState(srcImage), GetImageState(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600218}
219
Jeff Leger178b1e52020-10-05 12:22:23 -0400220void ValidationStateTracker::PreCallRecordCmdCopyImage2KHR(VkCommandBuffer commandBuffer,
221 const VkCopyImageInfo2KHR *pCopyImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600222 if (disabled[command_buffer_state]) return;
223
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600224 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600225 cb_node->RecordTransferCmd(CMD_COPYIMAGE2KHR, GetImageState(pCopyImageInfo->srcImage), GetImageState(pCopyImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400226}
227
locke-lunargd556cc32019-09-17 01:21:23 -0600228void ValidationStateTracker::PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage,
229 VkImageLayout srcImageLayout, VkImage dstImage,
230 VkImageLayout dstImageLayout, uint32_t regionCount,
231 const VkImageResolve *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600232 if (disabled[command_buffer_state]) return;
233
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600234 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600235 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE, GetImageState(srcImage), GetImageState(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600236}
237
Jeff Leger178b1e52020-10-05 12:22:23 -0400238void ValidationStateTracker::PreCallRecordCmdResolveImage2KHR(VkCommandBuffer commandBuffer,
239 const VkResolveImageInfo2KHR *pResolveImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600240 if (disabled[command_buffer_state]) return;
241
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600242 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600243 cb_node->RecordTransferCmd(CMD_RESOLVEIMAGE2KHR, GetImageState(pResolveImageInfo->srcImage),
244 GetImageState(pResolveImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400245}
246
locke-lunargd556cc32019-09-17 01:21:23 -0600247void ValidationStateTracker::PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage,
248 VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
249 uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
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 Gebben10a0ed12021-08-17 09:54:29 -0600253 cb_node->RecordTransferCmd(CMD_BLITIMAGE, GetImageState(srcImage), GetImageState(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600254}
255
Jeff Leger178b1e52020-10-05 12:22:23 -0400256void ValidationStateTracker::PreCallRecordCmdBlitImage2KHR(VkCommandBuffer commandBuffer,
257 const VkBlitImageInfo2KHR *pBlitImageInfo) {
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 Gebben10a0ed12021-08-17 09:54:29 -0600261 cb_node->RecordTransferCmd(CMD_BLITIMAGE2KHR, GetImageState(pBlitImageInfo->srcImage), GetImageState(pBlitImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400262}
263
locke-lunargd556cc32019-09-17 01:21:23 -0600264void ValidationStateTracker::PostCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
265 const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer,
266 VkResult result) {
267 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600268
Jeremy Gebbenc8937b62021-09-24 15:50:56 -0600269 auto buffer_state = std::make_shared<BUFFER_STATE>(this, *pBuffer, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -0600270
James Rumble2f6e7bb2021-07-13 15:21:20 +0100271 if (pCreateInfo) {
272 const auto *opaque_capture_address = LvlFindInChain<VkBufferOpaqueCaptureAddressCreateInfo>(pCreateInfo->pNext);
273 if (opaque_capture_address) {
274 // address is used for GPU-AV and ray tracing buffer validation
275 buffer_state->deviceAddress = opaque_capture_address->opaqueCaptureAddress;
276 buffer_address_map_.emplace(opaque_capture_address->opaqueCaptureAddress, buffer_state.get());
277 }
278 }
Jeremy Gebbencbf22862021-03-03 12:01:22 -0700279 bufferMap.emplace(*pBuffer, std::move(buffer_state));
locke-lunargd556cc32019-09-17 01:21:23 -0600280}
281
282void ValidationStateTracker::PostCallRecordCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
283 const VkAllocationCallbacks *pAllocator, VkBufferView *pView,
284 VkResult result) {
285 if (result != VK_SUCCESS) return;
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600286
Jeff Bolze7fc67b2019-10-04 12:29:31 -0500287 auto buffer_state = GetBufferShared(pCreateInfo->buffer);
locke-lunarg25b6c352020-08-06 17:44:18 -0600288
289 VkFormatProperties format_properties;
290 DispatchGetPhysicalDeviceFormatProperties(physical_device, pCreateInfo->format, &format_properties);
locke-lunarg25b6c352020-08-06 17:44:18 -0600291
Jeremy Gebbenf2912cd2021-07-07 07:57:39 -0600292 bufferViewMap[*pView] =
293 std::make_shared<BUFFER_VIEW_STATE>(buffer_state, *pView, pCreateInfo, format_properties.bufferFeatures);
locke-lunargd556cc32019-09-17 01:21:23 -0600294}
295
296void ValidationStateTracker::PostCallRecordCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
297 const VkAllocationCallbacks *pAllocator, VkImageView *pView,
298 VkResult result) {
299 if (result != VK_SUCCESS) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -0500300 auto image_state = GetImageShared(pCreateInfo->image);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700301
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600302 VkFormatFeatureFlags format_features = 0;
303 if (image_state->HasAHBFormat() == true) {
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700304 // The ImageView uses same Image's format feature since they share same AHB
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600305 format_features = image_state->format_features;
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700306 } else {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600307 format_features = GetImageFormatFeatures(physical_device, device, image_state->image(), pCreateInfo->format,
308 image_state->createInfo.tiling);
Spencer Fricke6bba8c72020-04-06 07:41:21 -0700309 }
310
locke-lunarg9939d4b2020-10-26 20:11:08 -0600311 // 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 -0600312 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600313 if (IsExtEnabled(device_extensions.vk_ext_filter_cubic)) {
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700314 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg9939d4b2020-10-26 20:11:08 -0600315 imageview_format_info.imageViewType = pCreateInfo->viewType;
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -0700316 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600317 image_format_info.type = image_state->createInfo.imageType;
318 image_format_info.format = image_state->createInfo.format;
319 image_format_info.tiling = image_state->createInfo.tiling;
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600320 auto usage_create_info = LvlFindInChain<VkImageViewUsageCreateInfo>(pCreateInfo->pNext);
321 image_format_info.usage = usage_create_info ? usage_create_info->usage : image_state->createInfo.usage;
locke-lunarg9939d4b2020-10-26 20:11:08 -0600322 image_format_info.flags = image_state->createInfo.flags;
323
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600324 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg9939d4b2020-10-26 20:11:08 -0600325
326 DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_format_info, &image_format_properties);
327 }
Jeremy Gebbenb4d17012021-07-08 13:18:15 -0600328
329 imageViewMap[*pView] =
330 std::make_shared<IMAGE_VIEW_STATE>(image_state, *pView, pCreateInfo, format_features, filter_cubic_props);
locke-lunargd556cc32019-09-17 01:21:23 -0600331}
332
333void ValidationStateTracker::PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
334 uint32_t regionCount, const VkBufferCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600335 if (disabled[command_buffer_state]) return;
336
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600337 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600338 cb_node->RecordTransferCmd(CMD_COPYBUFFER, GetBufferState(srcBuffer), GetBufferState(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600339}
340
Jeff Leger178b1e52020-10-05 12:22:23 -0400341void ValidationStateTracker::PreCallRecordCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer,
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600342 const VkCopyBufferInfo2KHR *pCopyBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600343 if (disabled[command_buffer_state]) return;
344
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600345 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600346 cb_node->RecordTransferCmd(CMD_COPYBUFFER2KHR, GetBufferState(pCopyBufferInfo->srcBuffer),
347 GetBufferState(pCopyBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400348}
349
locke-lunargd556cc32019-09-17 01:21:23 -0600350void ValidationStateTracker::PreCallRecordDestroyImageView(VkDevice device, VkImageView imageView,
351 const VkAllocationCallbacks *pAllocator) {
352 IMAGE_VIEW_STATE *image_view_state = GetImageViewState(imageView);
353 if (!image_view_state) return;
locke-lunargd556cc32019-09-17 01:21:23 -0600354
355 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600356 image_view_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -0600357 imageViewMap.erase(imageView);
358}
359
360void ValidationStateTracker::PreCallRecordDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
361 if (!buffer) return;
362 auto buffer_state = GetBufferState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600363
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600364 buffer_state->Destroy();
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -0600365 bufferMap.erase(buffer_state->buffer());
locke-lunargd556cc32019-09-17 01:21:23 -0600366}
367
368void ValidationStateTracker::PreCallRecordDestroyBufferView(VkDevice device, VkBufferView bufferView,
369 const VkAllocationCallbacks *pAllocator) {
370 if (!bufferView) return;
371 auto buffer_view_state = GetBufferViewState(bufferView);
locke-lunargd556cc32019-09-17 01:21:23 -0600372
373 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600374 buffer_view_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -0600375 bufferViewMap.erase(bufferView);
376}
377
378void ValidationStateTracker::PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
379 VkDeviceSize size, uint32_t data) {
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 Gebben10a0ed12021-08-17 09:54:29 -0600383 cb_node->RecordTransferCmd(CMD_FILLBUFFER, GetBufferState(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600384}
385
386void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
387 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
388 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600389 if (disabled[command_buffer_state]) return;
390
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600391 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -0600392
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600393 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER, GetImageState(srcImage), GetBufferState(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -0600394}
395
Jeff Leger178b1e52020-10-05 12:22:23 -0400396void ValidationStateTracker::PreCallRecordCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
397 const VkCopyImageToBufferInfo2KHR *pCopyImageToBufferInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600398 if (disabled[command_buffer_state]) return;
399
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600400 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600401 cb_node->RecordTransferCmd(CMD_COPYIMAGETOBUFFER2KHR, GetImageState(pCopyImageToBufferInfo->srcImage),
402 GetBufferState(pCopyImageToBufferInfo->dstBuffer));
Jeff Leger178b1e52020-10-05 12:22:23 -0400403}
404
locke-lunargd556cc32019-09-17 01:21:23 -0600405void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
406 VkImageLayout dstImageLayout, uint32_t regionCount,
407 const VkBufferImageCopy *pRegions) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600408 if (disabled[command_buffer_state]) return;
409
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600410 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600411 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE, GetBufferState(srcBuffer), GetImageState(dstImage));
locke-lunargd556cc32019-09-17 01:21:23 -0600412}
413
Jeff Leger178b1e52020-10-05 12:22:23 -0400414void ValidationStateTracker::PreCallRecordCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
415 const VkCopyBufferToImageInfo2KHR *pCopyBufferToImageInfo) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600416
417 if (disabled[command_buffer_state]) return;
418
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600419 auto cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -0600420 cb_node->RecordTransferCmd(CMD_COPYBUFFERTOIMAGE2KHR, GetBufferState(pCopyBufferToImageInfo->srcBuffer),
421 GetImageState(pCopyBufferToImageInfo->dstImage));
Jeff Leger178b1e52020-10-05 12:22:23 -0400422}
423
locke-lunargd556cc32019-09-17 01:21:23 -0600424// Return ptr to memory binding for given handle of specified type
425template <typename State, typename Result>
426static Result GetObjectMemBindingImpl(State state, const VulkanTypedHandle &typed_handle) {
427 switch (typed_handle.type) {
428 case kVulkanObjectTypeImage:
429 return state->GetImageState(typed_handle.Cast<VkImage>());
430 case kVulkanObjectTypeBuffer:
431 return state->GetBufferState(typed_handle.Cast<VkBuffer>());
432 case kVulkanObjectTypeAccelerationStructureNV:
sourav parmarcd5fb182020-07-17 12:58:44 -0700433 return state->GetAccelerationStructureStateNV(typed_handle.Cast<VkAccelerationStructureNV>());
locke-lunargd556cc32019-09-17 01:21:23 -0600434 default:
435 break;
436 }
437 return nullptr;
438}
439
440const BINDABLE *ValidationStateTracker::GetObjectMemBinding(const VulkanTypedHandle &typed_handle) const {
441 return GetObjectMemBindingImpl<const ValidationStateTracker *, const BINDABLE *>(this, typed_handle);
442}
443
444BINDABLE *ValidationStateTracker::GetObjectMemBinding(const VulkanTypedHandle &typed_handle) {
445 return GetObjectMemBindingImpl<ValidationStateTracker *, BINDABLE *>(this, typed_handle);
446}
447
locke-lunargd556cc32019-09-17 01:21:23 -0600448// Remove set from setMap and delete the set
449void ValidationStateTracker::FreeDescriptorSet(cvdescriptorset::DescriptorSet *descriptor_set) {
Jeff Bolz41a1ced2019-10-11 11:40:49 -0500450 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -0600451 descriptor_set->Destroy();
Jeff Bolz41a1ced2019-10-11 11:40:49 -0500452
locke-lunargd556cc32019-09-17 01:21:23 -0600453 setMap.erase(descriptor_set->GetSet());
454}
455
456// Free all DS Pools including their Sets & related sub-structs
457// NOTE : Calls to this function should be wrapped in mutex
458void ValidationStateTracker::DeleteDescriptorSetPools() {
459 for (auto ii = descriptorPoolMap.begin(); ii != descriptorPoolMap.end();) {
460 // Remove this pools' sets from setMap and delete them
John Zulauf79f06582021-02-27 18:38:39 -0700461 for (auto *ds : ii->second->sets) {
locke-lunargd556cc32019-09-17 01:21:23 -0600462 FreeDescriptorSet(ds);
463 }
464 ii->second->sets.clear();
465 ii = descriptorPoolMap.erase(ii);
466 }
467}
468
469// For given object struct return a ptr of BASE_NODE type for its wrapping struct
470BASE_NODE *ValidationStateTracker::GetStateStructPtrFromObject(const VulkanTypedHandle &object_struct) {
Jeff Bolzadbfa852019-10-04 13:53:30 -0500471 if (object_struct.node) {
472#ifdef _DEBUG
473 // assert that lookup would find the same object
474 VulkanTypedHandle other = object_struct;
475 other.node = nullptr;
476 assert(object_struct.node == GetStateStructPtrFromObject(other));
477#endif
478 return object_struct.node;
479 }
locke-lunargd556cc32019-09-17 01:21:23 -0600480 BASE_NODE *base_ptr = nullptr;
481 switch (object_struct.type) {
482 case kVulkanObjectTypeDescriptorSet: {
483 base_ptr = GetSetNode(object_struct.Cast<VkDescriptorSet>());
484 break;
485 }
486 case kVulkanObjectTypeSampler: {
487 base_ptr = GetSamplerState(object_struct.Cast<VkSampler>());
488 break;
489 }
490 case kVulkanObjectTypeQueryPool: {
491 base_ptr = GetQueryPoolState(object_struct.Cast<VkQueryPool>());
492 break;
493 }
494 case kVulkanObjectTypePipeline: {
495 base_ptr = GetPipelineState(object_struct.Cast<VkPipeline>());
496 break;
497 }
498 case kVulkanObjectTypeBuffer: {
499 base_ptr = GetBufferState(object_struct.Cast<VkBuffer>());
500 break;
501 }
502 case kVulkanObjectTypeBufferView: {
503 base_ptr = GetBufferViewState(object_struct.Cast<VkBufferView>());
504 break;
505 }
506 case kVulkanObjectTypeImage: {
507 base_ptr = GetImageState(object_struct.Cast<VkImage>());
508 break;
509 }
510 case kVulkanObjectTypeImageView: {
511 base_ptr = GetImageViewState(object_struct.Cast<VkImageView>());
512 break;
513 }
514 case kVulkanObjectTypeEvent: {
515 base_ptr = GetEventState(object_struct.Cast<VkEvent>());
516 break;
517 }
518 case kVulkanObjectTypeDescriptorPool: {
519 base_ptr = GetDescriptorPoolState(object_struct.Cast<VkDescriptorPool>());
520 break;
521 }
522 case kVulkanObjectTypeCommandPool: {
523 base_ptr = GetCommandPoolState(object_struct.Cast<VkCommandPool>());
524 break;
525 }
526 case kVulkanObjectTypeFramebuffer: {
527 base_ptr = GetFramebufferState(object_struct.Cast<VkFramebuffer>());
528 break;
529 }
530 case kVulkanObjectTypeRenderPass: {
531 base_ptr = GetRenderPassState(object_struct.Cast<VkRenderPass>());
532 break;
533 }
534 case kVulkanObjectTypeDeviceMemory: {
535 base_ptr = GetDevMemState(object_struct.Cast<VkDeviceMemory>());
536 break;
537 }
538 case kVulkanObjectTypeAccelerationStructureNV: {
sourav parmarcd5fb182020-07-17 12:58:44 -0700539 base_ptr = GetAccelerationStructureStateNV(object_struct.Cast<VkAccelerationStructureNV>());
540 break;
541 }
542 case kVulkanObjectTypeAccelerationStructureKHR: {
543 base_ptr = GetAccelerationStructureStateKHR(object_struct.Cast<VkAccelerationStructureKHR>());
locke-lunargd556cc32019-09-17 01:21:23 -0600544 break;
545 }
Jeff Bolzadbfa852019-10-04 13:53:30 -0500546 case kVulkanObjectTypeUnknown:
547 // This can happen if an element of the object_bindings vector has been
548 // zeroed out, after an object is destroyed.
549 break;
locke-lunargd556cc32019-09-17 01:21:23 -0600550 default:
551 // TODO : Any other objects to be handled here?
552 assert(0);
553 break;
554 }
555 return base_ptr;
556}
557
sfricke-samsungbf1a2ed2020-06-14 23:31:00 -0700558// Gets union of all features defined by Potential Format Features
559// except, does not handle the external format case for AHB as that only can be used for sampled images
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700560VkFormatFeatureFlags ValidationStateTracker::GetPotentialFormatFeatures(VkFormat format) const {
561 VkFormatFeatureFlags format_features = 0;
562
563 if (format != VK_FORMAT_UNDEFINED) {
564 VkFormatProperties format_properties;
565 DispatchGetPhysicalDeviceFormatProperties(physical_device, format, &format_properties);
566 format_features |= format_properties.linearTilingFeatures;
567 format_features |= format_properties.optimalTilingFeatures;
sfricke-samsung45996a42021-09-16 13:45:27 -0700568 if (IsExtEnabled(device_extensions.vk_ext_image_drm_format_modifier)) {
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700569 // VK_KHR_get_physical_device_properties2 is required in this case
570 VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2};
571 VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
572 nullptr};
573 format_properties_2.pNext = (void *)&drm_properties_list;
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100574
575 // First call is to get the number of modifiers compatible with the queried format
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700576 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
Marc Alcala Prieto773871c2021-02-04 19:24:43 +0100577
578 std::vector<VkDrmFormatModifierPropertiesEXT> drm_properties;
579 drm_properties.resize(drm_properties_list.drmFormatModifierCount);
580 drm_properties_list.pDrmFormatModifierProperties = drm_properties.data();
581
582 // Second call, now with an allocated array in pDrmFormatModifierProperties, is to get the modifiers
583 // compatible with the queried format
584 DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
585
sfricke-samsungbe3584f2020-04-22 14:58:06 -0700586 for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
587 format_features |= drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
588 }
589 }
590 }
591
592 return format_features;
593}
594
locke-lunargd556cc32019-09-17 01:21:23 -0600595void ValidationStateTracker::PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
596 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice,
597 VkResult result) {
598 if (VK_SUCCESS != result) return;
599
Locke Linf3873542021-04-26 11:25:10 -0600600 ValidationObject *device_object = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
601 ValidationObject *validation_data = GetValidationObject(device_object->object_dispatch, this->container_type);
602 ValidationStateTracker *state_tracker = static_cast<ValidationStateTracker *>(validation_data);
603
locke-lunargd556cc32019-09-17 01:21:23 -0600604 const VkPhysicalDeviceFeatures *enabled_features_found = pCreateInfo->pEnabledFeatures;
605 if (nullptr == enabled_features_found) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700606 const auto *features2 = LvlFindInChain<VkPhysicalDeviceFeatures2>(pCreateInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -0600607 if (features2) {
608 enabled_features_found = &(features2->features);
609 }
610 }
611
locke-lunargd556cc32019-09-17 01:21:23 -0600612 if (nullptr == enabled_features_found) {
613 state_tracker->enabled_features.core = {};
614 } else {
615 state_tracker->enabled_features.core = *enabled_features_found;
616 }
617
locke-lunargd556cc32019-09-17 01:21:23 -0600618 // Save local link to this device's physical device state
Jeremy Gebben383b9a32021-09-08 16:31:33 -0600619 state_tracker->physical_device_state = Get<PHYSICAL_DEVICE_STATE>(gpu);
locke-lunargd556cc32019-09-17 01:21:23 -0600620
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700621 const auto *vulkan_12_features = LvlFindInChain<VkPhysicalDeviceVulkan12Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700622 if (vulkan_12_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700623 state_tracker->enabled_features.core12 = *vulkan_12_features;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700624 } else {
sfricke-samsung27c70722020-05-02 08:42:39 -0700625 // Set Extension Feature Aliases to false as there is no struct to check
626 state_tracker->enabled_features.core12.drawIndirectCount = VK_FALSE;
627 state_tracker->enabled_features.core12.samplerMirrorClampToEdge = VK_FALSE;
628 state_tracker->enabled_features.core12.descriptorIndexing = VK_FALSE;
629 state_tracker->enabled_features.core12.samplerFilterMinmax = VK_FALSE;
630 state_tracker->enabled_features.core12.shaderOutputLayer = VK_FALSE;
631 state_tracker->enabled_features.core12.shaderOutputViewportIndex = VK_FALSE;
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800632 state_tracker->enabled_features.core12.subgroupBroadcastDynamicId = VK_FALSE;
sfricke-samsung27c70722020-05-02 08:42:39 -0700633
634 // These structs are only allowed in pNext chain if there is no VkPhysicalDeviceVulkan12Features
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700635
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700636 const auto *eight_bit_storage_features = LvlFindInChain<VkPhysicalDevice8BitStorageFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700637 if (eight_bit_storage_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700638 state_tracker->enabled_features.core12.storageBuffer8BitAccess = eight_bit_storage_features->storageBuffer8BitAccess;
639 state_tracker->enabled_features.core12.uniformAndStorageBuffer8BitAccess =
640 eight_bit_storage_features->uniformAndStorageBuffer8BitAccess;
641 state_tracker->enabled_features.core12.storagePushConstant8 = eight_bit_storage_features->storagePushConstant8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700642 }
643
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700644 const auto *float16_int8_features = LvlFindInChain<VkPhysicalDeviceShaderFloat16Int8Features>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700645 if (float16_int8_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700646 state_tracker->enabled_features.core12.shaderFloat16 = float16_int8_features->shaderFloat16;
647 state_tracker->enabled_features.core12.shaderInt8 = float16_int8_features->shaderInt8;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700648 }
649
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700650 const auto *descriptor_indexing_features = LvlFindInChain<VkPhysicalDeviceDescriptorIndexingFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700651 if (descriptor_indexing_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700652 state_tracker->enabled_features.core12.shaderInputAttachmentArrayDynamicIndexing =
653 descriptor_indexing_features->shaderInputAttachmentArrayDynamicIndexing;
654 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayDynamicIndexing =
655 descriptor_indexing_features->shaderUniformTexelBufferArrayDynamicIndexing;
656 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayDynamicIndexing =
657 descriptor_indexing_features->shaderStorageTexelBufferArrayDynamicIndexing;
658 state_tracker->enabled_features.core12.shaderUniformBufferArrayNonUniformIndexing =
659 descriptor_indexing_features->shaderUniformBufferArrayNonUniformIndexing;
660 state_tracker->enabled_features.core12.shaderSampledImageArrayNonUniformIndexing =
661 descriptor_indexing_features->shaderSampledImageArrayNonUniformIndexing;
662 state_tracker->enabled_features.core12.shaderStorageBufferArrayNonUniformIndexing =
663 descriptor_indexing_features->shaderStorageBufferArrayNonUniformIndexing;
664 state_tracker->enabled_features.core12.shaderStorageImageArrayNonUniformIndexing =
665 descriptor_indexing_features->shaderStorageImageArrayNonUniformIndexing;
666 state_tracker->enabled_features.core12.shaderInputAttachmentArrayNonUniformIndexing =
667 descriptor_indexing_features->shaderInputAttachmentArrayNonUniformIndexing;
668 state_tracker->enabled_features.core12.shaderUniformTexelBufferArrayNonUniformIndexing =
669 descriptor_indexing_features->shaderUniformTexelBufferArrayNonUniformIndexing;
670 state_tracker->enabled_features.core12.shaderStorageTexelBufferArrayNonUniformIndexing =
671 descriptor_indexing_features->shaderStorageTexelBufferArrayNonUniformIndexing;
672 state_tracker->enabled_features.core12.descriptorBindingUniformBufferUpdateAfterBind =
673 descriptor_indexing_features->descriptorBindingUniformBufferUpdateAfterBind;
674 state_tracker->enabled_features.core12.descriptorBindingSampledImageUpdateAfterBind =
675 descriptor_indexing_features->descriptorBindingSampledImageUpdateAfterBind;
676 state_tracker->enabled_features.core12.descriptorBindingStorageImageUpdateAfterBind =
677 descriptor_indexing_features->descriptorBindingStorageImageUpdateAfterBind;
678 state_tracker->enabled_features.core12.descriptorBindingStorageBufferUpdateAfterBind =
679 descriptor_indexing_features->descriptorBindingStorageBufferUpdateAfterBind;
680 state_tracker->enabled_features.core12.descriptorBindingUniformTexelBufferUpdateAfterBind =
681 descriptor_indexing_features->descriptorBindingUniformTexelBufferUpdateAfterBind;
682 state_tracker->enabled_features.core12.descriptorBindingStorageTexelBufferUpdateAfterBind =
683 descriptor_indexing_features->descriptorBindingStorageTexelBufferUpdateAfterBind;
684 state_tracker->enabled_features.core12.descriptorBindingUpdateUnusedWhilePending =
685 descriptor_indexing_features->descriptorBindingUpdateUnusedWhilePending;
686 state_tracker->enabled_features.core12.descriptorBindingPartiallyBound =
687 descriptor_indexing_features->descriptorBindingPartiallyBound;
688 state_tracker->enabled_features.core12.descriptorBindingVariableDescriptorCount =
689 descriptor_indexing_features->descriptorBindingVariableDescriptorCount;
690 state_tracker->enabled_features.core12.runtimeDescriptorArray = descriptor_indexing_features->runtimeDescriptorArray;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700691 }
692
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700693 const auto *scalar_block_layout_features = LvlFindInChain<VkPhysicalDeviceScalarBlockLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700694 if (scalar_block_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700695 state_tracker->enabled_features.core12.scalarBlockLayout = scalar_block_layout_features->scalarBlockLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700696 }
697
698 const auto *imageless_framebuffer_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700699 LvlFindInChain<VkPhysicalDeviceImagelessFramebufferFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700700 if (imageless_framebuffer_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700701 state_tracker->enabled_features.core12.imagelessFramebuffer = imageless_framebuffer_features->imagelessFramebuffer;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700702 }
703
704 const auto *uniform_buffer_standard_layout_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700705 LvlFindInChain<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700706 if (uniform_buffer_standard_layout_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700707 state_tracker->enabled_features.core12.uniformBufferStandardLayout =
708 uniform_buffer_standard_layout_features->uniformBufferStandardLayout;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700709 }
710
711 const auto *subgroup_extended_types_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700712 LvlFindInChain<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700713 if (subgroup_extended_types_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700714 state_tracker->enabled_features.core12.shaderSubgroupExtendedTypes =
715 subgroup_extended_types_features->shaderSubgroupExtendedTypes;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700716 }
717
718 const auto *separate_depth_stencil_layouts_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700719 LvlFindInChain<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700720 if (separate_depth_stencil_layouts_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700721 state_tracker->enabled_features.core12.separateDepthStencilLayouts =
722 separate_depth_stencil_layouts_features->separateDepthStencilLayouts;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700723 }
724
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700725 const auto *host_query_reset_features = LvlFindInChain<VkPhysicalDeviceHostQueryResetFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700726 if (host_query_reset_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700727 state_tracker->enabled_features.core12.hostQueryReset = host_query_reset_features->hostQueryReset;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700728 }
729
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700730 const auto *timeline_semaphore_features = LvlFindInChain<VkPhysicalDeviceTimelineSemaphoreFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700731 if (timeline_semaphore_features) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700732 state_tracker->enabled_features.core12.timelineSemaphore = timeline_semaphore_features->timelineSemaphore;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700733 }
734
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700735 const auto *buffer_device_address = LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeatures>(pCreateInfo->pNext);
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700736 if (buffer_device_address) {
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700737 state_tracker->enabled_features.core12.bufferDeviceAddress = buffer_device_address->bufferDeviceAddress;
738 state_tracker->enabled_features.core12.bufferDeviceAddressCaptureReplay =
739 buffer_device_address->bufferDeviceAddressCaptureReplay;
740 state_tracker->enabled_features.core12.bufferDeviceAddressMultiDevice =
741 buffer_device_address->bufferDeviceAddressMultiDevice;
742 }
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800743
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700744 const auto *atomic_int64_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicInt64Features>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800745 if (atomic_int64_features) {
746 state_tracker->enabled_features.core12.shaderBufferInt64Atomics = atomic_int64_features->shaderBufferInt64Atomics;
747 state_tracker->enabled_features.core12.shaderSharedInt64Atomics = atomic_int64_features->shaderSharedInt64Atomics;
748 }
749
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700750 const auto *memory_model_features = LvlFindInChain<VkPhysicalDeviceVulkanMemoryModelFeatures>(pCreateInfo->pNext);
sfricke-samsunga4143ac2020-12-18 00:00:53 -0800751 if (memory_model_features) {
752 state_tracker->enabled_features.core12.vulkanMemoryModel = memory_model_features->vulkanMemoryModel;
753 state_tracker->enabled_features.core12.vulkanMemoryModelDeviceScope =
754 memory_model_features->vulkanMemoryModelDeviceScope;
755 state_tracker->enabled_features.core12.vulkanMemoryModelAvailabilityVisibilityChains =
756 memory_model_features->vulkanMemoryModelAvailabilityVisibilityChains;
757 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700758 }
759
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700760 const auto *vulkan_11_features = LvlFindInChain<VkPhysicalDeviceVulkan11Features>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700761 if (vulkan_11_features) {
762 state_tracker->enabled_features.core11 = *vulkan_11_features;
763 } else {
sfricke-samsung828e59d2021-08-22 23:20:49 -0700764 // These structs are only allowed in pNext chain if there is no vkPhysicalDeviceVulkan11Features
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700765
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700766 const auto *sixteen_bit_storage_features = LvlFindInChain<VkPhysicalDevice16BitStorageFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700767 if (sixteen_bit_storage_features) {
768 state_tracker->enabled_features.core11.storageBuffer16BitAccess =
769 sixteen_bit_storage_features->storageBuffer16BitAccess;
770 state_tracker->enabled_features.core11.uniformAndStorageBuffer16BitAccess =
771 sixteen_bit_storage_features->uniformAndStorageBuffer16BitAccess;
772 state_tracker->enabled_features.core11.storagePushConstant16 = sixteen_bit_storage_features->storagePushConstant16;
773 state_tracker->enabled_features.core11.storageInputOutput16 = sixteen_bit_storage_features->storageInputOutput16;
774 }
775
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700776 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700777 if (multiview_features) {
778 state_tracker->enabled_features.core11.multiview = multiview_features->multiview;
779 state_tracker->enabled_features.core11.multiviewGeometryShader = multiview_features->multiviewGeometryShader;
780 state_tracker->enabled_features.core11.multiviewTessellationShader = multiview_features->multiviewTessellationShader;
781 }
782
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700783 const auto *variable_pointers_features = LvlFindInChain<VkPhysicalDeviceVariablePointersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700784 if (variable_pointers_features) {
785 state_tracker->enabled_features.core11.variablePointersStorageBuffer =
786 variable_pointers_features->variablePointersStorageBuffer;
787 state_tracker->enabled_features.core11.variablePointers = variable_pointers_features->variablePointers;
788 }
789
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700790 const auto *protected_memory_features = LvlFindInChain<VkPhysicalDeviceProtectedMemoryFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700791 if (protected_memory_features) {
792 state_tracker->enabled_features.core11.protectedMemory = protected_memory_features->protectedMemory;
793 }
794
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700795 const auto *ycbcr_conversion_features = LvlFindInChain<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700796 if (ycbcr_conversion_features) {
797 state_tracker->enabled_features.core11.samplerYcbcrConversion = ycbcr_conversion_features->samplerYcbcrConversion;
798 }
799
800 const auto *shader_draw_parameters_features =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700801 LvlFindInChain<VkPhysicalDeviceShaderDrawParametersFeatures>(pCreateInfo->pNext);
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700802 if (shader_draw_parameters_features) {
803 state_tracker->enabled_features.core11.shaderDrawParameters = shader_draw_parameters_features->shaderDrawParameters;
Tony-LunarGb036c2f2019-12-05 14:38:25 -0700804 }
805 }
806
Mark Lobodzinski1f887d32020-12-30 15:31:33 -0700807 const auto *device_group_ci = LvlFindInChain<VkDeviceGroupDeviceCreateInfo>(pCreateInfo->pNext);
Tony-LunarGca4891a2020-08-10 15:46:46 -0600808 if (device_group_ci) {
809 state_tracker->physical_device_count = device_group_ci->physicalDeviceCount;
810 state_tracker->device_group_create_info = *device_group_ci;
811 } else {
812 state_tracker->physical_device_count = 1;
813 }
locke-lunargd556cc32019-09-17 01:21:23 -0600814
sfricke-samsung828e59d2021-08-22 23:20:49 -0700815 // Features from other extensions passesd in create info
816 {
817 const auto *exclusive_scissor_features = LvlFindInChain<VkPhysicalDeviceExclusiveScissorFeaturesNV>(pCreateInfo->pNext);
818 if (exclusive_scissor_features) {
819 state_tracker->enabled_features.exclusive_scissor_features = *exclusive_scissor_features;
820 }
locke-lunargd556cc32019-09-17 01:21:23 -0600821
sfricke-samsung828e59d2021-08-22 23:20:49 -0700822 const auto *shading_rate_image_features = LvlFindInChain<VkPhysicalDeviceShadingRateImageFeaturesNV>(pCreateInfo->pNext);
823 if (shading_rate_image_features) {
824 state_tracker->enabled_features.shading_rate_image_features = *shading_rate_image_features;
825 }
locke-lunargd556cc32019-09-17 01:21:23 -0600826
sfricke-samsung828e59d2021-08-22 23:20:49 -0700827 const auto *mesh_shader_features = LvlFindInChain<VkPhysicalDeviceMeshShaderFeaturesNV>(pCreateInfo->pNext);
828 if (mesh_shader_features) {
829 state_tracker->enabled_features.mesh_shader_features = *mesh_shader_features;
830 }
locke-lunargd556cc32019-09-17 01:21:23 -0600831
sfricke-samsung828e59d2021-08-22 23:20:49 -0700832 const auto *inline_uniform_block_features =
833 LvlFindInChain<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(pCreateInfo->pNext);
834 if (inline_uniform_block_features) {
835 state_tracker->enabled_features.inline_uniform_block_features = *inline_uniform_block_features;
836 }
locke-lunargd556cc32019-09-17 01:21:23 -0600837
sfricke-samsung828e59d2021-08-22 23:20:49 -0700838 const auto *transform_feedback_features = LvlFindInChain<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(pCreateInfo->pNext);
839 if (transform_feedback_features) {
840 state_tracker->enabled_features.transform_feedback_features = *transform_feedback_features;
841 }
locke-lunargd556cc32019-09-17 01:21:23 -0600842
sfricke-samsung828e59d2021-08-22 23:20:49 -0700843 const auto *vtx_attrib_div_features = LvlFindInChain<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(pCreateInfo->pNext);
844 if (vtx_attrib_div_features) {
845 state_tracker->enabled_features.vtx_attrib_divisor_features = *vtx_attrib_div_features;
846 }
Piers Daniell41b8c5d2020-01-10 15:42:00 -0700847
sfricke-samsung828e59d2021-08-22 23:20:49 -0700848 const auto *buffer_device_address_ext_features =
849 LvlFindInChain<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(pCreateInfo->pNext);
850 if (buffer_device_address_ext_features) {
851 state_tracker->enabled_features.buffer_device_address_ext_features = *buffer_device_address_ext_features;
852 }
locke-lunargd556cc32019-09-17 01:21:23 -0600853
sfricke-samsung828e59d2021-08-22 23:20:49 -0700854 const auto *cooperative_matrix_features = LvlFindInChain<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(pCreateInfo->pNext);
855 if (cooperative_matrix_features) {
856 state_tracker->enabled_features.cooperative_matrix_features = *cooperative_matrix_features;
857 }
locke-lunargd556cc32019-09-17 01:21:23 -0600858
sfricke-samsung828e59d2021-08-22 23:20:49 -0700859 const auto *compute_shader_derivatives_features =
860 LvlFindInChain<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(pCreateInfo->pNext);
861 if (compute_shader_derivatives_features) {
862 state_tracker->enabled_features.compute_shader_derivatives_features = *compute_shader_derivatives_features;
863 }
locke-lunargd556cc32019-09-17 01:21:23 -0600864
sfricke-samsung828e59d2021-08-22 23:20:49 -0700865 const auto *fragment_shader_barycentric_features =
866 LvlFindInChain<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(pCreateInfo->pNext);
867 if (fragment_shader_barycentric_features) {
868 state_tracker->enabled_features.fragment_shader_barycentric_features = *fragment_shader_barycentric_features;
869 }
locke-lunargd556cc32019-09-17 01:21:23 -0600870
sfricke-samsung828e59d2021-08-22 23:20:49 -0700871 const auto *shader_image_footprint_features =
872 LvlFindInChain<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(pCreateInfo->pNext);
873 if (shader_image_footprint_features) {
874 state_tracker->enabled_features.shader_image_footprint_features = *shader_image_footprint_features;
875 }
locke-lunargd556cc32019-09-17 01:21:23 -0600876
sfricke-samsung828e59d2021-08-22 23:20:49 -0700877 const auto *fragment_shader_interlock_features =
878 LvlFindInChain<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(pCreateInfo->pNext);
879 if (fragment_shader_interlock_features) {
880 state_tracker->enabled_features.fragment_shader_interlock_features = *fragment_shader_interlock_features;
881 }
locke-lunargd556cc32019-09-17 01:21:23 -0600882
sfricke-samsung828e59d2021-08-22 23:20:49 -0700883 const auto *demote_to_helper_invocation_features =
884 LvlFindInChain<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>(pCreateInfo->pNext);
885 if (demote_to_helper_invocation_features) {
886 state_tracker->enabled_features.demote_to_helper_invocation_features = *demote_to_helper_invocation_features;
887 }
locke-lunargd556cc32019-09-17 01:21:23 -0600888
sfricke-samsung828e59d2021-08-22 23:20:49 -0700889 const auto *texel_buffer_alignment_features =
890 LvlFindInChain<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(pCreateInfo->pNext);
891 if (texel_buffer_alignment_features) {
892 state_tracker->enabled_features.texel_buffer_alignment_features = *texel_buffer_alignment_features;
893 }
locke-lunargd556cc32019-09-17 01:21:23 -0600894
sfricke-samsung828e59d2021-08-22 23:20:49 -0700895 const auto *pipeline_exe_props_features =
896 LvlFindInChain<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(pCreateInfo->pNext);
897 if (pipeline_exe_props_features) {
898 state_tracker->enabled_features.pipeline_exe_props_features = *pipeline_exe_props_features;
899 }
locke-lunargd556cc32019-09-17 01:21:23 -0600900
sfricke-samsung828e59d2021-08-22 23:20:49 -0700901 const auto *dedicated_allocation_image_aliasing_features =
902 LvlFindInChain<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(pCreateInfo->pNext);
903 if (dedicated_allocation_image_aliasing_features) {
904 state_tracker->enabled_features.dedicated_allocation_image_aliasing_features =
905 *dedicated_allocation_image_aliasing_features;
906 }
Jeff Bolz82f854d2019-09-17 14:56:47 -0500907
sfricke-samsung828e59d2021-08-22 23:20:49 -0700908 const auto *performance_query_features = LvlFindInChain<VkPhysicalDevicePerformanceQueryFeaturesKHR>(pCreateInfo->pNext);
909 if (performance_query_features) {
910 state_tracker->enabled_features.performance_query_features = *performance_query_features;
911 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +0100912
sfricke-samsung828e59d2021-08-22 23:20:49 -0700913 const auto *device_coherent_memory_features = LvlFindInChain<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(pCreateInfo->pNext);
914 if (device_coherent_memory_features) {
915 state_tracker->enabled_features.device_coherent_memory_features = *device_coherent_memory_features;
916 }
Tobias Hector782bcde2019-11-28 16:19:42 +0000917
sfricke-samsung828e59d2021-08-22 23:20:49 -0700918 const auto *ycbcr_image_array_features = LvlFindInChain<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(pCreateInfo->pNext);
919 if (ycbcr_image_array_features) {
920 state_tracker->enabled_features.ycbcr_image_array_features = *ycbcr_image_array_features;
921 }
sfricke-samsungcead0802020-01-30 22:20:10 -0800922
sfricke-samsung828e59d2021-08-22 23:20:49 -0700923 const auto *ray_query_features = LvlFindInChain<VkPhysicalDeviceRayQueryFeaturesKHR>(pCreateInfo->pNext);
924 if (ray_query_features) {
925 state_tracker->enabled_features.ray_query_features = *ray_query_features;
926 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700927
sfricke-samsung828e59d2021-08-22 23:20:49 -0700928 const auto *ray_tracing_pipeline_features =
929 LvlFindInChain<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>(pCreateInfo->pNext);
930 if (ray_tracing_pipeline_features) {
931 state_tracker->enabled_features.ray_tracing_pipeline_features = *ray_tracing_pipeline_features;
932 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700933
sfricke-samsung828e59d2021-08-22 23:20:49 -0700934 const auto *ray_tracing_acceleration_structure_features =
935 LvlFindInChain<VkPhysicalDeviceAccelerationStructureFeaturesKHR>(pCreateInfo->pNext);
936 if (ray_tracing_acceleration_structure_features) {
937 state_tracker->enabled_features.ray_tracing_acceleration_structure_features =
938 *ray_tracing_acceleration_structure_features;
939 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500940
sfricke-samsung828e59d2021-08-22 23:20:49 -0700941 const auto *robustness2_features = LvlFindInChain<VkPhysicalDeviceRobustness2FeaturesEXT>(pCreateInfo->pNext);
942 if (robustness2_features) {
943 state_tracker->enabled_features.robustness2_features = *robustness2_features;
944 }
Jeff Bolz165818a2020-05-08 11:19:03 -0500945
sfricke-samsung828e59d2021-08-22 23:20:49 -0700946 const auto *fragment_density_map_features =
947 LvlFindInChain<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(pCreateInfo->pNext);
948 if (fragment_density_map_features) {
949 state_tracker->enabled_features.fragment_density_map_features = *fragment_density_map_features;
950 }
janharaldfredriksen-arm3b793772020-05-12 18:55:53 +0200951
sfricke-samsung828e59d2021-08-22 23:20:49 -0700952 const auto *fragment_density_map_features2 =
953 LvlFindInChain<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(pCreateInfo->pNext);
954 if (fragment_density_map_features2) {
955 state_tracker->enabled_features.fragment_density_map2_features = *fragment_density_map_features2;
956 }
janharaldfredriksen-arm36e17572020-07-07 13:59:28 +0200957
sfricke-samsung828e59d2021-08-22 23:20:49 -0700958 const auto *astc_decode_features = LvlFindInChain<VkPhysicalDeviceASTCDecodeFeaturesEXT>(pCreateInfo->pNext);
959 if (astc_decode_features) {
960 state_tracker->enabled_features.astc_decode_features = *astc_decode_features;
961 }
sfricke-samsung0c4a06f2020-06-27 01:24:32 -0700962
sfricke-samsung828e59d2021-08-22 23:20:49 -0700963 const auto *custom_border_color_features = LvlFindInChain<VkPhysicalDeviceCustomBorderColorFeaturesEXT>(pCreateInfo->pNext);
964 if (custom_border_color_features) {
965 state_tracker->enabled_features.custom_border_color_features = *custom_border_color_features;
966 }
Tony-LunarG7337b312020-04-15 16:40:25 -0600967
sfricke-samsung828e59d2021-08-22 23:20:49 -0700968 const auto *pipeline_creation_cache_control_features =
969 LvlFindInChain<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>(pCreateInfo->pNext);
970 if (pipeline_creation_cache_control_features) {
971 state_tracker->enabled_features.pipeline_creation_cache_control_features = *pipeline_creation_cache_control_features;
972 }
sfricke-samsungfd661d62020-05-16 00:57:27 -0700973
sfricke-samsung828e59d2021-08-22 23:20:49 -0700974 const auto *fragment_shading_rate_features =
975 LvlFindInChain<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(pCreateInfo->pNext);
976 if (fragment_shading_rate_features) {
977 state_tracker->enabled_features.fragment_shading_rate_features = *fragment_shading_rate_features;
978 }
Tobias Hector6663c9b2020-11-05 10:18:02 +0000979
sfricke-samsung828e59d2021-08-22 23:20:49 -0700980 const auto *extended_dynamic_state_features =
981 LvlFindInChain<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(pCreateInfo->pNext);
982 if (extended_dynamic_state_features) {
983 state_tracker->enabled_features.extended_dynamic_state_features = *extended_dynamic_state_features;
984 }
Piers Daniell39842ee2020-07-10 16:42:33 -0600985
sfricke-samsung828e59d2021-08-22 23:20:49 -0700986 const auto *extended_dynamic_state2_features =
987 LvlFindInChain<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>(pCreateInfo->pNext);
988 if (extended_dynamic_state2_features) {
989 state_tracker->enabled_features.extended_dynamic_state2_features = *extended_dynamic_state2_features;
990 }
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -0700991
sfricke-samsung828e59d2021-08-22 23:20:49 -0700992 const auto *multiview_features = LvlFindInChain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
993 if (multiview_features) {
994 state_tracker->enabled_features.multiview_features = *multiview_features;
995 }
locke-lunarg3fa463a2020-10-23 16:39:04 -0600996
sfricke-samsung828e59d2021-08-22 23:20:49 -0700997 const auto *portability_features = LvlFindInChain<VkPhysicalDevicePortabilitySubsetFeaturesKHR>(pCreateInfo->pNext);
998 if (portability_features) {
999 state_tracker->enabled_features.portability_subset_features = *portability_features;
1000 }
Nathaniel Cesariob3f2d702020-11-09 09:20:49 -07001001
sfricke-samsung828e59d2021-08-22 23:20:49 -07001002 const auto *shader_integer_functions2_features =
1003 LvlFindInChain<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(pCreateInfo->pNext);
1004 if (shader_integer_functions2_features) {
1005 state_tracker->enabled_features.shader_integer_functions2_features = *shader_integer_functions2_features;
1006 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001007
sfricke-samsung828e59d2021-08-22 23:20:49 -07001008 const auto *shader_sm_builtins_features = LvlFindInChain<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>(pCreateInfo->pNext);
1009 if (shader_sm_builtins_features) {
1010 state_tracker->enabled_features.shader_sm_builtins_features = *shader_sm_builtins_features;
1011 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001012
sfricke-samsung828e59d2021-08-22 23:20:49 -07001013 const auto *shader_atomic_float_features = LvlFindInChain<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>(pCreateInfo->pNext);
1014 if (shader_atomic_float_features) {
1015 state_tracker->enabled_features.shader_atomic_float_features = *shader_atomic_float_features;
1016 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001017
sfricke-samsung828e59d2021-08-22 23:20:49 -07001018 const auto *shader_image_atomic_int64_features =
1019 LvlFindInChain<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>(pCreateInfo->pNext);
1020 if (shader_image_atomic_int64_features) {
1021 state_tracker->enabled_features.shader_image_atomic_int64_features = *shader_image_atomic_int64_features;
1022 }
sfricke-samsung0065ce02020-12-03 22:46:37 -08001023
sfricke-samsung828e59d2021-08-22 23:20:49 -07001024 const auto *shader_clock_features = LvlFindInChain<VkPhysicalDeviceShaderClockFeaturesKHR>(pCreateInfo->pNext);
1025 if (shader_clock_features) {
1026 state_tracker->enabled_features.shader_clock_features = *shader_clock_features;
1027 }
sfricke-samsung486a51e2021-01-02 00:10:15 -08001028
sfricke-samsung828e59d2021-08-22 23:20:49 -07001029 const auto *conditional_rendering_features =
1030 LvlFindInChain<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(pCreateInfo->pNext);
1031 if (conditional_rendering_features) {
1032 state_tracker->enabled_features.conditional_rendering_features = *conditional_rendering_features;
1033 }
Jeremy Gebben5f585ae2021-02-02 09:03:06 -07001034
sfricke-samsung828e59d2021-08-22 23:20:49 -07001035 const auto *workgroup_memory_explicit_layout_features =
1036 LvlFindInChain<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>(pCreateInfo->pNext);
1037 if (workgroup_memory_explicit_layout_features) {
1038 state_tracker->enabled_features.workgroup_memory_explicit_layout_features = *workgroup_memory_explicit_layout_features;
1039 }
Shannon McPhersondb287d42021-02-02 15:27:32 -07001040
sfricke-samsung828e59d2021-08-22 23:20:49 -07001041 const auto *synchronization2_features = LvlFindInChain<VkPhysicalDeviceSynchronization2FeaturesKHR>(pCreateInfo->pNext);
1042 if (synchronization2_features) {
1043 state_tracker->enabled_features.synchronization2_features = *synchronization2_features;
1044 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001045
sfricke-samsung828e59d2021-08-22 23:20:49 -07001046 const auto *provoking_vertex_features = lvl_find_in_chain<VkPhysicalDeviceProvokingVertexFeaturesEXT>(pCreateInfo->pNext);
1047 if (provoking_vertex_features) {
1048 state_tracker->enabled_features.provoking_vertex_features = *provoking_vertex_features;
1049 }
Locke Linf3873542021-04-26 11:25:10 -06001050
sfricke-samsung828e59d2021-08-22 23:20:49 -07001051 const auto *vertex_input_dynamic_state_features =
1052 LvlFindInChain<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>(pCreateInfo->pNext);
1053 if (vertex_input_dynamic_state_features) {
1054 state_tracker->enabled_features.vertex_input_dynamic_state_features = *vertex_input_dynamic_state_features;
1055 }
Piers Daniellcb6d8032021-04-19 18:51:26 -06001056
sfricke-samsung828e59d2021-08-22 23:20:49 -07001057 const auto *inherited_viewport_scissor_features =
1058 LvlFindInChain<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(pCreateInfo->pNext);
1059 if (inherited_viewport_scissor_features) {
1060 state_tracker->enabled_features.inherited_viewport_scissor_features = *inherited_viewport_scissor_features;
1061 }
David Zhao Akeley44139b12021-04-26 16:16:13 -07001062
sfricke-samsung828e59d2021-08-22 23:20:49 -07001063 const auto *multi_draw_features = LvlFindInChain<VkPhysicalDeviceMultiDrawFeaturesEXT>(pCreateInfo->pNext);
1064 if (multi_draw_features) {
1065 state_tracker->enabled_features.multi_draw_features = *multi_draw_features;
1066 }
Tony-LunarG4490de42021-06-21 15:49:19 -06001067
sfricke-samsung828e59d2021-08-22 23:20:49 -07001068 const auto *color_write_features = LvlFindInChain<VkPhysicalDeviceColorWriteEnableFeaturesEXT>(pCreateInfo->pNext);
1069 if (color_write_features) {
1070 state_tracker->enabled_features.color_write_features = *color_write_features;
1071 }
ziga-lunarg29ba2b92021-07-20 21:51:45 +02001072
sfricke-samsung828e59d2021-08-22 23:20:49 -07001073 const auto *shader_atomic_float2_features =
1074 LvlFindInChain<VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT>(pCreateInfo->pNext);
1075 if (shader_atomic_float2_features) {
1076 state_tracker->enabled_features.shader_atomic_float2_features = *shader_atomic_float2_features;
1077 }
Mike Schuchardtb3870ea2021-07-20 18:56:51 -07001078
sfricke-samsung828e59d2021-08-22 23:20:49 -07001079 const auto *present_id_features = LvlFindInChain<VkPhysicalDevicePresentIdFeaturesKHR>(pCreateInfo->pNext);
1080 if (present_id_features) {
1081 state_tracker->enabled_features.present_id_features = *present_id_features;
1082 }
Tony-LunarG6f887e52021-07-27 11:23:14 -06001083
sfricke-samsung828e59d2021-08-22 23:20:49 -07001084 const auto *present_wait_features = LvlFindInChain<VkPhysicalDevicePresentWaitFeaturesKHR>(pCreateInfo->pNext);
1085 if (present_wait_features) {
1086 state_tracker->enabled_features.present_wait_features = *present_wait_features;
1087 }
Mike Schuchardt9f65d3f2021-08-25 15:11:39 -07001088
1089 const auto *ray_tracing_motion_blur_features =
1090 LvlFindInChain<VkPhysicalDeviceRayTracingMotionBlurFeaturesNV>(pCreateInfo->pNext);
1091 if (ray_tracing_motion_blur_features) {
1092 state_tracker->enabled_features.ray_tracing_motion_blur_features = *ray_tracing_motion_blur_features;
1093 }
Mike Schuchardtb4d90452021-08-30 09:24:51 -07001094
1095 const auto *shader_integer_dot_product_features =
1096 LvlFindInChain<VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR>(pCreateInfo->pNext);
1097 if (shader_integer_dot_product_features) {
1098 state_tracker->enabled_features.shader_integer_dot_product_features = *shader_integer_dot_product_features;
1099 }
Tony-LunarG0b0d8be2021-08-30 13:50:38 -06001100
1101 const auto *primitive_topology_list_restart_features =
1102 LvlFindInChain<VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT>(pCreateInfo->pNext);
1103 if (primitive_topology_list_restart_features) {
1104 state_tracker->enabled_features.primitive_topology_list_restart_features = *primitive_topology_list_restart_features;
1105 }
sfricke-samsung10b35ce2021-09-29 08:50:20 -07001106
1107 const auto *rgba10x6_formats_features = LvlFindInChain<VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT>(pCreateInfo->pNext);
1108 if (rgba10x6_formats_features) {
1109 state_tracker->enabled_features.rgba10x6_formats_features = *rgba10x6_formats_features;
1110 }
sfricke-samsungd3c917b2021-10-19 08:24:57 -07001111
1112 const auto *maintenance4_features = LvlFindInChain<VkPhysicalDeviceMaintenance4FeaturesKHR>(pCreateInfo->pNext);
1113 if (maintenance4_features) {
1114 state_tracker->enabled_features.maintenance4_features = *maintenance4_features;
1115 }
Tony-LunarG6f887e52021-07-27 11:23:14 -06001116 }
1117
ziga-lunarg73163742021-08-25 13:15:29 +02001118 const auto *subgroup_size_control_features = LvlFindInChain<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>(pCreateInfo->pNext);
1119 if (subgroup_size_control_features) {
1120 state_tracker->enabled_features.subgroup_size_control_features = *subgroup_size_control_features;
1121 }
1122
locke-lunargd556cc32019-09-17 01:21:23 -06001123 // Store physical device properties and physical device mem limits into CoreChecks structs
1124 DispatchGetPhysicalDeviceMemoryProperties(gpu, &state_tracker->phys_dev_mem_props);
1125 DispatchGetPhysicalDeviceProperties(gpu, &state_tracker->phys_dev_props);
1126
1127 const auto &dev_ext = state_tracker->device_extensions;
1128 auto *phys_dev_props = &state_tracker->phys_dev_ext_props;
1129
sfricke-samsung828e59d2021-08-22 23:20:49 -07001130 // Vulkan 1.2 can get properties from single struct, otherwise need to add to it per extension
sfricke-samsung45996a42021-09-16 13:45:27 -07001131 if (dev_ext.vk_feature_version_1_2) {
1132 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core11);
1133 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_feature_version_1_2, &state_tracker->phys_dev_props_core12);
sfricke-samsung828e59d2021-08-22 23:20:49 -07001134 } else {
1135 // VkPhysicalDeviceVulkan11Properties
1136 //
1137 // Can ingnore VkPhysicalDeviceIDProperties as it has no validation purpose
1138
1139 if (dev_ext.vk_khr_multiview) {
1140 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
1141 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &multiview_props);
1142 state_tracker->phys_dev_props_core11.maxMultiviewViewCount = multiview_props.maxMultiviewViewCount;
1143 state_tracker->phys_dev_props_core11.maxMultiviewInstanceIndex = multiview_props.maxMultiviewInstanceIndex;
1144 }
1145
1146 if (dev_ext.vk_khr_maintenance3) {
1147 auto maintenance3_props = LvlInitStruct<VkPhysicalDeviceMaintenance3Properties>();
1148 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_maintenance3, &maintenance3_props);
1149 state_tracker->phys_dev_props_core11.maxPerSetDescriptors = maintenance3_props.maxPerSetDescriptors;
1150 state_tracker->phys_dev_props_core11.maxMemoryAllocationSize = maintenance3_props.maxMemoryAllocationSize;
1151 }
1152
1153 // Some 1.1 properties were added to core without previous extensions
1154 if (state_tracker->api_version >= VK_API_VERSION_1_1) {
1155 auto subgroup_prop = LvlInitStruct<VkPhysicalDeviceSubgroupProperties>();
1156 auto protected_memory_prop = LvlInitStruct<VkPhysicalDeviceProtectedMemoryProperties>(&subgroup_prop);
1157 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&protected_memory_prop);
1158 instance_dispatch_table.GetPhysicalDeviceProperties2(gpu, &prop2);
1159
1160 state_tracker->phys_dev_props_core11.subgroupSize = subgroup_prop.subgroupSize;
1161 state_tracker->phys_dev_props_core11.subgroupSupportedStages = subgroup_prop.supportedStages;
1162 state_tracker->phys_dev_props_core11.subgroupSupportedOperations = subgroup_prop.supportedOperations;
1163 state_tracker->phys_dev_props_core11.subgroupQuadOperationsInAllStages = subgroup_prop.quadOperationsInAllStages;
1164
1165 state_tracker->phys_dev_props_core11.protectedNoFault = protected_memory_prop.protectedNoFault;
1166 }
1167
1168 // VkPhysicalDeviceVulkan12Properties
1169 //
1170 // Can ingnore VkPhysicalDeviceDriverProperties as it has no validation purpose
1171
1172 if (dev_ext.vk_ext_descriptor_indexing) {
1173 auto descriptor_indexing_prop = LvlInitStruct<VkPhysicalDeviceDescriptorIndexingProperties>();
1174 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_descriptor_indexing, &descriptor_indexing_prop);
1175 state_tracker->phys_dev_props_core12.maxUpdateAfterBindDescriptorsInAllPools =
1176 descriptor_indexing_prop.maxUpdateAfterBindDescriptorsInAllPools;
1177 state_tracker->phys_dev_props_core12.shaderUniformBufferArrayNonUniformIndexingNative =
1178 descriptor_indexing_prop.shaderUniformBufferArrayNonUniformIndexingNative;
1179 state_tracker->phys_dev_props_core12.shaderSampledImageArrayNonUniformIndexingNative =
1180 descriptor_indexing_prop.shaderSampledImageArrayNonUniformIndexingNative;
1181 state_tracker->phys_dev_props_core12.shaderStorageBufferArrayNonUniformIndexingNative =
1182 descriptor_indexing_prop.shaderStorageBufferArrayNonUniformIndexingNative;
1183 state_tracker->phys_dev_props_core12.shaderStorageImageArrayNonUniformIndexingNative =
1184 descriptor_indexing_prop.shaderStorageImageArrayNonUniformIndexingNative;
1185 state_tracker->phys_dev_props_core12.shaderInputAttachmentArrayNonUniformIndexingNative =
1186 descriptor_indexing_prop.shaderInputAttachmentArrayNonUniformIndexingNative;
1187 state_tracker->phys_dev_props_core12.robustBufferAccessUpdateAfterBind =
1188 descriptor_indexing_prop.robustBufferAccessUpdateAfterBind;
1189 state_tracker->phys_dev_props_core12.quadDivergentImplicitLod = descriptor_indexing_prop.quadDivergentImplicitLod;
1190 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSamplers =
1191 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSamplers;
1192 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindUniformBuffers =
1193 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindUniformBuffers;
1194 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageBuffers =
1195 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageBuffers;
1196 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindSampledImages =
1197 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindSampledImages;
1198 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindStorageImages =
1199 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindStorageImages;
1200 state_tracker->phys_dev_props_core12.maxPerStageDescriptorUpdateAfterBindInputAttachments =
1201 descriptor_indexing_prop.maxPerStageDescriptorUpdateAfterBindInputAttachments;
1202 state_tracker->phys_dev_props_core12.maxPerStageUpdateAfterBindResources =
1203 descriptor_indexing_prop.maxPerStageUpdateAfterBindResources;
1204 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSamplers =
1205 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSamplers;
1206 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffers =
1207 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffers;
1208 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic =
1209 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic;
1210 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffers =
1211 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffers;
1212 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic =
1213 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic;
1214 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindSampledImages =
1215 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindSampledImages;
1216 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindStorageImages =
1217 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindStorageImages;
1218 state_tracker->phys_dev_props_core12.maxDescriptorSetUpdateAfterBindInputAttachments =
1219 descriptor_indexing_prop.maxDescriptorSetUpdateAfterBindInputAttachments;
1220 }
1221
1222 if (dev_ext.vk_khr_depth_stencil_resolve) {
1223 auto depth_stencil_resolve_props = LvlInitStruct<VkPhysicalDeviceDepthStencilResolveProperties>();
1224 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_depth_stencil_resolve, &depth_stencil_resolve_props);
1225 state_tracker->phys_dev_props_core12.supportedDepthResolveModes =
1226 depth_stencil_resolve_props.supportedDepthResolveModes;
1227 state_tracker->phys_dev_props_core12.supportedStencilResolveModes =
1228 depth_stencil_resolve_props.supportedStencilResolveModes;
1229 state_tracker->phys_dev_props_core12.independentResolveNone = depth_stencil_resolve_props.independentResolveNone;
1230 state_tracker->phys_dev_props_core12.independentResolve = depth_stencil_resolve_props.independentResolve;
1231 }
1232
1233 if (dev_ext.vk_khr_timeline_semaphore) {
1234 auto timeline_semaphore_props = LvlInitStruct<VkPhysicalDeviceTimelineSemaphoreProperties>();
1235 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_timeline_semaphore, &timeline_semaphore_props);
1236 state_tracker->phys_dev_props_core12.maxTimelineSemaphoreValueDifference =
1237 timeline_semaphore_props.maxTimelineSemaphoreValueDifference;
1238 }
1239
1240 if (dev_ext.vk_ext_sampler_filter_minmax) {
1241 auto sampler_filter_minmax_props = LvlInitStruct<VkPhysicalDeviceSamplerFilterMinmaxProperties>();
1242 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sampler_filter_minmax, &sampler_filter_minmax_props);
1243 state_tracker->phys_dev_props_core12.filterMinmaxSingleComponentFormats =
1244 sampler_filter_minmax_props.filterMinmaxSingleComponentFormats;
1245 state_tracker->phys_dev_props_core12.filterMinmaxImageComponentMapping =
1246 sampler_filter_minmax_props.filterMinmaxImageComponentMapping;
1247 }
1248
1249 if (dev_ext.vk_khr_shader_float_controls) {
1250 auto float_controls_props = LvlInitStruct<VkPhysicalDeviceFloatControlsProperties>();
1251 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_shader_float_controls, &float_controls_props);
1252 state_tracker->phys_dev_props_core12.denormBehaviorIndependence = float_controls_props.denormBehaviorIndependence;
1253 state_tracker->phys_dev_props_core12.roundingModeIndependence = float_controls_props.roundingModeIndependence;
1254 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat16 =
1255 float_controls_props.shaderSignedZeroInfNanPreserveFloat16;
1256 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat32 =
1257 float_controls_props.shaderSignedZeroInfNanPreserveFloat32;
1258 state_tracker->phys_dev_props_core12.shaderSignedZeroInfNanPreserveFloat64 =
1259 float_controls_props.shaderSignedZeroInfNanPreserveFloat64;
1260 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat16 = float_controls_props.shaderDenormPreserveFloat16;
1261 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat32 = float_controls_props.shaderDenormPreserveFloat32;
1262 state_tracker->phys_dev_props_core12.shaderDenormPreserveFloat64 = float_controls_props.shaderDenormPreserveFloat64;
1263 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat16 =
1264 float_controls_props.shaderDenormFlushToZeroFloat16;
1265 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat32 =
1266 float_controls_props.shaderDenormFlushToZeroFloat32;
1267 state_tracker->phys_dev_props_core12.shaderDenormFlushToZeroFloat64 =
1268 float_controls_props.shaderDenormFlushToZeroFloat64;
1269 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat16 = float_controls_props.shaderRoundingModeRTEFloat16;
1270 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat32 = float_controls_props.shaderRoundingModeRTEFloat32;
1271 state_tracker->phys_dev_props_core12.shaderRoundingModeRTEFloat64 = float_controls_props.shaderRoundingModeRTEFloat64;
1272 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat16 = float_controls_props.shaderRoundingModeRTZFloat16;
1273 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat32 = float_controls_props.shaderRoundingModeRTZFloat32;
1274 state_tracker->phys_dev_props_core12.shaderRoundingModeRTZFloat64 = float_controls_props.shaderRoundingModeRTZFloat64;
1275 }
locke-lunargd556cc32019-09-17 01:21:23 -06001276 }
1277
sfricke-samsung828e59d2021-08-22 23:20:49 -07001278 // Extensions with properties to extract to DeviceExtensionProperties
1279 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_push_descriptor, &phys_dev_props->push_descriptor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001280 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_shading_rate_image, &phys_dev_props->shading_rate_image_props);
1281 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_mesh_shader, &phys_dev_props->mesh_shader_props);
1282 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_inline_uniform_block, &phys_dev_props->inline_uniform_block_props);
1283 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_vertex_attribute_divisor, &phys_dev_props->vtx_attrib_divisor_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001284 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_transform_feedback, &phys_dev_props->transform_feedback_props);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001285 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_nv_ray_tracing, &phys_dev_props->ray_tracing_propsNV);
sourav parmarcd5fb182020-07-17 12:58:44 -07001286 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_ray_tracing_pipeline, &phys_dev_props->ray_tracing_propsKHR);
1287 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_acceleration_structure, &phys_dev_props->acc_structure_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001288 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_texel_buffer_alignment, &phys_dev_props->texel_buffer_alignment_props);
1289 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map, &phys_dev_props->fragment_density_map_props);
Mike Schuchardtc57de4a2021-07-20 17:26:32 -07001290 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map2, &phys_dev_props->fragment_density_map2_props);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001291 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_performance_query, &phys_dev_props->performance_query_props);
sfricke-samsung8f658d42020-05-03 20:12:24 -07001292 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sample_locations, &phys_dev_props->sample_locations_props);
Tony-LunarG7337b312020-04-15 16:40:25 -06001293 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_custom_border_color, &phys_dev_props->custom_border_color_props);
locke-lunarg3fa463a2020-10-23 16:39:04 -06001294 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_multiview, &phys_dev_props->multiview_props);
Nathaniel Cesario3291c912020-11-17 16:54:41 -07001295 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_portability_subset, &phys_dev_props->portability_props);
sfricke-samsung828e59d2021-08-22 23:20:49 -07001296 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_fragment_shading_rate, &phys_dev_props->fragment_shading_rate_props);
Locke Lin016d8482021-05-27 12:11:31 -06001297 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_provoking_vertex, &phys_dev_props->provoking_vertex_props);
Tony-LunarG4490de42021-06-21 15:49:19 -06001298 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_multi_draw, &phys_dev_props->multi_draw_props);
ziga-lunarg128904a2021-07-30 13:49:01 +02001299 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_discard_rectangles, &phys_dev_props->discard_rectangle_props);
ziga-lunarg86492812021-08-05 23:58:16 +02001300 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_blend_operation_advanced, &phys_dev_props->blend_operation_advanced_props);
ziga-lunargbd8ded62021-09-20 18:24:39 +02001301 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_conservative_rasterization, &phys_dev_props->conservative_rasterization_props);
ziga-lunarg11fecb92021-09-20 16:48:06 +02001302 GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_subgroup_size_control, &phys_dev_props->subgroup_size_control_props);
Piers Daniell41b8c5d2020-01-10 15:42:00 -07001303
sfricke-samsung45996a42021-09-16 13:45:27 -07001304 if (IsExtEnabled(dev_ext.vk_nv_cooperative_matrix)) {
locke-lunargd556cc32019-09-17 01:21:23 -06001305 // Get the needed cooperative_matrix properties
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001306 auto cooperative_matrix_props = LvlInitStruct<VkPhysicalDeviceCooperativeMatrixPropertiesNV>();
1307 auto prop2 = LvlInitStruct<VkPhysicalDeviceProperties2>(&cooperative_matrix_props);
locke-lunargd556cc32019-09-17 01:21:23 -06001308 instance_dispatch_table.GetPhysicalDeviceProperties2KHR(gpu, &prop2);
1309 state_tracker->phys_dev_ext_props.cooperative_matrix_props = cooperative_matrix_props;
1310
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001311 uint32_t num_cooperative_matrix_properties = 0;
1312 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties, NULL);
1313 state_tracker->cooperative_matrix_properties.resize(num_cooperative_matrix_properties,
Mark Lobodzinski6fe9e702020-12-30 15:36:39 -07001314 LvlInitStruct<VkCooperativeMatrixPropertiesNV>());
locke-lunargd556cc32019-09-17 01:21:23 -06001315
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001316 instance_dispatch_table.GetPhysicalDeviceCooperativeMatrixPropertiesNV(gpu, &num_cooperative_matrix_properties,
locke-lunargd556cc32019-09-17 01:21:23 -06001317 state_tracker->cooperative_matrix_properties.data());
1318 }
Tobias Hector6663c9b2020-11-05 10:18:02 +00001319
locke-lunargd556cc32019-09-17 01:21:23 -06001320 // Store queue family data
1321 if (pCreateInfo->pQueueCreateInfos != nullptr) {
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001322 uint32_t total_count = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001323 for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
sfricke-samsung590ae1e2020-04-25 01:18:05 -07001324 const VkDeviceQueueCreateInfo &queue_create_info = pCreateInfo->pQueueCreateInfos[i];
sfricke-samsungb585ec12021-05-06 03:10:13 -07001325 state_tracker->queue_family_index_set.insert(queue_create_info.queueFamilyIndex);
1326 state_tracker->device_queue_info_list.push_back(
1327 {i, queue_create_info.queueFamilyIndex, queue_create_info.flags, queue_create_info.queueCount});
Jeremy Gebbena15e2382021-09-30 11:49:32 -06001328 total_count += queue_create_info.queueCount;
1329 }
1330 queueMap.reserve(total_count);
1331 for (const auto &queue_info : state_tracker->device_queue_info_list) {
1332 for (uint32_t i = 0; i < queue_info.queue_count; i++) {
1333 VkQueue queue = VK_NULL_HANDLE;
1334 // vkGetDeviceQueue2() was added in vulkan 1.1, and there was never a KHR version of it.
1335 if (api_version >= VK_API_VERSION_1_1 && queue_info.flags != 0) {
1336 auto get_info = LvlInitStruct<VkDeviceQueueInfo2>();
1337 get_info.flags = queue_info.flags;
1338 get_info.queueFamilyIndex = queue_info.queue_family_index;
1339 get_info.queueIndex = i;
1340 DispatchGetDeviceQueue2(*pDevice, &get_info, &queue);
1341 } else {
1342 DispatchGetDeviceQueue(*pDevice, queue_info.queue_family_index, i, &queue);
1343 }
1344 assert(queue != VK_NULL_HANDLE);
1345 state_tracker->queueMap.emplace(queue, std::make_shared<QUEUE_STATE>(queue, queue_info.queue_family_index));
1346 }
locke-lunargd556cc32019-09-17 01:21:23 -06001347 }
1348 }
1349}
1350
1351void ValidationStateTracker::PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
1352 if (!device) return;
1353
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001354 commandPoolMap.clear();
1355 assert(commandBufferMap.empty());
Jeff Bolzadbfa852019-10-04 13:53:30 -05001356 pipelineMap.clear();
1357 renderPassMap.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001358
1359 // This will also delete all sets in the pool & remove them from setMap
1360 DeleteDescriptorSetPools();
1361 // All sets should be removed
1362 assert(setMap.empty());
1363 descriptorSetLayoutMap.clear();
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001364 // Because swapchains are associated with Surfaces, which are at instance level,
1365 // they need to be explicitly destroyed here to avoid continued references to
1366 // the device we're destroying.
1367 for (auto &entry : swapchainMap) {
1368 entry.second->Destroy();
1369 }
1370 swapchainMap.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001371 imageViewMap.clear();
1372 imageMap.clear();
1373 bufferViewMap.clear();
1374 bufferMap.clear();
1375 // Queues persist until device is destroyed
1376 queueMap.clear();
1377}
1378
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001379void ValidationStateTracker::PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1380 VkFence fence, VkResult result) {
1381 if (result != VK_SUCCESS) return;
1382 auto queue_state = GetQueueState(queue);
1383
Jeremy Gebben57642982021-09-14 14:14:55 -06001384 uint64_t early_retire_seq = 0;
1385
1386 if (submitCount == 0) {
1387 CB_SUBMISSION submission;
1388 submission.AddFence(GetShared<FENCE_STATE>(fence));
1389 early_retire_seq = queue_state->Submit(std::move(submission));
1390 }
locke-lunargd556cc32019-09-17 01:21:23 -06001391
1392 // Now process each individual submit
1393 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001394 CB_SUBMISSION submission;
locke-lunargd556cc32019-09-17 01:21:23 -06001395 const VkSubmitInfo *submit = &pSubmits[submit_idx];
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001396 auto *timeline_semaphore_submit = LvlFindInChain<VkTimelineSemaphoreSubmitInfo>(submit->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06001397 for (uint32_t i = 0; i < submit->waitSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001398 uint64_t value = 0;
1399 if (timeline_semaphore_submit && timeline_semaphore_submit->pWaitSemaphoreValues != nullptr &&
1400 (i < timeline_semaphore_submit->waitSemaphoreValueCount)) {
1401 value = timeline_semaphore_submit->pWaitSemaphoreValues[i];
1402 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001403 submission.AddWaitSemaphore(GetShared<SEMAPHORE_STATE>(submit->pWaitSemaphores[i]), value);
locke-lunargd556cc32019-09-17 01:21:23 -06001404 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001405
locke-lunargd556cc32019-09-17 01:21:23 -06001406 for (uint32_t i = 0; i < submit->signalSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001407 uint64_t value = 0;
1408 if (timeline_semaphore_submit && timeline_semaphore_submit->pSignalSemaphoreValues != nullptr &&
1409 (i < timeline_semaphore_submit->signalSemaphoreValueCount)) {
1410 value = timeline_semaphore_submit->pSignalSemaphoreValues[i];
1411 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001412 submission.AddSignalSemaphore(GetShared<SEMAPHORE_STATE>(submit->pSignalSemaphores[i]), value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001413 }
1414
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001415 const auto perf_submit = LvlFindInChain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001416 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02001417
locke-lunargd556cc32019-09-17 01:21:23 -06001418 for (uint32_t i = 0; i < submit->commandBufferCount; i++) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001419 submission.AddCommandBuffer(GetShared<CMD_BUFFER_STATE>(submit->pCommandBuffers[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001420 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001421 if (submit_idx == (submitCount - 1) && fence != VK_NULL_HANDLE) {
1422 submission.AddFence(GetShared<FENCE_STATE>(fence));
1423 }
1424 auto submit_seq = queue_state->Submit(std::move(submission));
1425 early_retire_seq = std::max(early_retire_seq, submit_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001426 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001427
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001428 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001429 queue_state->Retire(early_retire_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001430 }
1431}
1432
1433void ValidationStateTracker::PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1434 VkFence fence, VkResult result) {
1435 if (result != VK_SUCCESS) return;
1436 auto queue_state = GetQueueState(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001437 uint64_t early_retire_seq = 0;
1438 if (submitCount == 0) {
1439 CB_SUBMISSION submission;
1440 submission.AddFence(GetShared<FENCE_STATE>(fence));
1441 early_retire_seq = queue_state->Submit(std::move(submission));
1442 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001443
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001444 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
1445 CB_SUBMISSION submission;
1446 const VkSubmitInfo2KHR *submit = &pSubmits[submit_idx];
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001447 for (uint32_t i = 0; i < submit->waitSemaphoreInfoCount; ++i) {
1448 const auto &sem_info = submit->pWaitSemaphoreInfos[i];
Jeremy Gebben57642982021-09-14 14:14:55 -06001449 submission.AddWaitSemaphore(GetShared<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001450 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001451 for (uint32_t i = 0; i < submit->signalSemaphoreInfoCount; ++i) {
1452 const auto &sem_info = submit->pSignalSemaphoreInfos[i];
Jeremy Gebben57642982021-09-14 14:14:55 -06001453 submission.AddSignalSemaphore(GetShared<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001454 }
1455 const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
1456 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
1457
1458 for (uint32_t i = 0; i < submit->commandBufferInfoCount; i++) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001459 submission.AddCommandBuffer(GetShared<CMD_BUFFER_STATE>(submit->pCommandBufferInfos[i].commandBuffer));
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001460 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001461 if (submit_idx == (submitCount - 1)) {
1462 submission.AddFence(GetShared<FENCE_STATE>(fence));
1463 }
1464 auto submit_seq = queue_state->Submit(std::move(submission));
1465 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001466 }
locke-lunargd556cc32019-09-17 01:21:23 -06001467 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001468 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001469 }
1470}
1471
1472void ValidationStateTracker::PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1473 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory,
1474 VkResult result) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001475 if (VK_SUCCESS != result) {
1476 return;
locke-lunargd556cc32019-09-17 01:21:23 -06001477 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001478 const auto &memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
1479 const auto &memory_heap = phys_dev_mem_props.memoryHeaps[memory_type.heapIndex];
1480 auto fake_address = fake_memory.Alloc(pAllocateInfo->allocationSize);
1481
1482 layer_data::optional<DedicatedBinding> dedicated_binding;
1483
1484 auto dedicated = LvlFindInChain<VkMemoryDedicatedAllocateInfo>(pAllocateInfo->pNext);
1485 if (dedicated) {
1486 if (dedicated->buffer) {
1487 const auto *buffer_state = GetBufferState(dedicated->buffer);
1488 assert(buffer_state);
1489 if (!buffer_state) {
1490 return;
1491 }
1492 dedicated_binding.emplace(dedicated->buffer, buffer_state->createInfo);
1493 } else if (dedicated->image) {
1494 const auto *image_state = GetImageState(dedicated->image);
1495 assert(image_state);
1496 if (!image_state) {
1497 return;
1498 }
1499 dedicated_binding.emplace(dedicated->image, image_state->createInfo);
1500 }
1501 }
1502 memObjMap[*pMemory] = std::make_shared<DEVICE_MEMORY_STATE>(*pMemory, pAllocateInfo, fake_address, memory_type, memory_heap,
ziga-lunarg9663f4f2021-09-30 17:24:01 +02001503 std::move(dedicated_binding), physical_device_count);
locke-lunargd556cc32019-09-17 01:21:23 -06001504 return;
1505}
1506
1507void ValidationStateTracker::PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory mem, const VkAllocationCallbacks *pAllocator) {
1508 if (!mem) return;
1509 DEVICE_MEMORY_STATE *mem_info = GetDevMemState(mem);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001510 if (!mem_info) return;
locke-lunargd556cc32019-09-17 01:21:23 -06001511 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001512 mem_info->Destroy();
John Zulauf79952712020-04-07 11:25:54 -06001513 fake_memory.Free(mem_info->fake_base_address);
locke-lunargd556cc32019-09-17 01:21:23 -06001514 memObjMap.erase(mem);
1515}
1516
1517void ValidationStateTracker::PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
1518 VkFence fence, VkResult result) {
1519 if (result != VK_SUCCESS) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001520 auto queue_state = GetQueueState(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06001521
Jeremy Gebben57642982021-09-14 14:14:55 -06001522 uint64_t early_retire_seq = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001523
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001524 for (uint32_t bind_idx = 0; bind_idx < bindInfoCount; ++bind_idx) {
1525 const VkBindSparseInfo &bind_info = pBindInfo[bind_idx];
locke-lunargd556cc32019-09-17 01:21:23 -06001526 // Track objects tied to memory
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001527 for (uint32_t j = 0; j < bind_info.bufferBindCount; j++) {
1528 for (uint32_t k = 0; k < bind_info.pBufferBinds[j].bindCount; k++) {
1529 auto sparse_binding = bind_info.pBufferBinds[j].pBinds[k];
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001530 auto buffer_state = GetBufferState(bind_info.pBufferBinds[j].buffer);
1531 auto mem_state = GetDevMemShared(sparse_binding.memory);
1532 if (buffer_state && mem_state) {
1533 buffer_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1534 }
locke-lunargd556cc32019-09-17 01:21:23 -06001535 }
1536 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001537 for (uint32_t j = 0; j < bind_info.imageOpaqueBindCount; j++) {
1538 for (uint32_t k = 0; k < bind_info.pImageOpaqueBinds[j].bindCount; k++) {
1539 auto sparse_binding = bind_info.pImageOpaqueBinds[j].pBinds[k];
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001540 auto image_state = GetImageState(bind_info.pImageOpaqueBinds[j].image);
1541 auto mem_state = GetDevMemShared(sparse_binding.memory);
1542 if (image_state && mem_state) {
1543 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1544 }
locke-lunargd556cc32019-09-17 01:21:23 -06001545 }
1546 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001547 for (uint32_t j = 0; j < bind_info.imageBindCount; j++) {
1548 for (uint32_t k = 0; k < bind_info.pImageBinds[j].bindCount; k++) {
1549 auto sparse_binding = bind_info.pImageBinds[j].pBinds[k];
locke-lunargd556cc32019-09-17 01:21:23 -06001550 // TODO: This size is broken for non-opaque bindings, need to update to comprehend full sparse binding data
1551 VkDeviceSize size = sparse_binding.extent.depth * sparse_binding.extent.height * sparse_binding.extent.width * 4;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001552 auto image_state = GetImageState(bind_info.pImageBinds[j].image);
1553 auto mem_state = GetDevMemShared(sparse_binding.memory);
1554 if (image_state && mem_state) {
1555 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, size);
1556 }
locke-lunargd556cc32019-09-17 01:21:23 -06001557 }
1558 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001559 CB_SUBMISSION submission;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001560 for (uint32_t i = 0; i < bind_info.waitSemaphoreCount; ++i) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001561 submission.AddWaitSemaphore(GetShared<SEMAPHORE_STATE>(bind_info.pWaitSemaphores[i]), 0);
locke-lunargd556cc32019-09-17 01:21:23 -06001562 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001563 for (uint32_t i = 0; i < bind_info.signalSemaphoreCount; ++i) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001564 submission.AddSignalSemaphore(GetShared<SEMAPHORE_STATE>(bind_info.pSignalSemaphores[i]), 0);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001565 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001566 if (bind_idx == (bindInfoCount - 1)) {
1567 submission.AddFence(GetShared<FENCE_STATE>(fence));
locke-lunargd556cc32019-09-17 01:21:23 -06001568 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001569 auto submit_seq = queue_state->Submit(std::move(submission));
1570 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001571 }
1572
1573 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001574 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001575 }
1576}
1577
1578void ValidationStateTracker::PostCallRecordCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
1579 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore,
1580 VkResult result) {
1581 if (VK_SUCCESS != result) return;
Jeremy Gebben57642982021-09-14 14:14:55 -06001582 semaphoreMap[*pSemaphore] =
1583 std::make_shared<SEMAPHORE_STATE>(*pSemaphore, LvlFindInChain<VkSemaphoreTypeCreateInfo>(pCreateInfo->pNext));
locke-lunargd556cc32019-09-17 01:21:23 -06001584}
1585
Mike Schuchardt2df08912020-12-15 16:28:09 -08001586void ValidationStateTracker::RecordImportSemaphoreState(VkSemaphore semaphore, VkExternalSemaphoreHandleTypeFlagBits handle_type,
1587 VkSemaphoreImportFlags flags) {
locke-lunargd556cc32019-09-17 01:21:23 -06001588 SEMAPHORE_STATE *sema_node = GetSemaphoreState(semaphore);
1589 if (sema_node && sema_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08001590 if ((handle_type == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06001591 sema_node->scope == kSyncScopeInternal) {
1592 sema_node->scope = kSyncScopeExternalTemporary;
1593 } else {
1594 sema_node->scope = kSyncScopeExternalPermanent;
1595 }
1596 }
1597}
1598
Mike Schuchardt2df08912020-12-15 16:28:09 -08001599void ValidationStateTracker::PostCallRecordSignalSemaphoreKHR(VkDevice device, const VkSemaphoreSignalInfo *pSignalInfo,
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001600 VkResult result) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001601 auto *semaphore_state = GetSemaphoreState(pSignalInfo->semaphore);
1602 semaphore_state->payload = pSignalInfo->value;
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001603}
1604
locke-lunargd556cc32019-09-17 01:21:23 -06001605void ValidationStateTracker::RecordMappedMemory(VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, void **ppData) {
1606 auto mem_info = GetDevMemState(mem);
1607 if (mem_info) {
1608 mem_info->mapped_range.offset = offset;
1609 mem_info->mapped_range.size = size;
1610 mem_info->p_driver_data = *ppData;
1611 }
1612}
1613
locke-lunargd556cc32019-09-17 01:21:23 -06001614void ValidationStateTracker::PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1615 VkBool32 waitAll, uint64_t timeout, VkResult result) {
1616 if (VK_SUCCESS != result) return;
1617
1618 // When we know that all fences are complete we can clean/remove their CBs
1619 if ((VK_TRUE == waitAll) || (1 == fenceCount)) {
1620 for (uint32_t i = 0; i < fenceCount; i++) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001621 auto fence_state = GetFenceState(pFences[i]);
1622 if (fence_state) {
1623 fence_state->Retire();
1624 }
locke-lunargd556cc32019-09-17 01:21:23 -06001625 }
1626 }
1627 // NOTE : Alternate case not handled here is when some fences have completed. In
1628 // this case for app to guarantee which fences completed it will have to call
1629 // vkGetFenceStatus() at which point we'll clean/remove their CBs if complete.
1630}
1631
John Zulauff89de662020-04-13 18:57:34 -06001632void ValidationStateTracker::RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1633 VkResult result) {
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001634 if (VK_SUCCESS != result) return;
1635
1636 for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001637 auto semaphore_state = GetSemaphoreState(pWaitInfo->pSemaphores[i]);
1638 if (semaphore_state) {
1639 semaphore_state->Retire(pWaitInfo->pValues[i]);
1640 }
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001641 }
1642}
1643
John Zulauff89de662020-04-13 18:57:34 -06001644void ValidationStateTracker::PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1645 VkResult result) {
1646 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1647}
1648
1649void ValidationStateTracker::PostCallRecordWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo,
1650 uint64_t timeout, VkResult result) {
1651 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1652}
1653
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001654void ValidationStateTracker::RecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1655 VkResult result) {
1656 if (VK_SUCCESS != result) return;
1657
Jeremy Gebben57642982021-09-14 14:14:55 -06001658 auto semaphore_state = GetSemaphoreState(semaphore);
1659 if (semaphore_state) {
1660 semaphore_state->Retire(*pValue);
1661 }
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001662}
1663
1664void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1665 VkResult result) {
1666 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1667}
1668void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValueKHR(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1669 VkResult result) {
1670 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1671}
1672
locke-lunargd556cc32019-09-17 01:21:23 -06001673void ValidationStateTracker::PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
1674 if (VK_SUCCESS != result) return;
Jeremy Gebben57642982021-09-14 14:14:55 -06001675 auto fence_state = GetFenceState(fence);
1676 if (fence_state) {
1677 fence_state->Retire();
1678 }
locke-lunargd556cc32019-09-17 01:21:23 -06001679}
1680
locke-lunargd556cc32019-09-17 01:21:23 -06001681void ValidationStateTracker::PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) {
1682 if (VK_SUCCESS != result) return;
1683 QUEUE_STATE *queue_state = GetQueueState(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001684 if (queue_state) {
1685 queue_state->Retire();
1686 }
locke-lunargd556cc32019-09-17 01:21:23 -06001687}
1688
1689void ValidationStateTracker::PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) {
1690 if (VK_SUCCESS != result) return;
1691 for (auto &queue : queueMap) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001692 queue.second->Retire();
locke-lunargd556cc32019-09-17 01:21:23 -06001693 }
1694}
1695
1696void ValidationStateTracker::PreCallRecordDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
1697 if (!fence) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001698 auto fence_state = GetFenceState(fence);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001699 fence_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001700 fenceMap.erase(fence);
1701}
1702
1703void ValidationStateTracker::PreCallRecordDestroySemaphore(VkDevice device, VkSemaphore semaphore,
1704 const VkAllocationCallbacks *pAllocator) {
1705 if (!semaphore) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001706 auto semaphore_state = GetSemaphoreState(semaphore);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001707 semaphore_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001708 semaphoreMap.erase(semaphore);
1709}
1710
1711void ValidationStateTracker::PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
1712 if (!event) return;
John Zulauf48057322020-12-02 11:59:31 -07001713 EVENT_STATE *event_state = Get<EVENT_STATE>(event);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001714 event_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001715 eventMap.erase(event);
1716}
1717
1718void ValidationStateTracker::PreCallRecordDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
1719 const VkAllocationCallbacks *pAllocator) {
1720 if (!queryPool) return;
1721 QUERY_POOL_STATE *qp_state = GetQueryPoolState(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001722 qp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001723 queryPoolMap.erase(queryPool);
1724}
1725
locke-lunargd556cc32019-09-17 01:21:23 -06001726void ValidationStateTracker::UpdateBindBufferMemoryState(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
1727 BUFFER_STATE *buffer_state = GetBufferState(buffer);
1728 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001729 // Track objects tied to memory
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001730 auto mem_state = GetDevMemShared(mem);
1731 if (mem_state) {
1732 buffer_state->SetMemBinding(mem_state, memoryOffset);
1733 }
locke-lunargd556cc32019-09-17 01:21:23 -06001734 }
1735}
1736
1737void ValidationStateTracker::PostCallRecordBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
1738 VkDeviceSize memoryOffset, VkResult result) {
1739 if (VK_SUCCESS != result) return;
1740 UpdateBindBufferMemoryState(buffer, mem, memoryOffset);
1741}
1742
1743void ValidationStateTracker::PostCallRecordBindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001744 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001745 for (uint32_t i = 0; i < bindInfoCount; i++) {
1746 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1747 }
1748}
1749
1750void ValidationStateTracker::PostCallRecordBindBufferMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001751 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001752 for (uint32_t i = 0; i < bindInfoCount; i++) {
1753 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1754 }
1755}
1756
Spencer Fricke6c127102020-04-16 06:25:20 -07001757void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer) {
locke-lunargd556cc32019-09-17 01:21:23 -06001758 BUFFER_STATE *buffer_state = GetBufferState(buffer);
1759 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001760 buffer_state->memory_requirements_checked = true;
1761 }
1762}
1763
1764void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1765 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001766 RecordGetBufferMemoryRequirementsState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001767}
1768
1769void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001770 const VkBufferMemoryRequirementsInfo2 *pInfo,
1771 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001772 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001773}
1774
1775void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2KHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001776 const VkBufferMemoryRequirementsInfo2 *pInfo,
1777 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001778 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001779}
1780
Spencer Fricke6c127102020-04-16 06:25:20 -07001781void ValidationStateTracker::RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2 *pInfo) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001782 const VkImagePlaneMemoryRequirementsInfo *plane_info =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001783 (pInfo == nullptr) ? nullptr : LvlFindInChain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06001784 IMAGE_STATE *image_state = GetImageState(image);
1785 if (image_state) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001786 if (plane_info != nullptr) {
1787 // Multi-plane image
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001788 if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_0_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001789 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001790 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_1_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001791 image_state->memory_requirements_checked[1] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001792 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_2_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001793 image_state->memory_requirements_checked[2] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001794 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001795 } else if (!image_state->disjoint) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001796 // Single Plane image
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001797 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001798 }
locke-lunargd556cc32019-09-17 01:21:23 -06001799 }
1800}
1801
1802void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements(VkDevice device, VkImage image,
1803 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001804 RecordGetImageMemoryRequirementsState(image, nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06001805}
1806
1807void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
1808 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001809 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001810}
1811
1812void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2KHR(VkDevice device,
1813 const VkImageMemoryRequirementsInfo2 *pInfo,
1814 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001815 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001816}
1817
locke-lunargd556cc32019-09-17 01:21:23 -06001818void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements(
1819 VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1820 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1821 auto image_state = GetImageState(image);
1822 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001823}
1824
1825void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001826 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1827 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
locke-lunargd556cc32019-09-17 01:21:23 -06001828 auto image_state = GetImageState(pInfo->image);
1829 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001830}
1831
1832void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001833 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1834 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
locke-lunargd556cc32019-09-17 01:21:23 -06001835 auto image_state = GetImageState(pInfo->image);
1836 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001837}
1838
1839void ValidationStateTracker::PreCallRecordDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1840 const VkAllocationCallbacks *pAllocator) {
1841 if (!shaderModule) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001842 auto shader_module_state = GetShaderModuleState(shaderModule);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001843 shader_module_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001844 shaderModuleMap.erase(shaderModule);
1845}
1846
1847void ValidationStateTracker::PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline,
1848 const VkAllocationCallbacks *pAllocator) {
1849 if (!pipeline) return;
1850 PIPELINE_STATE *pipeline_state = GetPipelineState(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06001851 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001852 pipeline_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001853 pipelineMap.erase(pipeline);
1854}
1855
1856void ValidationStateTracker::PreCallRecordDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1857 const VkAllocationCallbacks *pAllocator) {
1858 if (!pipelineLayout) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001859 auto pipeline_layout_state = GetPipelineLayout(pipelineLayout);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001860 pipeline_layout_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001861 pipelineLayoutMap.erase(pipelineLayout);
1862}
1863
1864void ValidationStateTracker::PreCallRecordDestroySampler(VkDevice device, VkSampler sampler,
1865 const VkAllocationCallbacks *pAllocator) {
1866 if (!sampler) return;
1867 SAMPLER_STATE *sampler_state = GetSamplerState(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001868 // Any bound cmd buffers are now invalid
1869 if (sampler_state) {
Yuly Novikov424cdd52020-05-26 16:45:12 -04001870 if (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
1871 sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
1872 custom_border_color_sampler_count--;
1873 }
1874
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001875 sampler_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001876 }
1877 samplerMap.erase(sampler);
1878}
1879
1880void ValidationStateTracker::PreCallRecordDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1881 const VkAllocationCallbacks *pAllocator) {
1882 if (!descriptorSetLayout) return;
1883 auto layout_it = descriptorSetLayoutMap.find(descriptorSetLayout);
1884 if (layout_it != descriptorSetLayoutMap.end()) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001885 layout_it->second.get()->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001886 descriptorSetLayoutMap.erase(layout_it);
1887 }
1888}
1889
1890void ValidationStateTracker::PreCallRecordDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1891 const VkAllocationCallbacks *pAllocator) {
1892 if (!descriptorPool) return;
1893 DESCRIPTOR_POOL_STATE *desc_pool_state = GetDescriptorPoolState(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001894 if (desc_pool_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001895 // Free sets that were in this pool
John Zulauf79f06582021-02-27 18:38:39 -07001896 for (auto *ds : desc_pool_state->sets) {
locke-lunargd556cc32019-09-17 01:21:23 -06001897 FreeDescriptorSet(ds);
1898 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001899 desc_pool_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001900 descriptorPoolMap.erase(descriptorPool);
1901 }
1902}
1903
locke-lunargd556cc32019-09-17 01:21:23 -06001904void ValidationStateTracker::PreCallRecordFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
1905 uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001906 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1907 if (pool) {
1908 pool->Free(commandBufferCount, pCommandBuffers);
1909 }
locke-lunargd556cc32019-09-17 01:21:23 -06001910}
1911
1912void ValidationStateTracker::PostCallRecordCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1913 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool,
1914 VkResult result) {
1915 if (VK_SUCCESS != result) return;
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001916 auto queue_flags = physical_device_state->queue_family_properties[pCreateInfo->queueFamilyIndex].queueFlags;
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001917 commandPoolMap[*pCommandPool] = std::make_shared<COMMAND_POOL_STATE>(this, *pCommandPool, pCreateInfo, queue_flags);
locke-lunargd556cc32019-09-17 01:21:23 -06001918}
1919
1920void ValidationStateTracker::PostCallRecordCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1921 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool,
1922 VkResult result) {
1923 if (VK_SUCCESS != result) return;
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001924
1925 uint32_t index_count = 0, n_perf_pass = 0;
1926 bool has_cb = false, has_rb = false;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001927 if (pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001928 const auto *perf = LvlFindInChain<VkQueryPoolPerformanceCreateInfoKHR>(pCreateInfo->pNext);
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001929 index_count = perf->counterIndexCount;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001930
Mark Lobodzinski7e948e42020-09-09 10:23:36 -06001931 const QUEUE_FAMILY_PERF_COUNTERS &counters = *physical_device_state->perf_counters[perf->queueFamilyIndex];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001932 for (uint32_t i = 0; i < perf->counterIndexCount; i++) {
1933 const auto &counter = counters.counters[perf->pCounterIndices[i]];
1934 switch (counter.scope) {
1935 case VK_QUERY_SCOPE_COMMAND_BUFFER_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001936 has_cb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001937 break;
1938 case VK_QUERY_SCOPE_RENDER_PASS_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001939 has_rb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001940 break;
1941 default:
1942 break;
1943 }
1944 }
1945
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001946 DispatchGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physical_device_state->PhysDev(), perf, &n_perf_pass);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001947 }
1948
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001949 queryPoolMap[*pQueryPool] =
1950 std::make_shared<QUERY_POOL_STATE>(*pQueryPool, pCreateInfo, index_count, n_perf_pass, has_cb, has_rb);
locke-lunargd556cc32019-09-17 01:21:23 -06001951
1952 QueryObject query_obj{*pQueryPool, 0u};
1953 for (uint32_t i = 0; i < pCreateInfo->queryCount; ++i) {
1954 query_obj.query = i;
1955 queryToStateMap[query_obj] = QUERYSTATE_UNKNOWN;
1956 }
1957}
1958
1959void ValidationStateTracker::PreCallRecordDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
1960 const VkAllocationCallbacks *pAllocator) {
1961 if (!commandPool) return;
1962 COMMAND_POOL_STATE *cp_state = GetCommandPoolState(commandPool);
1963 // Remove cmdpool from cmdpoolmap, after freeing layer data for the command buffers
1964 // "When a pool is destroyed, all command buffers allocated from the pool are freed."
1965 if (cp_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001966 cp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001967 commandPoolMap.erase(commandPool);
1968 }
1969}
1970
1971void ValidationStateTracker::PostCallRecordResetCommandPool(VkDevice device, VkCommandPool commandPool,
1972 VkCommandPoolResetFlags flags, VkResult result) {
1973 if (VK_SUCCESS != result) return;
1974 // Reset all of the CBs allocated from this pool
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06001975 auto pool = Get<COMMAND_POOL_STATE>(commandPool);
1976 if (pool) {
1977 pool->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001978 }
1979}
1980
1981void ValidationStateTracker::PostCallRecordResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1982 VkResult result) {
1983 for (uint32_t i = 0; i < fenceCount; ++i) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001984 auto fence_state = GetFenceState(pFences[i]);
1985 if (fence_state) {
1986 if (fence_state->scope == kSyncScopeInternal) {
1987 fence_state->state = FENCE_UNSIGNALED;
1988 } else if (fence_state->scope == kSyncScopeExternalTemporary) {
1989 fence_state->scope = kSyncScopeInternal;
locke-lunargd556cc32019-09-17 01:21:23 -06001990 }
1991 }
1992 }
1993}
1994
locke-lunargd556cc32019-09-17 01:21:23 -06001995void ValidationStateTracker::PreCallRecordDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
1996 const VkAllocationCallbacks *pAllocator) {
1997 if (!framebuffer) return;
1998 FRAMEBUFFER_STATE *framebuffer_state = GetFramebufferState(framebuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001999 framebuffer_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002000 frameBufferMap.erase(framebuffer);
2001}
2002
2003void ValidationStateTracker::PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
2004 const VkAllocationCallbacks *pAllocator) {
2005 if (!renderPass) return;
2006 RENDER_PASS_STATE *rp_state = GetRenderPassState(renderPass);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002007 rp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002008 renderPassMap.erase(renderPass);
2009}
2010
2011void ValidationStateTracker::PostCallRecordCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2012 const VkAllocationCallbacks *pAllocator, VkFence *pFence, VkResult result) {
2013 if (VK_SUCCESS != result) return;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002014 fenceMap[*pFence] = std::make_shared<FENCE_STATE>(*pFence, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002015}
2016
2017bool ValidationStateTracker::PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2018 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2019 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002020 void *cgpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002021 // Set up the state that CoreChecks, gpu_validation and later StateTracker Record will use.
2022 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2023 cgpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2024 cgpl_state->pipe_state.reserve(count);
2025 for (uint32_t i = 0; i < count; i++) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002026 cgpl_state->pipe_state.push_back(std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i],
2027 GetRenderPassShared(pCreateInfos[i].renderPass),
2028 GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002029 }
2030 return false;
2031}
2032
2033void ValidationStateTracker::PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2034 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2035 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2036 VkResult result, void *cgpl_state_data) {
2037 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2038 // This API may create pipelines regardless of the return value
2039 for (uint32_t i = 0; i < count; i++) {
2040 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002041 (cgpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002042 pipelineMap[pPipelines[i]] = std::move((cgpl_state->pipe_state)[i]);
2043 }
2044 }
2045 cgpl_state->pipe_state.clear();
2046}
2047
2048bool ValidationStateTracker::PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2049 const VkComputePipelineCreateInfo *pCreateInfos,
2050 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002051 void *ccpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002052 auto *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2053 ccpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2054 ccpl_state->pipe_state.reserve(count);
2055 for (uint32_t i = 0; i < count; i++) {
2056 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002057 ccpl_state->pipe_state.push_back(
2058 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002059 }
2060 return false;
2061}
2062
2063void ValidationStateTracker::PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2064 const VkComputePipelineCreateInfo *pCreateInfos,
2065 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2066 VkResult result, void *ccpl_state_data) {
2067 create_compute_pipeline_api_state *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2068
2069 // This API may create pipelines regardless of the return value
2070 for (uint32_t i = 0; i < count; i++) {
2071 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002072 (ccpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002073 pipelineMap[pPipelines[i]] = std::move((ccpl_state->pipe_state)[i]);
2074 }
2075 }
2076 ccpl_state->pipe_state.clear();
2077}
2078
2079bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache,
2080 uint32_t count,
2081 const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2082 const VkAllocationCallbacks *pAllocator,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002083 VkPipeline *pPipelines, void *crtpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002084 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2085 crtpl_state->pipe_state.reserve(count);
2086 for (uint32_t i = 0; i < count; i++) {
2087 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002088 crtpl_state->pipe_state.push_back(
2089 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002090 }
2091 return false;
2092}
2093
2094void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesNV(
2095 VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2096 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines, VkResult result, void *crtpl_state_data) {
2097 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2098 // This API may create pipelines regardless of the return value
2099 for (uint32_t i = 0; i < count; i++) {
2100 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002101 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002102 pipelineMap[pPipelines[i]] = std::move((crtpl_state->pipe_state)[i]);
2103 }
2104 }
2105 crtpl_state->pipe_state.clear();
2106}
2107
sourav parmarcd5fb182020-07-17 12:58:44 -07002108bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2109 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002110 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2111 const VkAllocationCallbacks *pAllocator,
2112 VkPipeline *pPipelines, void *crtpl_state_data) const {
2113 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
2114 crtpl_state->pipe_state.reserve(count);
2115 for (uint32_t i = 0; i < count; i++) {
2116 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002117 crtpl_state->pipe_state.push_back(
2118 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002119 }
2120 return false;
2121}
2122
sourav parmarcd5fb182020-07-17 12:58:44 -07002123void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2124 VkPipelineCache pipelineCache, uint32_t count,
2125 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2126 const VkAllocationCallbacks *pAllocator,
2127 VkPipeline *pPipelines, VkResult result,
2128 void *crtpl_state_data) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002129 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
2130 // This API may create pipelines regardless of the return value
2131 for (uint32_t i = 0; i < count; i++) {
2132 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002133 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002134 pipelineMap[pPipelines[i]] = std::move((crtpl_state->pipe_state)[i]);
2135 }
2136 }
2137 crtpl_state->pipe_state.clear();
2138}
2139
locke-lunargd556cc32019-09-17 01:21:23 -06002140void ValidationStateTracker::PostCallRecordCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2141 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler,
2142 VkResult result) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002143 samplerMap[*pSampler] = std::make_shared<SAMPLER_STATE>(pSampler, pCreateInfo);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002144 if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
2145 pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
Tony-LunarG7337b312020-04-15 16:40:25 -06002146 custom_border_color_sampler_count++;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002147 }
locke-lunargd556cc32019-09-17 01:21:23 -06002148}
2149
2150void ValidationStateTracker::PostCallRecordCreateDescriptorSetLayout(VkDevice device,
2151 const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2152 const VkAllocationCallbacks *pAllocator,
2153 VkDescriptorSetLayout *pSetLayout, VkResult result) {
2154 if (VK_SUCCESS != result) return;
2155 descriptorSetLayoutMap[*pSetLayout] = std::make_shared<cvdescriptorset::DescriptorSetLayout>(pCreateInfo, *pSetLayout);
2156}
2157
locke-lunargd556cc32019-09-17 01:21:23 -06002158void ValidationStateTracker::PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
2159 const VkAllocationCallbacks *pAllocator,
2160 VkPipelineLayout *pPipelineLayout, VkResult result) {
2161 if (VK_SUCCESS != result) return;
2162
Jeremy Gebbene6e45542021-08-05 16:39:49 -06002163 pipelineLayoutMap[*pPipelineLayout] = std::make_shared<PIPELINE_LAYOUT_STATE>(this, *pPipelineLayout, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002164}
2165
2166void ValidationStateTracker::PostCallRecordCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
2167 const VkAllocationCallbacks *pAllocator,
2168 VkDescriptorPool *pDescriptorPool, VkResult result) {
2169 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002170 descriptorPoolMap[*pDescriptorPool] = std::make_shared<DESCRIPTOR_POOL_STATE>(*pDescriptorPool, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002171}
2172
2173void ValidationStateTracker::PostCallRecordResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
2174 VkDescriptorPoolResetFlags flags, VkResult result) {
2175 if (VK_SUCCESS != result) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002176 DESCRIPTOR_POOL_STATE *pool = GetDescriptorPoolState(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06002177 // TODO: validate flags
2178 // For every set off of this pool, clear it, remove from setMap, and free cvdescriptorset::DescriptorSet
John Zulauf79f06582021-02-27 18:38:39 -07002179 for (auto *ds : pool->sets) {
locke-lunargd556cc32019-09-17 01:21:23 -06002180 FreeDescriptorSet(ds);
2181 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002182 pool->sets.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06002183 // Reset available count for each type and available sets for this pool
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002184 for (auto it = pool->availableDescriptorTypeCount.begin(); it != pool->availableDescriptorTypeCount.end(); ++it) {
2185 pool->availableDescriptorTypeCount[it->first] = pool->maxDescriptorTypeCount[it->first];
locke-lunargd556cc32019-09-17 01:21:23 -06002186 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002187 pool->availableSets = pool->maxSets;
locke-lunargd556cc32019-09-17 01:21:23 -06002188}
2189
2190bool ValidationStateTracker::PreCallValidateAllocateDescriptorSets(VkDevice device,
2191 const VkDescriptorSetAllocateInfo *pAllocateInfo,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002192 VkDescriptorSet *pDescriptorSets, void *ads_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002193 // Always update common data
2194 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2195 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2196 UpdateAllocateDescriptorSetsData(pAllocateInfo, ads_state);
2197
2198 return false;
2199}
2200
2201// Allocation state was good and call down chain was made so update state based on allocating descriptor sets
2202void ValidationStateTracker::PostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
2203 VkDescriptorSet *pDescriptorSets, VkResult result,
2204 void *ads_state_data) {
2205 if (VK_SUCCESS != result) return;
2206 // All the updates are contained in a single cvdescriptorset function
2207 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2208 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2209 PerformAllocateDescriptorSets(pAllocateInfo, pDescriptorSets, ads_state);
2210}
2211
2212void ValidationStateTracker::PreCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count,
2213 const VkDescriptorSet *pDescriptorSets) {
2214 DESCRIPTOR_POOL_STATE *pool_state = GetDescriptorPoolState(descriptorPool);
2215 // Update available descriptor sets in pool
2216 pool_state->availableSets += count;
2217
2218 // For each freed descriptor add its resources back into the pool as available and remove from pool and setMap
2219 for (uint32_t i = 0; i < count; ++i) {
2220 if (pDescriptorSets[i] != VK_NULL_HANDLE) {
2221 auto descriptor_set = setMap[pDescriptorSets[i]].get();
2222 uint32_t type_index = 0, descriptor_count = 0;
2223 for (uint32_t j = 0; j < descriptor_set->GetBindingCount(); ++j) {
2224 type_index = static_cast<uint32_t>(descriptor_set->GetTypeFromIndex(j));
2225 descriptor_count = descriptor_set->GetDescriptorCountFromIndex(j);
2226 pool_state->availableDescriptorTypeCount[type_index] += descriptor_count;
2227 }
2228 FreeDescriptorSet(descriptor_set);
2229 pool_state->sets.erase(descriptor_set);
2230 }
2231 }
2232}
2233
2234void ValidationStateTracker::PreCallRecordUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
2235 const VkWriteDescriptorSet *pDescriptorWrites,
2236 uint32_t descriptorCopyCount,
2237 const VkCopyDescriptorSet *pDescriptorCopies) {
2238 cvdescriptorset::PerformUpdateDescriptorSets(this, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
2239 pDescriptorCopies);
2240}
2241
2242void ValidationStateTracker::PostCallRecordAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002243 VkCommandBuffer *pCommandBuffers, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002244 if (VK_SUCCESS != result) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002245 auto pool = GetCommandPoolShared(pCreateInfo->commandPool);
2246 if (pool) {
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06002247 pool->Allocate(pCreateInfo, pCommandBuffers);
locke-lunargfc78e932020-11-19 17:06:24 -07002248 }
2249}
2250
locke-lunargd556cc32019-09-17 01:21:23 -06002251void ValidationStateTracker::PreCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer,
2252 const VkCommandBufferBeginInfo *pBeginInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002253 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002254 if (!cb_state) return;
locke-lunargfc78e932020-11-19 17:06:24 -07002255
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002256 cb_state->Begin(pBeginInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002257}
2258
2259void ValidationStateTracker::PostCallRecordEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002260 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002261 if (!cb_state) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002262
2263 cb_state->End(result);
locke-lunargd556cc32019-09-17 01:21:23 -06002264}
2265
2266void ValidationStateTracker::PostCallRecordResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags,
2267 VkResult result) {
2268 if (VK_SUCCESS == result) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002269 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002270 cb_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002271 }
2272}
2273
2274CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) {
2275 // initially assume everything is static state
2276 CBStatusFlags flags = CBSTATUS_ALL_STATE_SET;
2277
2278 if (ds) {
2279 for (uint32_t i = 0; i < ds->dynamicStateCount; i++) {
locke-lunarg4189aa22020-10-21 00:23:48 -06002280 flags &= ~ConvertToCBStatusFlagBits(ds->pDynamicStates[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002281 }
2282 }
locke-lunargd556cc32019-09-17 01:21:23 -06002283 return flags;
2284}
2285
2286// Validation cache:
2287// CV is the bottommost implementor of this extension. Don't pass calls down.
locke-lunargd556cc32019-09-17 01:21:23 -06002288
2289void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2290 VkPipeline pipeline) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002291 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002292 assert(cb_state);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002293 cb_state->RecordCmd(CMD_BINDPIPELINE);
locke-lunargd556cc32019-09-17 01:21:23 -06002294
2295 auto pipe_state = GetPipelineState(pipeline);
2296 if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002297 const auto &create_info = pipe_state->create_info.graphics;
2298 bool rasterization_enabled = VK_FALSE == create_info.pRasterizationState->rasterizerDiscardEnable;
2299 const auto *viewport_state = create_info.pViewportState;
2300 const auto *dynamic_state = create_info.pDynamicState;
locke-lunargd556cc32019-09-17 01:21:23 -06002301 cb_state->status &= ~cb_state->static_status;
Jeremy Gebben11af9792021-08-20 10:20:09 -06002302 cb_state->static_status = MakeStaticStateMask(dynamic_state->ptr());
locke-lunargd556cc32019-09-17 01:21:23 -06002303 cb_state->status |= cb_state->static_status;
locke-lunarg4189aa22020-10-21 00:23:48 -06002304 cb_state->dynamic_status = CBSTATUS_ALL_STATE_SET & (~cb_state->static_status);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002305
2306 // Used to calculate CMD_BUFFER_STATE::usedViewportScissorCount upon draw command with this graphics pipeline.
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002307 // If rasterization disabled (no viewport/scissors used), or the actual number of viewports/scissors is dynamic (unknown at
2308 // this time), then these are set to 0 to disable this checking.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002309 auto has_dynamic_viewport_count = cb_state->dynamic_status & CBSTATUS_VIEWPORT_WITH_COUNT_SET;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002310 auto has_dynamic_scissor_count = cb_state->dynamic_status & CBSTATUS_SCISSOR_WITH_COUNT_SET;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002311 cb_state->pipelineStaticViewportCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002312 has_dynamic_viewport_count || !rasterization_enabled ? 0 : viewport_state->viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002313 cb_state->pipelineStaticScissorCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002314 has_dynamic_scissor_count || !rasterization_enabled ? 0 : viewport_state->scissorCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002315
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002316 // Trash dynamic viewport/scissor state if pipeline defines static state and enabled rasterization.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002317 // akeley98 NOTE: There's a bit of an ambiguity in the spec, whether binding such a pipeline overwrites
2318 // the entire viewport (scissor) array, or only the subsection defined by the viewport (scissor) count.
2319 // I am taking the latter interpretation based on the implementation details of NVIDIA's Vulkan driver.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002320 if (!has_dynamic_viewport_count) {
2321 cb_state->trashedViewportCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002322 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_VIEWPORT_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002323 cb_state->trashedViewportMask |= (uint32_t(1) << viewport_state->viewportCount) - 1u;
2324 // should become = ~uint32_t(0) if the other interpretation is correct.
2325 }
2326 }
2327 if (!has_dynamic_scissor_count) {
2328 cb_state->trashedScissorCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002329 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_SCISSOR_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002330 cb_state->trashedScissorMask |= (uint32_t(1) << viewport_state->scissorCount) - 1u;
2331 // should become = ~uint32_t(0) if the other interpretation is correct.
2332 }
2333 }
locke-lunargd556cc32019-09-17 01:21:23 -06002334 }
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002335 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
2336 cb_state->lastBound[lv_bind_point].pipeline_state = pipe_state;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002337 if (!disabled[command_buffer_state]) {
2338 cb_state->AddChild(pipe_state);
2339 }
locke-lunargb8be8222020-10-20 00:34:37 -06002340 for (auto &slot : pipe_state->active_slots) {
2341 for (auto &req : slot.second) {
2342 for (auto &sampler : req.second.samplers_used_by_image) {
2343 for (auto &des : sampler) {
2344 des.second = nullptr;
2345 }
2346 }
2347 }
2348 }
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06002349 cb_state->lastBound[lv_bind_point].UpdateSamplerDescriptorsUsedByImage();
locke-lunargd556cc32019-09-17 01:21:23 -06002350}
2351
2352void ValidationStateTracker::PreCallRecordCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2353 uint32_t viewportCount, const VkViewport *pViewports) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002354 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002355 cb_state->RecordStateCmd(CMD_SETVIEWPORT, CBSTATUS_VIEWPORT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002356 uint32_t bits = ((1u << viewportCount) - 1u) << firstViewport;
2357 cb_state->viewportMask |= bits;
2358 cb_state->trashedViewportMask &= ~bits;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002359
2360 cb_state->dynamicViewports.resize(std::max(size_t(firstViewport + viewportCount), cb_state->dynamicViewports.size()));
2361 for (size_t i = 0; i < viewportCount; ++i) {
2362 cb_state->dynamicViewports[firstViewport + i] = pViewports[i];
2363 }
locke-lunargd556cc32019-09-17 01:21:23 -06002364}
2365
2366void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
2367 uint32_t exclusiveScissorCount,
2368 const VkRect2D *pExclusiveScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002369 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002370 cb_state->RecordStateCmd(CMD_SETEXCLUSIVESCISSORNV, CBSTATUS_EXCLUSIVE_SCISSOR_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002371 // TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
2372 // cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
locke-lunargd556cc32019-09-17 01:21:23 -06002373}
2374
2375void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
2376 VkImageLayout imageLayout) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002377 if (disabled[command_buffer_state]) return;
2378
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002379 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002380 cb_state->RecordCmd(CMD_BINDSHADINGRATEIMAGENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002381
2382 if (imageView != VK_NULL_HANDLE) {
2383 auto view_state = GetImageViewState(imageView);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002384 cb_state->AddChild(view_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002385 }
2386}
2387
2388void ValidationStateTracker::PreCallRecordCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2389 uint32_t viewportCount,
2390 const VkShadingRatePaletteNV *pShadingRatePalettes) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002391 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002392 cb_state->RecordStateCmd(CMD_SETVIEWPORTSHADINGRATEPALETTENV, CBSTATUS_SHADING_RATE_PALETTE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002393 // TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
2394 // cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
locke-lunargd556cc32019-09-17 01:21:23 -06002395}
2396
2397void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
2398 const VkAccelerationStructureCreateInfoNV *pCreateInfo,
2399 const VkAllocationCallbacks *pAllocator,
2400 VkAccelerationStructureNV *pAccelerationStructure,
2401 VkResult result) {
2402 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002403 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002404
2405 // Query the requirements in case the application doesn't (to avoid bind/validation time query)
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002406 auto as_memory_requirements_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002407 as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002408 as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002409 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &as_memory_requirements_info, &as_state->memory_requirements);
2410
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002411 auto scratch_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002412 scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002413 scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002414 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &scratch_memory_req_info,
2415 &as_state->build_scratch_memory_requirements);
2416
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002417 auto update_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002418 update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002419 update_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002420 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
2421 &as_state->update_scratch_memory_requirements);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002422 as_state->allocator = pAllocator;
locke-lunargd556cc32019-09-17 01:21:23 -06002423 accelerationStructureMap[*pAccelerationStructure] = std::move(as_state);
2424}
2425
Jeff Bolz95176d02020-04-01 00:36:16 -05002426void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
2427 const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
2428 const VkAllocationCallbacks *pAllocator,
2429 VkAccelerationStructureKHR *pAccelerationStructure,
2430 VkResult result) {
2431 if (VK_SUCCESS != result) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002432 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE_KHR>(*pAccelerationStructure, pCreateInfo);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002433 as_state->allocator = pAllocator;
sourav parmarcd5fb182020-07-17 12:58:44 -07002434 accelerationStructureMap_khr[*pAccelerationStructure] = std::move(as_state);
Jeff Bolz95176d02020-04-01 00:36:16 -05002435}
2436
sourav parmarcd5fb182020-07-17 12:58:44 -07002437void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresKHR(
2438 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2439 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002440 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002441 if (cb_state == nullptr) {
2442 return;
2443 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002444 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002445 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002446 auto *dst_as_state = GetAccelerationStructureStateKHR(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002447 if (dst_as_state != nullptr) {
2448 dst_as_state->built = true;
2449 dst_as_state->build_info_khr.initialize(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002450 if (!disabled[command_buffer_state]) {
2451 cb_state->AddChild(dst_as_state);
2452 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002453 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002454 if (!disabled[command_buffer_state]) {
2455 auto *src_as_state = GetAccelerationStructureStateKHR(pInfos[i].srcAccelerationStructure);
2456 if (src_as_state != nullptr) {
2457 cb_state->AddChild(src_as_state);
2458 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002459 }
2460 }
2461 cb_state->hasBuildAccelerationStructureCmd = true;
2462}
2463
2464void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresIndirectKHR(
2465 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2466 const VkDeviceAddress *pIndirectDeviceAddresses, const uint32_t *pIndirectStrides,
2467 const uint32_t *const *ppMaxPrimitiveCounts) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002468 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002469 if (cb_state == nullptr) {
2470 return;
2471 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002472 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESINDIRECTKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002473 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002474 auto *dst_as_state = GetAccelerationStructureStateKHR(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002475 if (dst_as_state != nullptr) {
2476 dst_as_state->built = true;
2477 dst_as_state->build_info_khr.initialize(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002478 if (!disabled[command_buffer_state]) {
2479 cb_state->AddChild(dst_as_state);
2480 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002481 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002482 if (!disabled[command_buffer_state]) {
2483 auto *src_as_state = GetAccelerationStructureStateKHR(pInfos[i].srcAccelerationStructure);
2484 if (src_as_state != nullptr) {
2485 cb_state->AddChild(src_as_state);
2486 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002487 }
2488 }
2489 cb_state->hasBuildAccelerationStructureCmd = true;
2490}
locke-lunargd556cc32019-09-17 01:21:23 -06002491void ValidationStateTracker::PostCallRecordGetAccelerationStructureMemoryRequirementsNV(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002492 VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV *pInfo, VkMemoryRequirements2 *pMemoryRequirements) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002493 ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureStateNV(pInfo->accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002494 if (as_state != nullptr) {
2495 if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV) {
2496 as_state->memory_requirements = *pMemoryRequirements;
2497 as_state->memory_requirements_checked = true;
2498 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV) {
2499 as_state->build_scratch_memory_requirements = *pMemoryRequirements;
2500 as_state->build_scratch_memory_requirements_checked = true;
2501 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV) {
2502 as_state->update_scratch_memory_requirements = *pMemoryRequirements;
2503 as_state->update_scratch_memory_requirements_checked = true;
2504 }
2505 }
2506}
2507
sourav parmarcd5fb182020-07-17 12:58:44 -07002508void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
2509 VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002510 if (VK_SUCCESS != result) return;
2511 for (uint32_t i = 0; i < bindInfoCount; i++) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002512 const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
locke-lunargd556cc32019-09-17 01:21:23 -06002513
sourav parmarcd5fb182020-07-17 12:58:44 -07002514 ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureStateNV(info.accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002515 if (as_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002516 // Track objects tied to memory
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002517 auto mem_state = GetDevMemShared(info.memory);
2518 if (mem_state) {
2519 as_state->SetMemBinding(mem_state, info.memoryOffset);
2520 }
locke-lunargd556cc32019-09-17 01:21:23 -06002521
2522 // GPU validation of top level acceleration structure building needs acceleration structure handles.
Jeff Bolz95176d02020-04-01 00:36:16 -05002523 // XXX TODO: Query device address for KHR extension
sourav parmarcd5fb182020-07-17 12:58:44 -07002524 if (enabled[gpu_validation]) {
locke-lunargd556cc32019-09-17 01:21:23 -06002525 DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
2526 }
2527 }
2528 }
2529}
2530
2531void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
2532 VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
2533 VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002534 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002535 if (cb_state == nullptr) {
2536 return;
2537 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002538 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002539
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002540 auto *dst_as_state = GetAccelerationStructureStateNV(dst);
locke-lunargd556cc32019-09-17 01:21:23 -06002541 if (dst_as_state != nullptr) {
2542 dst_as_state->built = true;
2543 dst_as_state->build_info.initialize(pInfo);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002544 if (!disabled[command_buffer_state]) {
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002545 cb_state->AddChild(dst_as_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002546 }
locke-lunargd556cc32019-09-17 01:21:23 -06002547 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002548 if (!disabled[command_buffer_state]) {
2549 auto *src_as_state = GetAccelerationStructureStateNV(src);
2550 if (src_as_state != nullptr) {
2551 cb_state->AddChild(src_as_state);
2552 }
locke-lunargd556cc32019-09-17 01:21:23 -06002553 }
2554 cb_state->hasBuildAccelerationStructureCmd = true;
2555}
2556
2557void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureNV(VkCommandBuffer commandBuffer,
2558 VkAccelerationStructureNV dst,
2559 VkAccelerationStructureNV src,
2560 VkCopyAccelerationStructureModeNV mode) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002561 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002562 if (cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002563 ACCELERATION_STRUCTURE_STATE *src_as_state = GetAccelerationStructureStateNV(src);
2564 ACCELERATION_STRUCTURE_STATE *dst_as_state = GetAccelerationStructureStateNV(dst);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002565 if (!disabled[command_buffer_state]) {
2566 cb_state->RecordTransferCmd(CMD_COPYACCELERATIONSTRUCTURENV, src_as_state, dst_as_state);
2567 }
locke-lunargd556cc32019-09-17 01:21:23 -06002568 if (dst_as_state != nullptr && src_as_state != nullptr) {
2569 dst_as_state->built = true;
2570 dst_as_state->build_info = src_as_state->build_info;
locke-lunargd556cc32019-09-17 01:21:23 -06002571 }
2572 }
2573}
2574
Jeff Bolz95176d02020-04-01 00:36:16 -05002575void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
2576 VkAccelerationStructureKHR accelerationStructure,
2577 const VkAllocationCallbacks *pAllocator) {
locke-lunargd556cc32019-09-17 01:21:23 -06002578 if (!accelerationStructure) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002579 auto *as_state = GetAccelerationStructureStateKHR(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002580 if (as_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002581 as_state->Destroy();
sourav parmarcd5fb182020-07-17 12:58:44 -07002582 accelerationStructureMap_khr.erase(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002583 }
2584}
2585
Jeff Bolz95176d02020-04-01 00:36:16 -05002586void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
2587 VkAccelerationStructureNV accelerationStructure,
2588 const VkAllocationCallbacks *pAllocator) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002589 if (!accelerationStructure) return;
2590 auto *as_state = GetAccelerationStructureStateNV(accelerationStructure);
2591 if (as_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002592 as_state->Destroy();
sourav parmarcd5fb182020-07-17 12:58:44 -07002593 accelerationStructureMap.erase(accelerationStructure);
2594 }
Jeff Bolz95176d02020-04-01 00:36:16 -05002595}
2596
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002597void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2598 uint32_t viewportCount,
2599 const VkViewportWScalingNV *pViewportWScalings) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002600 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002601 cb_state->RecordStateCmd(CMD_SETVIEWPORTWSCALINGNV, CBSTATUS_VIEWPORT_W_SCALING_SET);
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002602}
2603
locke-lunargd556cc32019-09-17 01:21:23 -06002604void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002605 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002606 cb_state->RecordStateCmd(CMD_SETLINEWIDTH, CBSTATUS_LINE_WIDTH_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002607}
2608
2609void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
2610 uint16_t lineStipplePattern) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002611 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002612 cb_state->RecordStateCmd(CMD_SETLINESTIPPLEEXT, CBSTATUS_LINE_STIPPLE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002613}
2614
2615void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
2616 float depthBiasClamp, float depthBiasSlopeFactor) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002617 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002618 cb_state->RecordStateCmd(CMD_SETDEPTHBIAS, CBSTATUS_DEPTH_BIAS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002619}
2620
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002621void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
2622 const VkRect2D *pScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002623 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002624 cb_state->RecordStateCmd(CMD_SETSCISSOR, CBSTATUS_SCISSOR_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002625 uint32_t bits = ((1u << scissorCount) - 1u) << firstScissor;
2626 cb_state->scissorMask |= bits;
2627 cb_state->trashedScissorMask &= ~bits;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002628}
2629
locke-lunargd556cc32019-09-17 01:21:23 -06002630void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002631 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002632 cb_state->RecordStateCmd(CMD_SETBLENDCONSTANTS, CBSTATUS_BLEND_CONSTANTS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002633}
2634
2635void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
2636 float maxDepthBounds) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002637 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002638 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDS, CBSTATUS_DEPTH_BOUNDS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002639}
2640
2641void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2642 uint32_t compareMask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002643 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002644 cb_state->RecordStateCmd(CMD_SETSTENCILCOMPAREMASK, CBSTATUS_STENCIL_READ_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002645}
2646
2647void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2648 uint32_t writeMask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002649 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002650 cb_state->RecordStateCmd(CMD_SETSTENCILWRITEMASK, CBSTATUS_STENCIL_WRITE_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002651}
2652
2653void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2654 uint32_t reference) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002655 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002656 cb_state->RecordStateCmd(CMD_SETSTENCILREFERENCE, CBSTATUS_STENCIL_REFERENCE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002657}
2658
locke-lunargd556cc32019-09-17 01:21:23 -06002659
2660// Update the bound state for the bind point, including the effects of incompatible pipeline layouts
2661void ValidationStateTracker::PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2662 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2663 uint32_t firstSet, uint32_t setCount,
2664 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2665 const uint32_t *pDynamicOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002666 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002667 cb_state->RecordCmd(CMD_BINDDESCRIPTORSETS);
locke-lunargd556cc32019-09-17 01:21:23 -06002668 auto pipeline_layout = GetPipelineLayout(layout);
2669
2670 // Resize binding arrays
2671 uint32_t last_set_index = firstSet + setCount - 1;
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002672 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
2673 if (last_set_index >= cb_state->lastBound[lv_bind_point].per_set.size()) {
2674 cb_state->lastBound[lv_bind_point].per_set.resize(last_set_index + 1);
locke-lunargd556cc32019-09-17 01:21:23 -06002675 }
2676
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002677 cb_state->UpdateLastBoundDescriptorSets(pipelineBindPoint, pipeline_layout, firstSet, setCount, pDescriptorSets, nullptr,
2678 dynamicOffsetCount, pDynamicOffsets);
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002679 cb_state->lastBound[lv_bind_point].pipeline_layout = layout;
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06002680 cb_state->lastBound[lv_bind_point].UpdateSamplerDescriptorsUsedByImage();
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002681}
2682
locke-lunargd556cc32019-09-17 01:21:23 -06002683void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
2684 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2685 uint32_t set, uint32_t descriptorWriteCount,
2686 const VkWriteDescriptorSet *pDescriptorWrites) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002687 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002688 auto pipeline_layout = GetPipelineLayout(layout);
2689 cb_state->PushDescriptorSetState(pipelineBindPoint, pipeline_layout, set, descriptorWriteCount, pDescriptorWrites);
locke-lunargd556cc32019-09-17 01:21:23 -06002690}
2691
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002692void ValidationStateTracker::PostCallRecordCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2693 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2694 const void *pValues) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002695 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002696 if (cb_state != nullptr) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002697 cb_state->RecordCmd(CMD_PUSHCONSTANTS);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002698 cb_state->ResetPushConstantDataIfIncompatible(GetPipelineLayout(layout));
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002699
2700 auto &push_constant_data = cb_state->push_constant_data;
2701 assert((offset + size) <= static_cast<uint32_t>(push_constant_data.size()));
2702 std::memcpy(push_constant_data.data() + offset, pValues, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002703 cb_state->push_constant_pipeline_layout_set = layout;
2704
2705 auto flags = stageFlags;
2706 uint32_t bit_shift = 0;
2707 while (flags) {
2708 if (flags & 1) {
2709 VkShaderStageFlagBits flag = static_cast<VkShaderStageFlagBits>(1 << bit_shift);
2710 const auto it = cb_state->push_constant_data_update.find(flag);
2711
2712 if (it != cb_state->push_constant_data_update.end()) {
locke-lunarg3d8b8f32020-10-26 17:04:16 -06002713 std::memset(it->second.data() + offset, PC_Byte_Updated, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002714 }
2715 }
2716 flags = flags >> 1;
2717 ++bit_shift;
2718 }
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002719 }
2720}
2721
locke-lunargd556cc32019-09-17 01:21:23 -06002722void ValidationStateTracker::PreCallRecordCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2723 VkIndexType indexType) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002724 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002725
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002726 cb_state->RecordStateCmd(CMD_BINDINDEXBUFFER, CBSTATUS_INDEX_BUFFER_BOUND);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002727 cb_state->index_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(buffer);
2728 cb_state->index_buffer_binding.size = cb_state->index_buffer_binding.buffer_state->createInfo.size;
locke-lunargd556cc32019-09-17 01:21:23 -06002729 cb_state->index_buffer_binding.offset = offset;
2730 cb_state->index_buffer_binding.index_type = indexType;
2731 // Add binding for this index buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002732 if (!disabled[command_buffer_state]) {
2733 cb_state->AddChild(cb_state->index_buffer_binding.buffer_state.get());
2734 }
locke-lunargd556cc32019-09-17 01:21:23 -06002735}
2736
2737void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2738 uint32_t bindingCount, const VkBuffer *pBuffers,
2739 const VkDeviceSize *pOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002740 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002741 cb_state->RecordCmd(CMD_BINDVERTEXBUFFERS);
locke-lunargd556cc32019-09-17 01:21:23 -06002742
2743 uint32_t end = firstBinding + bindingCount;
2744 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
2745 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
2746 }
2747
2748 for (uint32_t i = 0; i < bindingCount; ++i) {
2749 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
locke-lunarg1ae57d62020-11-18 10:49:19 -07002750 vertex_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(pBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002751 vertex_buffer_binding.offset = pOffsets[i];
Piers Daniell39842ee2020-07-10 16:42:33 -06002752 vertex_buffer_binding.size = VK_WHOLE_SIZE;
2753 vertex_buffer_binding.stride = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06002754 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002755 if (pBuffers[i] && !disabled[command_buffer_state]) {
2756 cb_state->AddChild(vertex_buffer_binding.buffer_state.get());
Jeff Bolz165818a2020-05-08 11:19:03 -05002757 }
locke-lunargd556cc32019-09-17 01:21:23 -06002758 }
2759}
2760
2761void ValidationStateTracker::PostCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
2762 VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002763 if (disabled[command_buffer_state]) return;
2764
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002765 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002766 cb_state->RecordTransferCmd(CMD_UPDATEBUFFER, GetBufferState(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -06002767}
2768
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002769void ValidationStateTracker::PreCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2770 VkPipelineStageFlags stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002771 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2772 cb_state->RecordSetEvent(CMD_SETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002773}
2774
2775void ValidationStateTracker::PreCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2776 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002777 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002778 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
2779
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002780 cb_state->RecordSetEvent(CMD_SETEVENT2KHR, event, stage_masks.src);
2781 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002782}
2783
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002784void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2785 VkPipelineStageFlags stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002786 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2787 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002788}
2789
2790void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2791 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002792 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2793 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002794}
2795
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002796void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2797 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
2798 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2799 uint32_t bufferMemoryBarrierCount,
2800 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2801 uint32_t imageMemoryBarrierCount,
2802 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002803 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2804 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents);
2805 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2806 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002807}
2808
2809void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
2810 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002811 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2812 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, eventCount, pEvents);
Jeremy Gebben79649152021-06-22 14:46:24 -06002813 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002814 cb_state->RecordBarriers(pDependencyInfos[i]);
Jeremy Gebben79649152021-06-22 14:46:24 -06002815 }
2816}
2817
2818void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2819 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2820 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2821 uint32_t bufferMemoryBarrierCount,
2822 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2823 uint32_t imageMemoryBarrierCount,
2824 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002825 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2826 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
2827 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2828 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06002829}
2830
2831void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
2832 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002833 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2834 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
2835 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06002836}
2837
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02002838QueryState ValidationStateTracker::GetQueryState(const QueryMap *localQueryToStateMap, VkQueryPool queryPool, uint32_t queryIndex,
2839 uint32_t perfPass) const {
2840 QueryObject query = QueryObject(QueryObject(queryPool, queryIndex), perfPass);
locke-lunargd556cc32019-09-17 01:21:23 -06002841
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02002842 auto iter = localQueryToStateMap->find(query);
2843 if (iter != localQueryToStateMap->end()) return iter->second;
Jeff Bolz310775c2019-10-09 00:46:33 -05002844
Jeff Bolz310775c2019-10-09 00:46:33 -05002845 return QUERYSTATE_UNKNOWN;
locke-lunargd556cc32019-09-17 01:21:23 -06002846}
2847
locke-lunargd556cc32019-09-17 01:21:23 -06002848void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
2849 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002850 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002851
locke-lunargd556cc32019-09-17 01:21:23 -06002852 QueryObject query = {queryPool, slot};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002853 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002854 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002855 if (!disabled[query_validation]) {
2856 cb_state->BeginQuery(query);
2857 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002858 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002859 auto pool_state = GetQueryPoolState(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002860 cb_state->AddChild(pool_state);
2861 }
locke-lunargd556cc32019-09-17 01:21:23 -06002862}
2863
2864void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002865 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002866 QueryObject query_obj = {queryPool, slot};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002867 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002868 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002869 if (!disabled[query_validation]) {
2870 cb_state->EndQuery(query_obj);
2871 }
2872 if (!disabled[command_buffer_state]) {
2873 auto pool_state = GetQueryPoolState(query_obj.pool);
2874 cb_state->AddChild(pool_state);
2875 }
locke-lunargd556cc32019-09-17 01:21:23 -06002876}
2877
2878void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2879 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002880 if (disabled[query_validation]) return;
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002881 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002882
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002883 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002884 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02002885
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002886 if (!disabled[command_buffer_state]) {
2887 auto pool_state = GetQueryPoolState(queryPool);
2888 cb_state->AddChild(pool_state);
2889 }
locke-lunargd556cc32019-09-17 01:21:23 -06002890}
2891
2892void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2893 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
2894 VkDeviceSize dstOffset, VkDeviceSize stride,
2895 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002896 if (disabled[query_validation] || disabled[command_buffer_state]) return;
2897
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002898 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002899 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
locke-lunargd556cc32019-09-17 01:21:23 -06002900 auto dst_buff_state = GetBufferState(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002901 cb_state->AddChild(dst_buff_state);
Jeff Bolzadbfa852019-10-04 13:53:30 -05002902 auto pool_state = GetQueryPoolState(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002903 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002904}
2905
2906void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2907 VkQueryPool queryPool, uint32_t slot) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002908 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2909 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002910}
2911
2912void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
2913 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
2914 uint32_t slot) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002915 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2916 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06002917}
2918
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002919void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
2920 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
2921 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
2922 if (disabled[query_validation]) return;
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002923 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002924 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002925 if (!disabled[command_buffer_state]) {
2926 auto pool_state = GetQueryPoolState(queryPool);
2927 cb_state->AddChild(pool_state);
2928 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002929 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002930}
2931
locke-lunargd556cc32019-09-17 01:21:23 -06002932void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2933 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
2934 VkResult result) {
2935 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002936
Jeremy Gebben88f58142021-06-01 10:07:52 -06002937 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08002938 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002939 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002940
locke-lunargd556cc32019-09-17 01:21:23 -06002941 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002942 views[i] = GetShared<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002943 }
2944 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06002945
2946 frameBufferMap[*pFramebuffer] = std::make_shared<FRAMEBUFFER_STATE>(
2947 *pFramebuffer, pCreateInfo, GetRenderPassShared(pCreateInfo->renderPass), std::move(views));
locke-lunargd556cc32019-09-17 01:21:23 -06002948}
2949
locke-lunargd556cc32019-09-17 01:21:23 -06002950void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2951 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2952 VkResult result) {
2953 if (VK_SUCCESS != result) return;
Jeremy Gebben88f58142021-06-01 10:07:52 -06002954 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002955}
2956
Mike Schuchardt2df08912020-12-15 16:28:09 -08002957void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002958 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2959 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002960 if (VK_SUCCESS != result) return;
2961
2962 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
Tony-LunarG977448c2019-12-02 14:52:02 -07002963}
2964
Mike Schuchardt2df08912020-12-15 16:28:09 -08002965void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002966 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2967 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002968 if (VK_SUCCESS != result) return;
2969
2970 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
Tony-LunarG977448c2019-12-02 14:52:02 -07002971}
2972
locke-lunargd556cc32019-09-17 01:21:23 -06002973void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
2974 const VkRenderPassBeginInfo *pRenderPassBegin,
2975 VkSubpassContents contents) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002976 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2977 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002978}
2979
2980void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
2981 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08002982 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002983 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07002984 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06002985}
2986
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002987void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2988 uint32_t counterBufferCount,
2989 const VkBuffer *pCounterBuffers,
2990 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002991 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002992
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002993 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06002994 cb_state->transform_feedback_active = true;
2995}
2996
2997void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
2998 uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
2999 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003000 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003001
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003002 cb_state->RecordCmd(CMD_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003003 cb_state->transform_feedback_active = false;
3004}
3005
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003006void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
3007 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebbenc8b51a92021-08-16 15:19:00 -06003008 auto *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003009
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003010 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003011 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02003012 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
3013 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003014}
3015
3016void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenc8b51a92021-08-16 15:19:00 -06003017 auto *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003018
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003019 cb_state->RecordCmd(CMD_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003020 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02003021 cb_state->conditional_rendering_inside_render_pass = false;
3022 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003023}
3024
Tony-LunarG977448c2019-12-02 14:52:02 -07003025void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
3026 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003027 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003028 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3029 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07003030}
3031
locke-lunargd556cc32019-09-17 01:21:23 -06003032
3033void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003034 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3035 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003036}
3037
3038void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003039 const VkSubpassBeginInfo *pSubpassBeginInfo,
3040 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003041 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003042 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003043}
3044
Tony-LunarG977448c2019-12-02 14:52:02 -07003045void ValidationStateTracker::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003046 const VkSubpassBeginInfo *pSubpassBeginInfo,
3047 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003048 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003049 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003050}
3051
3052void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003053 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3054 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06003055}
3056
3057void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003058 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003059 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003060 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06003061}
3062
Tony-LunarG977448c2019-12-02 14:52:02 -07003063void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003064 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003065 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3066 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07003067}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003068
locke-lunargd556cc32019-09-17 01:21:23 -06003069void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
3070 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003071 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003072
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003073 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06003074}
3075
3076void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
3077 VkFlags flags, void **ppData, VkResult result) {
3078 if (VK_SUCCESS != result) return;
3079 RecordMappedMemory(mem, offset, size, ppData);
3080}
3081
3082void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
3083 auto mem_info = GetDevMemState(mem);
3084 if (mem_info) {
3085 mem_info->mapped_range = MemRange();
3086 mem_info->p_driver_data = nullptr;
3087 }
3088}
3089
3090void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben8ee02af2021-07-16 10:15:55 -06003091 auto image_state = GetShared<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06003092 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06003093 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
3094 // See: VUID-vkGetImageSubresourceLayout-image-01895
3095 image_state->fragment_encoder =
3096 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07003097 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003098 if (swapchain_info) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003099 auto swapchain = GetShared<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003100 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003101 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07003102
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003103 if (!swapchain_image.fake_base_address) {
3104 auto size = image_state->fragment_encoder->TotalSize();
3105 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06003106 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003107 // All images bound to this swapchain and index are aliases
3108 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003109 }
3110 } else {
3111 // Track bound memory range information
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003112 auto mem_info = GetDevMemShared(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06003113 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003114 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06003115 }
locke-lunargd556cc32019-09-17 01:21:23 -06003116 }
locke-lunargd556cc32019-09-17 01:21:23 -06003117 }
3118}
3119
3120void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
3121 VkDeviceSize memoryOffset, VkResult result) {
3122 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06003123 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003124 bind_info.image = image;
3125 bind_info.memory = mem;
3126 bind_info.memoryOffset = memoryOffset;
3127 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003128}
3129
3130void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003131 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003132 if (VK_SUCCESS != result) return;
3133 for (uint32_t i = 0; i < bindInfoCount; i++) {
3134 UpdateBindImageMemoryState(pBindInfos[i]);
3135 }
3136}
3137
3138void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003139 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003140 if (VK_SUCCESS != result) return;
3141 for (uint32_t i = 0; i < bindInfoCount; i++) {
3142 UpdateBindImageMemoryState(pBindInfos[i]);
3143 }
3144}
3145
3146void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
3147 auto event_state = GetEventState(event);
3148 if (event_state) {
3149 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
3150 }
locke-lunargd556cc32019-09-17 01:21:23 -06003151}
3152
3153void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
3154 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
3155 VkResult result) {
3156 if (VK_SUCCESS != result) return;
3157 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
3158 pImportSemaphoreFdInfo->flags);
3159}
3160
3161void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003162 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
locke-lunargd556cc32019-09-17 01:21:23 -06003163 SEMAPHORE_STATE *semaphore_state = GetSemaphoreState(semaphore);
Mike Schuchardt2df08912020-12-15 16:28:09 -08003164 if (semaphore_state && handle_type != VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06003165 // Cannot track semaphore state once it is exported, except for Sync FD handle types which have copy transference
3166 semaphore_state->scope = kSyncScopeExternalPermanent;
3167 }
3168}
3169
3170#ifdef VK_USE_PLATFORM_WIN32_KHR
3171void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
3172 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
3173 if (VK_SUCCESS != result) return;
3174 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
3175 pImportSemaphoreWin32HandleInfo->flags);
3176}
3177
3178void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
3179 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3180 HANDLE *pHandle, VkResult result) {
3181 if (VK_SUCCESS != result) return;
3182 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
3183}
3184
3185void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
3186 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
3187 if (VK_SUCCESS != result) return;
3188 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
3189 pImportFenceWin32HandleInfo->flags);
3190}
3191
3192void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
3193 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3194 HANDLE *pHandle, VkResult result) {
3195 if (VK_SUCCESS != result) return;
3196 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
3197}
3198#endif
3199
3200void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
3201 VkResult result) {
3202 if (VK_SUCCESS != result) return;
3203 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
3204}
3205
Mike Schuchardt2df08912020-12-15 16:28:09 -08003206void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
3207 VkFenceImportFlags flags) {
locke-lunargd556cc32019-09-17 01:21:23 -06003208 FENCE_STATE *fence_node = GetFenceState(fence);
3209 if (fence_node && fence_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08003210 if ((handle_type == VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_FENCE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06003211 fence_node->scope == kSyncScopeInternal) {
3212 fence_node->scope = kSyncScopeExternalTemporary;
3213 } else {
3214 fence_node->scope = kSyncScopeExternalPermanent;
3215 }
3216 }
3217}
3218
3219void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
3220 VkResult result) {
3221 if (VK_SUCCESS != result) return;
3222 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
3223}
3224
Mike Schuchardt2df08912020-12-15 16:28:09 -08003225void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
locke-lunargd556cc32019-09-17 01:21:23 -06003226 FENCE_STATE *fence_state = GetFenceState(fence);
3227 if (fence_state) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08003228 if (handle_type != VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06003229 // Export with reference transference becomes external
3230 fence_state->scope = kSyncScopeExternalPermanent;
3231 } else if (fence_state->scope == kSyncScopeInternal) {
3232 // Export with copy transference has a side effect of resetting the fence
3233 fence_state->state = FENCE_UNSIGNALED;
3234 }
3235 }
3236}
3237
3238void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3239 VkResult result) {
3240 if (VK_SUCCESS != result) return;
3241 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3242}
3243
3244void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3245 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3246 if (VK_SUCCESS != result) return;
John Zulaufd5115702021-01-18 12:34:33 -07003247 const auto event = *pEvent;
Jeremy Gebbencbf22862021-03-03 12:01:22 -07003248 eventMap.emplace(event, std::make_shared<EVENT_STATE>(event, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003249}
3250
3251void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003252 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003253 SWAPCHAIN_NODE *old_swapchain_state) {
3254 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003255 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003256 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003257 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003258 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3259 surface_state->AddParent(swapchain.get());
3260 surface_state->swapchain = swapchain.get();
3261 swapchain->surface = std::move(surface_state);
3262 swapchainMap[*pSwapchain] = std::move(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003263 } else {
3264 surface_state->swapchain = nullptr;
3265 }
3266 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003267 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003268 if (old_swapchain_state) {
3269 old_swapchain_state->retired = true;
3270 }
3271 return;
3272}
3273
3274void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3275 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3276 VkResult result) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003277 auto surface_state = GetShared<SURFACE_STATE>(pCreateInfo->surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003278 auto old_swapchain_state = GetSwapchainState(pCreateInfo->oldSwapchain);
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003279 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003280}
3281
3282void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3283 const VkAllocationCallbacks *pAllocator) {
3284 if (!swapchain) return;
3285 auto swapchain_data = GetSwapchainState(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003286 if (!swapchain_data) return;
John Zulauffaa7a522021-03-05 12:22:45 -07003287
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003288 swapchain_data->Destroy();
3289 swapchainMap.erase(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003290}
3291
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003292void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3293 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3294 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3295 VkResult result) {
3296 if (VK_SUCCESS != result) return;
3297 if (!pMode) return;
Jeremy Gebben5573a8c2021-06-04 08:55:10 -06003298 display_mode_map[*pMode] = std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice);
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003299}
3300
locke-lunargd556cc32019-09-17 01:21:23 -06003301void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
3302 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3303 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003304 auto semaphore_state = GetSemaphoreState(pPresentInfo->pWaitSemaphores[i]);
3305 if (semaphore_state) {
Jeremy Gebben57642982021-09-14 14:14:55 -06003306 semaphore_state->signaler.queue = nullptr;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003307 semaphore_state->signaled = false;
locke-lunargd556cc32019-09-17 01:21:23 -06003308 }
3309 }
3310
Tony-LunarG6f887e52021-07-27 11:23:14 -06003311 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003312 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3313 // 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
3314 // confused itself just as much.
3315 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3316 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3317 // Mark the image as having been released to the WSI
3318 auto swapchain_data = GetSwapchainState(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003319 if (swapchain_data) {
3320 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003321 if (present_id_info) {
3322 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3323 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3324 }
3325 }
locke-lunargd556cc32019-09-17 01:21:23 -06003326 }
3327 }
3328 // Note: even though presentation is directed to a queue, there is no direct ordering between QP and subsequent work, so QP (and
3329 // its semaphore waits) /never/ participate in any completion proof.
3330}
3331
3332void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3333 const VkSwapchainCreateInfoKHR *pCreateInfos,
3334 const VkAllocationCallbacks *pAllocator,
3335 VkSwapchainKHR *pSwapchains, VkResult result) {
3336 if (pCreateInfos) {
3337 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003338 auto surface_state = GetShared<SURFACE_STATE>(pCreateInfos[i].surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003339 auto old_swapchain_state = GetSwapchainState(pCreateInfos[i].oldSwapchain);
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003340 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state), old_swapchain_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003341 }
3342 }
3343}
3344
3345void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3346 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003347 auto fence_state = GetFenceState(fence);
3348 if (fence_state && fence_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003349 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3350 // import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003351 fence_state->state = FENCE_INFLIGHT;
Jeremy Gebben57642982021-09-14 14:14:55 -06003352 fence_state->signaler.queue = nullptr; // ANI isn't on a queue, so this can't participate in a completion proof.
locke-lunargd556cc32019-09-17 01:21:23 -06003353 }
3354
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003355 auto semaphore_state = GetSemaphoreState(semaphore);
3356 if (semaphore_state && semaphore_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003357 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3358 // temporary import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003359 semaphore_state->signaled = true;
Jeremy Gebben57642982021-09-14 14:14:55 -06003360 semaphore_state->signaler.queue = nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003361 }
3362
3363 // Mark the image as acquired.
3364 auto swapchain_data = GetSwapchainState(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003365 if (swapchain_data) {
3366 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003367 }
3368}
3369
3370void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3371 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3372 VkResult result) {
3373 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3374 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3375}
3376
3377void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3378 uint32_t *pImageIndex, VkResult result) {
3379 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3380 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3381 pAcquireInfo->fence, pImageIndex);
3382}
3383
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003384std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3385 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3386}
3387
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003388void ValidationStateTracker::PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
3389 const VkAllocationCallbacks *pAllocator, VkInstance *pInstance,
3390 VkResult result) {
3391 if (result != VK_SUCCESS) {
3392 return;
3393 }
3394 uint32_t count = 0;
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003395 // this can fail if the allocator fails
3396 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, nullptr);
3397 if (result != VK_SUCCESS) {
3398 return;
3399 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003400 std::vector<VkPhysicalDevice> physdev_handles(count);
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003401 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, physdev_handles.data());
3402 if (result != VK_SUCCESS) {
3403 return;
3404 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003405
3406 physical_device_map.reserve(count);
3407 for (auto physdev : physdev_handles) {
3408 physical_device_map.emplace(physdev, CreatePhysicalDeviceState(physdev));
locke-lunargd556cc32019-09-17 01:21:23 -06003409 }
3410}
3411
3412// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003413static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003414 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003415}
3416
3417void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3418 uint32_t *pQueueFamilyPropertyCount,
3419 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003420 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3421 assert(pd_state);
3422 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003423}
3424
3425void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003426 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003427 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3428 assert(pd_state);
3429 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003430}
3431
3432void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003433 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003434 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3435 assert(pd_state);
3436 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003437}
3438void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3439 const VkAllocationCallbacks *pAllocator) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003440 if (!surface) return;
3441 auto surface_state = GetSurfaceState(surface);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003442 surface_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06003443 surface_map.erase(surface);
3444}
3445
3446void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003447 surface_map[*pSurface] = std::make_shared<SURFACE_STATE>(*pSurface);
locke-lunargd556cc32019-09-17 01:21:23 -06003448}
3449
3450void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3451 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3452 const VkAllocationCallbacks *pAllocator,
3453 VkSurfaceKHR *pSurface, VkResult result) {
3454 if (VK_SUCCESS != result) return;
3455 RecordVulkanSurface(pSurface);
3456}
3457
3458#ifdef VK_USE_PLATFORM_ANDROID_KHR
3459void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3460 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3461 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3462 VkResult result) {
3463 if (VK_SUCCESS != result) return;
3464 RecordVulkanSurface(pSurface);
3465}
3466#endif // VK_USE_PLATFORM_ANDROID_KHR
3467
3468#ifdef VK_USE_PLATFORM_IOS_MVK
3469void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3470 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3471 VkResult result) {
3472 if (VK_SUCCESS != result) return;
3473 RecordVulkanSurface(pSurface);
3474}
3475#endif // VK_USE_PLATFORM_IOS_MVK
3476
3477#ifdef VK_USE_PLATFORM_MACOS_MVK
3478void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3479 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3480 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3481 VkResult result) {
3482 if (VK_SUCCESS != result) return;
3483 RecordVulkanSurface(pSurface);
3484}
3485#endif // VK_USE_PLATFORM_MACOS_MVK
3486
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003487#ifdef VK_USE_PLATFORM_METAL_EXT
3488void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3489 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3490 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3491 VkResult result) {
3492 if (VK_SUCCESS != result) return;
3493 RecordVulkanSurface(pSurface);
3494}
3495#endif // VK_USE_PLATFORM_METAL_EXT
3496
locke-lunargd556cc32019-09-17 01:21:23 -06003497#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3498void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3499 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3500 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3501 VkResult result) {
3502 if (VK_SUCCESS != result) return;
3503 RecordVulkanSurface(pSurface);
3504}
3505#endif // VK_USE_PLATFORM_WAYLAND_KHR
3506
3507#ifdef VK_USE_PLATFORM_WIN32_KHR
3508void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3509 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
3510 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3511 VkResult result) {
3512 if (VK_SUCCESS != result) return;
3513 RecordVulkanSurface(pSurface);
3514}
3515#endif // VK_USE_PLATFORM_WIN32_KHR
3516
3517#ifdef VK_USE_PLATFORM_XCB_KHR
3518void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
3519 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3520 VkResult result) {
3521 if (VK_SUCCESS != result) return;
3522 RecordVulkanSurface(pSurface);
3523}
3524#endif // VK_USE_PLATFORM_XCB_KHR
3525
3526#ifdef VK_USE_PLATFORM_XLIB_KHR
3527void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
3528 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3529 VkResult result) {
3530 if (VK_SUCCESS != result) return;
3531 RecordVulkanSurface(pSurface);
3532}
3533#endif // VK_USE_PLATFORM_XLIB_KHR
3534
Niklas Haas8b84af12020-04-19 22:20:11 +02003535void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3536 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3537 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3538 VkResult result) {
3539 if (VK_SUCCESS != result) return;
3540 RecordVulkanSurface(pSurface);
3541}
3542
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003543void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
3544 VkSurfaceKHR surface,
3545 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities,
3546 VkResult result) {
3547 if (VK_SUCCESS != result) return;
3548 auto surface_state = Get<SURFACE_STATE>(surface);
3549 surface_state->SetCapabilities(physicalDevice, *pSurfaceCapabilities);
3550}
3551
3552void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
3553 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3554 VkSurfaceCapabilities2KHR *pSurfaceCapabilities, VkResult result) {
3555 if (VK_SUCCESS != result) return;
3556 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3557 surface_state->SetCapabilities(physicalDevice, pSurfaceCapabilities->surfaceCapabilities);
3558}
3559
3560void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice,
3561 VkSurfaceKHR surface,
3562 VkSurfaceCapabilities2EXT *pSurfaceCapabilities,
3563 VkResult result) {
3564 auto surface_state = Get<SURFACE_STATE>(surface);
3565 VkSurfaceCapabilitiesKHR caps{
3566 pSurfaceCapabilities->minImageCount, pSurfaceCapabilities->maxImageCount,
3567 pSurfaceCapabilities->currentExtent, pSurfaceCapabilities->minImageExtent,
3568 pSurfaceCapabilities->maxImageExtent, pSurfaceCapabilities->maxImageArrayLayers,
3569 pSurfaceCapabilities->supportedTransforms, pSurfaceCapabilities->currentTransform,
3570 pSurfaceCapabilities->supportedCompositeAlpha, pSurfaceCapabilities->supportedUsageFlags,
3571 };
3572 surface_state->SetCapabilities(physicalDevice, caps);
3573}
3574
locke-lunargd556cc32019-09-17 01:21:23 -06003575void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3576 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3577 VkBool32 *pSupported, VkResult result) {
3578 if (VK_SUCCESS != result) return;
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003579 auto surface_state = Get<SURFACE_STATE>(surface);
3580 surface_state->SetQueueSupport(physicalDevice, queueFamilyIndex, (*pSupported == VK_TRUE));
3581}
3582
3583void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
3584 VkSurfaceKHR surface,
3585 uint32_t *pPresentModeCount,
3586 VkPresentModeKHR *pPresentModes,
3587 VkResult result) {
3588 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3589
3590 if (pPresentModes) {
3591 auto surface_state = Get<SURFACE_STATE>(surface);
3592 surface_state->SetPresentModes(physicalDevice,
3593 std::vector<VkPresentModeKHR>(pPresentModes, pPresentModes + *pPresentModeCount));
3594 }
3595}
3596
3597void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
3598 uint32_t *pSurfaceFormatCount,
3599 VkSurfaceFormatKHR *pSurfaceFormats,
3600 VkResult result) {
3601 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3602
3603 if (pSurfaceFormats) {
3604 auto surface_state = Get<SURFACE_STATE>(surface);
3605 surface_state->SetFormats(physicalDevice,
3606 std::vector<VkSurfaceFormatKHR>(pSurfaceFormats, pSurfaceFormats + *pSurfaceFormatCount));
3607 }
3608}
3609
3610void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
3611 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3612 uint32_t *pSurfaceFormatCount,
3613 VkSurfaceFormat2KHR *pSurfaceFormats,
3614 VkResult result) {
3615 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3616
3617 if (pSurfaceFormats) {
3618 std::vector<VkSurfaceFormatKHR> fmts(*pSurfaceFormatCount);
3619 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3620 for (uint32_t i = 0; i < *pSurfaceFormatCount; i++) {
3621 fmts[i] = pSurfaceFormats[i].surfaceFormat;
3622 }
3623 surface_state->SetFormats(physicalDevice, std::move(fmts));
3624 }
locke-lunargd556cc32019-09-17 01:21:23 -06003625}
3626
locke-lunargd556cc32019-09-17 01:21:23 -06003627void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3628 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003629 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3630 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003631 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3632}
3633
3634void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003635 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3636 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003637 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3638}
3639
3640void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3641 const VkDebugUtilsLabelEXT *pLabelInfo) {
3642 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3643
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003644 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003645 cb_state->RecordCmd(CMD_INSERTDEBUGUTILSLABELEXT);
3646 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003647 cb_state->debug_label = LoggingLabel(pLabelInfo);
3648}
3649
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003650void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3651 uint32_t queueFamilyIndex,
3652 uint32_t *pCounterCount,
3653 VkPerformanceCounterKHR *pCounters) {
3654 if (NULL == pCounters) return;
3655
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003656 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3657 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003658
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003659 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3660 queue_family_counters->counters.resize(*pCounterCount);
3661 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003662
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003663 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003664}
3665
3666void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3667 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3668 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3669 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3670 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3671}
3672
3673void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3674 VkResult result) {
3675 if (result == VK_SUCCESS) performance_lock_acquired = true;
3676}
3677
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003678void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3679 performance_lock_acquired = false;
3680 for (auto &cmd_buffer : commandBufferMap) {
3681 cmd_buffer.second->performance_lock_released = true;
3682 }
3683}
3684
locke-lunargd556cc32019-09-17 01:21:23 -06003685void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003686 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003687 const VkAllocationCallbacks *pAllocator) {
3688 if (!descriptorUpdateTemplate) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003689 auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3690 template_state->destroyed = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003691 desc_template_map.erase(descriptorUpdateTemplate);
3692}
3693
3694void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003695 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003696 const VkAllocationCallbacks *pAllocator) {
3697 if (!descriptorUpdateTemplate) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003698 auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3699 template_state->destroyed = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003700 desc_template_map.erase(descriptorUpdateTemplate);
3701}
3702
Mike Schuchardt2df08912020-12-15 16:28:09 -08003703void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3704 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
locke-lunargd556cc32019-09-17 01:21:23 -06003705 safe_VkDescriptorUpdateTemplateCreateInfo local_create_info(pCreateInfo);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003706 auto template_state = std::make_shared<TEMPLATE_STATE>(*pDescriptorUpdateTemplate, &local_create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003707 desc_template_map[*pDescriptorUpdateTemplate] = std::move(template_state);
3708}
3709
Mike Schuchardt2df08912020-12-15 16:28:09 -08003710void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3711 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3712 const VkAllocationCallbacks *pAllocator,
3713 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3714 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003715 if (VK_SUCCESS != result) return;
3716 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3717}
3718
3719void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003720 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3721 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003722 if (VK_SUCCESS != result) return;
3723 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3724}
3725
3726void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003727 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003728 const void *pData) {
3729 auto const template_map_entry = desc_template_map.find(descriptorUpdateTemplate);
3730 if ((template_map_entry == desc_template_map.end()) || (template_map_entry->second.get() == nullptr)) {
3731 assert(0);
3732 } else {
3733 const TEMPLATE_STATE *template_state = template_map_entry->second.get();
3734 // TODO: Record template push descriptor updates
3735 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
3736 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state, pData);
3737 }
3738 }
3739}
3740
3741void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3742 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3743 const void *pData) {
3744 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3745}
3746
3747void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003748 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003749 const void *pData) {
3750 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3751}
3752
Mike Schuchardt2df08912020-12-15 16:28:09 -08003753void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3754 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3755 VkPipelineLayout layout, uint32_t set,
3756 const void *pData) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003757 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003758
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003759 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
locke-lunargd556cc32019-09-17 01:21:23 -06003760 const auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3761 if (template_state) {
3762 auto layout_data = GetPipelineLayout(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003763 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003764 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003765 // Decode the template into a set of write updates
3766 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state, pData,
3767 dsl->GetDescriptorSetLayout());
3768 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data, set,
3769 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3770 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003771 }
3772}
3773
3774void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3775 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003776 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003777 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003778 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003779 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003780 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003781 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003782 }
3783}
3784
3785void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3786 uint32_t *pPropertyCount,
3787 VkDisplayPlanePropertiesKHR *pProperties,
3788 VkResult result) {
3789 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3790 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3791}
3792
3793void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3794 uint32_t *pPropertyCount,
3795 VkDisplayPlaneProperties2KHR *pProperties,
3796 VkResult result) {
3797 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3798 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3799}
3800
3801void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3802 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3803 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003804 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003805 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003806 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003807}
3808
3809void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3810 uint32_t query, uint32_t index) {
3811 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003812 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003813 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003814 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003815}
3816
3817void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3818 VkSamplerYcbcrConversion ycbcr_conversion) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003819 VkFormatFeatureFlags format_features = 0;
3820
3821 if (create_info->format != VK_FORMAT_UNDEFINED) {
3822 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07003823 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003824 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
3825 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003826 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003827
3828 samplerYcbcrConversionMap[ycbcr_conversion] =
3829 std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features);
locke-lunargd556cc32019-09-17 01:21:23 -06003830}
3831
3832void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
3833 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3834 const VkAllocationCallbacks *pAllocator,
3835 VkSamplerYcbcrConversion *pYcbcrConversion,
3836 VkResult result) {
3837 if (VK_SUCCESS != result) return;
3838 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3839}
3840
3841void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(VkDevice device,
3842 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3843 const VkAllocationCallbacks *pAllocator,
3844 VkSamplerYcbcrConversion *pYcbcrConversion,
3845 VkResult result) {
3846 if (VK_SUCCESS != result) return;
3847 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3848}
3849
sfricke-samsungbe3584f2020-04-22 14:58:06 -07003850void ValidationStateTracker::RecordDestroySamplerYcbcrConversionState(VkSamplerYcbcrConversion ycbcr_conversion) {
sfricke-samsungbe3584f2020-04-22 14:58:06 -07003851 auto ycbcr_state = GetSamplerYcbcrConversionState(ycbcr_conversion);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003852 ycbcr_state->Destroy();
sfricke-samsungbe3584f2020-04-22 14:58:06 -07003853 samplerYcbcrConversionMap.erase(ycbcr_conversion);
3854}
3855
locke-lunargd556cc32019-09-17 01:21:23 -06003856void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
3857 const VkAllocationCallbacks *pAllocator) {
3858 if (!ycbcrConversion) return;
sfricke-samsungbe3584f2020-04-22 14:58:06 -07003859 RecordDestroySamplerYcbcrConversionState(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003860}
3861
3862void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
3863 VkSamplerYcbcrConversion ycbcrConversion,
3864 const VkAllocationCallbacks *pAllocator) {
3865 if (!ycbcrConversion) return;
sfricke-samsungbe3584f2020-04-22 14:58:06 -07003866 RecordDestroySamplerYcbcrConversionState(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003867}
3868
Tony-LunarG977448c2019-12-02 14:52:02 -07003869void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3870 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06003871 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07003872 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003873
3874 // Do nothing if the query pool has been destroyed.
3875 auto query_pool_state = GetQueryPoolState(queryPool);
3876 if (!query_pool_state) return;
3877
3878 // Reset the state of existing entries.
3879 QueryObject query_obj{queryPool, 0};
3880 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
3881 for (uint32_t i = 0; i < max_query_count; ++i) {
3882 query_obj.query = firstQuery + i;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02003883 queryToStateMap[query_obj] = QUERYSTATE_RESET;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003884 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003885 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
3886 query_obj.perf_pass = pass_index;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02003887 queryToStateMap[query_obj] = QUERYSTATE_RESET;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003888 }
3889 }
locke-lunargd556cc32019-09-17 01:21:23 -06003890 }
3891}
3892
Tony-LunarG977448c2019-12-02 14:52:02 -07003893void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3894 uint32_t queryCount) {
3895 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3896}
3897
3898void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3899 uint32_t queryCount) {
3900 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3901}
3902
locke-lunargd556cc32019-09-17 01:21:23 -06003903void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
3904 const TEMPLATE_STATE *template_state, const void *pData) {
3905 // Translate the templated update into a normal update for validation...
3906 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
3907 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
3908 decoded_update.desc_writes.data(), 0, NULL);
3909}
3910
3911// Update the common AllocateDescriptorSetsData
3912void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05003913 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06003914 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeff Bolz6ae39612019-10-11 20:57:36 -05003915 auto layout = GetDescriptorSetLayoutShared(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003916 if (layout) {
3917 ds_data->layout_nodes[i] = layout;
3918 // Count total descriptors required per type
3919 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
3920 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003921 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
3922 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003923 }
3924 }
3925 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
3926 }
3927}
3928
3929// Decrement allocated sets from the pool and insert new sets into set_map
3930void ValidationStateTracker::PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *p_alloc_info,
3931 const VkDescriptorSet *descriptor_sets,
3932 const cvdescriptorset::AllocateDescriptorSetsData *ds_data) {
3933 auto pool_state = descriptorPoolMap[p_alloc_info->descriptorPool].get();
3934 // Account for sets and individual descriptors allocated from pool
3935 pool_state->availableSets -= p_alloc_info->descriptorSetCount;
3936 for (auto it = ds_data->required_descriptors_by_type.begin(); it != ds_data->required_descriptors_by_type.end(); ++it) {
3937 pool_state->availableDescriptorTypeCount[it->first] -= ds_data->required_descriptors_by_type.at(it->first);
3938 }
3939
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07003940 const auto *variable_count_info = LvlFindInChain<VkDescriptorSetVariableDescriptorCountAllocateInfo>(p_alloc_info->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003941 bool variable_count_valid = variable_count_info && variable_count_info->descriptorSetCount == p_alloc_info->descriptorSetCount;
3942
3943 // Create tracking object for each descriptor set; insert into global map and the pool's set.
3944 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
3945 uint32_t variable_count = variable_count_valid ? variable_count_info->pDescriptorCounts[i] : 0;
3946
Jeff Bolz41a1ced2019-10-11 11:40:49 -05003947 auto new_ds = std::make_shared<cvdescriptorset::DescriptorSet>(descriptor_sets[i], pool_state, ds_data->layout_nodes[i],
John Zulaufd2c3dae2019-12-12 11:02:17 -07003948 variable_count, this);
locke-lunargd556cc32019-09-17 01:21:23 -06003949 pool_state->sets.insert(new_ds.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003950 setMap[descriptor_sets[i]] = std::move(new_ds);
3951 }
3952}
3953
locke-lunargd556cc32019-09-17 01:21:23 -06003954void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3955 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003956 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003957 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003958}
3959
Tony-LunarG745150c2021-07-02 15:07:31 -06003960void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3961 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
3962 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003963 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003964 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003965}
3966
locke-lunargd556cc32019-09-17 01:21:23 -06003967void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3968 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3969 uint32_t firstInstance) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003970 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003971 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003972}
3973
Tony-LunarG745150c2021-07-02 15:07:31 -06003974void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3975 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
3976 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
3977 const int32_t *pVertexOffset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003978 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003979 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003980}
3981
locke-lunargd556cc32019-09-17 01:21:23 -06003982void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
3983 uint32_t count, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003984 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003985 BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003986 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003987 if (!disabled[command_buffer_state]) {
3988 cb_state->AddChild(buffer_state);
3989 }
locke-lunargd556cc32019-09-17 01:21:23 -06003990}
3991
3992void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
3993 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003994 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003995 BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003996 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003997 if (!disabled[command_buffer_state]) {
3998 cb_state->AddChild(buffer_state);
3999 }
locke-lunargd556cc32019-09-17 01:21:23 -06004000}
4001
4002void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004003 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004004 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06004005}
4006
4007void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
4008 VkDeviceSize offset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004009 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004010 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004011 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004012 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004013 cb_state->AddChild(buffer_state);
4014 }
locke-lunargd556cc32019-09-17 01:21:23 -06004015}
4016
Nathaniel Cesarioa1325f42021-10-26 13:18:11 -06004017void ValidationStateTracker::PostCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
4018 uint32_t, uint32_t) {
4019 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
4020 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
4021}
4022
4023void ValidationStateTracker::PostCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t, uint32_t, uint32_t, uint32_t,
4024 uint32_t, uint32_t) {
4025 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
4026 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
4027}
4028
Tony-LunarG977448c2019-12-02 14:52:02 -07004029void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4030 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07004031 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004032 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004033 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004034 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004035 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4036 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004037 cb_state->AddChild(buffer_state);
4038 cb_state->AddChild(count_buffer_state);
4039 }
Tony-LunarG977448c2019-12-02 14:52:02 -07004040}
4041
locke-lunargd556cc32019-09-17 01:21:23 -06004042void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
4043 VkDeviceSize offset, VkBuffer countBuffer,
4044 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4045 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004046 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004047 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07004048}
4049
4050void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4051 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
4052 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004053 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004054 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07004055}
4056
4057void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4058 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07004059 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004060 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004061 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004062 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004063 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4064 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004065 cb_state->AddChild(buffer_state);
4066 cb_state->AddChild(count_buffer_state);
4067 }
locke-lunargd556cc32019-09-17 01:21:23 -06004068}
4069
4070void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
4071 VkDeviceSize offset, VkBuffer countBuffer,
4072 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4073 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004074 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004075 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07004076}
4077
4078void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
4079 VkDeviceSize offset, VkBuffer countBuffer,
4080 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4081 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004082 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004083 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06004084}
4085
4086void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
4087 uint32_t firstTask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004088 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004089 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004090}
4091
4092void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4093 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004094 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004095 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004096 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004097 if (!disabled[command_buffer_state] && buffer_state) {
4098 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06004099 }
4100}
4101
4102void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4103 VkDeviceSize offset, VkBuffer countBuffer,
4104 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4105 uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004106 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004107 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004108 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004109 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4110 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004111 if (buffer_state) {
4112 cb_state->AddChild(buffer_state);
4113 }
4114 if (count_buffer_state) {
4115 cb_state->AddChild(count_buffer_state);
4116 }
locke-lunargd556cc32019-09-17 01:21:23 -06004117 }
4118}
4119
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004120void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
4121 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
4122 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
4123 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
4124 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
4125 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
4126 uint32_t width, uint32_t height, uint32_t depth) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004127 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004128 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004129 cb_state->hasTraceRaysCmd = true;
4130}
4131
4132
4133void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
4134 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4135 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4136 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4137 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
4138 uint32_t height, uint32_t depth) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004139 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004140 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004141 cb_state->hasTraceRaysCmd = true;
4142}
4143
4144void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
4145 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4146 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4147 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4148 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
4149 VkDeviceAddress indirectDeviceAddress) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004150 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004151 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004152 cb_state->hasTraceRaysCmd = true;
4153}
4154
locke-lunargd556cc32019-09-17 01:21:23 -06004155void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
4156 const VkAllocationCallbacks *pAllocator,
4157 VkShaderModule *pShaderModule, VkResult result,
4158 void *csm_state_data) {
4159 if (VK_SUCCESS != result) return;
4160 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
4161
sfricke-samsung45996a42021-09-16 13:45:27 -07004162 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06004163 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05004164 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
4165 csm_state->unique_shader_id)
4166 : std::make_shared<SHADER_MODULE_STATE>();
locke-lunargd556cc32019-09-17 01:21:23 -06004167 shaderModuleMap[*pShaderModule] = std::move(new_shader_module);
4168}
4169
John Zulauf22b0fbe2019-10-15 06:26:16 -06004170void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
4171 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
4172 VkResult result) {
4173 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004174 auto swapchain_state = GetShared<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004175
4176 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
4177
4178 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004179 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07004180 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07004181 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06004182
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004183 auto format_features =
4184 GetImageFormatFeatures(physical_device, device, pSwapchainImages[i], swapchain_state->image_create_info.format,
4185 swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004186
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06004187 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004188 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004189 if (!swapchain_image.fake_base_address) {
4190 auto size = image_state->fragment_encoder->TotalSize();
4191 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07004192 }
4193
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004194 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004195 swapchain_image.image_state = image_state.get();
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004196 imageMap[pSwapchainImages[i]] = std::move(image_state);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004197 }
4198 }
4199
4200 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004201 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
4202 }
4203}
sourav parmar35e7a002020-06-09 17:58:44 -07004204
sourav parmar35e7a002020-06-09 17:58:44 -07004205void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
4206 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004207 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07004208 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004209 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07004210 ACCELERATION_STRUCTURE_STATE_KHR *src_as_state = GetAccelerationStructureStateKHR(pInfo->src);
4211 ACCELERATION_STRUCTURE_STATE_KHR *dst_as_state = GetAccelerationStructureStateKHR(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07004212 if (dst_as_state != nullptr && src_as_state != nullptr) {
4213 dst_as_state->built = true;
4214 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004215 if (!disabled[command_buffer_state]) {
4216 cb_state->AddChild(dst_as_state);
4217 cb_state->AddChild(src_as_state);
4218 }
sourav parmar35e7a002020-06-09 17:58:44 -07004219 }
4220 }
4221}
Piers Daniell39842ee2020-07-10 16:42:33 -06004222
4223void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004224 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004225 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004226}
4227
4228void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004229 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004230 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004231}
4232
4233void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
4234 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004235 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004236 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004237 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06004238}
4239
4240void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4241 const VkViewport *pViewports) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004242 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004243 cb_state->RecordStateCmd(CMD_SETVIEWPORTWITHCOUNTEXT, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004244 uint32_t bits = (1u << viewportCount) - 1u;
4245 cb_state->viewportWithCountMask |= bits;
4246 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00004247 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004248 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004249
4250 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
4251 for (size_t i = 0; i < viewportCount; ++i) {
4252 cb_state->dynamicViewports[i] = pViewports[i];
4253 }
Piers Daniell39842ee2020-07-10 16:42:33 -06004254}
4255
4256void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4257 const VkRect2D *pScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004258 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004259 cb_state->RecordStateCmd(CMD_SETSCISSORWITHCOUNTEXT, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004260 uint32_t bits = (1u << scissorCount) - 1u;
4261 cb_state->scissorWithCountMask |= bits;
4262 cb_state->trashedScissorMask &= ~bits;
4263 cb_state->scissorWithCountCount = scissorCount;
4264 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06004265}
4266
4267void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4268 uint32_t bindingCount, const VkBuffer *pBuffers,
4269 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4270 const VkDeviceSize *pStrides) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004271 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004272 cb_state->RecordStateCmd(CMD_BINDVERTEXBUFFERS2EXT, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06004273
4274 uint32_t end = firstBinding + bindingCount;
4275 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
4276 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
4277 }
4278
4279 for (uint32_t i = 0; i < bindingCount; ++i) {
4280 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
locke-lunarg1ae57d62020-11-18 10:49:19 -07004281 vertex_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004282 vertex_buffer_binding.offset = pOffsets[i];
4283 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4284 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4285 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004286 if (!disabled[command_buffer_state] && pBuffers[i]) {
4287 cb_state->AddChild(vertex_buffer_binding.buffer_state.get());
Piers Daniell39842ee2020-07-10 16:42:33 -06004288 }
4289 }
4290}
4291
4292void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004293 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004294 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004295}
4296
4297void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004298 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004299 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004300}
4301
4302void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004303 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004304 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004305}
4306
4307void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4308 VkBool32 depthBoundsTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004309 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004310 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004311}
4312void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004313 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004314 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004315}
4316
4317void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4318 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4319 VkCompareOp compareOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004320 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004321 cb_state->RecordStateCmd(CMD_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004322}
locke-lunarg4189aa22020-10-21 00:23:48 -06004323
4324void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4325 uint32_t discardRectangleCount,
4326 const VkRect2D *pDiscardRectangles) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004327 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004328 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004329}
4330
4331void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4332 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004333 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004334 cb_state->RecordStateCmd(CMD_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004335}
4336
4337void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4338 VkCoarseSampleOrderTypeNV sampleOrderType,
4339 uint32_t customSampleOrderCount,
4340 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004341 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004342 cb_state->RecordStateCmd(CMD_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004343}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004344
4345void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004346 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004347 cb_state->RecordStateCmd(CMD_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004348}
4349
4350void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004351 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004352 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004353}
4354
4355void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4356 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004357 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004358 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004359}
4360
4361void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004362 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004363 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004364}
4365
4366void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4367 VkBool32 primitiveRestartEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004368 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004369 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004370}
Piers Daniell924cd832021-05-18 13:48:47 -06004371
4372void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4373 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4374 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4375 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004376 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004377 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4378
4379 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4380 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4381 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004382 if (pipeline_state->create_info.graphics.pDynamicState) {
4383 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4384 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004385 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4386 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4387 break;
4388 }
4389 }
4390 }
4391 }
4392 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004393}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004394
4395void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
4396 BUFFER_STATE *buffer_state = GetBufferState(pInfo->buffer);
4397 if (buffer_state) {
4398 // address is used for GPU-AV and ray tracing buffer validation
4399 buffer_state->deviceAddress = address;
4400 buffer_address_map_.emplace(address, buffer_state);
4401 }
4402}
4403
4404void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4405 VkDeviceAddress address) {
4406 RecordGetBufferDeviceAddress(pInfo, address);
4407}
4408
4409void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4410 VkDeviceAddress address) {
4411 RecordGetBufferDeviceAddress(pInfo, address);
4412}
4413
4414void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4415 VkDeviceAddress address) {
4416 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004417}
4418
4419std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4420 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004421 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004422}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004423
4424std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4425 const VkCommandBufferAllocateInfo *create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -06004426 const COMMAND_POOL_STATE *pool) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004427 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4428}