blob: 56b4baa252ff3379d50b8f08f08a243db9846b86 [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
locke-lunargd556cc32019-09-17 01:21:23 -06001354 // Reset all command buffers before destroying them, to unlink object_bindings.
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001355 for (auto &command_buffer : commandBufferMap) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06001356 command_buffer.second->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001357 }
Jeff Bolzadbfa852019-10-04 13:53:30 -05001358 pipelineMap.clear();
1359 renderPassMap.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001360 commandBufferMap.clear();
1361
1362 // This will also delete all sets in the pool & remove them from setMap
1363 DeleteDescriptorSetPools();
1364 // All sets should be removed
1365 assert(setMap.empty());
1366 descriptorSetLayoutMap.clear();
Jeremy Gebben5a542f52021-07-21 15:25:52 -06001367 // Because swapchains are associated with Surfaces, which are at instance level,
1368 // they need to be explicitly destroyed here to avoid continued references to
1369 // the device we're destroying.
1370 for (auto &entry : swapchainMap) {
1371 entry.second->Destroy();
1372 }
1373 swapchainMap.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06001374 imageViewMap.clear();
1375 imageMap.clear();
1376 bufferViewMap.clear();
1377 bufferMap.clear();
1378 // Queues persist until device is destroyed
1379 queueMap.clear();
1380}
1381
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001382void ValidationStateTracker::PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
1383 VkFence fence, VkResult result) {
1384 if (result != VK_SUCCESS) return;
1385 auto queue_state = GetQueueState(queue);
1386
Jeremy Gebben57642982021-09-14 14:14:55 -06001387 uint64_t early_retire_seq = 0;
1388
1389 if (submitCount == 0) {
1390 CB_SUBMISSION submission;
1391 submission.AddFence(GetShared<FENCE_STATE>(fence));
1392 early_retire_seq = queue_state->Submit(std::move(submission));
1393 }
locke-lunargd556cc32019-09-17 01:21:23 -06001394
1395 // Now process each individual submit
1396 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001397 CB_SUBMISSION submission;
locke-lunargd556cc32019-09-17 01:21:23 -06001398 const VkSubmitInfo *submit = &pSubmits[submit_idx];
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001399 auto *timeline_semaphore_submit = LvlFindInChain<VkTimelineSemaphoreSubmitInfo>(submit->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06001400 for (uint32_t i = 0; i < submit->waitSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001401 uint64_t value = 0;
1402 if (timeline_semaphore_submit && timeline_semaphore_submit->pWaitSemaphoreValues != nullptr &&
1403 (i < timeline_semaphore_submit->waitSemaphoreValueCount)) {
1404 value = timeline_semaphore_submit->pWaitSemaphoreValues[i];
1405 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001406 submission.AddWaitSemaphore(GetShared<SEMAPHORE_STATE>(submit->pWaitSemaphores[i]), value);
locke-lunargd556cc32019-09-17 01:21:23 -06001407 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001408
locke-lunargd556cc32019-09-17 01:21:23 -06001409 for (uint32_t i = 0; i < submit->signalSemaphoreCount; ++i) {
Jeremy Gebben4ae5cc72021-03-10 15:34:44 -07001410 uint64_t value = 0;
1411 if (timeline_semaphore_submit && timeline_semaphore_submit->pSignalSemaphoreValues != nullptr &&
1412 (i < timeline_semaphore_submit->signalSemaphoreValueCount)) {
1413 value = timeline_semaphore_submit->pSignalSemaphoreValues[i];
1414 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001415 submission.AddSignalSemaphore(GetShared<SEMAPHORE_STATE>(submit->pSignalSemaphores[i]), value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001416 }
1417
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001418 const auto perf_submit = LvlFindInChain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001419 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02001420
locke-lunargd556cc32019-09-17 01:21:23 -06001421 for (uint32_t i = 0; i < submit->commandBufferCount; i++) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001422 submission.AddCommandBuffer(GetShared<CMD_BUFFER_STATE>(submit->pCommandBuffers[i]));
locke-lunargd556cc32019-09-17 01:21:23 -06001423 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001424 if (submit_idx == (submitCount - 1) && fence != VK_NULL_HANDLE) {
1425 submission.AddFence(GetShared<FENCE_STATE>(fence));
1426 }
1427 auto submit_seq = queue_state->Submit(std::move(submission));
1428 early_retire_seq = std::max(early_retire_seq, submit_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001429 }
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001430
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001431 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001432 queue_state->Retire(early_retire_seq);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001433 }
1434}
1435
1436void ValidationStateTracker::PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR *pSubmits,
1437 VkFence fence, VkResult result) {
1438 if (result != VK_SUCCESS) return;
1439 auto queue_state = GetQueueState(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001440 uint64_t early_retire_seq = 0;
1441 if (submitCount == 0) {
1442 CB_SUBMISSION submission;
1443 submission.AddFence(GetShared<FENCE_STATE>(fence));
1444 early_retire_seq = queue_state->Submit(std::move(submission));
1445 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001446
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001447 for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
1448 CB_SUBMISSION submission;
1449 const VkSubmitInfo2KHR *submit = &pSubmits[submit_idx];
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001450 for (uint32_t i = 0; i < submit->waitSemaphoreInfoCount; ++i) {
1451 const auto &sem_info = submit->pWaitSemaphoreInfos[i];
Jeremy Gebben57642982021-09-14 14:14:55 -06001452 submission.AddWaitSemaphore(GetShared<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001453 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001454 for (uint32_t i = 0; i < submit->signalSemaphoreInfoCount; ++i) {
1455 const auto &sem_info = submit->pSignalSemaphoreInfos[i];
Jeremy Gebben57642982021-09-14 14:14:55 -06001456 submission.AddSignalSemaphore(GetShared<SEMAPHORE_STATE>(sem_info.semaphore), sem_info.value);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001457 }
1458 const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
1459 submission.perf_submit_pass = perf_submit ? perf_submit->counterPassIndex : 0;
1460
1461 for (uint32_t i = 0; i < submit->commandBufferInfoCount; i++) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001462 submission.AddCommandBuffer(GetShared<CMD_BUFFER_STATE>(submit->pCommandBufferInfos[i].commandBuffer));
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001463 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001464 if (submit_idx == (submitCount - 1)) {
1465 submission.AddFence(GetShared<FENCE_STATE>(fence));
1466 }
1467 auto submit_seq = queue_state->Submit(std::move(submission));
1468 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001469 }
locke-lunargd556cc32019-09-17 01:21:23 -06001470 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001471 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001472 }
1473}
1474
1475void ValidationStateTracker::PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1476 const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory,
1477 VkResult result) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001478 if (VK_SUCCESS != result) {
1479 return;
locke-lunargd556cc32019-09-17 01:21:23 -06001480 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001481 const auto &memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
1482 const auto &memory_heap = phys_dev_mem_props.memoryHeaps[memory_type.heapIndex];
1483 auto fake_address = fake_memory.Alloc(pAllocateInfo->allocationSize);
1484
1485 layer_data::optional<DedicatedBinding> dedicated_binding;
1486
1487 auto dedicated = LvlFindInChain<VkMemoryDedicatedAllocateInfo>(pAllocateInfo->pNext);
1488 if (dedicated) {
1489 if (dedicated->buffer) {
1490 const auto *buffer_state = GetBufferState(dedicated->buffer);
1491 assert(buffer_state);
1492 if (!buffer_state) {
1493 return;
1494 }
1495 dedicated_binding.emplace(dedicated->buffer, buffer_state->createInfo);
1496 } else if (dedicated->image) {
1497 const auto *image_state = GetImageState(dedicated->image);
1498 assert(image_state);
1499 if (!image_state) {
1500 return;
1501 }
1502 dedicated_binding.emplace(dedicated->image, image_state->createInfo);
1503 }
1504 }
1505 memObjMap[*pMemory] = std::make_shared<DEVICE_MEMORY_STATE>(*pMemory, pAllocateInfo, fake_address, memory_type, memory_heap,
ziga-lunarg9663f4f2021-09-30 17:24:01 +02001506 std::move(dedicated_binding), physical_device_count);
locke-lunargd556cc32019-09-17 01:21:23 -06001507 return;
1508}
1509
1510void ValidationStateTracker::PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory mem, const VkAllocationCallbacks *pAllocator) {
1511 if (!mem) return;
1512 DEVICE_MEMORY_STATE *mem_info = GetDevMemState(mem);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001513 if (!mem_info) return;
locke-lunargd556cc32019-09-17 01:21:23 -06001514 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001515 mem_info->Destroy();
John Zulauf79952712020-04-07 11:25:54 -06001516 fake_memory.Free(mem_info->fake_base_address);
locke-lunargd556cc32019-09-17 01:21:23 -06001517 memObjMap.erase(mem);
1518}
1519
1520void ValidationStateTracker::PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo,
1521 VkFence fence, VkResult result) {
1522 if (result != VK_SUCCESS) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001523 auto queue_state = GetQueueState(queue);
locke-lunargd556cc32019-09-17 01:21:23 -06001524
Jeremy Gebben57642982021-09-14 14:14:55 -06001525 uint64_t early_retire_seq = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06001526
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001527 for (uint32_t bind_idx = 0; bind_idx < bindInfoCount; ++bind_idx) {
1528 const VkBindSparseInfo &bind_info = pBindInfo[bind_idx];
locke-lunargd556cc32019-09-17 01:21:23 -06001529 // Track objects tied to memory
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001530 for (uint32_t j = 0; j < bind_info.bufferBindCount; j++) {
1531 for (uint32_t k = 0; k < bind_info.pBufferBinds[j].bindCount; k++) {
1532 auto sparse_binding = bind_info.pBufferBinds[j].pBinds[k];
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001533 auto buffer_state = GetBufferState(bind_info.pBufferBinds[j].buffer);
1534 auto mem_state = GetDevMemShared(sparse_binding.memory);
1535 if (buffer_state && mem_state) {
1536 buffer_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1537 }
locke-lunargd556cc32019-09-17 01:21:23 -06001538 }
1539 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001540 for (uint32_t j = 0; j < bind_info.imageOpaqueBindCount; j++) {
1541 for (uint32_t k = 0; k < bind_info.pImageOpaqueBinds[j].bindCount; k++) {
1542 auto sparse_binding = bind_info.pImageOpaqueBinds[j].pBinds[k];
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001543 auto image_state = GetImageState(bind_info.pImageOpaqueBinds[j].image);
1544 auto mem_state = GetDevMemShared(sparse_binding.memory);
1545 if (image_state && mem_state) {
1546 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, sparse_binding.size);
1547 }
locke-lunargd556cc32019-09-17 01:21:23 -06001548 }
1549 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001550 for (uint32_t j = 0; j < bind_info.imageBindCount; j++) {
1551 for (uint32_t k = 0; k < bind_info.pImageBinds[j].bindCount; k++) {
1552 auto sparse_binding = bind_info.pImageBinds[j].pBinds[k];
locke-lunargd556cc32019-09-17 01:21:23 -06001553 // TODO: This size is broken for non-opaque bindings, need to update to comprehend full sparse binding data
1554 VkDeviceSize size = sparse_binding.extent.depth * sparse_binding.extent.height * sparse_binding.extent.width * 4;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001555 auto image_state = GetImageState(bind_info.pImageBinds[j].image);
1556 auto mem_state = GetDevMemShared(sparse_binding.memory);
1557 if (image_state && mem_state) {
1558 image_state->SetSparseMemBinding(mem_state, sparse_binding.memoryOffset, size);
1559 }
locke-lunargd556cc32019-09-17 01:21:23 -06001560 }
1561 }
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001562 CB_SUBMISSION submission;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001563 for (uint32_t i = 0; i < bind_info.waitSemaphoreCount; ++i) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001564 submission.AddWaitSemaphore(GetShared<SEMAPHORE_STATE>(bind_info.pWaitSemaphores[i]), 0);
locke-lunargd556cc32019-09-17 01:21:23 -06001565 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001566 for (uint32_t i = 0; i < bind_info.signalSemaphoreCount; ++i) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001567 submission.AddSignalSemaphore(GetShared<SEMAPHORE_STATE>(bind_info.pSignalSemaphores[i]), 0);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07001568 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001569 if (bind_idx == (bindInfoCount - 1)) {
1570 submission.AddFence(GetShared<FENCE_STATE>(fence));
locke-lunargd556cc32019-09-17 01:21:23 -06001571 }
Jeremy Gebben57642982021-09-14 14:14:55 -06001572 auto submit_seq = queue_state->Submit(std::move(submission));
1573 early_retire_seq = std::max(early_retire_seq, submit_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001574 }
1575
1576 if (early_retire_seq) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001577 queue_state->Retire(early_retire_seq);
locke-lunargd556cc32019-09-17 01:21:23 -06001578 }
1579}
1580
1581void ValidationStateTracker::PostCallRecordCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
1582 const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore,
1583 VkResult result) {
1584 if (VK_SUCCESS != result) return;
Jeremy Gebben57642982021-09-14 14:14:55 -06001585 semaphoreMap[*pSemaphore] =
1586 std::make_shared<SEMAPHORE_STATE>(*pSemaphore, LvlFindInChain<VkSemaphoreTypeCreateInfo>(pCreateInfo->pNext));
locke-lunargd556cc32019-09-17 01:21:23 -06001587}
1588
Mike Schuchardt2df08912020-12-15 16:28:09 -08001589void ValidationStateTracker::RecordImportSemaphoreState(VkSemaphore semaphore, VkExternalSemaphoreHandleTypeFlagBits handle_type,
1590 VkSemaphoreImportFlags flags) {
locke-lunargd556cc32019-09-17 01:21:23 -06001591 SEMAPHORE_STATE *sema_node = GetSemaphoreState(semaphore);
1592 if (sema_node && sema_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08001593 if ((handle_type == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_SEMAPHORE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06001594 sema_node->scope == kSyncScopeInternal) {
1595 sema_node->scope = kSyncScopeExternalTemporary;
1596 } else {
1597 sema_node->scope = kSyncScopeExternalPermanent;
1598 }
1599 }
1600}
1601
Mike Schuchardt2df08912020-12-15 16:28:09 -08001602void ValidationStateTracker::PostCallRecordSignalSemaphoreKHR(VkDevice device, const VkSemaphoreSignalInfo *pSignalInfo,
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001603 VkResult result) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001604 auto *semaphore_state = GetSemaphoreState(pSignalInfo->semaphore);
1605 semaphore_state->payload = pSignalInfo->value;
Juan A. Suarez Romerof3024162019-10-31 17:57:50 +00001606}
1607
locke-lunargd556cc32019-09-17 01:21:23 -06001608void ValidationStateTracker::RecordMappedMemory(VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, void **ppData) {
1609 auto mem_info = GetDevMemState(mem);
1610 if (mem_info) {
1611 mem_info->mapped_range.offset = offset;
1612 mem_info->mapped_range.size = size;
1613 mem_info->p_driver_data = *ppData;
1614 }
1615}
1616
locke-lunargd556cc32019-09-17 01:21:23 -06001617void ValidationStateTracker::PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1618 VkBool32 waitAll, uint64_t timeout, VkResult result) {
1619 if (VK_SUCCESS != result) return;
1620
1621 // When we know that all fences are complete we can clean/remove their CBs
1622 if ((VK_TRUE == waitAll) || (1 == fenceCount)) {
1623 for (uint32_t i = 0; i < fenceCount; i++) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001624 auto fence_state = GetFenceState(pFences[i]);
1625 if (fence_state) {
1626 fence_state->Retire();
1627 }
locke-lunargd556cc32019-09-17 01:21:23 -06001628 }
1629 }
1630 // NOTE : Alternate case not handled here is when some fences have completed. In
1631 // this case for app to guarantee which fences completed it will have to call
1632 // vkGetFenceStatus() at which point we'll clean/remove their CBs if complete.
1633}
1634
John Zulauff89de662020-04-13 18:57:34 -06001635void ValidationStateTracker::RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1636 VkResult result) {
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001637 if (VK_SUCCESS != result) return;
1638
1639 for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001640 auto semaphore_state = GetSemaphoreState(pWaitInfo->pSemaphores[i]);
1641 if (semaphore_state) {
1642 semaphore_state->Retire(pWaitInfo->pValues[i]);
1643 }
Jakub Okoński04feb3b2020-02-01 18:31:01 +01001644 }
1645}
1646
John Zulauff89de662020-04-13 18:57:34 -06001647void ValidationStateTracker::PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
1648 VkResult result) {
1649 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1650}
1651
1652void ValidationStateTracker::PostCallRecordWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo,
1653 uint64_t timeout, VkResult result) {
1654 RecordWaitSemaphores(device, pWaitInfo, timeout, result);
1655}
1656
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001657void ValidationStateTracker::RecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1658 VkResult result) {
1659 if (VK_SUCCESS != result) return;
1660
Jeremy Gebben57642982021-09-14 14:14:55 -06001661 auto semaphore_state = GetSemaphoreState(semaphore);
1662 if (semaphore_state) {
1663 semaphore_state->Retire(*pValue);
1664 }
Adrian Coca Lorentec7d76102020-09-28 13:58:16 +02001665}
1666
1667void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1668 VkResult result) {
1669 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1670}
1671void ValidationStateTracker::PostCallRecordGetSemaphoreCounterValueKHR(VkDevice device, VkSemaphore semaphore, uint64_t *pValue,
1672 VkResult result) {
1673 RecordGetSemaphoreCounterValue(device, semaphore, pValue, result);
1674}
1675
locke-lunargd556cc32019-09-17 01:21:23 -06001676void ValidationStateTracker::PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
1677 if (VK_SUCCESS != result) return;
Jeremy Gebben57642982021-09-14 14:14:55 -06001678 auto fence_state = GetFenceState(fence);
1679 if (fence_state) {
1680 fence_state->Retire();
1681 }
locke-lunargd556cc32019-09-17 01:21:23 -06001682}
1683
locke-lunargd556cc32019-09-17 01:21:23 -06001684void ValidationStateTracker::PostCallRecordQueueWaitIdle(VkQueue queue, VkResult result) {
1685 if (VK_SUCCESS != result) return;
1686 QUEUE_STATE *queue_state = GetQueueState(queue);
Jeremy Gebben57642982021-09-14 14:14:55 -06001687 if (queue_state) {
1688 queue_state->Retire();
1689 }
locke-lunargd556cc32019-09-17 01:21:23 -06001690}
1691
1692void ValidationStateTracker::PostCallRecordDeviceWaitIdle(VkDevice device, VkResult result) {
1693 if (VK_SUCCESS != result) return;
1694 for (auto &queue : queueMap) {
Jeremy Gebben57642982021-09-14 14:14:55 -06001695 queue.second->Retire();
locke-lunargd556cc32019-09-17 01:21:23 -06001696 }
1697}
1698
1699void ValidationStateTracker::PreCallRecordDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
1700 if (!fence) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001701 auto fence_state = GetFenceState(fence);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001702 fence_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001703 fenceMap.erase(fence);
1704}
1705
1706void ValidationStateTracker::PreCallRecordDestroySemaphore(VkDevice device, VkSemaphore semaphore,
1707 const VkAllocationCallbacks *pAllocator) {
1708 if (!semaphore) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001709 auto semaphore_state = GetSemaphoreState(semaphore);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001710 semaphore_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001711 semaphoreMap.erase(semaphore);
1712}
1713
1714void ValidationStateTracker::PreCallRecordDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
1715 if (!event) return;
John Zulauf48057322020-12-02 11:59:31 -07001716 EVENT_STATE *event_state = Get<EVENT_STATE>(event);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001717 event_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001718 eventMap.erase(event);
1719}
1720
1721void ValidationStateTracker::PreCallRecordDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
1722 const VkAllocationCallbacks *pAllocator) {
1723 if (!queryPool) return;
1724 QUERY_POOL_STATE *qp_state = GetQueryPoolState(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001725 qp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001726 queryPoolMap.erase(queryPool);
1727}
1728
locke-lunargd556cc32019-09-17 01:21:23 -06001729void ValidationStateTracker::UpdateBindBufferMemoryState(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
1730 BUFFER_STATE *buffer_state = GetBufferState(buffer);
1731 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001732 // Track objects tied to memory
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001733 auto mem_state = GetDevMemShared(mem);
1734 if (mem_state) {
1735 buffer_state->SetMemBinding(mem_state, memoryOffset);
1736 }
locke-lunargd556cc32019-09-17 01:21:23 -06001737 }
1738}
1739
1740void ValidationStateTracker::PostCallRecordBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
1741 VkDeviceSize memoryOffset, VkResult result) {
1742 if (VK_SUCCESS != result) return;
1743 UpdateBindBufferMemoryState(buffer, mem, memoryOffset);
1744}
1745
1746void ValidationStateTracker::PostCallRecordBindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001747 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001748 for (uint32_t i = 0; i < bindInfoCount; i++) {
1749 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1750 }
1751}
1752
1753void ValidationStateTracker::PostCallRecordBindBufferMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001754 const VkBindBufferMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06001755 for (uint32_t i = 0; i < bindInfoCount; i++) {
1756 UpdateBindBufferMemoryState(pBindInfos[i].buffer, pBindInfos[i].memory, pBindInfos[i].memoryOffset);
1757 }
1758}
1759
Spencer Fricke6c127102020-04-16 06:25:20 -07001760void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer) {
locke-lunargd556cc32019-09-17 01:21:23 -06001761 BUFFER_STATE *buffer_state = GetBufferState(buffer);
1762 if (buffer_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001763 buffer_state->memory_requirements_checked = true;
1764 }
1765}
1766
1767void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1768 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001769 RecordGetBufferMemoryRequirementsState(buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001770}
1771
1772void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001773 const VkBufferMemoryRequirementsInfo2 *pInfo,
1774 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001775 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001776}
1777
1778void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2KHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08001779 const VkBufferMemoryRequirementsInfo2 *pInfo,
1780 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001781 RecordGetBufferMemoryRequirementsState(pInfo->buffer);
locke-lunargd556cc32019-09-17 01:21:23 -06001782}
1783
Spencer Fricke6c127102020-04-16 06:25:20 -07001784void ValidationStateTracker::RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2 *pInfo) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001785 const VkImagePlaneMemoryRequirementsInfo *plane_info =
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001786 (pInfo == nullptr) ? nullptr : LvlFindInChain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06001787 IMAGE_STATE *image_state = GetImageState(image);
1788 if (image_state) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001789 if (plane_info != nullptr) {
1790 // Multi-plane image
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001791 if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_0_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001792 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001793 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_1_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001794 image_state->memory_requirements_checked[1] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001795 } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_2_BIT) {
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001796 image_state->memory_requirements_checked[2] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001797 }
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001798 } else if (!image_state->disjoint) {
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001799 // Single Plane image
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06001800 image_state->memory_requirements_checked[0] = true;
sfricke-samsungd7ea5de2020-04-08 09:19:18 -07001801 }
locke-lunargd556cc32019-09-17 01:21:23 -06001802 }
1803}
1804
1805void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements(VkDevice device, VkImage image,
1806 VkMemoryRequirements *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001807 RecordGetImageMemoryRequirementsState(image, nullptr);
locke-lunargd556cc32019-09-17 01:21:23 -06001808}
1809
1810void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
1811 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001812 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001813}
1814
1815void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2KHR(VkDevice device,
1816 const VkImageMemoryRequirementsInfo2 *pInfo,
1817 VkMemoryRequirements2 *pMemoryRequirements) {
Spencer Fricke6c127102020-04-16 06:25:20 -07001818 RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06001819}
1820
locke-lunargd556cc32019-09-17 01:21:23 -06001821void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements(
1822 VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1823 VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1824 auto image_state = GetImageState(image);
1825 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001826}
1827
1828void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001829 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1830 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
locke-lunargd556cc32019-09-17 01:21:23 -06001831 auto image_state = GetImageState(pInfo->image);
1832 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001833}
1834
1835void ValidationStateTracker::PostCallRecordGetImageSparseMemoryRequirements2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08001836 VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
1837 VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
locke-lunargd556cc32019-09-17 01:21:23 -06001838 auto image_state = GetImageState(pInfo->image);
1839 image_state->get_sparse_reqs_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06001840}
1841
1842void ValidationStateTracker::PreCallRecordDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1843 const VkAllocationCallbacks *pAllocator) {
1844 if (!shaderModule) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001845 auto shader_module_state = GetShaderModuleState(shaderModule);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001846 shader_module_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001847 shaderModuleMap.erase(shaderModule);
1848}
1849
1850void ValidationStateTracker::PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline,
1851 const VkAllocationCallbacks *pAllocator) {
1852 if (!pipeline) return;
1853 PIPELINE_STATE *pipeline_state = GetPipelineState(pipeline);
locke-lunargd556cc32019-09-17 01:21:23 -06001854 // Any bound cmd buffers are now invalid
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001855 pipeline_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001856 pipelineMap.erase(pipeline);
1857}
1858
1859void ValidationStateTracker::PreCallRecordDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1860 const VkAllocationCallbacks *pAllocator) {
1861 if (!pipelineLayout) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05001862 auto pipeline_layout_state = GetPipelineLayout(pipelineLayout);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001863 pipeline_layout_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001864 pipelineLayoutMap.erase(pipelineLayout);
1865}
1866
1867void ValidationStateTracker::PreCallRecordDestroySampler(VkDevice device, VkSampler sampler,
1868 const VkAllocationCallbacks *pAllocator) {
1869 if (!sampler) return;
1870 SAMPLER_STATE *sampler_state = GetSamplerState(sampler);
locke-lunargd556cc32019-09-17 01:21:23 -06001871 // Any bound cmd buffers are now invalid
1872 if (sampler_state) {
Yuly Novikov424cdd52020-05-26 16:45:12 -04001873 if (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
1874 sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
1875 custom_border_color_sampler_count--;
1876 }
1877
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001878 sampler_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001879 }
1880 samplerMap.erase(sampler);
1881}
1882
1883void ValidationStateTracker::PreCallRecordDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1884 const VkAllocationCallbacks *pAllocator) {
1885 if (!descriptorSetLayout) return;
1886 auto layout_it = descriptorSetLayoutMap.find(descriptorSetLayout);
1887 if (layout_it != descriptorSetLayoutMap.end()) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001888 layout_it->second.get()->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001889 descriptorSetLayoutMap.erase(layout_it);
1890 }
1891}
1892
1893void ValidationStateTracker::PreCallRecordDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1894 const VkAllocationCallbacks *pAllocator) {
1895 if (!descriptorPool) return;
1896 DESCRIPTOR_POOL_STATE *desc_pool_state = GetDescriptorPoolState(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06001897 if (desc_pool_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06001898 // Free sets that were in this pool
John Zulauf79f06582021-02-27 18:38:39 -07001899 for (auto *ds : desc_pool_state->sets) {
locke-lunargd556cc32019-09-17 01:21:23 -06001900 FreeDescriptorSet(ds);
1901 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001902 desc_pool_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001903 descriptorPoolMap.erase(descriptorPool);
1904 }
1905}
1906
Jeremy Gebben1ec89332021-08-05 13:51:49 -06001907// Free all command buffers in given list, removing all references/links to them using CMD_BUFFER_STATE::Reset
locke-lunargd556cc32019-09-17 01:21:23 -06001908void ValidationStateTracker::FreeCommandBufferStates(COMMAND_POOL_STATE *pool_state, const uint32_t command_buffer_count,
1909 const VkCommandBuffer *command_buffers) {
1910 for (uint32_t i = 0; i < command_buffer_count; i++) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06001911 auto cb_state = Get<CMD_BUFFER_STATE>(command_buffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06001912 // Remove references to command buffer's state and delete
1913 if (cb_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001914 cb_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001915 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06001916 // Remove CBState from CB map
1917 pool_state->commandBuffers.erase(command_buffers[i]);
1918 commandBufferMap.erase(command_buffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06001919 }
1920}
1921
1922void ValidationStateTracker::PreCallRecordFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
1923 uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001924 auto pool = GetCommandPoolState(commandPool);
1925 FreeCommandBufferStates(pool, commandBufferCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06001926}
1927
1928void ValidationStateTracker::PostCallRecordCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1929 const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool,
1930 VkResult result) {
1931 if (VK_SUCCESS != result) return;
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001932 auto queue_flags = physical_device_state->queue_family_properties[pCreateInfo->queueFamilyIndex].queueFlags;
Jeremy Gebben159b3cc2021-06-03 09:09:03 -06001933 commandPoolMap[*pCommandPool] = std::make_shared<COMMAND_POOL_STATE>(*pCommandPool, pCreateInfo, queue_flags);
locke-lunargd556cc32019-09-17 01:21:23 -06001934}
1935
1936void ValidationStateTracker::PostCallRecordCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1937 const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool,
1938 VkResult result) {
1939 if (VK_SUCCESS != result) return;
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001940
1941 uint32_t index_count = 0, n_perf_pass = 0;
1942 bool has_cb = false, has_rb = false;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001943 if (pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07001944 const auto *perf = LvlFindInChain<VkQueryPoolPerformanceCreateInfoKHR>(pCreateInfo->pNext);
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001945 index_count = perf->counterIndexCount;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001946
Mark Lobodzinski7e948e42020-09-09 10:23:36 -06001947 const QUEUE_FAMILY_PERF_COUNTERS &counters = *physical_device_state->perf_counters[perf->queueFamilyIndex];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001948 for (uint32_t i = 0; i < perf->counterIndexCount; i++) {
1949 const auto &counter = counters.counters[perf->pCounterIndices[i]];
1950 switch (counter.scope) {
1951 case VK_QUERY_SCOPE_COMMAND_BUFFER_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001952 has_cb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001953 break;
1954 case VK_QUERY_SCOPE_RENDER_PASS_KHR:
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001955 has_rb = true;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001956 break;
1957 default:
1958 break;
1959 }
1960 }
1961
Jeremy Gebben383b9a32021-09-08 16:31:33 -06001962 DispatchGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physical_device_state->PhysDev(), perf, &n_perf_pass);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01001963 }
1964
Jeremy Gebbene9206ee2021-06-02 12:44:41 -06001965 queryPoolMap[*pQueryPool] =
1966 std::make_shared<QUERY_POOL_STATE>(*pQueryPool, pCreateInfo, index_count, n_perf_pass, has_cb, has_rb);
locke-lunargd556cc32019-09-17 01:21:23 -06001967
1968 QueryObject query_obj{*pQueryPool, 0u};
1969 for (uint32_t i = 0; i < pCreateInfo->queryCount; ++i) {
1970 query_obj.query = i;
1971 queryToStateMap[query_obj] = QUERYSTATE_UNKNOWN;
1972 }
1973}
1974
1975void ValidationStateTracker::PreCallRecordDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
1976 const VkAllocationCallbacks *pAllocator) {
1977 if (!commandPool) return;
1978 COMMAND_POOL_STATE *cp_state = GetCommandPoolState(commandPool);
1979 // Remove cmdpool from cmdpoolmap, after freeing layer data for the command buffers
1980 // "When a pool is destroyed, all command buffers allocated from the pool are freed."
1981 if (cp_state) {
1982 // Create a vector, as FreeCommandBufferStates deletes from cp_state->commandBuffers during iteration.
1983 std::vector<VkCommandBuffer> cb_vec{cp_state->commandBuffers.begin(), cp_state->commandBuffers.end()};
1984 FreeCommandBufferStates(cp_state, static_cast<uint32_t>(cb_vec.size()), cb_vec.data());
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06001985 cp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06001986 commandPoolMap.erase(commandPool);
1987 }
1988}
1989
1990void ValidationStateTracker::PostCallRecordResetCommandPool(VkDevice device, VkCommandPool commandPool,
1991 VkCommandPoolResetFlags flags, VkResult result) {
1992 if (VK_SUCCESS != result) return;
1993 // Reset all of the CBs allocated from this pool
1994 auto command_pool_state = GetCommandPoolState(commandPool);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07001995 for (auto cmd_buffer : command_pool_state->commandBuffers) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06001996 auto cb_state = Get<CMD_BUFFER_STATE>(cmd_buffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06001997 cb_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06001998 }
1999}
2000
2001void ValidationStateTracker::PostCallRecordResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
2002 VkResult result) {
2003 for (uint32_t i = 0; i < fenceCount; ++i) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002004 auto fence_state = GetFenceState(pFences[i]);
2005 if (fence_state) {
2006 if (fence_state->scope == kSyncScopeInternal) {
2007 fence_state->state = FENCE_UNSIGNALED;
2008 } else if (fence_state->scope == kSyncScopeExternalTemporary) {
2009 fence_state->scope = kSyncScopeInternal;
locke-lunargd556cc32019-09-17 01:21:23 -06002010 }
2011 }
2012 }
2013}
2014
locke-lunargd556cc32019-09-17 01:21:23 -06002015void ValidationStateTracker::PreCallRecordDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
2016 const VkAllocationCallbacks *pAllocator) {
2017 if (!framebuffer) return;
2018 FRAMEBUFFER_STATE *framebuffer_state = GetFramebufferState(framebuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002019 framebuffer_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002020 frameBufferMap.erase(framebuffer);
2021}
2022
2023void ValidationStateTracker::PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
2024 const VkAllocationCallbacks *pAllocator) {
2025 if (!renderPass) return;
2026 RENDER_PASS_STATE *rp_state = GetRenderPassState(renderPass);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002027 rp_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06002028 renderPassMap.erase(renderPass);
2029}
2030
2031void ValidationStateTracker::PostCallRecordCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
2032 const VkAllocationCallbacks *pAllocator, VkFence *pFence, VkResult result) {
2033 if (VK_SUCCESS != result) return;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002034 fenceMap[*pFence] = std::make_shared<FENCE_STATE>(*pFence, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002035}
2036
2037bool ValidationStateTracker::PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2038 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2039 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002040 void *cgpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002041 // Set up the state that CoreChecks, gpu_validation and later StateTracker Record will use.
2042 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2043 cgpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2044 cgpl_state->pipe_state.reserve(count);
2045 for (uint32_t i = 0; i < count; i++) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002046 cgpl_state->pipe_state.push_back(std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i],
2047 GetRenderPassShared(pCreateInfos[i].renderPass),
2048 GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002049 }
2050 return false;
2051}
2052
2053void ValidationStateTracker::PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2054 const VkGraphicsPipelineCreateInfo *pCreateInfos,
2055 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2056 VkResult result, void *cgpl_state_data) {
2057 create_graphics_pipeline_api_state *cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state *>(cgpl_state_data);
2058 // This API may create pipelines regardless of the return value
2059 for (uint32_t i = 0; i < count; i++) {
2060 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002061 (cgpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002062 pipelineMap[pPipelines[i]] = std::move((cgpl_state->pipe_state)[i]);
2063 }
2064 }
2065 cgpl_state->pipe_state.clear();
2066}
2067
2068bool ValidationStateTracker::PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2069 const VkComputePipelineCreateInfo *pCreateInfos,
2070 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002071 void *ccpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002072 auto *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2073 ccpl_state->pCreateInfos = pCreateInfos; // GPU validation can alter this, so we have to set a default value for the Chassis
2074 ccpl_state->pipe_state.reserve(count);
2075 for (uint32_t i = 0; i < count; i++) {
2076 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002077 ccpl_state->pipe_state.push_back(
2078 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002079 }
2080 return false;
2081}
2082
2083void ValidationStateTracker::PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
2084 const VkComputePipelineCreateInfo *pCreateInfos,
2085 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
2086 VkResult result, void *ccpl_state_data) {
2087 create_compute_pipeline_api_state *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
2088
2089 // This API may create pipelines regardless of the return value
2090 for (uint32_t i = 0; i < count; i++) {
2091 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002092 (ccpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002093 pipelineMap[pPipelines[i]] = std::move((ccpl_state->pipe_state)[i]);
2094 }
2095 }
2096 ccpl_state->pipe_state.clear();
2097}
2098
2099bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache,
2100 uint32_t count,
2101 const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2102 const VkAllocationCallbacks *pAllocator,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002103 VkPipeline *pPipelines, void *crtpl_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002104 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2105 crtpl_state->pipe_state.reserve(count);
2106 for (uint32_t i = 0; i < count; i++) {
2107 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002108 crtpl_state->pipe_state.push_back(
2109 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
locke-lunargd556cc32019-09-17 01:21:23 -06002110 }
2111 return false;
2112}
2113
2114void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesNV(
2115 VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkRayTracingPipelineCreateInfoNV *pCreateInfos,
2116 const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines, VkResult result, void *crtpl_state_data) {
2117 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
2118 // This API may create pipelines regardless of the return value
2119 for (uint32_t i = 0; i < count; i++) {
2120 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002121 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002122 pipelineMap[pPipelines[i]] = std::move((crtpl_state->pipe_state)[i]);
2123 }
2124 }
2125 crtpl_state->pipe_state.clear();
2126}
2127
sourav parmarcd5fb182020-07-17 12:58:44 -07002128bool ValidationStateTracker::PreCallValidateCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2129 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002130 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2131 const VkAllocationCallbacks *pAllocator,
2132 VkPipeline *pPipelines, void *crtpl_state_data) const {
2133 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
2134 crtpl_state->pipe_state.reserve(count);
2135 for (uint32_t i = 0; i < count; i++) {
2136 // Create and initialize internal tracking data structure
Jeremy Gebben11af9792021-08-20 10:20:09 -06002137 crtpl_state->pipe_state.push_back(
2138 std::make_shared<PIPELINE_STATE>(this, &pCreateInfos[i], GetPipelineLayoutShared(pCreateInfos[i].layout)));
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002139 }
2140 return false;
2141}
2142
sourav parmarcd5fb182020-07-17 12:58:44 -07002143void ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
2144 VkPipelineCache pipelineCache, uint32_t count,
2145 const VkRayTracingPipelineCreateInfoKHR *pCreateInfos,
2146 const VkAllocationCallbacks *pAllocator,
2147 VkPipeline *pPipelines, VkResult result,
2148 void *crtpl_state_data) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002149 auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
2150 // This API may create pipelines regardless of the return value
2151 for (uint32_t i = 0; i < count; i++) {
2152 if (pPipelines[i] != VK_NULL_HANDLE) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002153 (crtpl_state->pipe_state)[i]->SetHandle(pPipelines[i]);
Jeff Bolz443c2ca2020-03-19 12:11:51 -05002154 pipelineMap[pPipelines[i]] = std::move((crtpl_state->pipe_state)[i]);
2155 }
2156 }
2157 crtpl_state->pipe_state.clear();
2158}
2159
locke-lunargd556cc32019-09-17 01:21:23 -06002160void ValidationStateTracker::PostCallRecordCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
2161 const VkAllocationCallbacks *pAllocator, VkSampler *pSampler,
2162 VkResult result) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002163 samplerMap[*pSampler] = std::make_shared<SAMPLER_STATE>(pSampler, pCreateInfo);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002164 if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
2165 pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
Tony-LunarG7337b312020-04-15 16:40:25 -06002166 custom_border_color_sampler_count++;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002167 }
locke-lunargd556cc32019-09-17 01:21:23 -06002168}
2169
2170void ValidationStateTracker::PostCallRecordCreateDescriptorSetLayout(VkDevice device,
2171 const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2172 const VkAllocationCallbacks *pAllocator,
2173 VkDescriptorSetLayout *pSetLayout, VkResult result) {
2174 if (VK_SUCCESS != result) return;
2175 descriptorSetLayoutMap[*pSetLayout] = std::make_shared<cvdescriptorset::DescriptorSetLayout>(pCreateInfo, *pSetLayout);
2176}
2177
locke-lunargd556cc32019-09-17 01:21:23 -06002178void ValidationStateTracker::PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
2179 const VkAllocationCallbacks *pAllocator,
2180 VkPipelineLayout *pPipelineLayout, VkResult result) {
2181 if (VK_SUCCESS != result) return;
2182
Jeremy Gebbene6e45542021-08-05 16:39:49 -06002183 pipelineLayoutMap[*pPipelineLayout] = std::make_shared<PIPELINE_LAYOUT_STATE>(this, *pPipelineLayout, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002184}
2185
2186void ValidationStateTracker::PostCallRecordCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
2187 const VkAllocationCallbacks *pAllocator,
2188 VkDescriptorPool *pDescriptorPool, VkResult result) {
2189 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002190 descriptorPoolMap[*pDescriptorPool] = std::make_shared<DESCRIPTOR_POOL_STATE>(*pDescriptorPool, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002191}
2192
2193void ValidationStateTracker::PostCallRecordResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
2194 VkDescriptorPoolResetFlags flags, VkResult result) {
2195 if (VK_SUCCESS != result) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002196 DESCRIPTOR_POOL_STATE *pool = GetDescriptorPoolState(descriptorPool);
locke-lunargd556cc32019-09-17 01:21:23 -06002197 // TODO: validate flags
2198 // For every set off of this pool, clear it, remove from setMap, and free cvdescriptorset::DescriptorSet
John Zulauf79f06582021-02-27 18:38:39 -07002199 for (auto *ds : pool->sets) {
locke-lunargd556cc32019-09-17 01:21:23 -06002200 FreeDescriptorSet(ds);
2201 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002202 pool->sets.clear();
locke-lunargd556cc32019-09-17 01:21:23 -06002203 // Reset available count for each type and available sets for this pool
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002204 for (auto it = pool->availableDescriptorTypeCount.begin(); it != pool->availableDescriptorTypeCount.end(); ++it) {
2205 pool->availableDescriptorTypeCount[it->first] = pool->maxDescriptorTypeCount[it->first];
locke-lunargd556cc32019-09-17 01:21:23 -06002206 }
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002207 pool->availableSets = pool->maxSets;
locke-lunargd556cc32019-09-17 01:21:23 -06002208}
2209
2210bool ValidationStateTracker::PreCallValidateAllocateDescriptorSets(VkDevice device,
2211 const VkDescriptorSetAllocateInfo *pAllocateInfo,
Jeff Bolz5c801d12019-10-09 10:38:45 -05002212 VkDescriptorSet *pDescriptorSets, void *ads_state_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06002213 // Always update common data
2214 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2215 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2216 UpdateAllocateDescriptorSetsData(pAllocateInfo, ads_state);
2217
2218 return false;
2219}
2220
2221// Allocation state was good and call down chain was made so update state based on allocating descriptor sets
2222void ValidationStateTracker::PostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
2223 VkDescriptorSet *pDescriptorSets, VkResult result,
2224 void *ads_state_data) {
2225 if (VK_SUCCESS != result) return;
2226 // All the updates are contained in a single cvdescriptorset function
2227 cvdescriptorset::AllocateDescriptorSetsData *ads_state =
2228 reinterpret_cast<cvdescriptorset::AllocateDescriptorSetsData *>(ads_state_data);
2229 PerformAllocateDescriptorSets(pAllocateInfo, pDescriptorSets, ads_state);
2230}
2231
2232void ValidationStateTracker::PreCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count,
2233 const VkDescriptorSet *pDescriptorSets) {
2234 DESCRIPTOR_POOL_STATE *pool_state = GetDescriptorPoolState(descriptorPool);
2235 // Update available descriptor sets in pool
2236 pool_state->availableSets += count;
2237
2238 // For each freed descriptor add its resources back into the pool as available and remove from pool and setMap
2239 for (uint32_t i = 0; i < count; ++i) {
2240 if (pDescriptorSets[i] != VK_NULL_HANDLE) {
2241 auto descriptor_set = setMap[pDescriptorSets[i]].get();
2242 uint32_t type_index = 0, descriptor_count = 0;
2243 for (uint32_t j = 0; j < descriptor_set->GetBindingCount(); ++j) {
2244 type_index = static_cast<uint32_t>(descriptor_set->GetTypeFromIndex(j));
2245 descriptor_count = descriptor_set->GetDescriptorCountFromIndex(j);
2246 pool_state->availableDescriptorTypeCount[type_index] += descriptor_count;
2247 }
2248 FreeDescriptorSet(descriptor_set);
2249 pool_state->sets.erase(descriptor_set);
2250 }
2251 }
2252}
2253
2254void ValidationStateTracker::PreCallRecordUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
2255 const VkWriteDescriptorSet *pDescriptorWrites,
2256 uint32_t descriptorCopyCount,
2257 const VkCopyDescriptorSet *pDescriptorCopies) {
2258 cvdescriptorset::PerformUpdateDescriptorSets(this, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
2259 pDescriptorCopies);
2260}
2261
2262void ValidationStateTracker::PostCallRecordAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pCreateInfo,
2263 VkCommandBuffer *pCommandBuffer, VkResult result) {
2264 if (VK_SUCCESS != result) return;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002265 auto pool = GetCommandPoolShared(pCreateInfo->commandPool);
2266 if (pool) {
locke-lunargd556cc32019-09-17 01:21:23 -06002267 for (uint32_t i = 0; i < pCreateInfo->commandBufferCount; i++) {
2268 // Add command buffer to its commandPool map
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07002269 pool->commandBuffers.insert(pCommandBuffer[i]);
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002270 commandBufferMap[pCommandBuffer[i]] = CreateCmdBufferState(pCommandBuffer[i], pCreateInfo, pool);
locke-lunargfc78e932020-11-19 17:06:24 -07002271 }
2272 }
2273}
2274
locke-lunargd556cc32019-09-17 01:21:23 -06002275void ValidationStateTracker::PreCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer,
2276 const VkCommandBufferBeginInfo *pBeginInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002277 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002278 if (!cb_state) return;
locke-lunargfc78e932020-11-19 17:06:24 -07002279
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002280 cb_state->Begin(pBeginInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002281}
2282
2283void ValidationStateTracker::PostCallRecordEndCommandBuffer(VkCommandBuffer commandBuffer, VkResult result) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002284 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002285 if (!cb_state) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002286
2287 cb_state->End(result);
locke-lunargd556cc32019-09-17 01:21:23 -06002288}
2289
2290void ValidationStateTracker::PostCallRecordResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags,
2291 VkResult result) {
2292 if (VK_SUCCESS == result) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002293 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002294 cb_state->Reset();
locke-lunargd556cc32019-09-17 01:21:23 -06002295 }
2296}
2297
2298CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) {
2299 // initially assume everything is static state
2300 CBStatusFlags flags = CBSTATUS_ALL_STATE_SET;
2301
2302 if (ds) {
2303 for (uint32_t i = 0; i < ds->dynamicStateCount; i++) {
locke-lunarg4189aa22020-10-21 00:23:48 -06002304 flags &= ~ConvertToCBStatusFlagBits(ds->pDynamicStates[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002305 }
2306 }
locke-lunargd556cc32019-09-17 01:21:23 -06002307 return flags;
2308}
2309
2310// Validation cache:
2311// CV is the bottommost implementor of this extension. Don't pass calls down.
locke-lunargd556cc32019-09-17 01:21:23 -06002312
2313void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
2314 VkPipeline pipeline) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002315 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002316 assert(cb_state);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002317 cb_state->RecordCmd(CMD_BINDPIPELINE);
locke-lunargd556cc32019-09-17 01:21:23 -06002318
2319 auto pipe_state = GetPipelineState(pipeline);
2320 if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06002321 const auto &create_info = pipe_state->create_info.graphics;
2322 bool rasterization_enabled = VK_FALSE == create_info.pRasterizationState->rasterizerDiscardEnable;
2323 const auto *viewport_state = create_info.pViewportState;
2324 const auto *dynamic_state = create_info.pDynamicState;
locke-lunargd556cc32019-09-17 01:21:23 -06002325 cb_state->status &= ~cb_state->static_status;
Jeremy Gebben11af9792021-08-20 10:20:09 -06002326 cb_state->static_status = MakeStaticStateMask(dynamic_state->ptr());
locke-lunargd556cc32019-09-17 01:21:23 -06002327 cb_state->status |= cb_state->static_status;
locke-lunarg4189aa22020-10-21 00:23:48 -06002328 cb_state->dynamic_status = CBSTATUS_ALL_STATE_SET & (~cb_state->static_status);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002329
2330 // Used to calculate CMD_BUFFER_STATE::usedViewportScissorCount upon draw command with this graphics pipeline.
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002331 // If rasterization disabled (no viewport/scissors used), or the actual number of viewports/scissors is dynamic (unknown at
2332 // this time), then these are set to 0 to disable this checking.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002333 auto has_dynamic_viewport_count = cb_state->dynamic_status & CBSTATUS_VIEWPORT_WITH_COUNT_SET;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002334 auto has_dynamic_scissor_count = cb_state->dynamic_status & CBSTATUS_SCISSOR_WITH_COUNT_SET;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002335 cb_state->pipelineStaticViewportCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002336 has_dynamic_viewport_count || !rasterization_enabled ? 0 : viewport_state->viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002337 cb_state->pipelineStaticScissorCount =
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002338 has_dynamic_scissor_count || !rasterization_enabled ? 0 : viewport_state->scissorCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002339
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002340 // Trash dynamic viewport/scissor state if pipeline defines static state and enabled rasterization.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002341 // akeley98 NOTE: There's a bit of an ambiguity in the spec, whether binding such a pipeline overwrites
2342 // the entire viewport (scissor) array, or only the subsection defined by the viewport (scissor) count.
2343 // I am taking the latter interpretation based on the implementation details of NVIDIA's Vulkan driver.
David Zhao Akeley44139b12021-04-26 16:16:13 -07002344 if (!has_dynamic_viewport_count) {
2345 cb_state->trashedViewportCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002346 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_VIEWPORT_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002347 cb_state->trashedViewportMask |= (uint32_t(1) << viewport_state->viewportCount) - 1u;
2348 // should become = ~uint32_t(0) if the other interpretation is correct.
2349 }
2350 }
2351 if (!has_dynamic_scissor_count) {
2352 cb_state->trashedScissorCount = true;
David Zhao Akeley5f40eb72021-05-04 21:56:14 -07002353 if (rasterization_enabled && (cb_state->static_status & CBSTATUS_SCISSOR_SET)) {
David Zhao Akeley44139b12021-04-26 16:16:13 -07002354 cb_state->trashedScissorMask |= (uint32_t(1) << viewport_state->scissorCount) - 1u;
2355 // should become = ~uint32_t(0) if the other interpretation is correct.
2356 }
2357 }
locke-lunargd556cc32019-09-17 01:21:23 -06002358 }
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002359 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
2360 cb_state->lastBound[lv_bind_point].pipeline_state = pipe_state;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002361 if (!disabled[command_buffer_state]) {
2362 cb_state->AddChild(pipe_state);
2363 }
locke-lunargb8be8222020-10-20 00:34:37 -06002364 for (auto &slot : pipe_state->active_slots) {
2365 for (auto &req : slot.second) {
2366 for (auto &sampler : req.second.samplers_used_by_image) {
2367 for (auto &des : sampler) {
2368 des.second = nullptr;
2369 }
2370 }
2371 }
2372 }
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06002373 cb_state->lastBound[lv_bind_point].UpdateSamplerDescriptorsUsedByImage();
locke-lunargd556cc32019-09-17 01:21:23 -06002374}
2375
2376void ValidationStateTracker::PreCallRecordCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2377 uint32_t viewportCount, const VkViewport *pViewports) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002378 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002379 cb_state->RecordStateCmd(CMD_SETVIEWPORT, CBSTATUS_VIEWPORT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002380 uint32_t bits = ((1u << viewportCount) - 1u) << firstViewport;
2381 cb_state->viewportMask |= bits;
2382 cb_state->trashedViewportMask &= ~bits;
David Zhao Akeley44139b12021-04-26 16:16:13 -07002383
2384 cb_state->dynamicViewports.resize(std::max(size_t(firstViewport + viewportCount), cb_state->dynamicViewports.size()));
2385 for (size_t i = 0; i < viewportCount; ++i) {
2386 cb_state->dynamicViewports[firstViewport + i] = pViewports[i];
2387 }
locke-lunargd556cc32019-09-17 01:21:23 -06002388}
2389
2390void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
2391 uint32_t exclusiveScissorCount,
2392 const VkRect2D *pExclusiveScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002393 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002394 cb_state->RecordStateCmd(CMD_SETEXCLUSIVESCISSORNV, CBSTATUS_EXCLUSIVE_SCISSOR_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002395 // TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
2396 // cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
locke-lunargd556cc32019-09-17 01:21:23 -06002397}
2398
2399void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
2400 VkImageLayout imageLayout) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002401 if (disabled[command_buffer_state]) return;
2402
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002403 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002404 cb_state->RecordCmd(CMD_BINDSHADINGRATEIMAGENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002405
2406 if (imageView != VK_NULL_HANDLE) {
2407 auto view_state = GetImageViewState(imageView);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002408 cb_state->AddChild(view_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002409 }
2410}
2411
2412void ValidationStateTracker::PreCallRecordCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2413 uint32_t viewportCount,
2414 const VkShadingRatePaletteNV *pShadingRatePalettes) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002415 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002416 cb_state->RecordStateCmd(CMD_SETVIEWPORTSHADINGRATEPALETTENV, CBSTATUS_SHADING_RATE_PALETTE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002417 // TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
2418 // cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
locke-lunargd556cc32019-09-17 01:21:23 -06002419}
2420
2421void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
2422 const VkAccelerationStructureCreateInfoNV *pCreateInfo,
2423 const VkAllocationCallbacks *pAllocator,
2424 VkAccelerationStructureNV *pAccelerationStructure,
2425 VkResult result) {
2426 if (VK_SUCCESS != result) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05002427 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002428
2429 // Query the requirements in case the application doesn't (to avoid bind/validation time query)
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002430 auto as_memory_requirements_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002431 as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002432 as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002433 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &as_memory_requirements_info, &as_state->memory_requirements);
2434
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002435 auto scratch_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002436 scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002437 scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002438 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &scratch_memory_req_info,
2439 &as_state->build_scratch_memory_requirements);
2440
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06002441 auto update_memory_req_info = LvlInitStruct<VkAccelerationStructureMemoryRequirementsInfoNV>();
locke-lunargd556cc32019-09-17 01:21:23 -06002442 update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
Jeremy Gebben14b0d1a2021-05-15 20:15:41 -06002443 update_memory_req_info.accelerationStructure = as_state->acceleration_structure();
locke-lunargd556cc32019-09-17 01:21:23 -06002444 DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
2445 &as_state->update_scratch_memory_requirements);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002446 as_state->allocator = pAllocator;
locke-lunargd556cc32019-09-17 01:21:23 -06002447 accelerationStructureMap[*pAccelerationStructure] = std::move(as_state);
2448}
2449
Jeff Bolz95176d02020-04-01 00:36:16 -05002450void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
2451 const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
2452 const VkAllocationCallbacks *pAllocator,
2453 VkAccelerationStructureKHR *pAccelerationStructure,
2454 VkResult result) {
2455 if (VK_SUCCESS != result) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002456 auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE_KHR>(*pAccelerationStructure, pCreateInfo);
Mark Lobodzinski17dc4602020-05-29 07:48:40 -06002457 as_state->allocator = pAllocator;
sourav parmarcd5fb182020-07-17 12:58:44 -07002458 accelerationStructureMap_khr[*pAccelerationStructure] = std::move(as_state);
Jeff Bolz95176d02020-04-01 00:36:16 -05002459}
2460
sourav parmarcd5fb182020-07-17 12:58:44 -07002461void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresKHR(
2462 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2463 const VkAccelerationStructureBuildRangeInfoKHR *const *ppBuildRangeInfos) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002464 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002465 if (cb_state == nullptr) {
2466 return;
2467 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002468 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002469 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002470 auto *dst_as_state = GetAccelerationStructureStateKHR(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002471 if (dst_as_state != nullptr) {
2472 dst_as_state->built = true;
2473 dst_as_state->build_info_khr.initialize(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002474 if (!disabled[command_buffer_state]) {
2475 cb_state->AddChild(dst_as_state);
2476 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002477 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002478 if (!disabled[command_buffer_state]) {
2479 auto *src_as_state = GetAccelerationStructureStateKHR(pInfos[i].srcAccelerationStructure);
2480 if (src_as_state != nullptr) {
2481 cb_state->AddChild(src_as_state);
2482 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002483 }
2484 }
2485 cb_state->hasBuildAccelerationStructureCmd = true;
2486}
2487
2488void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructuresIndirectKHR(
2489 VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
2490 const VkDeviceAddress *pIndirectDeviceAddresses, const uint32_t *pIndirectStrides,
2491 const uint32_t *const *ppMaxPrimitiveCounts) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002492 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmarcd5fb182020-07-17 12:58:44 -07002493 if (cb_state == nullptr) {
2494 return;
2495 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002496 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURESINDIRECTKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07002497 for (uint32_t i = 0; i < infoCount; ++i) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002498 auto *dst_as_state = GetAccelerationStructureStateKHR(pInfos[i].dstAccelerationStructure);
sourav parmarcd5fb182020-07-17 12:58:44 -07002499 if (dst_as_state != nullptr) {
2500 dst_as_state->built = true;
2501 dst_as_state->build_info_khr.initialize(&pInfos[i]);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002502 if (!disabled[command_buffer_state]) {
2503 cb_state->AddChild(dst_as_state);
2504 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002505 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002506 if (!disabled[command_buffer_state]) {
2507 auto *src_as_state = GetAccelerationStructureStateKHR(pInfos[i].srcAccelerationStructure);
2508 if (src_as_state != nullptr) {
2509 cb_state->AddChild(src_as_state);
2510 }
sourav parmarcd5fb182020-07-17 12:58:44 -07002511 }
2512 }
2513 cb_state->hasBuildAccelerationStructureCmd = true;
2514}
locke-lunargd556cc32019-09-17 01:21:23 -06002515void ValidationStateTracker::PostCallRecordGetAccelerationStructureMemoryRequirementsNV(
Mike Schuchardt2df08912020-12-15 16:28:09 -08002516 VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV *pInfo, VkMemoryRequirements2 *pMemoryRequirements) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002517 ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureStateNV(pInfo->accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002518 if (as_state != nullptr) {
2519 if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV) {
2520 as_state->memory_requirements = *pMemoryRequirements;
2521 as_state->memory_requirements_checked = true;
2522 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV) {
2523 as_state->build_scratch_memory_requirements = *pMemoryRequirements;
2524 as_state->build_scratch_memory_requirements_checked = true;
2525 } else if (pInfo->type == VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV) {
2526 as_state->update_scratch_memory_requirements = *pMemoryRequirements;
2527 as_state->update_scratch_memory_requirements_checked = true;
2528 }
2529 }
2530}
2531
sourav parmarcd5fb182020-07-17 12:58:44 -07002532void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
2533 VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06002534 if (VK_SUCCESS != result) return;
2535 for (uint32_t i = 0; i < bindInfoCount; i++) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002536 const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
locke-lunargd556cc32019-09-17 01:21:23 -06002537
sourav parmarcd5fb182020-07-17 12:58:44 -07002538 ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureStateNV(info.accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002539 if (as_state) {
locke-lunargd556cc32019-09-17 01:21:23 -06002540 // Track objects tied to memory
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002541 auto mem_state = GetDevMemShared(info.memory);
2542 if (mem_state) {
2543 as_state->SetMemBinding(mem_state, info.memoryOffset);
2544 }
locke-lunargd556cc32019-09-17 01:21:23 -06002545
2546 // GPU validation of top level acceleration structure building needs acceleration structure handles.
Jeff Bolz95176d02020-04-01 00:36:16 -05002547 // XXX TODO: Query device address for KHR extension
sourav parmarcd5fb182020-07-17 12:58:44 -07002548 if (enabled[gpu_validation]) {
locke-lunargd556cc32019-09-17 01:21:23 -06002549 DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
2550 }
2551 }
2552 }
2553}
2554
2555void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
2556 VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
2557 VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002558 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002559 if (cb_state == nullptr) {
2560 return;
2561 }
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002562 cb_state->RecordCmd(CMD_BUILDACCELERATIONSTRUCTURENV);
locke-lunargd556cc32019-09-17 01:21:23 -06002563
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002564 auto *dst_as_state = GetAccelerationStructureStateNV(dst);
locke-lunargd556cc32019-09-17 01:21:23 -06002565 if (dst_as_state != nullptr) {
2566 dst_as_state->built = true;
2567 dst_as_state->build_info.initialize(pInfo);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002568 if (!disabled[command_buffer_state]) {
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002569 cb_state->AddChild(dst_as_state);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002570 }
locke-lunargd556cc32019-09-17 01:21:23 -06002571 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002572 if (!disabled[command_buffer_state]) {
2573 auto *src_as_state = GetAccelerationStructureStateNV(src);
2574 if (src_as_state != nullptr) {
2575 cb_state->AddChild(src_as_state);
2576 }
locke-lunargd556cc32019-09-17 01:21:23 -06002577 }
2578 cb_state->hasBuildAccelerationStructureCmd = true;
2579}
2580
2581void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureNV(VkCommandBuffer commandBuffer,
2582 VkAccelerationStructureNV dst,
2583 VkAccelerationStructureNV src,
2584 VkCopyAccelerationStructureModeNV mode) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002585 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002586 if (cb_state) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002587 ACCELERATION_STRUCTURE_STATE *src_as_state = GetAccelerationStructureStateNV(src);
2588 ACCELERATION_STRUCTURE_STATE *dst_as_state = GetAccelerationStructureStateNV(dst);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002589 if (!disabled[command_buffer_state]) {
2590 cb_state->RecordTransferCmd(CMD_COPYACCELERATIONSTRUCTURENV, src_as_state, dst_as_state);
2591 }
locke-lunargd556cc32019-09-17 01:21:23 -06002592 if (dst_as_state != nullptr && src_as_state != nullptr) {
2593 dst_as_state->built = true;
2594 dst_as_state->build_info = src_as_state->build_info;
locke-lunargd556cc32019-09-17 01:21:23 -06002595 }
2596 }
2597}
2598
Jeff Bolz95176d02020-04-01 00:36:16 -05002599void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
2600 VkAccelerationStructureKHR accelerationStructure,
2601 const VkAllocationCallbacks *pAllocator) {
locke-lunargd556cc32019-09-17 01:21:23 -06002602 if (!accelerationStructure) return;
sourav parmarcd5fb182020-07-17 12:58:44 -07002603 auto *as_state = GetAccelerationStructureStateKHR(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002604 if (as_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002605 as_state->Destroy();
sourav parmarcd5fb182020-07-17 12:58:44 -07002606 accelerationStructureMap_khr.erase(accelerationStructure);
locke-lunargd556cc32019-09-17 01:21:23 -06002607 }
2608}
2609
Jeff Bolz95176d02020-04-01 00:36:16 -05002610void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
2611 VkAccelerationStructureNV accelerationStructure,
2612 const VkAllocationCallbacks *pAllocator) {
sourav parmarcd5fb182020-07-17 12:58:44 -07002613 if (!accelerationStructure) return;
2614 auto *as_state = GetAccelerationStructureStateNV(accelerationStructure);
2615 if (as_state) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002616 as_state->Destroy();
sourav parmarcd5fb182020-07-17 12:58:44 -07002617 accelerationStructureMap.erase(accelerationStructure);
2618 }
Jeff Bolz95176d02020-04-01 00:36:16 -05002619}
2620
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002621void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
2622 uint32_t viewportCount,
2623 const VkViewportWScalingNV *pViewportWScalings) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002624 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002625 cb_state->RecordStateCmd(CMD_SETVIEWPORTWSCALINGNV, CBSTATUS_VIEWPORT_W_SCALING_SET);
Chris Mayer9ded5eb2019-09-19 16:33:26 +02002626}
2627
locke-lunargd556cc32019-09-17 01:21:23 -06002628void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002629 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002630 cb_state->RecordStateCmd(CMD_SETLINEWIDTH, CBSTATUS_LINE_WIDTH_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002631}
2632
2633void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
2634 uint16_t lineStipplePattern) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002635 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002636 cb_state->RecordStateCmd(CMD_SETLINESTIPPLEEXT, CBSTATUS_LINE_STIPPLE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002637}
2638
2639void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
2640 float depthBiasClamp, float depthBiasSlopeFactor) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002641 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002642 cb_state->RecordStateCmd(CMD_SETDEPTHBIAS, CBSTATUS_DEPTH_BIAS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002643}
2644
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002645void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
2646 const VkRect2D *pScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002647 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002648 cb_state->RecordStateCmd(CMD_SETSCISSOR, CBSTATUS_SCISSOR_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07002649 uint32_t bits = ((1u << scissorCount) - 1u) << firstScissor;
2650 cb_state->scissorMask |= bits;
2651 cb_state->trashedScissorMask &= ~bits;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01002652}
2653
locke-lunargd556cc32019-09-17 01:21:23 -06002654void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
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_SETBLENDCONSTANTS, CBSTATUS_BLEND_CONSTANTS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002657}
2658
2659void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
2660 float maxDepthBounds) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002661 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002662 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDS, CBSTATUS_DEPTH_BOUNDS_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002663}
2664
2665void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2666 uint32_t compareMask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002667 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002668 cb_state->RecordStateCmd(CMD_SETSTENCILCOMPAREMASK, CBSTATUS_STENCIL_READ_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002669}
2670
2671void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2672 uint32_t writeMask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002673 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002674 cb_state->RecordStateCmd(CMD_SETSTENCILWRITEMASK, CBSTATUS_STENCIL_WRITE_MASK_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002675}
2676
2677void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2678 uint32_t reference) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002679 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002680 cb_state->RecordStateCmd(CMD_SETSTENCILREFERENCE, CBSTATUS_STENCIL_REFERENCE_SET);
locke-lunargd556cc32019-09-17 01:21:23 -06002681}
2682
locke-lunargd556cc32019-09-17 01:21:23 -06002683
2684// Update the bound state for the bind point, including the effects of incompatible pipeline layouts
2685void ValidationStateTracker::PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2686 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2687 uint32_t firstSet, uint32_t setCount,
2688 const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount,
2689 const uint32_t *pDynamicOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002690 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002691 cb_state->RecordCmd(CMD_BINDDESCRIPTORSETS);
locke-lunargd556cc32019-09-17 01:21:23 -06002692 auto pipeline_layout = GetPipelineLayout(layout);
2693
2694 // Resize binding arrays
2695 uint32_t last_set_index = firstSet + setCount - 1;
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002696 const auto lv_bind_point = ConvertToLvlBindPoint(pipelineBindPoint);
2697 if (last_set_index >= cb_state->lastBound[lv_bind_point].per_set.size()) {
2698 cb_state->lastBound[lv_bind_point].per_set.resize(last_set_index + 1);
locke-lunargd556cc32019-09-17 01:21:23 -06002699 }
2700
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002701 cb_state->UpdateLastBoundDescriptorSets(pipelineBindPoint, pipeline_layout, firstSet, setCount, pDescriptorSets, nullptr,
2702 dynamicOffsetCount, pDynamicOffsets);
locke-lunargb8d7a7a2020-10-25 16:01:52 -06002703 cb_state->lastBound[lv_bind_point].pipeline_layout = layout;
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06002704 cb_state->lastBound[lv_bind_point].UpdateSamplerDescriptorsUsedByImage();
Jeremy Gebben5570abe2021-05-16 18:35:13 -06002705}
2706
locke-lunargd556cc32019-09-17 01:21:23 -06002707void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetKHR(VkCommandBuffer commandBuffer,
2708 VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2709 uint32_t set, uint32_t descriptorWriteCount,
2710 const VkWriteDescriptorSet *pDescriptorWrites) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002711 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002712 auto pipeline_layout = GetPipelineLayout(layout);
2713 cb_state->PushDescriptorSetState(pipelineBindPoint, pipeline_layout, set, descriptorWriteCount, pDescriptorWrites);
locke-lunargd556cc32019-09-17 01:21:23 -06002714}
2715
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002716void ValidationStateTracker::PostCallRecordCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2717 VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2718 const void *pValues) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002719 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002720 if (cb_state != nullptr) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002721 cb_state->RecordCmd(CMD_PUSHCONSTANTS);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002722 cb_state->ResetPushConstantDataIfIncompatible(GetPipelineLayout(layout));
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002723
2724 auto &push_constant_data = cb_state->push_constant_data;
2725 assert((offset + size) <= static_cast<uint32_t>(push_constant_data.size()));
2726 std::memcpy(push_constant_data.data() + offset, pValues, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002727 cb_state->push_constant_pipeline_layout_set = layout;
2728
2729 auto flags = stageFlags;
2730 uint32_t bit_shift = 0;
2731 while (flags) {
2732 if (flags & 1) {
2733 VkShaderStageFlagBits flag = static_cast<VkShaderStageFlagBits>(1 << bit_shift);
2734 const auto it = cb_state->push_constant_data_update.find(flag);
2735
2736 if (it != cb_state->push_constant_data_update.end()) {
locke-lunarg3d8b8f32020-10-26 17:04:16 -06002737 std::memset(it->second.data() + offset, PC_Byte_Updated, static_cast<std::size_t>(size));
locke-lunargde3f0fa2020-09-10 11:55:31 -06002738 }
2739 }
2740 flags = flags >> 1;
2741 ++bit_shift;
2742 }
Tony-LunarG6bb1d0c2019-09-23 10:39:25 -06002743 }
2744}
2745
locke-lunargd556cc32019-09-17 01:21:23 -06002746void ValidationStateTracker::PreCallRecordCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2747 VkIndexType indexType) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002748 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002749
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002750 cb_state->RecordStateCmd(CMD_BINDINDEXBUFFER, CBSTATUS_INDEX_BUFFER_BOUND);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002751 cb_state->index_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(buffer);
2752 cb_state->index_buffer_binding.size = cb_state->index_buffer_binding.buffer_state->createInfo.size;
locke-lunargd556cc32019-09-17 01:21:23 -06002753 cb_state->index_buffer_binding.offset = offset;
2754 cb_state->index_buffer_binding.index_type = indexType;
2755 // Add binding for this index buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002756 if (!disabled[command_buffer_state]) {
2757 cb_state->AddChild(cb_state->index_buffer_binding.buffer_state.get());
2758 }
locke-lunargd556cc32019-09-17 01:21:23 -06002759}
2760
2761void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2762 uint32_t bindingCount, const VkBuffer *pBuffers,
2763 const VkDeviceSize *pOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002764 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002765 cb_state->RecordCmd(CMD_BINDVERTEXBUFFERS);
locke-lunargd556cc32019-09-17 01:21:23 -06002766
2767 uint32_t end = firstBinding + bindingCount;
2768 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
2769 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
2770 }
2771
2772 for (uint32_t i = 0; i < bindingCount; ++i) {
2773 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
locke-lunarg1ae57d62020-11-18 10:49:19 -07002774 vertex_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(pBuffers[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002775 vertex_buffer_binding.offset = pOffsets[i];
Piers Daniell39842ee2020-07-10 16:42:33 -06002776 vertex_buffer_binding.size = VK_WHOLE_SIZE;
2777 vertex_buffer_binding.stride = 0;
locke-lunargd556cc32019-09-17 01:21:23 -06002778 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002779 if (pBuffers[i] && !disabled[command_buffer_state]) {
2780 cb_state->AddChild(vertex_buffer_binding.buffer_state.get());
Jeff Bolz165818a2020-05-08 11:19:03 -05002781 }
locke-lunargd556cc32019-09-17 01:21:23 -06002782 }
2783}
2784
2785void ValidationStateTracker::PostCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
2786 VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002787 if (disabled[command_buffer_state]) return;
2788
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002789 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002790 cb_state->RecordTransferCmd(CMD_UPDATEBUFFER, GetBufferState(dstBuffer));
locke-lunargd556cc32019-09-17 01:21:23 -06002791}
2792
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002793void ValidationStateTracker::PreCallRecordCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2794 VkPipelineStageFlags stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002795 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2796 cb_state->RecordSetEvent(CMD_SETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002797}
2798
2799void ValidationStateTracker::PreCallRecordCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2800 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002801 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002802 auto stage_masks = sync_utils::GetGlobalStageMasks(*pDependencyInfo);
2803
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002804 cb_state->RecordSetEvent(CMD_SETEVENT2KHR, event, stage_masks.src);
2805 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002806}
2807
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002808void ValidationStateTracker::PreCallRecordCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2809 VkPipelineStageFlags stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002810 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2811 cb_state->RecordResetEvent(CMD_RESETEVENT, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002812}
2813
2814void ValidationStateTracker::PreCallRecordCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
2815 VkPipelineStageFlags2KHR stageMask) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002816 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2817 cb_state->RecordResetEvent(CMD_RESETEVENT2KHR, event, stageMask);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002818}
2819
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002820void ValidationStateTracker::PreCallRecordCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2821 VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
2822 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2823 uint32_t bufferMemoryBarrierCount,
2824 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2825 uint32_t imageMemoryBarrierCount,
2826 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002827 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2828 cb_state->RecordWaitEvents(CMD_WAITEVENTS, eventCount, pEvents);
2829 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2830 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002831}
2832
2833void ValidationStateTracker::PreCallRecordCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
2834 const VkEvent *pEvents, const VkDependencyInfoKHR *pDependencyInfos) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002835 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2836 cb_state->RecordWaitEvents(CMD_WAITEVENTS2KHR, eventCount, pEvents);
Jeremy Gebben79649152021-06-22 14:46:24 -06002837 for (uint32_t i = 0; i < eventCount; i++) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002838 cb_state->RecordBarriers(pDependencyInfos[i]);
Jeremy Gebben79649152021-06-22 14:46:24 -06002839 }
2840}
2841
2842void ValidationStateTracker::PostCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2843 VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2844 uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2845 uint32_t bufferMemoryBarrierCount,
2846 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2847 uint32_t imageMemoryBarrierCount,
2848 const VkImageMemoryBarrier *pImageMemoryBarriers) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002849 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2850 cb_state->RecordCmd(CMD_PIPELINEBARRIER);
2851 cb_state->RecordBarriers(memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
2852 imageMemoryBarrierCount, pImageMemoryBarriers);
Jeremy Gebben79649152021-06-22 14:46:24 -06002853}
2854
2855void ValidationStateTracker::PreCallRecordCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
2856 const VkDependencyInfoKHR *pDependencyInfo) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002857 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2858 cb_state->RecordCmd(CMD_PIPELINEBARRIER2KHR);
2859 cb_state->RecordBarriers(*pDependencyInfo);
Jeremy Gebben79649152021-06-22 14:46:24 -06002860}
2861
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02002862QueryState ValidationStateTracker::GetQueryState(const QueryMap *localQueryToStateMap, VkQueryPool queryPool, uint32_t queryIndex,
2863 uint32_t perfPass) const {
2864 QueryObject query = QueryObject(QueryObject(queryPool, queryIndex), perfPass);
locke-lunargd556cc32019-09-17 01:21:23 -06002865
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02002866 auto iter = localQueryToStateMap->find(query);
2867 if (iter != localQueryToStateMap->end()) return iter->second;
Jeff Bolz310775c2019-10-09 00:46:33 -05002868
Jeff Bolz310775c2019-10-09 00:46:33 -05002869 return QUERYSTATE_UNKNOWN;
locke-lunargd556cc32019-09-17 01:21:23 -06002870}
2871
locke-lunargd556cc32019-09-17 01:21:23 -06002872void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
2873 VkFlags flags) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002874 if (disabled[query_validation]) return;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002875
locke-lunargd556cc32019-09-17 01:21:23 -06002876 QueryObject query = {queryPool, slot};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002877 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002878 cb_state->RecordCmd(CMD_BEGINQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002879 if (!disabled[query_validation]) {
2880 cb_state->BeginQuery(query);
2881 }
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002882 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002883 auto pool_state = GetQueryPoolState(query.pool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002884 cb_state->AddChild(pool_state);
2885 }
locke-lunargd556cc32019-09-17 01:21:23 -06002886}
2887
2888void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002889 if (disabled[query_validation]) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002890 QueryObject query_obj = {queryPool, slot};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002891 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002892 cb_state->RecordCmd(CMD_ENDQUERY);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002893 if (!disabled[query_validation]) {
2894 cb_state->EndQuery(query_obj);
2895 }
2896 if (!disabled[command_buffer_state]) {
2897 auto pool_state = GetQueryPoolState(query_obj.pool);
2898 cb_state->AddChild(pool_state);
2899 }
locke-lunargd556cc32019-09-17 01:21:23 -06002900}
2901
2902void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2903 uint32_t firstQuery, uint32_t queryCount) {
Mark Lobodzinski90eea5b2020-05-15 12:54:00 -06002904 if (disabled[query_validation]) return;
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002905 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06002906
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002907 cb_state->RecordCmd(CMD_RESETQUERYPOOL);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002908 cb_state->ResetQueryPool(queryPool, firstQuery, queryCount);
Lionel Landwerlinb1e5a422020-02-18 16:49:09 +02002909
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002910 if (!disabled[command_buffer_state]) {
2911 auto pool_state = GetQueryPoolState(queryPool);
2912 cb_state->AddChild(pool_state);
2913 }
locke-lunargd556cc32019-09-17 01:21:23 -06002914}
2915
2916void ValidationStateTracker::PostCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2917 uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
2918 VkDeviceSize dstOffset, VkDeviceSize stride,
2919 VkQueryResultFlags flags) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002920 if (disabled[query_validation] || disabled[command_buffer_state]) return;
2921
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002922 auto cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002923 cb_state->RecordCmd(CMD_COPYQUERYPOOLRESULTS);
locke-lunargd556cc32019-09-17 01:21:23 -06002924 auto dst_buff_state = GetBufferState(dstBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002925 cb_state->AddChild(dst_buff_state);
Jeff Bolzadbfa852019-10-04 13:53:30 -05002926 auto pool_state = GetQueryPoolState(queryPool);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002927 cb_state->AddChild(pool_state);
locke-lunargd556cc32019-09-17 01:21:23 -06002928}
2929
2930void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2931 VkQueryPool queryPool, uint32_t slot) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002932 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2933 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP, pipelineStage, queryPool, slot);
Jeremy Gebben74aa7622020-12-15 11:18:00 -07002934}
2935
2936void ValidationStateTracker::PostCallRecordCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,
2937 VkPipelineStageFlags2KHR pipelineStage, VkQueryPool queryPool,
2938 uint32_t slot) {
Jeremy Gebbencefa7fd2021-08-17 13:44:47 -06002939 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
2940 cb_state->RecordWriteTimestamp(CMD_WRITETIMESTAMP2KHR, pipelineStage, queryPool, slot);
locke-lunargd556cc32019-09-17 01:21:23 -06002941}
2942
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002943void ValidationStateTracker::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
2944 VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
2945 VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) {
2946 if (disabled[query_validation]) return;
Jeremy Gebben3d22d582021-08-11 15:37:58 -06002947 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06002948 cb_state->RecordCmd(CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06002949 if (!disabled[command_buffer_state]) {
2950 auto pool_state = GetQueryPoolState(queryPool);
2951 cb_state->AddChild(pool_state);
2952 }
Jeremy Gebben1ec89332021-08-05 13:51:49 -06002953 cb_state->EndQueries(queryPool, firstQuery, accelerationStructureCount);
Marijn Suijten6750fdc2020-12-30 22:06:42 +01002954}
2955
locke-lunargd556cc32019-09-17 01:21:23 -06002956void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
2957 const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer,
2958 VkResult result) {
2959 if (VK_SUCCESS != result) return;
locke-lunargd556cc32019-09-17 01:21:23 -06002960
Jeremy Gebben88f58142021-06-01 10:07:52 -06002961 std::vector<std::shared_ptr<IMAGE_VIEW_STATE>> views;
Mike Schuchardt2df08912020-12-15 16:28:09 -08002962 if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) == 0) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002963 views.resize(pCreateInfo->attachmentCount);
locke-lunarg1ae57d62020-11-18 10:49:19 -07002964
locke-lunargd556cc32019-09-17 01:21:23 -06002965 for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002966 views[i] = GetShared<IMAGE_VIEW_STATE>(pCreateInfo->pAttachments[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06002967 }
2968 }
Jeremy Gebben88f58142021-06-01 10:07:52 -06002969
2970 frameBufferMap[*pFramebuffer] = std::make_shared<FRAMEBUFFER_STATE>(
2971 *pFramebuffer, pCreateInfo, GetRenderPassShared(pCreateInfo->renderPass), std::move(views));
locke-lunargd556cc32019-09-17 01:21:23 -06002972}
2973
locke-lunargd556cc32019-09-17 01:21:23 -06002974void ValidationStateTracker::PostCallRecordCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
2975 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2976 VkResult result) {
2977 if (VK_SUCCESS != result) return;
Jeremy Gebben88f58142021-06-01 10:07:52 -06002978 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
locke-lunargd556cc32019-09-17 01:21:23 -06002979}
2980
Mike Schuchardt2df08912020-12-15 16:28:09 -08002981void ValidationStateTracker::PostCallRecordCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002982 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2983 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002984 if (VK_SUCCESS != result) return;
2985
2986 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
Tony-LunarG977448c2019-12-02 14:52:02 -07002987}
2988
Mike Schuchardt2df08912020-12-15 16:28:09 -08002989void ValidationStateTracker::PostCallRecordCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
Tony-LunarG977448c2019-12-02 14:52:02 -07002990 const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass,
2991 VkResult result) {
Jeremy Gebben88f58142021-06-01 10:07:52 -06002992 if (VK_SUCCESS != result) return;
2993
2994 renderPassMap[*pRenderPass] = std::make_shared<RENDER_PASS_STATE>(*pRenderPass, pCreateInfo);
Tony-LunarG977448c2019-12-02 14:52:02 -07002995}
2996
locke-lunargd556cc32019-09-17 01:21:23 -06002997void ValidationStateTracker::PreCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer,
2998 const VkRenderPassBeginInfo *pRenderPassBegin,
2999 VkSubpassContents contents) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003000 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3001 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS, pRenderPassBegin, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003002}
3003
3004void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
3005 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003006 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003007 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003008 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2KHR, pRenderPassBegin, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003009}
3010
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003011void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
3012 uint32_t counterBufferCount,
3013 const VkBuffer *pCounterBuffers,
3014 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003015 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003016
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003017 cb_state->RecordCmd(CMD_BEGINTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003018 cb_state->transform_feedback_active = true;
3019}
3020
3021void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
3022 uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
3023 const VkDeviceSize *pCounterBufferOffsets) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003024 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003025
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003026 cb_state->RecordCmd(CMD_ENDTRANSFORMFEEDBACKEXT);
Jeremy Hayes9bda85a2020-05-21 16:36:17 -06003027 cb_state->transform_feedback_active = false;
3028}
3029
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003030void ValidationStateTracker::PostCallRecordCmdBeginConditionalRenderingEXT(
3031 VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin) {
Jeremy Gebbenc8b51a92021-08-16 15:19:00 -06003032 auto *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003033
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003034 cb_state->RecordCmd(CMD_BEGINCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003035 cb_state->conditional_rendering_active = true;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02003036 cb_state->conditional_rendering_inside_render_pass = cb_state->activeRenderPass != nullptr;
3037 cb_state->conditional_rendering_subpass = cb_state->activeSubpass;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003038}
3039
3040void ValidationStateTracker::PostCallRecordCmdEndConditionalRenderingEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebbenc8b51a92021-08-16 15:19:00 -06003041 auto *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003042
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003043 cb_state->RecordCmd(CMD_ENDCONDITIONALRENDERINGEXT);
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003044 cb_state->conditional_rendering_active = false;
ziga-lunarg39eeaf22021-09-03 19:12:44 +02003045 cb_state->conditional_rendering_inside_render_pass = false;
3046 cb_state->conditional_rendering_subpass = 0;
ziga-lunarg40f5fbc2021-08-14 23:06:41 +02003047}
3048
Tony-LunarG977448c2019-12-02 14:52:02 -07003049void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
3050 const VkRenderPassBeginInfo *pRenderPassBegin,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003051 const VkSubpassBeginInfo *pSubpassBeginInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003052 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3053 cb_state->BeginRenderPass(CMD_BEGINRENDERPASS2, pRenderPassBegin, pSubpassBeginInfo->contents);
Tony-LunarG977448c2019-12-02 14:52:02 -07003054}
3055
locke-lunargd556cc32019-09-17 01:21:23 -06003056
3057void ValidationStateTracker::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003058 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3059 cb_state->NextSubpass(CMD_NEXTSUBPASS, contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003060}
3061
3062void ValidationStateTracker::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003063 const VkSubpassBeginInfo *pSubpassBeginInfo,
3064 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003065 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003066 cb_state->NextSubpass(CMD_NEXTSUBPASS2KHR, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003067}
3068
Tony-LunarG977448c2019-12-02 14:52:02 -07003069void ValidationStateTracker::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003070 const VkSubpassBeginInfo *pSubpassBeginInfo,
3071 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003072 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003073 cb_state->NextSubpass(CMD_NEXTSUBPASS2, pSubpassBeginInfo->contents);
locke-lunargd556cc32019-09-17 01:21:23 -06003074}
3075
3076void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003077 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3078 cb_state->EndRenderPass(CMD_ENDRENDERPASS);
locke-lunargd556cc32019-09-17 01:21:23 -06003079}
3080
3081void ValidationStateTracker::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003082 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003083 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003084 cb_state->EndRenderPass(CMD_ENDRENDERPASS2KHR);
locke-lunargd556cc32019-09-17 01:21:23 -06003085}
3086
Tony-LunarG977448c2019-12-02 14:52:02 -07003087void ValidationStateTracker::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003088 const VkSubpassEndInfo *pSubpassEndInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003089 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3090 cb_state->EndRenderPass(CMD_ENDRENDERPASS2);
Tony-LunarG977448c2019-12-02 14:52:02 -07003091}
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003092
locke-lunargd556cc32019-09-17 01:21:23 -06003093void ValidationStateTracker::PreCallRecordCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
3094 const VkCommandBuffer *pCommandBuffers) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003095 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003096
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003097 cb_state->ExecuteCommands(commandBuffersCount, pCommandBuffers);
locke-lunargd556cc32019-09-17 01:21:23 -06003098}
3099
3100void ValidationStateTracker::PostCallRecordMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size,
3101 VkFlags flags, void **ppData, VkResult result) {
3102 if (VK_SUCCESS != result) return;
3103 RecordMappedMemory(mem, offset, size, ppData);
3104}
3105
3106void ValidationStateTracker::PreCallRecordUnmapMemory(VkDevice device, VkDeviceMemory mem) {
3107 auto mem_info = GetDevMemState(mem);
3108 if (mem_info) {
3109 mem_info->mapped_range = MemRange();
3110 mem_info->p_driver_data = nullptr;
3111 }
3112}
3113
3114void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
Jeremy Gebben8ee02af2021-07-16 10:15:55 -06003115 auto image_state = GetShared<IMAGE_STATE>(bindInfo.image);
locke-lunargd556cc32019-09-17 01:21:23 -06003116 if (image_state) {
locke-lunargae26eac2020-04-16 15:29:05 -06003117 // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
3118 // See: VUID-vkGetImageSubresourceLayout-image-01895
3119 image_state->fragment_encoder =
3120 std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07003121 const auto swapchain_info = LvlFindInChain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003122 if (swapchain_info) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003123 auto swapchain = GetShared<SWAPCHAIN_NODE>(swapchain_info->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003124 if (swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003125 SWAPCHAIN_IMAGE &swapchain_image = swapchain->images[swapchain_info->imageIndex];
John Zulaufd13b38e2021-03-05 08:17:38 -07003126
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003127 if (!swapchain_image.fake_base_address) {
3128 auto size = image_state->fragment_encoder->TotalSize();
3129 swapchain_image.fake_base_address = fake_memory.Alloc(size);
Jeremy Gebben6fbf8242021-06-21 09:14:46 -06003130 }
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06003131 // All images bound to this swapchain and index are aliases
3132 image_state->SetSwapchain(swapchain, swapchain_info->imageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003133 }
3134 } else {
3135 // Track bound memory range information
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003136 auto mem_info = GetDevMemShared(bindInfo.memory);
locke-lunargd556cc32019-09-17 01:21:23 -06003137 if (mem_info) {
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003138 image_state->SetMemBinding(mem_info, bindInfo.memoryOffset);
locke-lunargd556cc32019-09-17 01:21:23 -06003139 }
locke-lunargd556cc32019-09-17 01:21:23 -06003140 }
locke-lunargd556cc32019-09-17 01:21:23 -06003141 }
3142}
3143
3144void ValidationStateTracker::PostCallRecordBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
3145 VkDeviceSize memoryOffset, VkResult result) {
3146 if (VK_SUCCESS != result) return;
Nathaniel Cesariofc6291e2021-04-06 00:22:15 -06003147 auto bind_info = LvlInitStruct<VkBindImageMemoryInfo>();
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003148 bind_info.image = image;
3149 bind_info.memory = mem;
3150 bind_info.memoryOffset = memoryOffset;
3151 UpdateBindImageMemoryState(bind_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003152}
3153
3154void ValidationStateTracker::PostCallRecordBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003155 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003156 if (VK_SUCCESS != result) return;
3157 for (uint32_t i = 0; i < bindInfoCount; i++) {
3158 UpdateBindImageMemoryState(pBindInfos[i]);
3159 }
3160}
3161
3162void ValidationStateTracker::PostCallRecordBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003163 const VkBindImageMemoryInfo *pBindInfos, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003164 if (VK_SUCCESS != result) return;
3165 for (uint32_t i = 0; i < bindInfoCount; i++) {
3166 UpdateBindImageMemoryState(pBindInfos[i]);
3167 }
3168}
3169
3170void ValidationStateTracker::PreCallRecordSetEvent(VkDevice device, VkEvent event) {
3171 auto event_state = GetEventState(event);
3172 if (event_state) {
3173 event_state->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
3174 }
locke-lunargd556cc32019-09-17 01:21:23 -06003175}
3176
3177void ValidationStateTracker::PostCallRecordImportSemaphoreFdKHR(VkDevice device,
3178 const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo,
3179 VkResult result) {
3180 if (VK_SUCCESS != result) return;
3181 RecordImportSemaphoreState(pImportSemaphoreFdInfo->semaphore, pImportSemaphoreFdInfo->handleType,
3182 pImportSemaphoreFdInfo->flags);
3183}
3184
3185void ValidationStateTracker::RecordGetExternalSemaphoreState(VkSemaphore semaphore,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003186 VkExternalSemaphoreHandleTypeFlagBits handle_type) {
locke-lunargd556cc32019-09-17 01:21:23 -06003187 SEMAPHORE_STATE *semaphore_state = GetSemaphoreState(semaphore);
Mike Schuchardt2df08912020-12-15 16:28:09 -08003188 if (semaphore_state && handle_type != VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06003189 // Cannot track semaphore state once it is exported, except for Sync FD handle types which have copy transference
3190 semaphore_state->scope = kSyncScopeExternalPermanent;
3191 }
3192}
3193
3194#ifdef VK_USE_PLATFORM_WIN32_KHR
3195void ValidationStateTracker::PostCallRecordImportSemaphoreWin32HandleKHR(
3196 VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR *pImportSemaphoreWin32HandleInfo, VkResult result) {
3197 if (VK_SUCCESS != result) return;
3198 RecordImportSemaphoreState(pImportSemaphoreWin32HandleInfo->semaphore, pImportSemaphoreWin32HandleInfo->handleType,
3199 pImportSemaphoreWin32HandleInfo->flags);
3200}
3201
3202void ValidationStateTracker::PostCallRecordGetSemaphoreWin32HandleKHR(VkDevice device,
3203 const VkSemaphoreGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3204 HANDLE *pHandle, VkResult result) {
3205 if (VK_SUCCESS != result) return;
3206 RecordGetExternalSemaphoreState(pGetWin32HandleInfo->semaphore, pGetWin32HandleInfo->handleType);
3207}
3208
3209void ValidationStateTracker::PostCallRecordImportFenceWin32HandleKHR(
3210 VkDevice device, const VkImportFenceWin32HandleInfoKHR *pImportFenceWin32HandleInfo, VkResult result) {
3211 if (VK_SUCCESS != result) return;
3212 RecordImportFenceState(pImportFenceWin32HandleInfo->fence, pImportFenceWin32HandleInfo->handleType,
3213 pImportFenceWin32HandleInfo->flags);
3214}
3215
3216void ValidationStateTracker::PostCallRecordGetFenceWin32HandleKHR(VkDevice device,
3217 const VkFenceGetWin32HandleInfoKHR *pGetWin32HandleInfo,
3218 HANDLE *pHandle, VkResult result) {
3219 if (VK_SUCCESS != result) return;
3220 RecordGetExternalFenceState(pGetWin32HandleInfo->fence, pGetWin32HandleInfo->handleType);
3221}
3222#endif
3223
3224void ValidationStateTracker::PostCallRecordGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR *pGetFdInfo, int *pFd,
3225 VkResult result) {
3226 if (VK_SUCCESS != result) return;
3227 RecordGetExternalSemaphoreState(pGetFdInfo->semaphore, pGetFdInfo->handleType);
3228}
3229
Mike Schuchardt2df08912020-12-15 16:28:09 -08003230void ValidationStateTracker::RecordImportFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type,
3231 VkFenceImportFlags flags) {
locke-lunargd556cc32019-09-17 01:21:23 -06003232 FENCE_STATE *fence_node = GetFenceState(fence);
3233 if (fence_node && fence_node->scope != kSyncScopeExternalPermanent) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08003234 if ((handle_type == VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT || flags & VK_FENCE_IMPORT_TEMPORARY_BIT) &&
locke-lunargd556cc32019-09-17 01:21:23 -06003235 fence_node->scope == kSyncScopeInternal) {
3236 fence_node->scope = kSyncScopeExternalTemporary;
3237 } else {
3238 fence_node->scope = kSyncScopeExternalPermanent;
3239 }
3240 }
3241}
3242
3243void ValidationStateTracker::PostCallRecordImportFenceFdKHR(VkDevice device, const VkImportFenceFdInfoKHR *pImportFenceFdInfo,
3244 VkResult result) {
3245 if (VK_SUCCESS != result) return;
3246 RecordImportFenceState(pImportFenceFdInfo->fence, pImportFenceFdInfo->handleType, pImportFenceFdInfo->flags);
3247}
3248
Mike Schuchardt2df08912020-12-15 16:28:09 -08003249void ValidationStateTracker::RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBits handle_type) {
locke-lunargd556cc32019-09-17 01:21:23 -06003250 FENCE_STATE *fence_state = GetFenceState(fence);
3251 if (fence_state) {
Mike Schuchardt2df08912020-12-15 16:28:09 -08003252 if (handle_type != VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT) {
locke-lunargd556cc32019-09-17 01:21:23 -06003253 // Export with reference transference becomes external
3254 fence_state->scope = kSyncScopeExternalPermanent;
3255 } else if (fence_state->scope == kSyncScopeInternal) {
3256 // Export with copy transference has a side effect of resetting the fence
3257 fence_state->state = FENCE_UNSIGNALED;
3258 }
3259 }
3260}
3261
3262void ValidationStateTracker::PostCallRecordGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR *pGetFdInfo, int *pFd,
3263 VkResult result) {
3264 if (VK_SUCCESS != result) return;
3265 RecordGetExternalFenceState(pGetFdInfo->fence, pGetFdInfo->handleType);
3266}
3267
3268void ValidationStateTracker::PostCallRecordCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
3269 const VkAllocationCallbacks *pAllocator, VkEvent *pEvent, VkResult result) {
3270 if (VK_SUCCESS != result) return;
John Zulaufd5115702021-01-18 12:34:33 -07003271 const auto event = *pEvent;
Jeremy Gebbencbf22862021-03-03 12:01:22 -07003272 eventMap.emplace(event, std::make_shared<EVENT_STATE>(event, pCreateInfo->flags));
locke-lunargd556cc32019-09-17 01:21:23 -06003273}
3274
3275void ValidationStateTracker::RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo,
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003276 VkSwapchainKHR *pSwapchain, std::shared_ptr<SURFACE_STATE> &&surface_state,
locke-lunargd556cc32019-09-17 01:21:23 -06003277 SWAPCHAIN_NODE *old_swapchain_state) {
3278 if (VK_SUCCESS == result) {
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003279 if (surface_state->swapchain) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003280 surface_state->RemoveParent(surface_state->swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003281 }
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003282 auto swapchain = CreateSwapchainState(pCreateInfo, *pSwapchain);
3283 surface_state->AddParent(swapchain.get());
3284 surface_state->swapchain = swapchain.get();
3285 swapchain->surface = std::move(surface_state);
3286 swapchainMap[*pSwapchain] = std::move(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003287 } else {
3288 surface_state->swapchain = nullptr;
3289 }
3290 // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain is retired
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003291 // Retired swapchains remain associated with the surface until they are destroyed.
locke-lunargd556cc32019-09-17 01:21:23 -06003292 if (old_swapchain_state) {
3293 old_swapchain_state->retired = true;
3294 }
3295 return;
3296}
3297
3298void ValidationStateTracker::PostCallRecordCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
3299 const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain,
3300 VkResult result) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003301 auto surface_state = GetShared<SURFACE_STATE>(pCreateInfo->surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003302 auto old_swapchain_state = GetSwapchainState(pCreateInfo->oldSwapchain);
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003303 RecordCreateSwapchainState(result, pCreateInfo, pSwapchain, std::move(surface_state), old_swapchain_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003304}
3305
3306void ValidationStateTracker::PreCallRecordDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
3307 const VkAllocationCallbacks *pAllocator) {
3308 if (!swapchain) return;
3309 auto swapchain_data = GetSwapchainState(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003310 if (!swapchain_data) return;
John Zulauffaa7a522021-03-05 12:22:45 -07003311
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003312 swapchain_data->Destroy();
3313 swapchainMap.erase(swapchain);
locke-lunargd556cc32019-09-17 01:21:23 -06003314}
3315
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003316void ValidationStateTracker::PostCallRecordCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display,
3317 const VkDisplayModeCreateInfoKHR *pCreateInfo,
3318 const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode,
3319 VkResult result) {
3320 if (VK_SUCCESS != result) return;
3321 if (!pMode) return;
Jeremy Gebben5573a8c2021-06-04 08:55:10 -06003322 display_mode_map[*pMode] = std::make_shared<DISPLAY_MODE_STATE>(*pMode, physicalDevice);
sfricke-samsung5c1b7392020-12-13 22:17:15 -08003323}
3324
locke-lunargd556cc32019-09-17 01:21:23 -06003325void ValidationStateTracker::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo, VkResult result) {
3326 // Semaphore waits occur before error generation, if the call reached the ICD. (Confirm?)
3327 for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003328 auto semaphore_state = GetSemaphoreState(pPresentInfo->pWaitSemaphores[i]);
3329 if (semaphore_state) {
Jeremy Gebben57642982021-09-14 14:14:55 -06003330 semaphore_state->signaler.queue = nullptr;
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003331 semaphore_state->signaled = false;
locke-lunargd556cc32019-09-17 01:21:23 -06003332 }
3333 }
3334
Tony-LunarG6f887e52021-07-27 11:23:14 -06003335 const auto *present_id_info = LvlFindInChain<VkPresentIdKHR>(pPresentInfo->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003336 for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
3337 // 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
3338 // confused itself just as much.
3339 auto local_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
3340 if (local_result != VK_SUCCESS && local_result != VK_SUBOPTIMAL_KHR) continue; // this present didn't actually happen.
3341 // Mark the image as having been released to the WSI
3342 auto swapchain_data = GetSwapchainState(pPresentInfo->pSwapchains[i]);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003343 if (swapchain_data) {
3344 swapchain_data->PresentImage(pPresentInfo->pImageIndices[i]);
Tony-LunarG6f887e52021-07-27 11:23:14 -06003345 if (present_id_info) {
3346 if (i < present_id_info->swapchainCount && present_id_info->pPresentIds[i] > swapchain_data->max_present_id) {
3347 swapchain_data->max_present_id = present_id_info->pPresentIds[i];
3348 }
3349 }
locke-lunargd556cc32019-09-17 01:21:23 -06003350 }
3351 }
3352 // Note: even though presentation is directed to a queue, there is no direct ordering between QP and subsequent work, so QP (and
3353 // its semaphore waits) /never/ participate in any completion proof.
3354}
3355
3356void ValidationStateTracker::PostCallRecordCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
3357 const VkSwapchainCreateInfoKHR *pCreateInfos,
3358 const VkAllocationCallbacks *pAllocator,
3359 VkSwapchainKHR *pSwapchains, VkResult result) {
3360 if (pCreateInfos) {
3361 for (uint32_t i = 0; i < swapchainCount; i++) {
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003362 auto surface_state = GetShared<SURFACE_STATE>(pCreateInfos[i].surface);
locke-lunargd556cc32019-09-17 01:21:23 -06003363 auto old_swapchain_state = GetSwapchainState(pCreateInfos[i].oldSwapchain);
Jeremy Gebben5a542f52021-07-21 15:25:52 -06003364 RecordCreateSwapchainState(result, &pCreateInfos[i], &pSwapchains[i], std::move(surface_state), old_swapchain_state);
locke-lunargd556cc32019-09-17 01:21:23 -06003365 }
3366 }
3367}
3368
3369void ValidationStateTracker::RecordAcquireNextImageState(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3370 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003371 auto fence_state = GetFenceState(fence);
3372 if (fence_state && fence_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003373 // Treat as inflight since it is valid to wait on this fence, even in cases where it is technically a temporary
3374 // import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003375 fence_state->state = FENCE_INFLIGHT;
Jeremy Gebben57642982021-09-14 14:14:55 -06003376 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 -06003377 }
3378
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003379 auto semaphore_state = GetSemaphoreState(semaphore);
3380 if (semaphore_state && semaphore_state->scope == kSyncScopeInternal) {
locke-lunargd556cc32019-09-17 01:21:23 -06003381 // Treat as signaled since it is valid to wait on this semaphore, even in cases where it is technically a
3382 // temporary import
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003383 semaphore_state->signaled = true;
Jeremy Gebben57642982021-09-14 14:14:55 -06003384 semaphore_state->signaler.queue = nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003385 }
3386
3387 // Mark the image as acquired.
3388 auto swapchain_data = GetSwapchainState(swapchain);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06003389 if (swapchain_data) {
3390 swapchain_data->AcquireImage(*pImageIndex);
locke-lunargd556cc32019-09-17 01:21:23 -06003391 }
3392}
3393
3394void ValidationStateTracker::PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
3395 VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex,
3396 VkResult result) {
3397 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3398 RecordAcquireNextImageState(device, swapchain, timeout, semaphore, fence, pImageIndex);
3399}
3400
3401void ValidationStateTracker::PostCallRecordAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
3402 uint32_t *pImageIndex, VkResult result) {
3403 if ((VK_SUCCESS != result) && (VK_SUBOPTIMAL_KHR != result)) return;
3404 RecordAcquireNextImageState(device, pAcquireInfo->swapchain, pAcquireInfo->timeout, pAcquireInfo->semaphore,
3405 pAcquireInfo->fence, pImageIndex);
3406}
3407
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003408std::shared_ptr<PHYSICAL_DEVICE_STATE> ValidationStateTracker::CreatePhysicalDeviceState(VkPhysicalDevice phys_dev) {
3409 return std::make_shared<PHYSICAL_DEVICE_STATE>(phys_dev);
3410}
3411
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003412void ValidationStateTracker::PostCallRecordCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
3413 const VkAllocationCallbacks *pAllocator, VkInstance *pInstance,
3414 VkResult result) {
3415 if (result != VK_SUCCESS) {
3416 return;
3417 }
3418 uint32_t count = 0;
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003419 // this can fail if the allocator fails
3420 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, nullptr);
3421 if (result != VK_SUCCESS) {
3422 return;
3423 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003424 std::vector<VkPhysicalDevice> physdev_handles(count);
Jeremy Gebbenc4916802021-10-22 16:15:16 -06003425 result = DispatchEnumeratePhysicalDevices(*pInstance, &count, physdev_handles.data());
3426 if (result != VK_SUCCESS) {
3427 return;
3428 }
Jeremy Gebbenee3a3a22021-09-30 12:27:11 -06003429
3430 physical_device_map.reserve(count);
3431 for (auto physdev : physdev_handles) {
3432 physical_device_map.emplace(physdev, CreatePhysicalDeviceState(physdev));
locke-lunargd556cc32019-09-17 01:21:23 -06003433 }
3434}
3435
3436// Common function to update state for GetPhysicalDeviceQueueFamilyProperties & 2KHR version
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003437static void StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(PHYSICAL_DEVICE_STATE *pd_state, uint32_t count) {
locke-lunargd556cc32019-09-17 01:21:23 -06003438 pd_state->queue_family_known_count = std::max(pd_state->queue_family_known_count, count);
locke-lunargd556cc32019-09-17 01:21:23 -06003439}
3440
3441void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
3442 uint32_t *pQueueFamilyPropertyCount,
3443 VkQueueFamilyProperties *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003444 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3445 assert(pd_state);
3446 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003447}
3448
3449void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003450 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003451 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3452 assert(pd_state);
3453 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003454}
3455
3456void ValidationStateTracker::PostCallRecordGetPhysicalDeviceQueueFamilyProperties2KHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003457 VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003458 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3459 assert(pd_state);
3460 StateUpdateCommonGetPhysicalDeviceQueueFamilyProperties(pd_state, *pQueueFamilyPropertyCount);
locke-lunargd556cc32019-09-17 01:21:23 -06003461}
3462void ValidationStateTracker::PreCallRecordDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
3463 const VkAllocationCallbacks *pAllocator) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003464 if (!surface) return;
3465 auto surface_state = GetSurfaceState(surface);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003466 surface_state->Destroy();
locke-lunargd556cc32019-09-17 01:21:23 -06003467 surface_map.erase(surface);
3468}
3469
3470void ValidationStateTracker::RecordVulkanSurface(VkSurfaceKHR *pSurface) {
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003471 surface_map[*pSurface] = std::make_shared<SURFACE_STATE>(*pSurface);
locke-lunargd556cc32019-09-17 01:21:23 -06003472}
3473
3474void ValidationStateTracker::PostCallRecordCreateDisplayPlaneSurfaceKHR(VkInstance instance,
3475 const VkDisplaySurfaceCreateInfoKHR *pCreateInfo,
3476 const VkAllocationCallbacks *pAllocator,
3477 VkSurfaceKHR *pSurface, VkResult result) {
3478 if (VK_SUCCESS != result) return;
3479 RecordVulkanSurface(pSurface);
3480}
3481
3482#ifdef VK_USE_PLATFORM_ANDROID_KHR
3483void ValidationStateTracker::PostCallRecordCreateAndroidSurfaceKHR(VkInstance instance,
3484 const VkAndroidSurfaceCreateInfoKHR *pCreateInfo,
3485 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3486 VkResult result) {
3487 if (VK_SUCCESS != result) return;
3488 RecordVulkanSurface(pSurface);
3489}
3490#endif // VK_USE_PLATFORM_ANDROID_KHR
3491
3492#ifdef VK_USE_PLATFORM_IOS_MVK
3493void ValidationStateTracker::PostCallRecordCreateIOSSurfaceMVK(VkInstance instance, const VkIOSSurfaceCreateInfoMVK *pCreateInfo,
3494 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3495 VkResult result) {
3496 if (VK_SUCCESS != result) return;
3497 RecordVulkanSurface(pSurface);
3498}
3499#endif // VK_USE_PLATFORM_IOS_MVK
3500
3501#ifdef VK_USE_PLATFORM_MACOS_MVK
3502void ValidationStateTracker::PostCallRecordCreateMacOSSurfaceMVK(VkInstance instance,
3503 const VkMacOSSurfaceCreateInfoMVK *pCreateInfo,
3504 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3505 VkResult result) {
3506 if (VK_SUCCESS != result) return;
3507 RecordVulkanSurface(pSurface);
3508}
3509#endif // VK_USE_PLATFORM_MACOS_MVK
3510
Jeremy Kniagerf33a67c2019-12-09 09:44:39 -07003511#ifdef VK_USE_PLATFORM_METAL_EXT
3512void ValidationStateTracker::PostCallRecordCreateMetalSurfaceEXT(VkInstance instance,
3513 const VkMetalSurfaceCreateInfoEXT *pCreateInfo,
3514 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3515 VkResult result) {
3516 if (VK_SUCCESS != result) return;
3517 RecordVulkanSurface(pSurface);
3518}
3519#endif // VK_USE_PLATFORM_METAL_EXT
3520
locke-lunargd556cc32019-09-17 01:21:23 -06003521#ifdef VK_USE_PLATFORM_WAYLAND_KHR
3522void ValidationStateTracker::PostCallRecordCreateWaylandSurfaceKHR(VkInstance instance,
3523 const VkWaylandSurfaceCreateInfoKHR *pCreateInfo,
3524 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3525 VkResult result) {
3526 if (VK_SUCCESS != result) return;
3527 RecordVulkanSurface(pSurface);
3528}
3529#endif // VK_USE_PLATFORM_WAYLAND_KHR
3530
3531#ifdef VK_USE_PLATFORM_WIN32_KHR
3532void ValidationStateTracker::PostCallRecordCreateWin32SurfaceKHR(VkInstance instance,
3533 const VkWin32SurfaceCreateInfoKHR *pCreateInfo,
3534 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3535 VkResult result) {
3536 if (VK_SUCCESS != result) return;
3537 RecordVulkanSurface(pSurface);
3538}
3539#endif // VK_USE_PLATFORM_WIN32_KHR
3540
3541#ifdef VK_USE_PLATFORM_XCB_KHR
3542void ValidationStateTracker::PostCallRecordCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo,
3543 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3544 VkResult result) {
3545 if (VK_SUCCESS != result) return;
3546 RecordVulkanSurface(pSurface);
3547}
3548#endif // VK_USE_PLATFORM_XCB_KHR
3549
3550#ifdef VK_USE_PLATFORM_XLIB_KHR
3551void ValidationStateTracker::PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo,
3552 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3553 VkResult result) {
3554 if (VK_SUCCESS != result) return;
3555 RecordVulkanSurface(pSurface);
3556}
3557#endif // VK_USE_PLATFORM_XLIB_KHR
3558
Niklas Haas8b84af12020-04-19 22:20:11 +02003559void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
3560 const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
3561 const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
3562 VkResult result) {
3563 if (VK_SUCCESS != result) return;
3564 RecordVulkanSurface(pSurface);
3565}
3566
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003567void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice,
3568 VkSurfaceKHR surface,
3569 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities,
3570 VkResult result) {
3571 if (VK_SUCCESS != result) return;
3572 auto surface_state = Get<SURFACE_STATE>(surface);
3573 surface_state->SetCapabilities(physicalDevice, *pSurfaceCapabilities);
3574}
3575
3576void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
3577 VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3578 VkSurfaceCapabilities2KHR *pSurfaceCapabilities, VkResult result) {
3579 if (VK_SUCCESS != result) return;
3580 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3581 surface_state->SetCapabilities(physicalDevice, pSurfaceCapabilities->surfaceCapabilities);
3582}
3583
3584void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice,
3585 VkSurfaceKHR surface,
3586 VkSurfaceCapabilities2EXT *pSurfaceCapabilities,
3587 VkResult result) {
3588 auto surface_state = Get<SURFACE_STATE>(surface);
3589 VkSurfaceCapabilitiesKHR caps{
3590 pSurfaceCapabilities->minImageCount, pSurfaceCapabilities->maxImageCount,
3591 pSurfaceCapabilities->currentExtent, pSurfaceCapabilities->minImageExtent,
3592 pSurfaceCapabilities->maxImageExtent, pSurfaceCapabilities->maxImageArrayLayers,
3593 pSurfaceCapabilities->supportedTransforms, pSurfaceCapabilities->currentTransform,
3594 pSurfaceCapabilities->supportedCompositeAlpha, pSurfaceCapabilities->supportedUsageFlags,
3595 };
3596 surface_state->SetCapabilities(physicalDevice, caps);
3597}
3598
locke-lunargd556cc32019-09-17 01:21:23 -06003599void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice,
3600 uint32_t queueFamilyIndex, VkSurfaceKHR surface,
3601 VkBool32 *pSupported, VkResult result) {
3602 if (VK_SUCCESS != result) return;
Jeremy Gebben87b2e6b2021-10-20 11:21:40 -06003603 auto surface_state = Get<SURFACE_STATE>(surface);
3604 surface_state->SetQueueSupport(physicalDevice, queueFamilyIndex, (*pSupported == VK_TRUE));
3605}
3606
3607void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice physicalDevice,
3608 VkSurfaceKHR surface,
3609 uint32_t *pPresentModeCount,
3610 VkPresentModeKHR *pPresentModes,
3611 VkResult result) {
3612 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3613
3614 if (pPresentModes) {
3615 auto surface_state = Get<SURFACE_STATE>(surface);
3616 surface_state->SetPresentModes(physicalDevice,
3617 std::vector<VkPresentModeKHR>(pPresentModes, pPresentModes + *pPresentModeCount));
3618 }
3619}
3620
3621void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface,
3622 uint32_t *pSurfaceFormatCount,
3623 VkSurfaceFormatKHR *pSurfaceFormats,
3624 VkResult result) {
3625 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3626
3627 if (pSurfaceFormats) {
3628 auto surface_state = Get<SURFACE_STATE>(surface);
3629 surface_state->SetFormats(physicalDevice,
3630 std::vector<VkSurfaceFormatKHR>(pSurfaceFormats, pSurfaceFormats + *pSurfaceFormatCount));
3631 }
3632}
3633
3634void ValidationStateTracker::PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice,
3635 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
3636 uint32_t *pSurfaceFormatCount,
3637 VkSurfaceFormat2KHR *pSurfaceFormats,
3638 VkResult result) {
3639 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3640
3641 if (pSurfaceFormats) {
3642 std::vector<VkSurfaceFormatKHR> fmts(*pSurfaceFormatCount);
3643 auto surface_state = Get<SURFACE_STATE>(pSurfaceInfo->surface);
3644 for (uint32_t i = 0; i < *pSurfaceFormatCount; i++) {
3645 fmts[i] = pSurfaceFormats[i].surfaceFormat;
3646 }
3647 surface_state->SetFormats(physicalDevice, std::move(fmts));
3648 }
locke-lunargd556cc32019-09-17 01:21:23 -06003649}
3650
locke-lunargd556cc32019-09-17 01:21:23 -06003651void ValidationStateTracker::PreCallRecordCmdBeginDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3652 const VkDebugUtilsLabelEXT *pLabelInfo) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003653 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3654 cb_state->RecordCmd(CMD_BEGINDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003655 BeginCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3656}
3657
3658void ValidationStateTracker::PostCallRecordCmdEndDebugUtilsLabelEXT(VkCommandBuffer commandBuffer) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003659 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
3660 cb_state->RecordCmd(CMD_ENDDEBUGUTILSLABELEXT);
locke-lunargd556cc32019-09-17 01:21:23 -06003661 EndCmdDebugUtilsLabel(report_data, commandBuffer);
3662}
3663
3664void ValidationStateTracker::PreCallRecordCmdInsertDebugUtilsLabelEXT(VkCommandBuffer commandBuffer,
3665 const VkDebugUtilsLabelEXT *pLabelInfo) {
3666 InsertCmdDebugUtilsLabel(report_data, commandBuffer, pLabelInfo);
3667
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003668 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003669 cb_state->RecordCmd(CMD_INSERTDEBUGUTILSLABELEXT);
3670 // Squirrel away an easily accessible copy.
locke-lunargd556cc32019-09-17 01:21:23 -06003671 cb_state->debug_label = LoggingLabel(pLabelInfo);
3672}
3673
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003674void ValidationStateTracker::RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
3675 uint32_t queueFamilyIndex,
3676 uint32_t *pCounterCount,
3677 VkPerformanceCounterKHR *pCounters) {
3678 if (NULL == pCounters) return;
3679
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003680 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
3681 assert(pd_state);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003682
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003683 std::unique_ptr<QUEUE_FAMILY_PERF_COUNTERS> queue_family_counters(new QUEUE_FAMILY_PERF_COUNTERS());
3684 queue_family_counters->counters.resize(*pCounterCount);
3685 for (uint32_t i = 0; i < *pCounterCount; i++) queue_family_counters->counters[i] = pCounters[i];
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003686
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003687 pd_state->perf_counters[queueFamilyIndex] = std::move(queue_family_counters);
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003688}
3689
3690void ValidationStateTracker::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
3691 VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t *pCounterCount, VkPerformanceCounterKHR *pCounters,
3692 VkPerformanceCounterDescriptionKHR *pCounterDescriptions, VkResult result) {
3693 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3694 RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(physicalDevice, queueFamilyIndex, pCounterCount, pCounters);
3695}
3696
3697void ValidationStateTracker::PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR *pInfo,
3698 VkResult result) {
3699 if (result == VK_SUCCESS) performance_lock_acquired = true;
3700}
3701
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003702void ValidationStateTracker::PostCallRecordReleaseProfilingLockKHR(VkDevice device) {
3703 performance_lock_acquired = false;
3704 for (auto &cmd_buffer : commandBufferMap) {
3705 cmd_buffer.second->performance_lock_released = true;
3706 }
3707}
3708
locke-lunargd556cc32019-09-17 01:21:23 -06003709void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplate(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003710 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003711 const VkAllocationCallbacks *pAllocator) {
3712 if (!descriptorUpdateTemplate) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003713 auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3714 template_state->destroyed = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003715 desc_template_map.erase(descriptorUpdateTemplate);
3716}
3717
3718void ValidationStateTracker::PreCallRecordDestroyDescriptorUpdateTemplateKHR(VkDevice device,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003719 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003720 const VkAllocationCallbacks *pAllocator) {
3721 if (!descriptorUpdateTemplate) return;
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003722 auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3723 template_state->destroyed = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003724 desc_template_map.erase(descriptorUpdateTemplate);
3725}
3726
Mike Schuchardt2df08912020-12-15 16:28:09 -08003727void ValidationStateTracker::RecordCreateDescriptorUpdateTemplateState(const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3728 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
locke-lunargd556cc32019-09-17 01:21:23 -06003729 safe_VkDescriptorUpdateTemplateCreateInfo local_create_info(pCreateInfo);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05003730 auto template_state = std::make_shared<TEMPLATE_STATE>(*pDescriptorUpdateTemplate, &local_create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003731 desc_template_map[*pDescriptorUpdateTemplate] = std::move(template_state);
3732}
3733
Mike Schuchardt2df08912020-12-15 16:28:09 -08003734void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplate(VkDevice device,
3735 const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
3736 const VkAllocationCallbacks *pAllocator,
3737 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate,
3738 VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003739 if (VK_SUCCESS != result) return;
3740 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3741}
3742
3743void ValidationStateTracker::PostCallRecordCreateDescriptorUpdateTemplateKHR(
Mike Schuchardt2df08912020-12-15 16:28:09 -08003744 VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
3745 VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate, VkResult result) {
locke-lunargd556cc32019-09-17 01:21:23 -06003746 if (VK_SUCCESS != result) return;
3747 RecordCreateDescriptorUpdateTemplateState(pCreateInfo, pDescriptorUpdateTemplate);
3748}
3749
3750void ValidationStateTracker::RecordUpdateDescriptorSetWithTemplateState(VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003751 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003752 const void *pData) {
3753 auto const template_map_entry = desc_template_map.find(descriptorUpdateTemplate);
3754 if ((template_map_entry == desc_template_map.end()) || (template_map_entry->second.get() == nullptr)) {
3755 assert(0);
3756 } else {
3757 const TEMPLATE_STATE *template_state = template_map_entry->second.get();
3758 // TODO: Record template push descriptor updates
3759 if (template_state->create_info.templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) {
3760 PerformUpdateDescriptorSetsWithTemplateKHR(descriptorSet, template_state, pData);
3761 }
3762 }
3763}
3764
3765void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
3766 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3767 const void *pData) {
3768 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3769}
3770
3771void ValidationStateTracker::PreCallRecordUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet,
Mike Schuchardt2df08912020-12-15 16:28:09 -08003772 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
locke-lunargd556cc32019-09-17 01:21:23 -06003773 const void *pData) {
3774 RecordUpdateDescriptorSetWithTemplateState(descriptorSet, descriptorUpdateTemplate, pData);
3775}
3776
Mike Schuchardt2df08912020-12-15 16:28:09 -08003777void ValidationStateTracker::PreCallRecordCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer,
3778 VkDescriptorUpdateTemplate descriptorUpdateTemplate,
3779 VkPipelineLayout layout, uint32_t set,
3780 const void *pData) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003781 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06003782
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003783 cb_state->RecordCmd(CMD_PUSHDESCRIPTORSETWITHTEMPLATEKHR);
locke-lunargd556cc32019-09-17 01:21:23 -06003784 const auto template_state = GetDescriptorTemplateState(descriptorUpdateTemplate);
3785 if (template_state) {
3786 auto layout_data = GetPipelineLayout(layout);
Jeremy Gebbenadb3eb02021-06-15 12:55:19 -06003787 auto dsl = layout_data ? layout_data->GetDsl(set) : nullptr;
locke-lunargd556cc32019-09-17 01:21:23 -06003788 const auto &template_ci = template_state->create_info;
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003789 // Decode the template into a set of write updates
3790 cvdescriptorset::DecodedTemplateUpdate decoded_template(this, VK_NULL_HANDLE, template_state, pData,
3791 dsl->GetDescriptorSetLayout());
3792 cb_state->PushDescriptorSetState(template_ci.pipelineBindPoint, layout_data, set,
3793 static_cast<uint32_t>(decoded_template.desc_writes.size()),
3794 decoded_template.desc_writes.data());
locke-lunargd556cc32019-09-17 01:21:23 -06003795 }
3796}
3797
3798void ValidationStateTracker::RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice,
3799 uint32_t *pPropertyCount, void *pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003800 auto pd_state = Get<PHYSICAL_DEVICE_STATE>(physicalDevice);
locke-lunargd556cc32019-09-17 01:21:23 -06003801 if (*pPropertyCount) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003802 pd_state->display_plane_property_count = *pPropertyCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003803 }
Nathaniel Cesario24184fe2020-10-06 12:46:12 -06003804 if (*pPropertyCount || pProperties) {
Jeremy Gebben383b9a32021-09-08 16:31:33 -06003805 pd_state->vkGetPhysicalDeviceDisplayPlanePropertiesKHR_called = true;
locke-lunargd556cc32019-09-17 01:21:23 -06003806 }
3807}
3808
3809void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice,
3810 uint32_t *pPropertyCount,
3811 VkDisplayPlanePropertiesKHR *pProperties,
3812 VkResult result) {
3813 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3814 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3815}
3816
3817void ValidationStateTracker::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice physicalDevice,
3818 uint32_t *pPropertyCount,
3819 VkDisplayPlaneProperties2KHR *pProperties,
3820 VkResult result) {
3821 if ((VK_SUCCESS != result) && (VK_INCOMPLETE != result)) return;
3822 RecordGetPhysicalDeviceDisplayPlanePropertiesState(physicalDevice, pPropertyCount, pProperties);
3823}
3824
3825void ValidationStateTracker::PostCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3826 uint32_t query, VkQueryControlFlags flags, uint32_t index) {
3827 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003828 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003829 cb_state->RecordCmd(CMD_BEGINQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003830 cb_state->BeginQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003831}
3832
3833void ValidationStateTracker::PostCallRecordCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
3834 uint32_t query, uint32_t index) {
3835 QueryObject query_obj = {queryPool, query, index};
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003836 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06003837 cb_state->RecordCmd(CMD_ENDQUERYINDEXEDEXT);
Jeremy Gebben1ec89332021-08-05 13:51:49 -06003838 cb_state->EndQuery(query_obj);
locke-lunargd556cc32019-09-17 01:21:23 -06003839}
3840
3841void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
3842 VkSamplerYcbcrConversion ycbcr_conversion) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003843 VkFormatFeatureFlags format_features = 0;
3844
3845 if (create_info->format != VK_FORMAT_UNDEFINED) {
3846 format_features = GetPotentialFormatFeatures(create_info->format);
sfricke-samsung45996a42021-09-16 13:45:27 -07003847 } else if (IsExtEnabled(device_extensions.vk_android_external_memory_android_hardware_buffer)) {
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003848 // If format is VK_FORMAT_UNDEFINED, format_features will be set by external AHB features
3849 format_features = GetExternalFormatFeaturesANDROID(create_info);
locke-lunargd556cc32019-09-17 01:21:23 -06003850 }
Jeremy Gebbenf4fb2a02021-07-08 09:57:46 -06003851
3852 samplerYcbcrConversionMap[ycbcr_conversion] =
3853 std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>(ycbcr_conversion, create_info, format_features);
locke-lunargd556cc32019-09-17 01:21:23 -06003854}
3855
3856void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
3857 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3858 const VkAllocationCallbacks *pAllocator,
3859 VkSamplerYcbcrConversion *pYcbcrConversion,
3860 VkResult result) {
3861 if (VK_SUCCESS != result) return;
3862 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3863}
3864
3865void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversionKHR(VkDevice device,
3866 const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
3867 const VkAllocationCallbacks *pAllocator,
3868 VkSamplerYcbcrConversion *pYcbcrConversion,
3869 VkResult result) {
3870 if (VK_SUCCESS != result) return;
3871 RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
3872}
3873
sfricke-samsungbe3584f2020-04-22 14:58:06 -07003874void ValidationStateTracker::RecordDestroySamplerYcbcrConversionState(VkSamplerYcbcrConversion ycbcr_conversion) {
sfricke-samsungbe3584f2020-04-22 14:58:06 -07003875 auto ycbcr_state = GetSamplerYcbcrConversionState(ycbcr_conversion);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06003876 ycbcr_state->Destroy();
sfricke-samsungbe3584f2020-04-22 14:58:06 -07003877 samplerYcbcrConversionMap.erase(ycbcr_conversion);
3878}
3879
locke-lunargd556cc32019-09-17 01:21:23 -06003880void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
3881 const VkAllocationCallbacks *pAllocator) {
3882 if (!ycbcrConversion) return;
sfricke-samsungbe3584f2020-04-22 14:58:06 -07003883 RecordDestroySamplerYcbcrConversionState(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003884}
3885
3886void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
3887 VkSamplerYcbcrConversion ycbcrConversion,
3888 const VkAllocationCallbacks *pAllocator) {
3889 if (!ycbcrConversion) return;
sfricke-samsungbe3584f2020-04-22 14:58:06 -07003890 RecordDestroySamplerYcbcrConversionState(ycbcrConversion);
locke-lunargd556cc32019-09-17 01:21:23 -06003891}
3892
Tony-LunarG977448c2019-12-02 14:52:02 -07003893void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3894 uint32_t queryCount) {
locke-lunargd556cc32019-09-17 01:21:23 -06003895 // Do nothing if the feature is not enabled.
Piers Daniell41b8c5d2020-01-10 15:42:00 -07003896 if (!enabled_features.core12.hostQueryReset) return;
locke-lunargd556cc32019-09-17 01:21:23 -06003897
3898 // Do nothing if the query pool has been destroyed.
3899 auto query_pool_state = GetQueryPoolState(queryPool);
3900 if (!query_pool_state) return;
3901
3902 // Reset the state of existing entries.
3903 QueryObject query_obj{queryPool, 0};
3904 const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
3905 for (uint32_t i = 0; i < max_query_count; ++i) {
3906 query_obj.query = firstQuery + i;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02003907 queryToStateMap[query_obj] = QUERYSTATE_RESET;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003908 if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003909 for (uint32_t pass_index = 0; pass_index < query_pool_state->n_performance_passes; pass_index++) {
3910 query_obj.perf_pass = pass_index;
Lionel Landwerlin7dc796b2020-02-18 18:17:10 +02003911 queryToStateMap[query_obj] = QUERYSTATE_RESET;
Lionel Landwerlinc7420912019-05-23 00:33:42 +01003912 }
3913 }
locke-lunargd556cc32019-09-17 01:21:23 -06003914 }
3915}
3916
Tony-LunarG977448c2019-12-02 14:52:02 -07003917void ValidationStateTracker::PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3918 uint32_t queryCount) {
3919 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3920}
3921
3922void ValidationStateTracker::PostCallRecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3923 uint32_t queryCount) {
3924 RecordResetQueryPool(device, queryPool, firstQuery, queryCount);
3925}
3926
locke-lunargd556cc32019-09-17 01:21:23 -06003927void ValidationStateTracker::PerformUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet,
3928 const TEMPLATE_STATE *template_state, const void *pData) {
3929 // Translate the templated update into a normal update for validation...
3930 cvdescriptorset::DecodedTemplateUpdate decoded_update(this, descriptorSet, template_state, pData);
3931 cvdescriptorset::PerformUpdateDescriptorSets(this, static_cast<uint32_t>(decoded_update.desc_writes.size()),
3932 decoded_update.desc_writes.data(), 0, NULL);
3933}
3934
3935// Update the common AllocateDescriptorSetsData
3936void ValidationStateTracker::UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo *p_alloc_info,
Jeff Bolz46c0ea02019-10-09 13:06:29 -05003937 cvdescriptorset::AllocateDescriptorSetsData *ds_data) const {
locke-lunargd556cc32019-09-17 01:21:23 -06003938 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
Jeff Bolz6ae39612019-10-11 20:57:36 -05003939 auto layout = GetDescriptorSetLayoutShared(p_alloc_info->pSetLayouts[i]);
locke-lunargd556cc32019-09-17 01:21:23 -06003940 if (layout) {
3941 ds_data->layout_nodes[i] = layout;
3942 // Count total descriptors required per type
3943 for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) {
3944 const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j);
Nathaniel Cesarioce9b4812020-12-17 08:55:28 -07003945 uint32_t type_index = static_cast<uint32_t>(binding_layout->descriptorType);
3946 ds_data->required_descriptors_by_type[type_index] += binding_layout->descriptorCount;
locke-lunargd556cc32019-09-17 01:21:23 -06003947 }
3948 }
3949 // Any unknown layouts will be flagged as errors during ValidateAllocateDescriptorSets() call
3950 }
3951}
3952
3953// Decrement allocated sets from the pool and insert new sets into set_map
3954void ValidationStateTracker::PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *p_alloc_info,
3955 const VkDescriptorSet *descriptor_sets,
3956 const cvdescriptorset::AllocateDescriptorSetsData *ds_data) {
3957 auto pool_state = descriptorPoolMap[p_alloc_info->descriptorPool].get();
3958 // Account for sets and individual descriptors allocated from pool
3959 pool_state->availableSets -= p_alloc_info->descriptorSetCount;
3960 for (auto it = ds_data->required_descriptors_by_type.begin(); it != ds_data->required_descriptors_by_type.end(); ++it) {
3961 pool_state->availableDescriptorTypeCount[it->first] -= ds_data->required_descriptors_by_type.at(it->first);
3962 }
3963
Mark Lobodzinski1f887d32020-12-30 15:31:33 -07003964 const auto *variable_count_info = LvlFindInChain<VkDescriptorSetVariableDescriptorCountAllocateInfo>(p_alloc_info->pNext);
locke-lunargd556cc32019-09-17 01:21:23 -06003965 bool variable_count_valid = variable_count_info && variable_count_info->descriptorSetCount == p_alloc_info->descriptorSetCount;
3966
3967 // Create tracking object for each descriptor set; insert into global map and the pool's set.
3968 for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) {
3969 uint32_t variable_count = variable_count_valid ? variable_count_info->pDescriptorCounts[i] : 0;
3970
Jeff Bolz41a1ced2019-10-11 11:40:49 -05003971 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 -07003972 variable_count, this);
locke-lunargd556cc32019-09-17 01:21:23 -06003973 pool_state->sets.insert(new_ds.get());
locke-lunargd556cc32019-09-17 01:21:23 -06003974 setMap[descriptor_sets[i]] = std::move(new_ds);
3975 }
3976}
3977
locke-lunargd556cc32019-09-17 01:21:23 -06003978void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
3979 uint32_t firstVertex, uint32_t firstInstance) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003980 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003981 cb_state->UpdateStateCmdDrawType(CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003982}
3983
Tony-LunarG745150c2021-07-02 15:07:31 -06003984void ValidationStateTracker::PostCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3985 const VkMultiDrawInfoEXT *pVertexInfo, uint32_t instanceCount,
3986 uint32_t firstInstance, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003987 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003988 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06003989}
3990
locke-lunargd556cc32019-09-17 01:21:23 -06003991void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
3992 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
3993 uint32_t firstInstance) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06003994 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07003995 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06003996}
3997
Tony-LunarG745150c2021-07-02 15:07:31 -06003998void ValidationStateTracker::PostCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
3999 const VkMultiDrawIndexedInfoEXT *pIndexInfo,
4000 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride,
4001 const int32_t *pVertexOffset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004002 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004003 cb_state->UpdateStateCmdDrawType(CMD_DRAWMULTIINDEXEDEXT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Tony-LunarG745150c2021-07-02 15:07:31 -06004004}
4005
locke-lunargd556cc32019-09-17 01:21:23 -06004006void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4007 uint32_t count, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004008 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06004009 BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004010 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004011 if (!disabled[command_buffer_state]) {
4012 cb_state->AddChild(buffer_state);
4013 }
locke-lunargd556cc32019-09-17 01:21:23 -06004014}
4015
4016void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
4017 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004018 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
locke-lunargd556cc32019-09-17 01:21:23 -06004019 BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004020 cb_state->UpdateStateCmdDrawType(CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004021 if (!disabled[command_buffer_state]) {
4022 cb_state->AddChild(buffer_state);
4023 }
locke-lunargd556cc32019-09-17 01:21:23 -06004024}
4025
4026void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004027 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004028 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
locke-lunargd556cc32019-09-17 01:21:23 -06004029}
4030
4031void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
4032 VkDeviceSize offset) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004033 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004034 cb_state->UpdateStateCmdDrawDispatchType(CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004035 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004036 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004037 cb_state->AddChild(buffer_state);
4038 }
locke-lunargd556cc32019-09-17 01:21:23 -06004039}
4040
Tony-LunarG977448c2019-12-02 14:52:02 -07004041void ValidationStateTracker::RecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4042 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsung85584a72021-09-30 21:43:38 -07004043 uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004044 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004045 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004046 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004047 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4048 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004049 cb_state->AddChild(buffer_state);
4050 cb_state->AddChild(count_buffer_state);
4051 }
Tony-LunarG977448c2019-12-02 14:52:02 -07004052}
4053
locke-lunargd556cc32019-09-17 01:21:23 -06004054void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
4055 VkDeviceSize offset, VkBuffer countBuffer,
4056 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4057 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004058 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004059 CMD_DRAWINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07004060}
4061
4062void ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4063 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
4064 uint32_t maxDrawCount, uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004065 RecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004066 CMD_DRAWINDIRECTCOUNT);
Tony-LunarG977448c2019-12-02 14:52:02 -07004067}
4068
4069void ValidationStateTracker::RecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
4070 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
sfricke-samsung85584a72021-09-30 21:43:38 -07004071 uint32_t maxDrawCount, uint32_t stride, CMD_TYPE cmd_type) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004072 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004073 cb_state->UpdateStateCmdDrawType(cmd_type, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004074 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004075 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4076 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004077 cb_state->AddChild(buffer_state);
4078 cb_state->AddChild(count_buffer_state);
4079 }
locke-lunargd556cc32019-09-17 01:21:23 -06004080}
4081
4082void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
4083 VkDeviceSize offset, VkBuffer countBuffer,
4084 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4085 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004086 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004087 CMD_DRAWINDEXEDINDIRECTCOUNTKHR);
Tony-LunarG977448c2019-12-02 14:52:02 -07004088}
4089
4090void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
4091 VkDeviceSize offset, VkBuffer countBuffer,
4092 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4093 uint32_t stride) {
locke-lunarg540b2252020-08-03 13:23:36 -06004094 RecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsung85584a72021-09-30 21:43:38 -07004095 CMD_DRAWINDEXEDINDIRECTCOUNT);
locke-lunargd556cc32019-09-17 01:21:23 -06004096}
4097
4098void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
4099 uint32_t firstTask) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004100 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004101 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004102}
4103
4104void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4105 VkDeviceSize offset, uint32_t drawCount, 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_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
locke-lunargd556cc32019-09-17 01:21:23 -06004108 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004109 if (!disabled[command_buffer_state] && buffer_state) {
4110 cb_state->AddChild(buffer_state);
locke-lunargd556cc32019-09-17 01:21:23 -06004111 }
4112}
4113
4114void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
4115 VkDeviceSize offset, VkBuffer countBuffer,
4116 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
4117 uint32_t stride) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004118 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004119 cb_state->UpdateStateCmdDrawType(CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004120 if (!disabled[command_buffer_state]) {
Jeremy Gebben1ec89332021-08-05 13:51:49 -06004121 BUFFER_STATE *buffer_state = GetBufferState(buffer);
4122 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004123 if (buffer_state) {
4124 cb_state->AddChild(buffer_state);
4125 }
4126 if (count_buffer_state) {
4127 cb_state->AddChild(count_buffer_state);
4128 }
locke-lunargd556cc32019-09-17 01:21:23 -06004129 }
4130}
4131
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004132void ValidationStateTracker::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
4133 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
4134 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
4135 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
4136 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
4137 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
4138 uint32_t width, 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_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004141 cb_state->hasTraceRaysCmd = true;
4142}
4143
4144
4145void ValidationStateTracker::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
4146 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4147 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4148 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4149 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
4150 uint32_t height, uint32_t depth) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004151 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004152 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004153 cb_state->hasTraceRaysCmd = true;
4154}
4155
4156void ValidationStateTracker::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
4157 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
4158 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
4159 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
4160 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
4161 VkDeviceAddress indirectDeviceAddress) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004162 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sfricke-samsung85584a72021-09-30 21:43:38 -07004163 cb_state->UpdateStateCmdDrawDispatchType(CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeremy Gebben252f60c2021-07-15 14:54:30 -06004164 cb_state->hasTraceRaysCmd = true;
4165}
4166
locke-lunargd556cc32019-09-17 01:21:23 -06004167void ValidationStateTracker::PostCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
4168 const VkAllocationCallbacks *pAllocator,
4169 VkShaderModule *pShaderModule, VkResult result,
4170 void *csm_state_data) {
4171 if (VK_SUCCESS != result) return;
4172 create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
4173
sfricke-samsung45996a42021-09-16 13:45:27 -07004174 spv_target_env spirv_environment = PickSpirvEnv(api_version, IsExtEnabled(device_extensions.vk_khr_spirv_1_4));
locke-lunargd556cc32019-09-17 01:21:23 -06004175 bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
Jeff Bolze7fc67b2019-10-04 12:29:31 -05004176 auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
4177 csm_state->unique_shader_id)
4178 : std::make_shared<SHADER_MODULE_STATE>();
locke-lunargd556cc32019-09-17 01:21:23 -06004179 shaderModuleMap[*pShaderModule] = std::move(new_shader_module);
4180}
4181
John Zulauf22b0fbe2019-10-15 06:26:16 -06004182void ValidationStateTracker::PostCallRecordGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
4183 uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages,
4184 VkResult result) {
4185 if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004186 auto swapchain_state = GetShared<SWAPCHAIN_NODE>(swapchain);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004187
4188 if (*pSwapchainImageCount > swapchain_state->images.size()) swapchain_state->images.resize(*pSwapchainImageCount);
4189
4190 if (pSwapchainImages) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004191 for (uint32_t i = 0; i < *pSwapchainImageCount; ++i) {
John Zulauf29d00532021-03-04 13:28:54 -07004192 SWAPCHAIN_IMAGE &swapchain_image = swapchain_state->images[i];
John Zulauffaa7a522021-03-05 12:22:45 -07004193 if (swapchain_image.image_state) continue; // Already retrieved this.
John Zulauf22b0fbe2019-10-15 06:26:16 -06004194
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004195 auto format_features =
4196 GetImageFormatFeatures(physical_device, device, pSwapchainImages[i], swapchain_state->image_create_info.format,
4197 swapchain_state->image_create_info.tiling);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004198
Jeremy Gebbenbc9aacf2021-09-23 11:57:37 -06004199 auto image_state = std::make_shared<IMAGE_STATE>(this, pSwapchainImages[i], swapchain_state->image_create_info.ptr(),
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004200 swapchain, i, format_features);
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004201 if (!swapchain_image.fake_base_address) {
4202 auto size = image_state->fragment_encoder->TotalSize();
4203 swapchain_image.fake_base_address = fake_memory.Alloc(size);
John Zulauf29d00532021-03-04 13:28:54 -07004204 }
4205
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004206 image_state->SetSwapchain(swapchain_state, i);
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004207 swapchain_image.image_state = image_state.get();
Jeremy Gebbenb4d17012021-07-08 13:18:15 -06004208 imageMap[pSwapchainImages[i]] = std::move(image_state);
John Zulauf22b0fbe2019-10-15 06:26:16 -06004209 }
4210 }
4211
4212 if (*pSwapchainImageCount) {
John Zulauf22b0fbe2019-10-15 06:26:16 -06004213 swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
4214 }
4215}
sourav parmar35e7a002020-06-09 17:58:44 -07004216
sourav parmar35e7a002020-06-09 17:58:44 -07004217void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
4218 const VkCopyAccelerationStructureInfoKHR *pInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004219 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
sourav parmar35e7a002020-06-09 17:58:44 -07004220 if (cb_state) {
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004221 cb_state->RecordCmd(CMD_COPYACCELERATIONSTRUCTUREKHR);
sourav parmarcd5fb182020-07-17 12:58:44 -07004222 ACCELERATION_STRUCTURE_STATE_KHR *src_as_state = GetAccelerationStructureStateKHR(pInfo->src);
4223 ACCELERATION_STRUCTURE_STATE_KHR *dst_as_state = GetAccelerationStructureStateKHR(pInfo->dst);
sourav parmar35e7a002020-06-09 17:58:44 -07004224 if (dst_as_state != nullptr && src_as_state != nullptr) {
4225 dst_as_state->built = true;
4226 dst_as_state->build_info_khr = src_as_state->build_info_khr;
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004227 if (!disabled[command_buffer_state]) {
4228 cb_state->AddChild(dst_as_state);
4229 cb_state->AddChild(src_as_state);
4230 }
sourav parmar35e7a002020-06-09 17:58:44 -07004231 }
4232 }
4233}
Piers Daniell39842ee2020-07-10 16:42:33 -06004234
4235void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004236 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004237 cb_state->RecordStateCmd(CMD_SETCULLMODEEXT, CBSTATUS_CULL_MODE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004238}
4239
4240void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004241 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004242 cb_state->RecordStateCmd(CMD_SETFRONTFACEEXT, CBSTATUS_FRONT_FACE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004243}
4244
4245void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
4246 VkPrimitiveTopology primitiveTopology) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004247 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004248 cb_state->RecordStateCmd(CMD_SETPRIMITIVETOPOLOGYEXT, CBSTATUS_PRIMITIVE_TOPOLOGY_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004249 cb_state->primitiveTopology = primitiveTopology;
Piers Daniell39842ee2020-07-10 16:42:33 -06004250}
4251
4252void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
4253 const VkViewport *pViewports) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004254 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004255 cb_state->RecordStateCmd(CMD_SETVIEWPORTWITHCOUNTEXT, CBSTATUS_VIEWPORT_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004256 uint32_t bits = (1u << viewportCount) - 1u;
4257 cb_state->viewportWithCountMask |= bits;
4258 cb_state->trashedViewportMask &= ~bits;
Tobias Hector6663c9b2020-11-05 10:18:02 +00004259 cb_state->viewportWithCountCount = viewportCount;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004260 cb_state->trashedViewportCount = false;
David Zhao Akeley44139b12021-04-26 16:16:13 -07004261
4262 cb_state->dynamicViewports.resize(std::max(size_t(viewportCount), cb_state->dynamicViewports.size()));
4263 for (size_t i = 0; i < viewportCount; ++i) {
4264 cb_state->dynamicViewports[i] = pViewports[i];
4265 }
Piers Daniell39842ee2020-07-10 16:42:33 -06004266}
4267
4268void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
4269 const VkRect2D *pScissors) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004270 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004271 cb_state->RecordStateCmd(CMD_SETSCISSORWITHCOUNTEXT, CBSTATUS_SCISSOR_WITH_COUNT_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004272 uint32_t bits = (1u << scissorCount) - 1u;
4273 cb_state->scissorWithCountMask |= bits;
4274 cb_state->trashedScissorMask &= ~bits;
4275 cb_state->scissorWithCountCount = scissorCount;
4276 cb_state->trashedScissorCount = false;
Piers Daniell39842ee2020-07-10 16:42:33 -06004277}
4278
4279void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
4280 uint32_t bindingCount, const VkBuffer *pBuffers,
4281 const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
4282 const VkDeviceSize *pStrides) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004283 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004284 cb_state->RecordStateCmd(CMD_BINDVERTEXBUFFERS2EXT, pStrides ? CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET : CBSTATUS_NONE);
Piers Daniell39842ee2020-07-10 16:42:33 -06004285
4286 uint32_t end = firstBinding + bindingCount;
4287 if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
4288 cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
4289 }
4290
4291 for (uint32_t i = 0; i < bindingCount; ++i) {
4292 auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
locke-lunarg1ae57d62020-11-18 10:49:19 -07004293 vertex_buffer_binding.buffer_state = GetShared<BUFFER_STATE>(pBuffers[i]);
Piers Daniell39842ee2020-07-10 16:42:33 -06004294 vertex_buffer_binding.offset = pOffsets[i];
4295 vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
4296 vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
4297 // Add binding for this vertex buffer to this commandbuffer
Jeremy Gebben9efe1cf2021-05-15 20:05:09 -06004298 if (!disabled[command_buffer_state] && pBuffers[i]) {
4299 cb_state->AddChild(vertex_buffer_binding.buffer_state.get());
Piers Daniell39842ee2020-07-10 16:42:33 -06004300 }
4301 }
4302}
4303
4304void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004305 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004306 cb_state->RecordStateCmd(CMD_SETDEPTHTESTENABLEEXT, CBSTATUS_DEPTH_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004307}
4308
4309void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004310 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004311 cb_state->RecordStateCmd(CMD_SETDEPTHWRITEENABLEEXT, CBSTATUS_DEPTH_WRITE_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004312}
4313
4314void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004315 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004316 cb_state->RecordStateCmd(CMD_SETDEPTHCOMPAREOPEXT, CBSTATUS_DEPTH_COMPARE_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004317}
4318
4319void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
4320 VkBool32 depthBoundsTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004321 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004322 cb_state->RecordStateCmd(CMD_SETDEPTHBOUNDSTESTENABLEEXT, CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004323}
4324void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004325 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004326 cb_state->RecordStateCmd(CMD_SETSTENCILTESTENABLEEXT, CBSTATUS_STENCIL_TEST_ENABLE_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004327}
4328
4329void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
4330 VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
4331 VkCompareOp compareOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004332 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004333 cb_state->RecordStateCmd(CMD_SETSTENCILOPEXT, CBSTATUS_STENCIL_OP_SET);
Piers Daniell39842ee2020-07-10 16:42:33 -06004334}
locke-lunarg4189aa22020-10-21 00:23:48 -06004335
4336void ValidationStateTracker::PreCallRecordCmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle,
4337 uint32_t discardRectangleCount,
4338 const VkRect2D *pDiscardRectangles) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004339 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004340 cb_state->RecordStateCmd(CMD_SETDISCARDRECTANGLEEXT, CBSTATUS_DISCARD_RECTANGLE_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004341}
4342
4343void ValidationStateTracker::PreCallRecordCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
4344 const VkSampleLocationsInfoEXT *pSampleLocationsInfo) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004345 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004346 cb_state->RecordStateCmd(CMD_SETSAMPLELOCATIONSEXT, CBSTATUS_SAMPLE_LOCATIONS_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004347}
4348
4349void ValidationStateTracker::PreCallRecordCmdSetCoarseSampleOrderNV(VkCommandBuffer commandBuffer,
4350 VkCoarseSampleOrderTypeNV sampleOrderType,
4351 uint32_t customSampleOrderCount,
4352 const VkCoarseSampleOrderCustomNV *pCustomSampleOrders) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004353 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004354 cb_state->RecordStateCmd(CMD_SETCOARSESAMPLEORDERNV, CBSTATUS_COARSE_SAMPLE_ORDER_SET);
locke-lunarg4189aa22020-10-21 00:23:48 -06004355}
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004356
4357void ValidationStateTracker::PreCallRecordCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, uint32_t patchControlPoints) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004358 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004359 cb_state->RecordStateCmd(CMD_SETPATCHCONTROLPOINTSEXT, CBSTATUS_PATCH_CONTROL_POINTS_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004360}
4361
4362void ValidationStateTracker::PreCallRecordCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004363 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004364 cb_state->RecordStateCmd(CMD_SETLOGICOPEXT, CBSTATUS_LOGIC_OP_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004365}
4366
4367void ValidationStateTracker::PreCallRecordCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
4368 VkBool32 rasterizerDiscardEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004369 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004370 cb_state->RecordStateCmd(CMD_SETRASTERIZERDISCARDENABLEEXT, CBSTATUS_RASTERIZER_DISCARD_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004371}
4372
4373void ValidationStateTracker::PreCallRecordCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004374 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004375 cb_state->RecordStateCmd(CMD_SETDEPTHBIASENABLEEXT, CBSTATUS_DEPTH_BIAS_ENABLE_SET);
Vikram Kushwahaa57b0c32021-04-19 12:21:46 -07004376}
4377
4378void ValidationStateTracker::PreCallRecordCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
4379 VkBool32 primitiveRestartEnable) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004380 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
Jeremy Gebben10a0ed12021-08-17 09:54:29 -06004381 cb_state->RecordStateCmd(CMD_SETPRIMITIVERESTARTENABLEEXT, CBSTATUS_PRIMITIVE_RESTART_ENABLE_SET);
David Zhao Akeley44139b12021-04-26 16:16:13 -07004382}
Piers Daniell924cd832021-05-18 13:48:47 -06004383
4384void ValidationStateTracker::PreCallRecordCmdSetVertexInputEXT(
4385 VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount,
4386 const VkVertexInputBindingDescription2EXT *pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount,
4387 const VkVertexInputAttributeDescription2EXT *pVertexAttributeDescriptions) {
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004388 CMD_BUFFER_STATE *cb_state = Get<CMD_BUFFER_STATE>(commandBuffer);
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004389 CBStatusFlags status_flags = CBSTATUS_VERTEX_INPUT_SET;
4390
4391 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_GRAPHICS);
4392 const auto pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
4393 if (pipeline_state) {
Jeremy Gebben11af9792021-08-20 10:20:09 -06004394 if (pipeline_state->create_info.graphics.pDynamicState) {
4395 for (uint32_t i = 0; i < pipeline_state->create_info.graphics.pDynamicState->dynamicStateCount; ++i) {
4396 if (pipeline_state->create_info.graphics.pDynamicState->pDynamicStates[i] ==
ziga-lunarg4af0a8c2021-08-27 15:53:20 +02004397 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
4398 status_flags |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
4399 break;
4400 }
4401 }
4402 }
4403 }
4404 cb_state->RecordStateCmd(CMD_SETVERTEXINPUTEXT, status_flags);
Piers Daniell924cd832021-05-18 13:48:47 -06004405}
Nathaniel Cesario42ac6ca2021-06-15 17:23:05 -06004406
4407void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAddressInfo *pInfo, VkDeviceAddress address) {
4408 BUFFER_STATE *buffer_state = GetBufferState(pInfo->buffer);
4409 if (buffer_state) {
4410 // address is used for GPU-AV and ray tracing buffer validation
4411 buffer_state->deviceAddress = address;
4412 buffer_address_map_.emplace(address, buffer_state);
4413 }
4414}
4415
4416void ValidationStateTracker::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4417 VkDeviceAddress address) {
4418 RecordGetBufferDeviceAddress(pInfo, address);
4419}
4420
4421void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4422 VkDeviceAddress address) {
4423 RecordGetBufferDeviceAddress(pInfo, address);
4424}
4425
4426void ValidationStateTracker::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo *pInfo,
4427 VkDeviceAddress address) {
4428 RecordGetBufferDeviceAddress(pInfo, address);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004429}
4430
4431std::shared_ptr<SWAPCHAIN_NODE> ValidationStateTracker::CreateSwapchainState(const VkSwapchainCreateInfoKHR *create_info,
4432 VkSwapchainKHR swapchain) {
Jeremy Gebben62c3bf42021-07-21 15:38:24 -06004433 return std::make_shared<SWAPCHAIN_NODE>(this, create_info, swapchain);
Nathaniel Cesario39152e62021-07-02 13:04:16 -06004434}
Jeremy Gebben3d22d582021-08-11 15:37:58 -06004435
4436std::shared_ptr<CMD_BUFFER_STATE> ValidationStateTracker::CreateCmdBufferState(VkCommandBuffer cb,
4437 const VkCommandBufferAllocateInfo *create_info,
4438 std::shared_ptr<COMMAND_POOL_STATE> &pool) {
4439 return std::make_shared<CMD_BUFFER_STATE>(this, cb, create_info, pool);
4440}